@reformer/core 5.0.2 → 6.0.0

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 (131) hide show
  1. package/README.md +7 -5
  2. package/dist/behaviors-O9a1Djj9.js +147 -0
  3. package/dist/behaviors.d.ts +131 -4
  4. package/dist/behaviors.js +298 -27
  5. package/dist/core/model/behaviors.d.ts +123 -0
  6. package/dist/core/model/form-model.d.ts +18 -0
  7. package/dist/core/model/index.d.ts +12 -0
  8. package/dist/core/model/types.d.ts +112 -0
  9. package/dist/core/model/validate-model.d.ts +46 -0
  10. package/dist/core/nodes/array-node.d.ts +34 -2
  11. package/dist/core/nodes/group-node.d.ts +19 -71
  12. package/dist/core/nodes/model-array-node.d.ts +71 -0
  13. package/dist/core/types/deep-schema.d.ts +16 -2
  14. package/dist/core/types/form-proxy.d.ts +17 -6
  15. package/dist/core/types/index.d.ts +5 -23
  16. package/dist/core/types/validation-schema.d.ts +15 -66
  17. package/dist/core/utils/create-form.d.ts +24 -0
  18. package/dist/core/utils/derived-registry.d.ts +5 -0
  19. package/dist/core/utils/index.d.ts +4 -4
  20. package/dist/core/utils/signal-node-registry.d.ts +12 -0
  21. package/dist/core/utils/type-guards.d.ts +2 -3
  22. package/dist/core/validation/index.d.ts +5 -11
  23. package/dist/core/validation/validators/email.d.ts +5 -29
  24. package/dist/core/validation/validators/future-date.d.ts +6 -28
  25. package/dist/core/validation/validators/index.d.ts +11 -4
  26. package/dist/core/validation/validators/integer.d.ts +13 -0
  27. package/dist/core/validation/validators/is-date.d.ts +5 -28
  28. package/dist/core/validation/validators/is-number.d.ts +14 -0
  29. package/dist/core/validation/validators/max-age.d.ts +6 -29
  30. package/dist/core/validation/validators/max-date.d.ts +6 -29
  31. package/dist/core/validation/validators/max-length.d.ts +5 -30
  32. package/dist/core/validation/validators/max.d.ts +7 -29
  33. package/dist/core/validation/validators/min-age.d.ts +6 -29
  34. package/dist/core/validation/validators/min-date.d.ts +6 -29
  35. package/dist/core/validation/validators/min-length.d.ts +5 -30
  36. package/dist/core/validation/validators/min.d.ts +7 -29
  37. package/dist/core/validation/validators/multiple-of.d.ts +13 -0
  38. package/dist/core/validation/validators/non-negative.d.ts +13 -0
  39. package/dist/core/validation/validators/non-zero.d.ts +13 -0
  40. package/dist/core/validation/validators/past-date.d.ts +5 -28
  41. package/dist/core/validation/validators/pattern.d.ts +5 -32
  42. package/dist/core/validation/validators/phone.d.ts +9 -19
  43. package/dist/core/validation/validators/required.d.ts +10 -31
  44. package/dist/core/validation/validators/url.d.ts +13 -15
  45. package/dist/index.d.ts +3 -4
  46. package/dist/index.js +1299 -875
  47. package/dist/validators/email.js +7 -9
  48. package/dist/validators/future-date.js +11 -12
  49. package/dist/validators/integer.d.ts +2 -0
  50. package/dist/validators/integer.js +10 -0
  51. package/dist/validators/is-date.js +6 -7
  52. package/dist/validators/is-number.d.ts +2 -0
  53. package/dist/validators/is-number.js +10 -0
  54. package/dist/validators/max-age.js +11 -12
  55. package/dist/validators/max-date.js +11 -12
  56. package/dist/validators/max-length.js +12 -8
  57. package/dist/validators/max.js +5 -6
  58. package/dist/validators/min-age.js +10 -11
  59. package/dist/validators/min-date.js +12 -13
  60. package/dist/validators/min-length.js +12 -8
  61. package/dist/validators/min.js +6 -7
  62. package/dist/validators/multiple-of.d.ts +2 -0
  63. package/dist/validators/multiple-of.js +10 -0
  64. package/dist/validators/non-negative.d.ts +2 -0
  65. package/dist/validators/non-negative.js +10 -0
  66. package/dist/validators/non-zero.d.ts +2 -0
  67. package/dist/validators/non-zero.js +10 -0
  68. package/dist/validators/past-date.js +11 -12
  69. package/dist/validators/pattern.js +6 -7
  70. package/dist/validators/phone.js +14 -32
  71. package/dist/validators/required.js +9 -10
  72. package/dist/validators/url.js +19 -16
  73. package/dist/validators.js +67 -54
  74. package/llms.txt +959 -2584
  75. package/package.json +19 -35
  76. package/dist/behaviors/compute-from.d.ts +0 -2
  77. package/dist/behaviors/compute-from.js +0 -31
  78. package/dist/behaviors/copy-from.d.ts +0 -2
  79. package/dist/behaviors/copy-from.js +0 -29
  80. package/dist/behaviors/enable-when.d.ts +0 -2
  81. package/dist/behaviors/enable-when.js +0 -25
  82. package/dist/behaviors/reset-when.d.ts +0 -2
  83. package/dist/behaviors/reset-when.js +0 -24
  84. package/dist/behaviors/revalidate-when.d.ts +0 -2
  85. package/dist/behaviors/revalidate-when.js +0 -18
  86. package/dist/behaviors/sync-fields.d.ts +0 -2
  87. package/dist/behaviors/sync-fields.js +0 -41
  88. package/dist/behaviors/transform-value.d.ts +0 -2
  89. package/dist/behaviors/transform-value.js +0 -45
  90. package/dist/behaviors/watch-field.d.ts +0 -2
  91. package/dist/behaviors/watch-field.js +0 -21
  92. package/dist/core/behavior/behavior-context.d.ts +0 -47
  93. package/dist/core/behavior/behavior-registry.d.ts +0 -85
  94. package/dist/core/behavior/behaviors/compute-from.d.ts +0 -70
  95. package/dist/core/behavior/behaviors/copy-from.d.ts +0 -56
  96. package/dist/core/behavior/behaviors/enable-when.d.ts +0 -118
  97. package/dist/core/behavior/behaviors/index.d.ts +0 -11
  98. package/dist/core/behavior/behaviors/reset-when.d.ts +0 -64
  99. package/dist/core/behavior/behaviors/revalidate-when.d.ts +0 -53
  100. package/dist/core/behavior/behaviors/sync-fields.d.ts +0 -48
  101. package/dist/core/behavior/behaviors/transform-value.d.ts +0 -192
  102. package/dist/core/behavior/behaviors/watch-field.d.ts +0 -80
  103. package/dist/core/behavior/compose-behavior.d.ts +0 -96
  104. package/dist/core/behavior/index.d.ts +0 -11
  105. package/dist/core/behavior/types.d.ts +0 -146
  106. package/dist/core/types/field-path.d.ts +0 -42
  107. package/dist/core/types/form-context.d.ts +0 -89
  108. package/dist/core/utils/field-path-navigator.d.ts +0 -240
  109. package/dist/core/utils/field-path.d.ts +0 -60
  110. package/dist/core/utils/registry-helpers.d.ts +0 -43
  111. package/dist/core/validation/core/apply-when.d.ts +0 -22
  112. package/dist/core/validation/core/apply.d.ts +0 -52
  113. package/dist/core/validation/core/index.d.ts +0 -8
  114. package/dist/core/validation/core/validate-async.d.ts +0 -36
  115. package/dist/core/validation/core/validate-tree.d.ts +0 -35
  116. package/dist/core/validation/core/validate.d.ts +0 -26
  117. package/dist/core/validation/validate-form.d.ts +0 -48
  118. package/dist/core/validation/validation-applicator.d.ts +0 -70
  119. package/dist/core/validation/validation-context.d.ts +0 -86
  120. package/dist/core/validation/validation-registry.d.ts +0 -142
  121. package/dist/core/validation/validators/array-validators.d.ts +0 -53
  122. package/dist/core/validation/validators/number.d.ts +0 -31
  123. package/dist/field-path-DuKdGcIE.js +0 -66
  124. package/dist/hooks/useHiddenCondition.d.ts +0 -25
  125. package/dist/index-D25LsbRm.js +0 -73
  126. package/dist/registry-helpers-Bv_BJ1s-.js +0 -615
  127. package/dist/safe-effect-Dh8uw81c.js +0 -20
  128. package/dist/validate-C3XiA_zf.js +0 -10
  129. package/dist/validators/number.d.ts +0 -2
  130. package/dist/validators/number.js +0 -35
  131. package/dist/validators-BGsNOgT1.js +0 -207
@@ -1,52 +0,0 @@
1
- import { FieldPathNode, FieldPath } from '../../types';
2
- import { ValidationSchemaFn } from '../../types/validation-schema';
3
- /**
4
- * Применить validation схему к корневому path формы
5
- *
6
- * Используется для композиции схем на уровне всей формы.
7
- *
8
- * @group Validation
9
- * @category Core Functions
10
- *
11
- * @param path - Корневой FieldPath формы (весь объект путей)
12
- * @param validationSchema - Схема валидации
13
- *
14
- * @example
15
- * ```typescript
16
- * const creditApplicationValidation: ValidationSchemaFn<CreditApplicationForm> = (path) => {
17
- * apply(path, basicInfoValidation);
18
- * apply(path, contactInfoValidation);
19
- * };
20
- * ```
21
- */
22
- export declare function apply<TForm>(path: FieldPath<TForm>, validationSchema: ValidationSchemaFn<TForm>): void;
23
- /**
24
- * Применить validation схему к вложенному полю или полям
25
- *
26
- * Поддерживает:
27
- * - Одно поле или массив полей
28
- * - Одну схему или массив схем
29
- * - Все комбинации (поле + схема, поле + схемы, поля + схема, поля + схемы)
30
- *
31
- * @param fields - Одно поле или массив полей
32
- * @param validationSchemas - Одна схема или массив схем
33
- *
34
- * @example
35
- * ```typescript
36
- * // Одна схема к одному полю
37
- * apply(path.registrationAddress, addressValidation);
38
- *
39
- * // Одна схема к нескольким полям
40
- * apply([path.homeAddress, path.workAddress], addressValidation);
41
- *
42
- * // Несколько схем к одному полю
43
- * apply(path.email, [emailValidation, uniqueEmailValidation]);
44
- *
45
- * // Несколько схем к нескольким полям
46
- * apply(
47
- * [path.email, path.confirmEmail],
48
- * [emailValidation, matchValidation]
49
- * );
50
- * ```
51
- */
52
- export declare function apply<TForm, TField>(fields: FieldPathNode<TForm, TField> | Array<FieldPathNode<TForm, TField> | undefined> | undefined, validationSchemas: ValidationSchemaFn<TField> | Array<ValidationSchemaFn<TField>>): void;
@@ -1,8 +0,0 @@
1
- /**
2
- * Core validation functions
3
- */
4
- export { validate } from './validate';
5
- export { validateAsync } from './validate-async';
6
- export { validateTree } from './validate-tree';
7
- export { applyWhen } from './apply-when';
8
- export { apply } from './apply';
@@ -1,36 +0,0 @@
1
- import { ContextualAsyncValidatorFn, ValidateAsyncOptions } from '../../types/validation-schema';
2
- import { FieldPathNode } from '../../types';
3
- /**
4
- * Зарегистрировать асинхронный валидатор для поля
5
- *
6
- * @group Validation
7
- * @category Core Functions
8
- *
9
- * @example
10
- * ```typescript
11
- * validateAsync(
12
- * path.inn,
13
- * async (ctx: ValidationContext<TForm, TField>) => {
14
- * const inn = ctx.value();
15
- * if (!inn) return null;
16
- *
17
- * const response = await fetch('/api/validate-inn', {
18
- * method: 'POST',
19
- * body: JSON.stringify({ inn }),
20
- * });
21
- *
22
- * const data = await response.json();
23
- * if (!data.valid) {
24
- * return {
25
- * code: 'invalidInn',
26
- * message: 'ИНН не найден в базе данных ФНС',
27
- * };
28
- * }
29
- *
30
- * return null;
31
- * },
32
- * { debounce: 1000 }
33
- * );
34
- * ```
35
- */
36
- export declare function validateAsync<TForm, TField>(fieldPath: FieldPathNode<TForm, TField>, validatorFn: ContextualAsyncValidatorFn<TForm, TField>, options?: ValidateAsyncOptions): void;
@@ -1,35 +0,0 @@
1
- import { TreeValidatorFn, ValidateTreeOptions } from '../../types';
2
- /**
3
- * Зарегистрировать cross-field валидатор
4
- *
5
- * Используется для валидации, которая зависит от нескольких полей
6
- *
7
- * @group Validation
8
- * @category Core Functions
9
- *
10
- * @remarks
11
- * Параметр `ctx` в callback требует явной типизации для корректного вывода типов:
12
- * ```typescript
13
- * validateTree((ctx: { form: MyFormType }) => { ... });
14
- * ```
15
- *
16
- * @example
17
- * ```typescript
18
- * // Явная типизация ctx для избежания implicit any
19
- * validateTree(
20
- * (ctx: { form: MyForm }) => {
21
- * if (ctx.form.initialPayment && ctx.form.propertyValue) {
22
- * if (ctx.form.initialPayment > ctx.form.propertyValue) {
23
- * return {
24
- * code: 'initialPaymentTooHigh',
25
- * message: 'Первоначальный взнос не может превышать стоимость',
26
- * };
27
- * }
28
- * }
29
- * return null;
30
- * },
31
- * { targetField: 'initialPayment' }
32
- * );
33
- * ```
34
- */
35
- export declare function validateTree<TForm>(validatorFn: TreeValidatorFn<TForm>, options?: ValidateTreeOptions): void;
@@ -1,26 +0,0 @@
1
- import { ContextualValidatorFn, FieldPathNode, ValidateOptions } from '../../types';
2
- /**
3
- * Зарегистрировать кастомный синхронный валидатор для поля
4
- * Поддерживает опциональные поля
5
- *
6
- * @group Validation
7
- * @category Core Functions
8
- *
9
- * @example
10
- * ```typescript
11
- * validate(path.birthDate, (ctx: ValidationContext<TForm, TField>) => {
12
- * const birthDate = new Date(ctx.value());
13
- * const age = calculateAge(birthDate);
14
- *
15
- * if (age < 18) {
16
- * return {
17
- * code: 'tooYoung',
18
- * message: 'Заемщику должно быть не менее 18 лет',
19
- * };
20
- * }
21
- *
22
- * return null;
23
- * });
24
- * ```
25
- */
26
- export declare function validate<TForm, TField>(fieldPath: FieldPathNode<TForm, TField> | undefined, validatorFn: ContextualValidatorFn<TForm, TField>, options?: ValidateOptions): void;
@@ -1,48 +0,0 @@
1
- import { GroupNode } from '../nodes/group-node';
2
- import { ValidationSchemaFn, FormFields } from '../types';
3
- /**
4
- * Валидировать форму в соответствии с указанной схемой
5
- *
6
- * Функция создает временный контекст валидации, применяет валидаторы
7
- * из схемы и очищает контекст без сохранения в реестр.
8
- *
9
- * @param form - GroupNode для валидации
10
- * @param schema - Схема валидации (ValidationSchemaFn)
11
- * @returns Promise<boolean> - `true` если форма валидна, `false` если есть ошибки
12
- *
13
- * @example Multi-step форма: валидация текущего шага
14
- * ```typescript
15
- * const goToNextStep = async () => {
16
- * const isValid = await validateForm(form, step1LoanValidation);
17
- *
18
- * if (!isValid) {
19
- * form.markAsTouched(); // Показать ошибки
20
- * return false;
21
- * }
22
- *
23
- * setCurrentStep(2);
24
- * return true;
25
- * };
26
- * ```
27
- *
28
- * @example Полная валидация перед submit
29
- * ```typescript
30
- * const handleSubmit = async () => {
31
- * const isValid = await validateForm(form, fullValidationSchema);
32
- *
33
- * if (isValid) {
34
- * await form.submit(onSubmit);
35
- * }
36
- * };
37
- * ```
38
- *
39
- * @example Условная валидация
40
- * ```typescript
41
- * const schema = isBusinessAccount
42
- * ? businessValidation
43
- * : personalValidation;
44
- *
45
- * const isValid = await validateForm(form, schema);
46
- * ```
47
- */
48
- export declare function validateForm<T extends FormFields>(form: GroupNode<T>, schema: ValidationSchemaFn<T>): Promise<boolean>;
@@ -1,70 +0,0 @@
1
- import { GroupNode } from '../nodes/group-node';
2
- import { ValidatorRegistration } from '../types';
3
- /**
4
- * Класс для применения валидаторов к форме
5
- *
6
- * Выполняет:
7
- * - Группировку валидаторов по полям
8
- * - Фильтрацию по условиям (condition)
9
- * - Применение sync/async валидаторов к FieldNode
10
- * - Применение tree валидаторов (кросс-полевая валидация)
11
- *
12
- * @template T Тип формы (объект)
13
- */
14
- export declare class ValidationApplicator<T> {
15
- private readonly form;
16
- constructor(form: GroupNode<T>);
17
- /**
18
- * Применить валидаторы к полям формы
19
- *
20
- * Этапы применения:
21
- * 1. Разделение валидаторов на field и tree
22
- * 2. Применение field валидаторов (sync/async)
23
- * 3. Применение tree валидаторов (кросс-полевая валидация)
24
- *
25
- * @param validators Зарегистрированные валидаторы
26
- */
27
- apply(validators: ValidatorRegistration[]): Promise<void>;
28
- /**
29
- * Группировка валидаторов по типам
30
- *
31
- * Разделяет валидаторы на:
32
- * - Field validators (sync/async) - группируются по fieldPath
33
- * - Tree validators - применяются ко всей форме
34
- *
35
- * @param validators Все зарегистрированные валидаторы
36
- * @returns Сгруппированные валидаторы
37
- */
38
- private groupValidators;
39
- /**
40
- * Применение field валидаторов к полям
41
- *
42
- * Для каждого поля:
43
- * 1. Найти FieldNode по пути
44
- * 2. Проверить условия (condition)
45
- * 3. Выполнить sync/async валидаторы
46
- * 4. Установить ошибки на поле
47
- *
48
- * @param validatorsByField Валидаторы, сгруппированные по полям
49
- */
50
- private applyFieldValidators;
51
- /**
52
- * Применение tree валидаторов (кросс-полевая валидация)
53
- *
54
- * Tree валидаторы имеют доступ ко всей форме через TreeValidationContext.
55
- * Ошибки устанавливаются на targetField (если указано).
56
- *
57
- * @param treeValidators Список tree валидаторов
58
- */
59
- private applyTreeValidators;
60
- /**
61
- * Проверка условия (condition) для валидатора
62
- *
63
- * Условие определяет, должен ли валидатор выполняться.
64
- * Использует getFieldByPath для поддержки вложенных путей.
65
- *
66
- * @param condition Условие валидатора
67
- * @returns true, если условие выполнено
68
- */
69
- private checkCondition;
70
- }
@@ -1,86 +0,0 @@
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 {};
@@ -1,142 +0,0 @@
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 {};
@@ -1,53 +0,0 @@
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;
@@ -1,31 +0,0 @@
1
- import { ValidateOptions } from '../../types/validation-schema';
2
- import { FieldPathNode } from '../../types';
3
- /**
4
- * Адаптер для number валидатора
5
- * Проверяет, что значение является числом и соответствует заданным ограничениям
6
- *
7
- * @group Validation
8
- * @category Validators
9
- *
10
- * @example
11
- * ```typescript
12
- * number(path.age);
13
- * number(path.price, { min: 0, max: 1000000 });
14
- * number(path.percentage, { min: 0, max: 100, integer: true });
15
- * number(path.rating, { min: 0, max: 5, multipleOf: 0.5 });
16
- * ```
17
- */
18
- export declare function number<TForm, TField extends number | undefined = number>(fieldPath: FieldPathNode<TForm, TField> | undefined, options?: ValidateOptions & {
19
- /** Минимальное значение (включительно) */
20
- min?: number;
21
- /** Максимальное значение (включительно) */
22
- max?: number;
23
- /** Требовать целое число */
24
- integer?: boolean;
25
- /** Значение должно быть кратно этому числу */
26
- multipleOf?: number;
27
- /** Разрешить отрицательные числа (по умолчанию true) */
28
- allowNegative?: boolean;
29
- /** Разрешить ноль (по умолчанию true) */
30
- allowZero?: boolean;
31
- }): void;
@@ -1,66 +0,0 @@
1
- function c() {
2
- return _("");
3
- }
4
- function _(t) {
5
- return new Proxy({}, {
6
- get(r, i) {
7
- if (typeof i == "symbol")
8
- return;
9
- if (i === "__path" || i === "__fieldPath")
10
- return t || i;
11
- if (i === "__key") {
12
- const n = t.split(".");
13
- return n[n.length - 1] || i;
14
- }
15
- if (i === "then" || i === "catch" || i === "finally" || i === "constructor" || i === "toString" || i === "valueOf" || i === "toJSON")
16
- return;
17
- const f = t ? `${t}.${i}` : i, a = {
18
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
- __key: i,
20
- __path: f,
21
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
- __formType: void 0,
23
- __fieldType: void 0
24
- };
25
- return new Proxy(a, {
26
- get(n, e) {
27
- if (typeof e != "symbol") {
28
- if (e === "__path" || e === "__fieldPath") return f;
29
- if (e === "__key") return i;
30
- if (e !== "__formType" && e !== "__fieldType" && !(e === "then" || e === "catch" || e === "finally" || e === "constructor" || e === "toString" || e === "valueOf" || e === "toJSON"))
31
- return _(`${f}.${e}`);
32
- }
33
- }
34
- });
35
- }
36
- });
37
- }
38
- function u(t) {
39
- if (typeof t == "string")
40
- return t;
41
- if (t && typeof t == "object") {
42
- const r = t.__path;
43
- if (typeof r == "string")
44
- return r;
45
- }
46
- throw new Error("Invalid field path node: " + JSON.stringify(t));
47
- }
48
- function y(t) {
49
- const r = u(t);
50
- return _(r);
51
- }
52
- function l(t) {
53
- if (t && typeof t == "object" && "__key" in t)
54
- return t.__key;
55
- if (typeof t == "string") {
56
- const r = t.split(".");
57
- return r[r.length - 1];
58
- }
59
- throw new Error("Invalid field path node");
60
- }
61
- export {
62
- l as a,
63
- c,
64
- u as e,
65
- y as t
66
- };