@reformer/core 1.1.0 → 2.0.0-beta.3
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,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор максимального значения
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/max
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Валидатор максимального числового значения
|
|
11
|
-
*
|
|
12
|
-
* Проверяет, что числовое значение не превышает указанный максимум.
|
|
13
|
-
* Пустые значения пропускаются (используйте `required` для обязательности).
|
|
14
|
-
*
|
|
15
|
-
* @group Validation
|
|
16
|
-
* @category Validators
|
|
17
|
-
*
|
|
18
|
-
* @param fieldPath - Путь к полю для валидации
|
|
19
|
-
* @param maxValue - Максимально допустимое значение
|
|
20
|
-
* @param options - Опции валидации (message, params)
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* // Базовое использование
|
|
25
|
-
* validationSchema: (path) => [
|
|
26
|
-
* max(path.quantity, 100),
|
|
27
|
-
* max(path.discount, 50),
|
|
28
|
-
* ]
|
|
29
|
-
*
|
|
30
|
-
* // С кастомным сообщением
|
|
31
|
-
* max(path.quantity, 100, { message: 'Максимум 100 единиц' })
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* // Ошибка валидации
|
|
37
|
-
* {
|
|
38
|
-
* code: 'max',
|
|
39
|
-
* message: 'Максимальное значение: 100',
|
|
40
|
-
* params: { max: 100, actual: 150 }
|
|
41
|
-
* }
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export function max(fieldPath, maxValue, options) {
|
|
45
|
-
if (!fieldPath)
|
|
46
|
-
return; // Защита от undefined fieldPath
|
|
47
|
-
validate(fieldPath, (value) => {
|
|
48
|
-
if (value === null || value === undefined) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
if (value > maxValue) {
|
|
52
|
-
return {
|
|
53
|
-
code: 'max',
|
|
54
|
-
message: options?.message || `Максимальное значение: ${maxValue}`,
|
|
55
|
-
params: { max: maxValue, actual: value, ...options?.params },
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
return null;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор минимальной длины строки
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/minLength
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Валидатор минимальной длины строки
|
|
11
|
-
*
|
|
12
|
-
* Проверяет, что длина строки не меньше указанного минимума.
|
|
13
|
-
* Пустые значения пропускаются (используйте `required` для обязательности).
|
|
14
|
-
*
|
|
15
|
-
* @group Validation
|
|
16
|
-
* @category Validators
|
|
17
|
-
*
|
|
18
|
-
* @param fieldPath - Путь к полю для валидации
|
|
19
|
-
* @param minLen - Минимальная допустимая длина строки
|
|
20
|
-
* @param options - Опции валидации (message, params)
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* // Базовое использование
|
|
25
|
-
* validationSchema: (path) => [
|
|
26
|
-
* minLength(path.name, 2),
|
|
27
|
-
* minLength(path.password, 8),
|
|
28
|
-
* ]
|
|
29
|
-
*
|
|
30
|
-
* // С кастомным сообщением
|
|
31
|
-
* minLength(path.password, 8, { message: 'Пароль должен быть не менее 8 символов' })
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* // Ошибка валидации
|
|
37
|
-
* {
|
|
38
|
-
* code: 'minLength',
|
|
39
|
-
* message: 'Минимальная длина: 8 символов',
|
|
40
|
-
* params: { minLength: 8, actualLength: 3 }
|
|
41
|
-
* }
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export function minLength(fieldPath, minLen, options) {
|
|
45
|
-
if (!fieldPath)
|
|
46
|
-
return; // Защита от undefined fieldPath
|
|
47
|
-
validate(fieldPath, (value) => {
|
|
48
|
-
if (!value) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
if (value.length < minLen) {
|
|
52
|
-
return {
|
|
53
|
-
code: 'minLength',
|
|
54
|
-
message: options?.message || `Минимальная длина: ${minLen} символов`,
|
|
55
|
-
params: { minLength: minLen, actualLength: value.length, ...options?.params },
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
return null;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор минимального значения
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/min
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Валидатор минимального числового значения
|
|
11
|
-
*
|
|
12
|
-
* Проверяет, что числовое значение не меньше указанного минимума.
|
|
13
|
-
* Пустые значения пропускаются (используйте `required` для обязательности).
|
|
14
|
-
*
|
|
15
|
-
* @group Validation
|
|
16
|
-
* @category Validators
|
|
17
|
-
*
|
|
18
|
-
* @param fieldPath - Путь к полю для валидации
|
|
19
|
-
* @param minValue - Минимально допустимое значение
|
|
20
|
-
* @param options - Опции валидации (message, params)
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* // Базовое использование
|
|
25
|
-
* validationSchema: (path) => [
|
|
26
|
-
* min(path.age, 18),
|
|
27
|
-
* min(path.quantity, 1),
|
|
28
|
-
* ]
|
|
29
|
-
*
|
|
30
|
-
* // С кастомным сообщением
|
|
31
|
-
* min(path.age, 18, { message: 'Вам должно быть не менее 18 лет' })
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```typescript
|
|
36
|
-
* // Ошибка валидации
|
|
37
|
-
* {
|
|
38
|
-
* code: 'min',
|
|
39
|
-
* message: 'Минимальное значение: 18',
|
|
40
|
-
* params: { min: 18, actual: 16 }
|
|
41
|
-
* }
|
|
42
|
-
* ```
|
|
43
|
-
*/
|
|
44
|
-
export function min(fieldPath, minValue, options) {
|
|
45
|
-
if (!fieldPath)
|
|
46
|
-
return; // Защита от undefined fieldPath
|
|
47
|
-
validate(fieldPath, (value) => {
|
|
48
|
-
if (value === null || value === undefined) {
|
|
49
|
-
return null; // Пропускаем, если пусто (используйте required для обязательности)
|
|
50
|
-
}
|
|
51
|
-
if (value < minValue) {
|
|
52
|
-
return {
|
|
53
|
-
code: 'min',
|
|
54
|
-
message: options?.message || `Минимальное значение: ${minValue}`,
|
|
55
|
-
params: { min: minValue, actual: value, ...options?.params },
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
return null;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор числовых значений
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/number
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Адаптер для number валидатора
|
|
11
|
-
* Проверяет, что значение является числом и соответствует заданным ограничениям
|
|
12
|
-
*
|
|
13
|
-
* @group Validation
|
|
14
|
-
* @category Validators
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* number(path.age);
|
|
19
|
-
* number(path.price, { min: 0, max: 1000000 });
|
|
20
|
-
* number(path.percentage, { min: 0, max: 100, integer: true });
|
|
21
|
-
* number(path.rating, { min: 0, max: 5, multipleOf: 0.5 });
|
|
22
|
-
* ```
|
|
23
|
-
*/
|
|
24
|
-
export function number(fieldPath, options) {
|
|
25
|
-
if (!fieldPath)
|
|
26
|
-
return; // Защита от undefined fieldPath
|
|
27
|
-
validate(fieldPath, (value) => {
|
|
28
|
-
// Пропускаем null/undefined
|
|
29
|
-
if (value === null || value === undefined) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
// Проверка, что значение является числом
|
|
33
|
-
if (typeof value !== 'number' || isNaN(value)) {
|
|
34
|
-
return {
|
|
35
|
-
code: 'number',
|
|
36
|
-
message: options?.message || 'Значение должно быть числом',
|
|
37
|
-
params: options?.params,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
// Проверка на целое число
|
|
41
|
-
if (options?.integer && !Number.isInteger(value)) {
|
|
42
|
-
return {
|
|
43
|
-
code: 'number_integer',
|
|
44
|
-
message: options?.message || 'Значение должно быть целым числом',
|
|
45
|
-
params: options?.params,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
// Проверка минимального значения
|
|
49
|
-
if (options?.min !== undefined && value < options.min) {
|
|
50
|
-
return {
|
|
51
|
-
code: 'number_min',
|
|
52
|
-
message: options?.message || `Значение должно быть не менее ${options.min}`,
|
|
53
|
-
params: { min: options.min, ...options?.params },
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
// Проверка максимального значения
|
|
57
|
-
if (options?.max !== undefined && value > options.max) {
|
|
58
|
-
return {
|
|
59
|
-
code: 'number_max',
|
|
60
|
-
message: options?.message || `Значение должно быть не более ${options.max}`,
|
|
61
|
-
params: { max: options.max, ...options?.params },
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
// Проверка кратности
|
|
65
|
-
if (options?.multipleOf !== undefined && value % options.multipleOf !== 0) {
|
|
66
|
-
return {
|
|
67
|
-
code: 'number_multiple',
|
|
68
|
-
message: options?.message || `Значение должно быть кратно ${options.multipleOf}`,
|
|
69
|
-
params: { multipleOf: options.multipleOf, ...options?.params },
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
// Проверка отрицательных чисел
|
|
73
|
-
if (options?.allowNegative === false && value < 0) {
|
|
74
|
-
return {
|
|
75
|
-
code: 'number_negative',
|
|
76
|
-
message: options?.message || 'Отрицательные числа не допускаются',
|
|
77
|
-
params: options?.params,
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
// Проверка нуля
|
|
81
|
-
if (options?.allowZero === false && value === 0) {
|
|
82
|
-
return {
|
|
83
|
-
code: 'number_zero',
|
|
84
|
-
message: options?.message || 'Ноль не допускается',
|
|
85
|
-
params: options?.params,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
});
|
|
90
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор паттерна (регулярного выражения)
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/pattern
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Валидатор паттерна (регулярного выражения)
|
|
11
|
-
*
|
|
12
|
-
* Проверяет, что значение соответствует указанному регулярному выражению.
|
|
13
|
-
* Пустые значения пропускаются (используйте `required` для обязательности).
|
|
14
|
-
*
|
|
15
|
-
* @group Validation
|
|
16
|
-
* @category Validators
|
|
17
|
-
*
|
|
18
|
-
* @param fieldPath - Путь к полю для валидации
|
|
19
|
-
* @param regex - Регулярное выражение для проверки
|
|
20
|
-
* @param options - Опции валидации (message, params)
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* // Только буквы
|
|
25
|
-
* pattern(path.name, /^[а-яА-Яa-zA-Z]+$/)
|
|
26
|
-
*
|
|
27
|
-
* // Только цифры
|
|
28
|
-
* pattern(path.code, /^\d+$/)
|
|
29
|
-
*
|
|
30
|
-
* // С кастомным сообщением
|
|
31
|
-
* pattern(path.username, /^[a-z0-9_]+$/i, {
|
|
32
|
-
* message: 'Только латинские буквы, цифры и подчёркивание'
|
|
33
|
-
* })
|
|
34
|
-
* ```
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```typescript
|
|
38
|
-
* // Ошибка валидации
|
|
39
|
-
* {
|
|
40
|
-
* code: 'pattern',
|
|
41
|
-
* message: 'Значение не соответствует требуемому формату',
|
|
42
|
-
* params: { pattern: '^[a-z]+$' }
|
|
43
|
-
* }
|
|
44
|
-
* ```
|
|
45
|
-
*/
|
|
46
|
-
export function pattern(fieldPath, regex, options) {
|
|
47
|
-
if (!fieldPath)
|
|
48
|
-
return; // Защита от undefined fieldPath
|
|
49
|
-
validate(fieldPath, (value) => {
|
|
50
|
-
if (!value) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
if (!regex.test(value)) {
|
|
54
|
-
return {
|
|
55
|
-
code: 'pattern',
|
|
56
|
-
message: options?.message || 'Значение не соответствует требуемому формату',
|
|
57
|
-
params: { pattern: regex.source, ...options?.params },
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
return null;
|
|
61
|
-
});
|
|
62
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор номера телефона
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/phone
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Адаптер для phone валидатора
|
|
11
|
-
* Поддерживает опциональные поля (string | undefined)
|
|
12
|
-
*
|
|
13
|
-
* @group Validation
|
|
14
|
-
* @category Validators
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* phone(path.phoneNumber);
|
|
19
|
-
* phone(path.phoneNumber, { format: 'ru' });
|
|
20
|
-
* phone(path.phoneNumber, { format: 'international', message: 'Неверный формат телефона' });
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export function phone(fieldPath, options) {
|
|
24
|
-
if (!fieldPath)
|
|
25
|
-
return; // Защита от undefined fieldPath
|
|
26
|
-
const format = options?.format || 'any';
|
|
27
|
-
// Регулярные выражения для разных форматов
|
|
28
|
-
const patterns = {
|
|
29
|
-
// Международный формат: +1234567890 или +1 234 567 8900
|
|
30
|
-
international: /^\+?[1-9]\d{1,14}$/,
|
|
31
|
-
// Российский формат: +7 (XXX) XXX-XX-XX, 8 (XXX) XXX-XX-XX, и вариации
|
|
32
|
-
ru: /^(\+7|7|8)?[\s\-]?\(?[489][0-9]{2}\)?[\s\-]?[0-9]{3}[\s\-]?[0-9]{2}[\s\-]?[0-9]{2}$/,
|
|
33
|
-
// US формат: (123) 456-7890, 123-456-7890, 1234567890
|
|
34
|
-
us: /^(\+?1)?[\s\-]?\(?[2-9]\d{2}\)?[\s\-]?\d{3}[\s\-]?\d{4}$/,
|
|
35
|
-
// Любой формат: минимум 10 цифр с возможными разделителями
|
|
36
|
-
any: /^[\+]?[(]?[0-9]{1,4}[)]?[-\s\.]?[(]?[0-9]{1,4}[)]?[-\s\.]?[0-9]{1,9}$/,
|
|
37
|
-
};
|
|
38
|
-
validate(fieldPath, (value) => {
|
|
39
|
-
if (!value) {
|
|
40
|
-
return null;
|
|
41
|
-
}
|
|
42
|
-
const regex = patterns[format];
|
|
43
|
-
if (!regex.test(value)) {
|
|
44
|
-
const formatMessages = {
|
|
45
|
-
international: 'Введите телефон в международном формате (например, +1234567890)',
|
|
46
|
-
ru: 'Введите российский номер телефона (например, +7 900 123-45-67)',
|
|
47
|
-
us: 'Введите американский номер телефона (например, (123) 456-7890)',
|
|
48
|
-
any: 'Неверный формат телефона',
|
|
49
|
-
};
|
|
50
|
-
return {
|
|
51
|
-
code: 'phone',
|
|
52
|
-
message: options?.message || formatMessages[format],
|
|
53
|
-
params: { format, ...options?.params },
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
return null;
|
|
57
|
-
});
|
|
58
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор обязательного поля
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/required
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Валидатор обязательного поля
|
|
11
|
-
*
|
|
12
|
-
* Проверяет, что поле имеет непустое значение.
|
|
13
|
-
* Пустыми считаются: `null`, `undefined`, `''` (пустая строка).
|
|
14
|
-
* Для boolean полей требуется значение `true`.
|
|
15
|
-
*
|
|
16
|
-
* @group Validation
|
|
17
|
-
* @category Validators
|
|
18
|
-
*
|
|
19
|
-
* @param fieldPath - Путь к полю для валидации
|
|
20
|
-
* @param options - Опции валидации (message, params)
|
|
21
|
-
*
|
|
22
|
-
* @example
|
|
23
|
-
* ```typescript
|
|
24
|
-
* // Базовое использование
|
|
25
|
-
* validationSchema: (path, { validate }) => [
|
|
26
|
-
* required(path.name),
|
|
27
|
-
* required(path.email),
|
|
28
|
-
* ]
|
|
29
|
-
*
|
|
30
|
-
* // С кастомным сообщением
|
|
31
|
-
* required(path.phone, { message: 'Укажите номер телефона' })
|
|
32
|
-
*
|
|
33
|
-
* // Для checkbox (требует true)
|
|
34
|
-
* required(path.agreeToTerms, { message: 'Необходимо принять условия' })
|
|
35
|
-
* ```
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```typescript
|
|
39
|
-
* // Ошибка валидации
|
|
40
|
-
* {
|
|
41
|
-
* code: 'required',
|
|
42
|
-
* message: 'Поле обязательно для заполнения',
|
|
43
|
-
* params: {}
|
|
44
|
-
* }
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
export function required(fieldPath, options) {
|
|
48
|
-
if (!fieldPath)
|
|
49
|
-
return; // Защита от undefined fieldPath
|
|
50
|
-
validate(fieldPath, (value) => {
|
|
51
|
-
// Проверка на пустое значение
|
|
52
|
-
if (value === null || value === undefined || value === '') {
|
|
53
|
-
return {
|
|
54
|
-
code: 'required',
|
|
55
|
-
message: options?.message || 'Поле обязательно для заполнения',
|
|
56
|
-
params: options?.params,
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
// Для булевых значений требуем true
|
|
60
|
-
if (typeof value === 'boolean' && value !== true) {
|
|
61
|
-
return {
|
|
62
|
-
code: 'required',
|
|
63
|
-
message: options?.message || 'Поле обязательно для заполнения',
|
|
64
|
-
params: options?.params,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Валидатор URL
|
|
3
|
-
*
|
|
4
|
-
* @group Validation
|
|
5
|
-
* @category Validators
|
|
6
|
-
* @module validators/url
|
|
7
|
-
*/
|
|
8
|
-
import { validate } from '../core/validate';
|
|
9
|
-
/**
|
|
10
|
-
* Адаптер для URL валидатора
|
|
11
|
-
* Поддерживает опциональные поля (string | undefined)
|
|
12
|
-
*
|
|
13
|
-
* @group Validation
|
|
14
|
-
* @category Validators
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* url(path.website);
|
|
19
|
-
* url(path.website, { message: 'Введите корректный URL' });
|
|
20
|
-
* url(path.website, { requireProtocol: true });
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export function url(fieldPath, options) {
|
|
24
|
-
if (!fieldPath)
|
|
25
|
-
return; // Защита от undefined fieldPath
|
|
26
|
-
// URL regex с опциональным протоколом
|
|
27
|
-
const urlRegexWithProtocol = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/i;
|
|
28
|
-
const urlRegexRequireProtocol = /^https?:\/\/([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/i;
|
|
29
|
-
validate(fieldPath, (value) => {
|
|
30
|
-
if (!value) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
const regex = options?.requireProtocol ? urlRegexRequireProtocol : urlRegexWithProtocol;
|
|
34
|
-
if (!regex.test(value)) {
|
|
35
|
-
return {
|
|
36
|
-
code: 'url',
|
|
37
|
-
message: options?.message || 'Неверный формат URL',
|
|
38
|
-
params: options?.params,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
// Проверка разрешенных протоколов
|
|
42
|
-
if (options?.allowedProtocols && options.allowedProtocols.length > 0) {
|
|
43
|
-
const hasAllowedProtocol = options.allowedProtocols.some((protocol) => value.toLowerCase().startsWith(`${protocol}://`));
|
|
44
|
-
if (!hasAllowedProtocol) {
|
|
45
|
-
return {
|
|
46
|
-
code: 'url_protocol',
|
|
47
|
-
message: options?.message ||
|
|
48
|
-
`URL должен использовать один из протоколов: ${options.allowedProtocols.join(', ')}`,
|
|
49
|
-
params: { allowedProtocols: options.allowedProtocols, ...options?.params },
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return null;
|
|
54
|
-
});
|
|
55
|
-
}
|