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