@reformer/core 1.1.0-beta.7 → 1.1.0-beta.8

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.
Files changed (80) hide show
  1. package/dist/behaviors-BRaiR-UY.js +528 -0
  2. package/dist/behaviors.d.ts +6 -2
  3. package/dist/behaviors.js +18 -227
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.js +3380 -10
  6. package/dist/validators-DjXtDVoE.js +455 -0
  7. package/dist/validators.d.ts +6 -2
  8. package/dist/validators.js +29 -281
  9. package/package.json +1 -1
  10. package/dist/core/behavior/behavior-applicator.js +0 -92
  11. package/dist/core/behavior/behavior-context.js +0 -43
  12. package/dist/core/behavior/behavior-registry.js +0 -198
  13. package/dist/core/behavior/behaviors/compute-from.js +0 -84
  14. package/dist/core/behavior/behaviors/copy-from.js +0 -64
  15. package/dist/core/behavior/behaviors/enable-when.js +0 -81
  16. package/dist/core/behavior/behaviors/index.js +0 -11
  17. package/dist/core/behavior/behaviors/reset-when.js +0 -63
  18. package/dist/core/behavior/behaviors/revalidate-when.js +0 -51
  19. package/dist/core/behavior/behaviors/sync-fields.js +0 -66
  20. package/dist/core/behavior/behaviors/transform-value.js +0 -110
  21. package/dist/core/behavior/behaviors/watch-field.js +0 -56
  22. package/dist/core/behavior/compose-behavior.js +0 -166
  23. package/dist/core/behavior/create-field-path.js +0 -69
  24. package/dist/core/behavior/index.js +0 -17
  25. package/dist/core/behavior/types.js +0 -7
  26. package/dist/core/context/form-context-impl.js +0 -37
  27. package/dist/core/factories/index.js +0 -6
  28. package/dist/core/factories/node-factory.js +0 -281
  29. package/dist/core/nodes/array-node.js +0 -534
  30. package/dist/core/nodes/field-node.js +0 -510
  31. package/dist/core/nodes/form-node.js +0 -343
  32. package/dist/core/nodes/group-node/field-registry.js +0 -215
  33. package/dist/core/nodes/group-node/index.js +0 -11
  34. package/dist/core/nodes/group-node/proxy-builder.js +0 -161
  35. package/dist/core/nodes/group-node/state-manager.js +0 -265
  36. package/dist/core/nodes/group-node.js +0 -770
  37. package/dist/core/types/deep-schema.js +0 -11
  38. package/dist/core/types/field-path.js +0 -4
  39. package/dist/core/types/form-context.js +0 -25
  40. package/dist/core/types/group-node-proxy.js +0 -31
  41. package/dist/core/types/index.js +0 -4
  42. package/dist/core/types/validation-schema.js +0 -10
  43. package/dist/core/utils/create-form.js +0 -24
  44. package/dist/core/utils/debounce.js +0 -197
  45. package/dist/core/utils/error-handler.js +0 -226
  46. package/dist/core/utils/field-path-navigator.js +0 -374
  47. package/dist/core/utils/index.js +0 -14
  48. package/dist/core/utils/registry-helpers.js +0 -79
  49. package/dist/core/utils/registry-stack.js +0 -86
  50. package/dist/core/utils/resources.js +0 -69
  51. package/dist/core/utils/subscription-manager.js +0 -214
  52. package/dist/core/utils/type-guards.js +0 -169
  53. package/dist/core/validation/core/apply-when.js +0 -41
  54. package/dist/core/validation/core/apply.js +0 -38
  55. package/dist/core/validation/core/index.js +0 -8
  56. package/dist/core/validation/core/validate-async.js +0 -45
  57. package/dist/core/validation/core/validate-tree.js +0 -43
  58. package/dist/core/validation/core/validate.js +0 -38
  59. package/dist/core/validation/field-path.js +0 -147
  60. package/dist/core/validation/index.js +0 -33
  61. package/dist/core/validation/validate-form.js +0 -152
  62. package/dist/core/validation/validation-applicator.js +0 -217
  63. package/dist/core/validation/validation-context.js +0 -75
  64. package/dist/core/validation/validation-registry.js +0 -298
  65. package/dist/core/validation/validators/array-validators.js +0 -86
  66. package/dist/core/validation/validators/date.js +0 -117
  67. package/dist/core/validation/validators/email.js +0 -60
  68. package/dist/core/validation/validators/index.js +0 -14
  69. package/dist/core/validation/validators/max-length.js +0 -60
  70. package/dist/core/validation/validators/max.js +0 -60
  71. package/dist/core/validation/validators/min-length.js +0 -60
  72. package/dist/core/validation/validators/min.js +0 -60
  73. package/dist/core/validation/validators/number.js +0 -90
  74. package/dist/core/validation/validators/pattern.js +0 -62
  75. package/dist/core/validation/validators/phone.js +0 -58
  76. package/dist/core/validation/validators/required.js +0 -69
  77. package/dist/core/validation/validators/url.js +0 -55
  78. package/dist/create-field-path-nXfTtl55.js +0 -283
  79. package/dist/hooks/useFormControl.js +0 -298
  80. package/dist/validation-context-cWXmh_Ho.js +0 -156
@@ -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
- }