@reformer/core 1.0.0-beta.1

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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +143 -0
  3. package/dist/behaviors/compute-from.d.ts +2 -0
  4. package/dist/behaviors/compute-from.js +31 -0
  5. package/dist/behaviors/copy-from.d.ts +2 -0
  6. package/dist/behaviors/copy-from.js +29 -0
  7. package/dist/behaviors/enable-when.d.ts +2 -0
  8. package/dist/behaviors/enable-when.js +25 -0
  9. package/dist/behaviors/reset-when.d.ts +2 -0
  10. package/dist/behaviors/reset-when.js +24 -0
  11. package/dist/behaviors/revalidate-when.d.ts +2 -0
  12. package/dist/behaviors/revalidate-when.js +18 -0
  13. package/dist/behaviors/sync-fields.d.ts +2 -0
  14. package/dist/behaviors/sync-fields.js +41 -0
  15. package/dist/behaviors/transform-value.d.ts +2 -0
  16. package/dist/behaviors/transform-value.js +45 -0
  17. package/dist/behaviors/watch-field.d.ts +2 -0
  18. package/dist/behaviors/watch-field.js +21 -0
  19. package/dist/behaviors.d.ts +6 -0
  20. package/dist/behaviors.js +29 -0
  21. package/dist/core/behavior/behavior-context.d.ts +47 -0
  22. package/dist/core/behavior/behavior-registry.d.ts +85 -0
  23. package/dist/core/behavior/behaviors/compute-from.d.ts +70 -0
  24. package/dist/core/behavior/behaviors/copy-from.d.ts +56 -0
  25. package/dist/core/behavior/behaviors/enable-when.d.ts +118 -0
  26. package/dist/core/behavior/behaviors/index.d.ts +11 -0
  27. package/dist/core/behavior/behaviors/reset-when.d.ts +64 -0
  28. package/dist/core/behavior/behaviors/revalidate-when.d.ts +53 -0
  29. package/dist/core/behavior/behaviors/sync-fields.d.ts +48 -0
  30. package/dist/core/behavior/behaviors/transform-value.d.ts +192 -0
  31. package/dist/core/behavior/behaviors/watch-field.d.ts +80 -0
  32. package/dist/core/behavior/compose-behavior.d.ts +96 -0
  33. package/dist/core/behavior/index.d.ts +11 -0
  34. package/dist/core/behavior/types.d.ts +146 -0
  35. package/dist/core/factories/index.d.ts +6 -0
  36. package/dist/core/factories/node-factory.d.ts +186 -0
  37. package/dist/core/nodes/array-node.d.ts +328 -0
  38. package/dist/core/nodes/field-node.d.ts +294 -0
  39. package/dist/core/nodes/form-node.d.ts +340 -0
  40. package/dist/core/nodes/group-node.d.ts +319 -0
  41. package/dist/core/types/deep-schema.d.ts +68 -0
  42. package/dist/core/types/field-path.d.ts +42 -0
  43. package/dist/core/types/form-context.d.ts +89 -0
  44. package/dist/core/types/form-proxy.d.ts +105 -0
  45. package/dist/core/types/index.d.ts +209 -0
  46. package/dist/core/types/validation-schema.d.ts +95 -0
  47. package/dist/core/utils/abstract-registry.d.ts +74 -0
  48. package/dist/core/utils/aggregate-signals.d.ts +71 -0
  49. package/dist/core/utils/create-form.d.ts +44 -0
  50. package/dist/core/utils/error-handler.d.ts +163 -0
  51. package/dist/core/utils/field-path-navigator.d.ts +240 -0
  52. package/dist/core/utils/field-path.d.ts +60 -0
  53. package/dist/core/utils/form-observer.d.ts +176 -0
  54. package/dist/core/utils/form-proxy-builder.d.ts +25 -0
  55. package/dist/core/utils/form-submitter.d.ts +121 -0
  56. package/dist/core/utils/index.d.ts +22 -0
  57. package/dist/core/utils/registry-helpers.d.ts +43 -0
  58. package/dist/core/utils/registry-stack.d.ts +69 -0
  59. package/dist/core/utils/safe-effect.d.ts +73 -0
  60. package/dist/core/utils/status-machine.d.ts +153 -0
  61. package/dist/core/utils/subscription-manager.d.ts +180 -0
  62. package/dist/core/utils/type-guards.d.ts +98 -0
  63. package/dist/core/utils/unique-id.d.ts +53 -0
  64. package/dist/core/validation/core/apply-when.d.ts +22 -0
  65. package/dist/core/validation/core/apply.d.ts +52 -0
  66. package/dist/core/validation/core/index.d.ts +8 -0
  67. package/dist/core/validation/core/validate-async.d.ts +36 -0
  68. package/dist/core/validation/core/validate-tree.d.ts +35 -0
  69. package/dist/core/validation/core/validate.d.ts +26 -0
  70. package/dist/core/validation/index.d.ts +27 -0
  71. package/dist/core/validation/validate-form.d.ts +48 -0
  72. package/dist/core/validation/validation-applicator.d.ts +70 -0
  73. package/dist/core/validation/validation-context.d.ts +86 -0
  74. package/dist/core/validation/validation-registry.d.ts +142 -0
  75. package/dist/core/validation/validators/array-validators.d.ts +53 -0
  76. package/dist/core/validation/validators/date-utils.d.ts +26 -0
  77. package/dist/core/validation/validators/email.d.ts +37 -0
  78. package/dist/core/validation/validators/future-date.d.ts +35 -0
  79. package/dist/core/validation/validators/index.d.ts +20 -0
  80. package/dist/core/validation/validators/is-date.d.ts +36 -0
  81. package/dist/core/validation/validators/max-age.d.ts +36 -0
  82. package/dist/core/validation/validators/max-date.d.ts +36 -0
  83. package/dist/core/validation/validators/max-length.d.ts +38 -0
  84. package/dist/core/validation/validators/max.d.ts +38 -0
  85. package/dist/core/validation/validators/min-age.d.ts +36 -0
  86. package/dist/core/validation/validators/min-date.d.ts +36 -0
  87. package/dist/core/validation/validators/min-length.d.ts +38 -0
  88. package/dist/core/validation/validators/min.d.ts +38 -0
  89. package/dist/core/validation/validators/number.d.ts +31 -0
  90. package/dist/core/validation/validators/past-date.d.ts +35 -0
  91. package/dist/core/validation/validators/pattern.d.ts +40 -0
  92. package/dist/core/validation/validators/phone.d.ts +27 -0
  93. package/dist/core/validation/validators/required.d.ts +41 -0
  94. package/dist/core/validation/validators/url.d.ts +22 -0
  95. package/dist/date-utils-xUWFslTj.js +29 -0
  96. package/dist/field-path-DuKdGcIE.js +66 -0
  97. package/dist/hooks/types.d.ts +328 -0
  98. package/dist/hooks/useArrayLength.d.ts +31 -0
  99. package/dist/hooks/useFormControl.d.ts +24 -0
  100. package/dist/hooks/useFormControlValue.d.ts +167 -0
  101. package/dist/hooks/useHiddenCondition.d.ts +25 -0
  102. package/dist/hooks/useSignalSubscription.d.ts +17 -0
  103. package/dist/index-D25LsbRm.js +73 -0
  104. package/dist/index.d.ts +17 -0
  105. package/dist/index.js +3271 -0
  106. package/dist/registry-helpers-Bv_BJ1s-.js +615 -0
  107. package/dist/safe-effect-Dh8uw81c.js +20 -0
  108. package/dist/validate-C3XiA_zf.js +10 -0
  109. package/dist/validators/email.d.ts +2 -0
  110. package/dist/validators/email.js +13 -0
  111. package/dist/validators/future-date.d.ts +2 -0
  112. package/dist/validators/future-date.js +20 -0
  113. package/dist/validators/is-date.d.ts +2 -0
  114. package/dist/validators/is-date.js +12 -0
  115. package/dist/validators/max-age.d.ts +2 -0
  116. package/dist/validators/max-age.js +20 -0
  117. package/dist/validators/max-date.d.ts +2 -0
  118. package/dist/validators/max-date.js +20 -0
  119. package/dist/validators/max-length.d.ts +2 -0
  120. package/dist/validators/max-length.js +11 -0
  121. package/dist/validators/max.d.ts +2 -0
  122. package/dist/validators/max.js +11 -0
  123. package/dist/validators/min-age.d.ts +2 -0
  124. package/dist/validators/min-age.js +20 -0
  125. package/dist/validators/min-date.d.ts +2 -0
  126. package/dist/validators/min-date.js +20 -0
  127. package/dist/validators/min-length.d.ts +2 -0
  128. package/dist/validators/min-length.js +11 -0
  129. package/dist/validators/min.d.ts +2 -0
  130. package/dist/validators/min.js +11 -0
  131. package/dist/validators/number.d.ts +2 -0
  132. package/dist/validators/number.js +35 -0
  133. package/dist/validators/past-date.d.ts +2 -0
  134. package/dist/validators/past-date.js +20 -0
  135. package/dist/validators/pattern.d.ts +2 -0
  136. package/dist/validators/pattern.js +11 -0
  137. package/dist/validators/phone.d.ts +2 -0
  138. package/dist/validators/phone.js +35 -0
  139. package/dist/validators/required.d.ts +2 -0
  140. package/dist/validators/required.js +15 -0
  141. package/dist/validators/url.d.ts +2 -0
  142. package/dist/validators/url.js +19 -0
  143. package/dist/validators-BGsNOgT1.js +207 -0
  144. package/dist/validators.d.ts +6 -0
  145. package/dist/validators.js +56 -0
  146. package/llms.txt +9351 -0
  147. package/package.json +166 -0
@@ -0,0 +1,86 @@
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 {};
@@ -0,0 +1,142 @@
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 {};
@@ -0,0 +1,53 @@
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;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Утилиты для работы с датами в валидаторах
3
+ *
4
+ * @group Validation
5
+ * @category Validators
6
+ * @module validators/date-utils
7
+ */
8
+ /**
9
+ * Парсит значение в объект Date
10
+ *
11
+ * @param value - Значение для парсинга (Date, string или undefined)
12
+ * @returns Date объект или null если парсинг не удался
13
+ */
14
+ export declare function parseDate(value: string | Date | null | undefined): Date | null;
15
+ /**
16
+ * Возвращает сегодняшнюю дату с обнулённым временем
17
+ */
18
+ export declare function getToday(): Date;
19
+ /**
20
+ * Нормализует дату, обнуляя время
21
+ */
22
+ export declare function normalizeDate(date: Date): Date;
23
+ /**
24
+ * Вычисляет возраст на основе даты рождения
25
+ */
26
+ export declare function calculateAge(birthDate: Date): number;
@@ -0,0 +1,37 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Валидатор формата email
5
+ *
6
+ * Проверяет, что значение соответствует формату email адреса.
7
+ * Пустые значения пропускаются (используйте `required` для обязательности).
8
+ *
9
+ * @group Validation
10
+ * @category Validators
11
+ *
12
+ * @param fieldPath - Путь к полю для валидации
13
+ * @param options - Опции валидации (message, params)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Базовое использование
18
+ * validationSchema: (path) => [
19
+ * required(path.email),
20
+ * email(path.email),
21
+ * ]
22
+ *
23
+ * // С кастомным сообщением
24
+ * email(path.email, { message: 'Введите корректный email адрес' })
25
+ * ```
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Ошибка валидации
30
+ * {
31
+ * code: 'email',
32
+ * message: 'Неверный формат email',
33
+ * params: {}
34
+ * }
35
+ * ```
36
+ */
37
+ export declare function email<TForm, TField extends string | null | undefined = string>(fieldPath: FieldPathNode<TForm, TField> | undefined, options?: ValidateOptions): void;
@@ -0,0 +1,35 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Проверяет, что дата находится в будущем (не в прошлом)
5
+ *
6
+ * Пустые значения и невалидные даты пропускаются (используйте `required` и `isDate`).
7
+ *
8
+ * @group Validation
9
+ * @category Validators
10
+ *
11
+ * @param fieldPath - Путь к полю для валидации
12
+ * @param options - Опции валидации (message, params)
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Базовое использование - дата события должна быть в будущем
17
+ * validationSchema: (path) => [
18
+ * futureDate(path.eventDate),
19
+ * ]
20
+ *
21
+ * // С кастомным сообщением
22
+ * futureDate(path.appointmentDate, { message: 'Дата записи должна быть в будущем' })
23
+ * ```
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * // Ошибка валидации
28
+ * {
29
+ * code: 'date_past',
30
+ * message: 'Дата не может быть в прошлом',
31
+ * params: {}
32
+ * }
33
+ * ```
34
+ */
35
+ export declare function futureDate<TForm, TField extends string | Date | undefined = string | Date>(fieldPath: FieldPathNode<TForm, TField> | undefined, options?: ValidateOptions): void;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Reusable validators
3
+ */
4
+ export { required } from './required';
5
+ export { min } from './min';
6
+ export { max } from './max';
7
+ export { minLength } from './min-length';
8
+ export { maxLength } from './max-length';
9
+ export { email } from './email';
10
+ export { pattern } from './pattern';
11
+ export { url } from './url';
12
+ export { phone, type PhoneFormat } from './phone';
13
+ export { number } from './number';
14
+ export { isDate } from './is-date';
15
+ export { minDate } from './min-date';
16
+ export { maxDate } from './max-date';
17
+ export { pastDate } from './past-date';
18
+ export { futureDate } from './future-date';
19
+ export { minAge } from './min-age';
20
+ export { maxAge } from './max-age';
@@ -0,0 +1,36 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Проверяет, что значение является валидной датой
5
+ *
6
+ * Пустые значения пропускаются (используйте `required` для обязательности).
7
+ *
8
+ * @group Validation
9
+ * @category Validators
10
+ *
11
+ * @param fieldPath - Путь к полю для валидации
12
+ * @param options - Опции валидации (message, params)
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * // Базовое использование
17
+ * validationSchema: (path) => [
18
+ * isDate(path.birthDate),
19
+ * isDate(path.eventDate),
20
+ * ]
21
+ *
22
+ * // С кастомным сообщением
23
+ * isDate(path.birthDate, { message: 'Введите корректную дату' })
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Ошибка валидации
29
+ * {
30
+ * code: 'date_invalid',
31
+ * message: 'Неверный формат даты',
32
+ * params: {}
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function isDate<TForm, TField extends string | Date | undefined = string | Date>(fieldPath: FieldPathNode<TForm, TField> | undefined, options?: ValidateOptions): void;
@@ -0,0 +1,36 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Проверяет, что возраст (вычисленный из даты рождения) не больше указанного
5
+ *
6
+ * Пустые значения и невалидные даты пропускаются (используйте `required` и `isDate`).
7
+ *
8
+ * @group Validation
9
+ * @category Validators
10
+ *
11
+ * @param fieldPath - Путь к полю для валидации (дата рождения)
12
+ * @param maxAgeValue - Максимально допустимый возраст в годах
13
+ * @param options - Опции валидации (message, params)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Базовое использование - максимум 65 лет
18
+ * validationSchema: (path) => [
19
+ * maxAge(path.birthDate, 65),
20
+ * ]
21
+ *
22
+ * // С кастомным сообщением
23
+ * maxAge(path.birthDate, 100, { message: 'Проверьте правильность даты рождения' })
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Ошибка валидации
29
+ * {
30
+ * code: 'date_max_age',
31
+ * message: 'Максимальный возраст: 65 лет',
32
+ * params: { maxAge: 65, currentAge: 70 }
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function maxAge<TForm, TField extends string | Date | null | undefined = string | Date>(fieldPath: FieldPathNode<TForm, TField> | undefined, maxAgeValue: number, options?: ValidateOptions): void;
@@ -0,0 +1,36 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Проверяет, что дата не позже указанной максимальной
5
+ *
6
+ * Пустые значения и невалидные даты пропускаются (используйте `required` и `isDate`).
7
+ *
8
+ * @group Validation
9
+ * @category Validators
10
+ *
11
+ * @param fieldPath - Путь к полю для валидации
12
+ * @param maxDateValue - Максимально допустимая дата (включительно)
13
+ * @param options - Опции валидации (message, params)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Базовое использование
18
+ * validationSchema: (path) => [
19
+ * maxDate(path.birthDate, new Date()), // Не позже сегодня
20
+ * ]
21
+ *
22
+ * // С кастомным сообщением
23
+ * maxDate(path.endDate, new Date('2025-12-31'), { message: 'Дата не может быть позже конца года' })
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Ошибка валидации
29
+ * {
30
+ * code: 'date_max',
31
+ * message: 'Дата должна быть не позднее 31.12.2025',
32
+ * params: { maxDate: Date }
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function maxDate<TForm, TField extends string | Date | null | undefined = string | Date>(fieldPath: FieldPathNode<TForm, TField> | undefined, maxDateValue: Date, options?: ValidateOptions): void;
@@ -0,0 +1,38 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Валидатор максимальной длины строки
5
+ *
6
+ * Проверяет, что длина строки не превышает указанный максимум.
7
+ * Пустые значения пропускаются (используйте `required` для обязательности).
8
+ *
9
+ * @group Validation
10
+ * @category Validators
11
+ *
12
+ * @param fieldPath - Путь к полю для валидации
13
+ * @param maxLen - Максимальная допустимая длина строки
14
+ * @param options - Опции валидации (message, params)
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Базовое использование
19
+ * validationSchema: (path) => [
20
+ * maxLength(path.name, 50),
21
+ * maxLength(path.bio, 500),
22
+ * ]
23
+ *
24
+ * // С кастомным сообщением
25
+ * maxLength(path.bio, 500, { message: 'Максимум 500 символов' })
26
+ * ```
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // Ошибка валидации
31
+ * {
32
+ * code: 'maxLength',
33
+ * message: 'Максимальная длина: 500 символов',
34
+ * params: { maxLength: 500, actualLength: 512 }
35
+ * }
36
+ * ```
37
+ */
38
+ export declare function maxLength<TForm, TField extends string | null | undefined = string>(fieldPath: FieldPathNode<TForm, TField> | undefined, maxLen: number, options?: ValidateOptions): void;
@@ -0,0 +1,38 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Валидатор максимального числового значения
5
+ *
6
+ * Проверяет, что числовое значение не превышает указанный максимум.
7
+ * Пустые значения пропускаются (используйте `required` для обязательности).
8
+ *
9
+ * @group Validation
10
+ * @category Validators
11
+ *
12
+ * @param fieldPath - Путь к полю для валидации
13
+ * @param maxValue - Максимально допустимое значение
14
+ * @param options - Опции валидации (message, params)
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * // Базовое использование
19
+ * validationSchema: (path) => [
20
+ * max(path.quantity, 100),
21
+ * max(path.discount, 50),
22
+ * ]
23
+ *
24
+ * // С кастомным сообщением
25
+ * max(path.quantity, 100, { message: 'Максимум 100 единиц' })
26
+ * ```
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // Ошибка валидации
31
+ * {
32
+ * code: 'max',
33
+ * message: 'Максимальное значение: 100',
34
+ * params: { max: 100, actual: 150 }
35
+ * }
36
+ * ```
37
+ */
38
+ export declare function max<TForm, TField extends number | null | undefined = number>(fieldPath: FieldPathNode<TForm, TField> | undefined, maxValue: number, options?: ValidateOptions): void;
@@ -0,0 +1,36 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Проверяет, что возраст (вычисленный из даты рождения) не меньше указанного
5
+ *
6
+ * Пустые значения и невалидные даты пропускаются (используйте `required` и `isDate`).
7
+ *
8
+ * @group Validation
9
+ * @category Validators
10
+ *
11
+ * @param fieldPath - Путь к полю для валидации (дата рождения)
12
+ * @param minAgeValue - Минимально допустимый возраст в годах
13
+ * @param options - Опции валидации (message, params)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Базовое использование - минимум 18 лет
18
+ * validationSchema: (path) => [
19
+ * minAge(path.birthDate, 18),
20
+ * ]
21
+ *
22
+ * // С кастомным сообщением
23
+ * minAge(path.birthDate, 21, { message: 'Вам должно быть не менее 21 года' })
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Ошибка валидации
29
+ * {
30
+ * code: 'date_min_age',
31
+ * message: 'Минимальный возраст: 18 лет',
32
+ * params: { minAge: 18, currentAge: 16 }
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function minAge<TForm, TField extends string | Date | null | undefined = string | Date>(fieldPath: FieldPathNode<TForm, TField> | undefined, minAgeValue: number, options?: ValidateOptions): void;
@@ -0,0 +1,36 @@
1
+ import { ValidateOptions } from '../../types/validation-schema';
2
+ import { FieldPathNode } from '../../types';
3
+ /**
4
+ * Проверяет, что дата не раньше указанной минимальной
5
+ *
6
+ * Пустые значения и невалидные даты пропускаются (используйте `required` и `isDate`).
7
+ *
8
+ * @group Validation
9
+ * @category Validators
10
+ *
11
+ * @param fieldPath - Путь к полю для валидации
12
+ * @param minDateValue - Минимально допустимая дата (включительно)
13
+ * @param options - Опции валидации (message, params)
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * // Базовое использование
18
+ * validationSchema: (path) => [
19
+ * minDate(path.eventDate, new Date('2024-01-01')),
20
+ * ]
21
+ *
22
+ * // С кастомным сообщением
23
+ * minDate(path.startDate, new Date(), { message: 'Дата должна быть не раньше сегодня' })
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * // Ошибка валидации
29
+ * {
30
+ * code: 'date_min',
31
+ * message: 'Дата должна быть не ранее 01.01.2024',
32
+ * params: { minDate: Date }
33
+ * }
34
+ * ```
35
+ */
36
+ export declare function minDate<TForm, TField extends string | Date | null | undefined = string | Date>(fieldPath: FieldPathNode<TForm, TField> | undefined, minDateValue: Date, options?: ValidateOptions): void;