@reformer/core 11.0.0-beta.4 → 11.0.0-beta.6

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 (47) hide show
  1. package/dist/form/create-form.d.ts +6 -4
  2. package/dist/form/factories/node-factory.d.ts +1 -0
  3. package/dist/form/nodes/field-node.d.ts +3 -0
  4. package/dist/form/validators/email.d.ts +5 -6
  5. package/dist/form/validators/file-type.d.ts +5 -6
  6. package/dist/form/validators/future-date.d.ts +5 -6
  7. package/dist/form/validators/index.d.ts +3 -2
  8. package/dist/form/validators/integer.d.ts +5 -6
  9. package/dist/form/validators/is-date.d.ts +5 -6
  10. package/dist/form/validators/is-number.d.ts +5 -6
  11. package/dist/form/validators/max-age.d.ts +5 -6
  12. package/dist/form/validators/max-date.d.ts +5 -6
  13. package/dist/form/validators/max-file-size.d.ts +5 -6
  14. package/dist/form/validators/max-files.d.ts +5 -6
  15. package/dist/form/validators/max-length.d.ts +6 -7
  16. package/dist/form/validators/max-total-file-size.d.ts +5 -6
  17. package/dist/form/validators/max.d.ts +6 -7
  18. package/dist/form/validators/min-age.d.ts +5 -6
  19. package/dist/form/validators/min-date.d.ts +5 -6
  20. package/dist/form/validators/min-file-size.d.ts +5 -6
  21. package/dist/form/validators/min-files.d.ts +5 -6
  22. package/dist/form/validators/min-length.d.ts +6 -7
  23. package/dist/form/validators/min.d.ts +6 -7
  24. package/dist/form/validators/multiple-of.d.ts +5 -6
  25. package/dist/form/validators/non-negative.d.ts +5 -6
  26. package/dist/form/validators/non-zero.d.ts +5 -6
  27. package/dist/form/validators/past-date.d.ts +5 -6
  28. package/dist/form/validators/pattern.d.ts +6 -14
  29. package/dist/form/validators/phone.d.ts +5 -6
  30. package/dist/form/validators/required.d.ts +7 -12
  31. package/dist/form/validators/url.d.ts +7 -12
  32. package/dist/index.js +423 -376
  33. package/dist/platforms/react/field-binding/field-adapter.d.ts +87 -0
  34. package/dist/platforms/react/field-binding/field-handle.d.ts +50 -0
  35. package/dist/platforms/react/index.d.ts +4 -0
  36. package/docs/llms/02-quick-start.md +3 -3
  37. package/docs/llms/03-api-signatures.md +4 -4
  38. package/docs/llms/09-formschema.md +5 -5
  39. package/docs/llms/10-arrays.md +2 -2
  40. package/docs/llms/15-project-structure.md +19 -16
  41. package/docs/llms/16-ui-components.md +34 -7
  42. package/docs/llms/17-nonexistent-api.md +14 -0
  43. package/docs/llms/29-async-preload.md +3 -3
  44. package/docs/llms/30-type-safety-recipes.md +1 -1
  45. package/llms-index.json +1 -0
  46. package/llms.txt +2146 -68
  47. package/package.json +2 -1
@@ -4,7 +4,7 @@ import { FormModel } from '../model/types';
4
4
  import { FormBehavior } from './behaviors';
5
5
  /**
6
6
  * Аргументы createForm под архитектуру M1: данные приходят из {@link FormModel},
7
- * конфиг полей (component/componentProps/validators) — из единой схемы.
7
+ * конфиг полей (component/componentProps) — из единой схемы.
8
8
  *
9
9
  * @group Utilities
10
10
  */
@@ -27,7 +27,7 @@ export interface CreateFormFromModelArgs<T> {
27
27
  *
28
28
  * Значения принадлежат модели (источник истины), ноды формы держат UI/валидационное состояние и
29
29
  * ссылаются на сигналы модели по идентичности (`node.value === model.$.path`). Обходит структуру
30
- * модели, привязывает конфиг поля (component/componentProps/validators) из схемы, материализует
30
+ * модели, привязывает конфиг поля (component/componentProps) из схемы, материализует
31
31
  * top-level массивы как {@link ModelArrayNode}, заполняет реестр сигнал→нода (для `enableWhen`/
32
32
  * роутинга ошибок) и, при наличии, запускает декларативное поведение (cleanup живёт на форме).
33
33
  *
@@ -51,7 +51,8 @@ export interface CreateFormFromModelArgs<T> {
51
51
  * const schema = {
52
52
  * component: Section,
53
53
  * children: [
54
- * { value: model.$.email, component: Input, validators: [required] },
54
+ * // Layout несёт только component/componentProps; правила — в отдельной ValidationSchema.
55
+ * { value: model.$.email, component: Input },
55
56
  * // вложенная группа: `model.$.profile.name` (≡ под-модель `model.profile.$.name` — тот же сигнал)
56
57
  * { value: model.$.profile.name, component: Input },
57
58
  * ],
@@ -115,7 +116,8 @@ export declare function createForm<T>(config: GroupNodeConfig<T>): FormProxy<T>;
115
116
  *
116
117
  * @deprecated Legacy / back-compat: плоская `FormSchema` с инлайн-значениями (`value: ''`) — путь
117
118
  * ДО архитектуры M1. Для нового кода используйте перегрузку `createForm({ model, schema })`
118
- * (значения принадлежат {@link FormModel}, валидаторы — фабрики в `validators: [...]`).
119
+ * (значения принадлежат {@link FormModel}, а правила — отдельной схеме `defineValidationSchema`,
120
+ * которую прогоняет `validateModel`; поля `validators` у узла layout-схемы нет).
119
121
  *
120
122
  * @param schema - Схема полей формы
121
123
  * @returns Типизированная форма с Proxy-доступом к полям
@@ -33,6 +33,7 @@ export declare class NodeFactory {
33
33
  * ```typescript
34
34
  * const factory = new NodeFactory();
35
35
  *
36
+ * Конфиг node-level (не layout-схема M1, где `validators` уже нет).
36
37
  * // FieldNode
37
38
  * const field = factory.createNode({
38
39
  * value: 'test@mail.com',
@@ -7,6 +7,7 @@ import { FieldConfig, FieldStatus, ValidationError } from '../types/index';
7
7
  * @group Nodes
8
8
  *
9
9
  * @example
10
+ * Пример node-level: конфиг УЗЛА, а не layout-схема M1 (в ней поля `validators` нет).
10
11
  * ```typescript
11
12
  * const field = new FieldNode({
12
13
  * value: '',
@@ -194,6 +195,8 @@ export declare class FieldNode<T> extends FormNode<T> {
194
195
  * @param updateOn - новый триггер валидации: 'change' | 'blur' | 'submit'
195
196
  *
196
197
  * @example
198
+ * Пример node-level: плоская схема с инлайн-значениями (back-compat путь до M1). В layout-схеме
199
+ * `createForm({ model, schema })` поля `validators` нет — правила живут в `defineValidationSchema`.
197
200
  * ```typescript
198
201
  * // Сценарий 1: Instant feedback после submit
199
202
  * const form = createForm({
@@ -10,14 +10,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
10
10
  *
11
11
  * @example Проверка формата email
12
12
  * ```typescript
13
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
13
14
  * import { required, email } from '@reformer/core/validators';
14
15
  *
15
- * // Внутри FieldConfig схемы формы:
16
- * email: {
17
- * value: model.$.email,
18
- * component: Input,
19
- * validators: [required(), email({ message: 'Введите корректный email' })],
20
- * },
16
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
17
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
18
+ * validate(model.$.email, [required(), email({ message: 'Введите корректный email' })]);
19
+ * });
21
20
  * ```
22
21
  */
23
22
  export declare function email<TForm = unknown, TField extends string | null | undefined = string>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -18,14 +18,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
18
18
  *
19
19
  * @example Только изображения и PDF
20
20
  * ```typescript
21
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
21
22
  * import { fileType } from '@reformer/core/validators';
22
23
  *
23
- * // Внутри FieldConfig схемы формы:
24
- * documents: {
25
- * value: model.$.documents,
26
- * component: FileUploadField,
27
- * validators: [fileType('image/*,.pdf', { message: 'Только изображения или PDF' })],
28
- * },
24
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
25
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
26
+ * validate(model.$.documents, [fileType('image/*,.pdf', { message: 'Только изображения или PDF' })]);
27
+ * });
29
28
  * ```
30
29
  */
31
30
  export declare function fileType<TForm = unknown, TField = unknown>(accept: string, options?: ValidateOptions): Validator<TForm, TField>;
@@ -10,14 +10,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
10
10
  *
11
11
  * @example Дата не в прошлом
12
12
  * ```typescript
13
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
13
14
  * import { required, futureDate } from '@reformer/core/validators';
14
15
  *
15
- * // Внутри FieldConfig схемы формы:
16
- * appointmentDate: {
17
- * value: model.$.appointmentDate,
18
- * component: DatePicker,
19
- * validators: [required(), futureDate({ message: 'Дата записи должна быть в будущем' })],
20
- * },
16
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
17
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
18
+ * validate(model.$.appointmentDate, [required(), futureDate({ message: 'Дата записи должна быть в будущем' })]);
19
+ * });
21
20
  * ```
22
21
  */
23
22
  export declare function futureDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * Точка входа сабпата `@reformer/core/validators` — все фабрики правил одним импортом.
3
3
  *
4
- * Все примитивы — фабрики, возвращающие чистый `Validator<TForm, TField>`; передаются в
5
- * массив `validators` поля схемы формы: `validators: [required(), min(18)]`.
4
+ * Все примитивы — фабрики, возвращающие чистый `Validator<TForm, TField>`; передаются вторым
5
+ * аргументом оператора `validate` внутри схемы валидации: `validate(model.$.age, [required(), min(18)])`.
6
+ * В layout-схему формы правила НЕ кладутся — поля `validators` у узла нет (снято в 7.0).
6
7
  *
7
8
  * Гранулярные сабпаты (`@reformer/core/validators/required` и ещё 20) собираются отдельными
8
9
  * entry для tree-shaking; этот модуль отдаёт полный набор для случаев, когда правил много.
@@ -9,14 +9,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
9
9
  *
10
10
  * @example Проверка целого числа
11
11
  * ```typescript
12
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
12
13
  * import { required, integer } from '@reformer/core/validators';
13
14
  *
14
- * // Внутри FieldConfig схемы формы:
15
- * count: {
16
- * value: model.$.count,
17
- * component: Input,
18
- * validators: [required(), integer({ message: 'Должно быть целым числом' })],
19
- * },
15
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
16
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
17
+ * validate(model.$.count, [required(), integer({ message: 'Должно быть целым числом' })]);
18
+ * });
20
19
  * ```
21
20
  */
22
21
  export declare function integer<TForm = unknown, TField extends number | null | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -10,14 +10,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
10
10
  *
11
11
  * @example Проверка валидности даты
12
12
  * ```typescript
13
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
13
14
  * import { required, isDate } from '@reformer/core/validators';
14
15
  *
15
- * // Внутри FieldConfig схемы формы:
16
- * eventDate: {
17
- * value: model.$.eventDate,
18
- * component: DatePicker,
19
- * validators: [required(), isDate({ message: 'Введите корректную дату' })],
20
- * },
16
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
17
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
18
+ * validate(model.$.eventDate, [required(), isDate({ message: 'Введите корректную дату' })]);
19
+ * });
21
20
  * ```
22
21
  */
23
22
  export declare function isDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -11,14 +11,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
11
11
  *
12
12
  * @example Проверка, что значение — число
13
13
  * ```typescript
14
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
14
15
  * import { required, isNumber } from '@reformer/core/validators';
15
16
  *
16
- * // Внутри FieldConfig схемы формы:
17
- * amount: {
18
- * value: model.$.amount,
19
- * component: Input,
20
- * validators: [required(), isNumber({ message: 'Введите число' })],
21
- * },
17
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
18
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
19
+ * validate(model.$.amount, [required(), isNumber({ message: 'Введите число' })]);
20
+ * });
22
21
  * ```
23
22
  */
24
23
  export declare function isNumber<TForm = unknown, TField extends number | null | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -12,14 +12,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
12
12
  *
13
13
  * @example Максимальный возраст
14
14
  * ```typescript
15
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
15
16
  * import { maxAge } from '@reformer/core/validators';
16
17
  *
17
- * // Внутри FieldConfig схемы формы:
18
- * birthDate: {
19
- * value: model.$.birthDate,
20
- * component: DatePicker,
21
- * validators: [maxAge(100, { message: 'Проверьте дату рождения' })],
22
- * },
18
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
19
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
20
+ * validate(model.$.birthDate, [maxAge(100, { message: 'Проверьте дату рождения' })]);
21
+ * });
23
22
  * ```
24
23
  */
25
24
  export declare function maxAge<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(maxAgeValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -12,14 +12,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
12
12
  *
13
13
  * @example Максимальная дата
14
14
  * ```typescript
15
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
15
16
  * import { maxDate } from '@reformer/core/validators';
16
17
  *
17
- * // Внутри FieldConfig схемы формы:
18
- * birthDate: {
19
- * value: model.$.birthDate,
20
- * component: DatePicker,
21
- * validators: [maxDate(new Date(), { message: 'Дата не может быть в будущем' })],
22
- * },
18
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
19
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
20
+ * validate(model.$.birthDate, [maxDate(new Date(), { message: 'Дата не может быть в будущем' })]);
21
+ * });
23
22
  * ```
24
23
  */
25
24
  export declare function maxDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(maxDateValue: Date, options?: ValidateOptions): Validator<TForm, TField>;
@@ -15,14 +15,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
15
15
  *
16
16
  * @example Ограничение размера вложений
17
17
  * ```typescript
18
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
18
19
  * import { maxFileSize } from '@reformer/core/validators';
19
20
  *
20
- * // Внутри FieldConfig схемы формы:
21
- * documents: {
22
- * value: model.$.documents,
23
- * component: FileUploadField,
24
- * validators: [maxFileSize(5 * 1024 * 1024, { message: 'Файл больше 5 МБ' })],
25
- * },
21
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
22
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
23
+ * validate(model.$.documents, [maxFileSize(5 * 1024 * 1024, { message: 'Файл больше 5 МБ' })]);
24
+ * });
26
25
  * ```
27
26
  */
28
27
  export declare function maxFileSize<TForm = unknown, TField = unknown>(maxSize: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -13,14 +13,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
13
13
  *
14
14
  * @example Не более трёх вложений
15
15
  * ```typescript
16
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
16
17
  * import { maxFiles } from '@reformer/core/validators';
17
18
  *
18
- * // Внутри FieldConfig схемы формы:
19
- * documents: {
20
- * value: model.$.documents,
21
- * component: FileUploadField,
22
- * validators: [maxFiles(3, { message: 'Максимум 3 файла' })],
23
- * },
19
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
20
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
21
+ * validate(model.$.documents, [maxFiles(3, { message: 'Максимум 3 файла' })]);
22
+ * });
24
23
  * ```
25
24
  */
26
25
  export declare function maxFiles<TForm = unknown, TField = unknown>(max: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -13,15 +13,14 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
13
13
  *
14
14
  * @example Максимальная длина строки
15
15
  * ```typescript
16
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
16
17
  * import { maxLength } from '@reformer/core/validators';
17
18
  *
18
- * // Внутри FieldConfig схемы формы:
19
- * name: { value: model.$.name, component: Input, validators: [maxLength(50)] },
20
- * bio: {
21
- * value: model.$.bio,
22
- * component: Textarea,
23
- * validators: [maxLength(500, { message: 'Максимум 500 символов' })],
24
- * },
19
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
20
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
21
+ * validate(model.$.name, [maxLength(50)]);
22
+ * validate(model.$.bio, [maxLength(500, { message: 'Максимум 500 символов' })]);
23
+ * });
25
24
  * ```
26
25
  */
27
26
  export declare function maxLength<TForm = unknown, TField = unknown>(maxLen: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -13,14 +13,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
13
13
  *
14
14
  * @example Суммарно не более 20 МБ
15
15
  * ```typescript
16
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
16
17
  * import { maxTotalFileSize } from '@reformer/core/validators';
17
18
  *
18
- * // Внутри FieldConfig схемы формы:
19
- * documents: {
20
- * value: model.$.documents,
21
- * component: FileUploadField,
22
- * validators: [maxTotalFileSize(20 * 1024 * 1024, { message: 'Суммарно не более 20 МБ' })],
23
- * },
19
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
20
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
21
+ * validate(model.$.documents, [maxTotalFileSize(20 * 1024 * 1024, { message: 'Суммарно не более 20 МБ' })]);
22
+ * });
24
23
  * ```
25
24
  */
26
25
  export declare function maxTotalFileSize<TForm = unknown, TField = unknown>(maxTotal: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -11,15 +11,14 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
11
11
  *
12
12
  * @example Максимальное значение числового поля
13
13
  * ```typescript
14
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
14
15
  * import { required, max } from '@reformer/core/validators';
15
16
  *
16
- * // Внутри FieldConfig схемы формы:
17
- * quantity: { value: model.$.quantity, component: Input, validators: [max(100)] },
18
- * discount: {
19
- * value: model.$.discount,
20
- * component: Input,
21
- * validators: [required(), max(50, { message: 'Не более 50%' })],
22
- * },
17
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
18
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
19
+ * validate(model.$.quantity, [max(100)]);
20
+ * validate(model.$.discount, [required(), max(50, { message: 'Не более 50%' })]);
21
+ * });
23
22
  * ```
24
23
  */
25
24
  export declare function max<TForm = unknown, TField extends number | null | undefined = number>(maxValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -12,14 +12,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
12
12
  *
13
13
  * @example Минимальный возраст
14
14
  * ```typescript
15
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
15
16
  * import { required, minAge } from '@reformer/core/validators';
16
17
  *
17
- * // Внутри FieldConfig схемы формы:
18
- * birthDate: {
19
- * value: model.$.birthDate,
20
- * component: DatePicker,
21
- * validators: [required(), minAge(18, { message: 'Вам должно быть не менее 18 лет' })],
22
- * },
18
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
19
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
20
+ * validate(model.$.birthDate, [required(), minAge(18, { message: 'Вам должно быть не менее 18 лет' })]);
21
+ * });
23
22
  * ```
24
23
  */
25
24
  export declare function minAge<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(minAgeValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -12,14 +12,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
12
12
  *
13
13
  * @example Минимальная дата
14
14
  * ```typescript
15
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
15
16
  * import { required, minDate } from '@reformer/core/validators';
16
17
  *
17
- * // Внутри FieldConfig схемы формы:
18
- * startDate: {
19
- * value: model.$.startDate,
20
- * component: DatePicker,
21
- * validators: [required(), minDate(new Date(), { message: 'Дата не раньше сегодня' })],
22
- * },
18
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
19
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
20
+ * validate(model.$.startDate, [required(), minDate(new Date(), { message: 'Дата не раньше сегодня' })]);
21
+ * });
23
22
  * ```
24
23
  */
25
24
  export declare function minDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(minDateValue: Date, options?: ValidateOptions): Validator<TForm, TField>;
@@ -15,14 +15,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
15
15
  *
16
16
  * @example Отсев пустых файлов
17
17
  * ```typescript
18
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
18
19
  * import { minFileSize } from '@reformer/core/validators';
19
20
  *
20
- * // Внутри FieldConfig схемы формы:
21
- * documents: {
22
- * value: model.$.documents,
23
- * component: FileUploadField,
24
- * validators: [minFileSize(1, { message: 'Файл пустой' })],
25
- * },
21
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
22
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
23
+ * validate(model.$.documents, [minFileSize(1, { message: 'Файл пустой' })]);
24
+ * });
26
25
  * ```
27
26
  */
28
27
  export declare function minFileSize<TForm = unknown, TField = unknown>(minSize: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -13,14 +13,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
13
13
  *
14
14
  * @example Не менее двух документов
15
15
  * ```typescript
16
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
16
17
  * import { required, minFiles } from '@reformer/core/validators';
17
18
  *
18
- * // Внутри FieldConfig схемы формы:
19
- * documents: {
20
- * value: model.$.documents,
21
- * component: FileUploadField,
22
- * validators: [required(), minFiles(2, { message: 'Приложите минимум 2 документа' })],
23
- * },
19
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
20
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
21
+ * validate(model.$.documents, [required(), minFiles(2, { message: 'Приложите минимум 2 документа' })]);
22
+ * });
24
23
  * ```
25
24
  */
26
25
  export declare function minFiles<TForm = unknown, TField = unknown>(min: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -13,15 +13,14 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
13
13
  *
14
14
  * @example Минимальная длина строки
15
15
  * ```typescript
16
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
16
17
  * import { required, minLength } from '@reformer/core/validators';
17
18
  *
18
- * // Внутри FieldConfig схемы формы:
19
- * name: { value: model.$.name, component: Input, validators: [minLength(2)] },
20
- * password: {
21
- * value: model.$.password,
22
- * component: Input,
23
- * validators: [required(), minLength(8, { message: 'Минимум 8 символов' })],
24
- * },
19
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
20
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
21
+ * validate(model.$.name, [minLength(2)]);
22
+ * validate(model.$.password, [required(), minLength(8, { message: 'Минимум 8 символов' })]);
23
+ * });
25
24
  * ```
26
25
  */
27
26
  export declare function minLength<TForm = unknown, TField = unknown>(minLen: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -11,15 +11,14 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
11
11
  *
12
12
  * @example Минимальное значение числового поля
13
13
  * ```typescript
14
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
14
15
  * import { required, min } from '@reformer/core/validators';
15
16
  *
16
- * // Внутри FieldConfig схемы формы:
17
- * age: { value: model.$.age, component: Input, validators: [min(18)] },
18
- * quantity: {
19
- * value: model.$.quantity,
20
- * component: Input,
21
- * validators: [required(), min(1, { message: 'Минимум 1' })],
22
- * },
17
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
18
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
19
+ * validate(model.$.age, [min(18)]);
20
+ * validate(model.$.quantity, [required(), min(1, { message: 'Минимум 1' })]);
21
+ * });
23
22
  * ```
24
23
  */
25
24
  export declare function min<TForm = unknown, TField extends number | null | undefined = number>(minValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -11,14 +11,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
11
11
  *
12
12
  * @example Проверка кратности
13
13
  * ```typescript
14
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
14
15
  * import { multipleOf } from '@reformer/core/validators';
15
16
  *
16
- * // Внутри FieldConfig схемы формы:
17
- * rating: {
18
- * value: model.$.rating,
19
- * component: Input,
20
- * validators: [multipleOf(0.5, { message: 'Только шаг 0.5' })],
21
- * },
17
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
18
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
19
+ * validate(model.$.rating, [multipleOf(0.5, { message: 'Только шаг 0.5' })]);
20
+ * });
22
21
  * ```
23
22
  */
24
23
  export declare function multipleOf<TForm = unknown, TField extends number | null | undefined = number>(divisor: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -9,14 +9,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
9
9
  *
10
10
  * @example Проверка неотрицательности
11
11
  * ```typescript
12
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
12
13
  * import { nonNegative } from '@reformer/core/validators';
13
14
  *
14
- * // Внутри FieldConfig схемы формы:
15
- * balance: {
16
- * value: model.$.balance,
17
- * component: Input,
18
- * validators: [nonNegative({ message: 'Баланс не может быть отрицательным' })],
19
- * },
15
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
16
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
17
+ * validate(model.$.balance, [nonNegative({ message: 'Баланс не может быть отрицательным' })]);
18
+ * });
20
19
  * ```
21
20
  */
22
21
  export declare function nonNegative<TForm = unknown, TField extends number | null | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -9,14 +9,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
9
9
  *
10
10
  * @example Проверка «не ноль»
11
11
  * ```typescript
12
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
12
13
  * import { nonZero } from '@reformer/core/validators';
13
14
  *
14
- * // Внутри FieldConfig схемы формы:
15
- * divisor: {
16
- * value: model.$.divisor,
17
- * component: Input,
18
- * validators: [nonZero({ message: 'Не может быть нулём' })],
19
- * },
15
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
16
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
17
+ * validate(model.$.divisor, [nonZero({ message: 'Не может быть нулём' })]);
18
+ * });
20
19
  * ```
21
20
  */
22
21
  export declare function nonZero<TForm = unknown, TField extends number | null | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -10,14 +10,13 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
10
10
  *
11
11
  * @example Дата не в будущем
12
12
  * ```typescript
13
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
13
14
  * import { required, pastDate } from '@reformer/core/validators';
14
15
  *
15
- * // Внутри FieldConfig схемы формы:
16
- * birthDate: {
17
- * value: model.$.birthDate,
18
- * component: DatePicker,
19
- * validators: [required(), pastDate({ message: 'Дата рождения не может быть в будущем' })],
20
- * },
16
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
17
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
18
+ * validate(model.$.birthDate, [required(), pastDate({ message: 'Дата рождения не может быть в будущем' })]);
19
+ * });
21
20
  * ```
22
21
  */
23
22
  export declare function pastDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -12,22 +12,14 @@ import { Validator, ValidateOptions } from '../types/validation-schema';
12
12
  *
13
13
  * @example Проверка по регулярному выражению
14
14
  * ```typescript
15
+ * import { defineValidationSchema, validate } from '@reformer/core/validation';
15
16
  * import { required, pattern } from '@reformer/core/validators';
16
17
  *
17
- * // Внутри FieldConfig схемы формы:
18
- * name: {
19
- * value: model.$.name,
20
- * component: Input,
21
- * validators: [pattern(/^[a-zA-Zа-яА-Я]+$/, { message: 'Только буквы' })],
22
- * },
23
- * phone: {
24
- * value: model.$.phone,
25
- * component: InputMask,
26
- * validators: [
27
- * required(),
28
- * pattern(/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/, { message: 'Формат +7 (999) 123-45-67' }),
29
- * ],
30
- * },
18
+ * // Правила живут в отдельной схеме над МОДЕЛЬЮ — layout-схема валидаторов не несёт.
19
+ * const validation = defineValidationSchema<MyForm>(({ model }) => {
20
+ * validate(model.$.name, [pattern(/^[a-zA-Zа-яА-Я]+$/, { message: 'Только буквы' })]);
21
+ * validate(model.$.phone, [required(), pattern(/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/, { message: 'Формат +7 (999) 123-45-67' })]);
22
+ * });
31
23
  * ```
32
24
  */
33
25
  export declare function pattern<TForm = unknown, TField extends string | null | undefined = string>(regex: RegExp, options?: ValidateOptions): Validator<TForm, TField>;