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

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 (50) hide show
  1. package/dist/form/create-form.d.ts +11 -9
  2. package/dist/form/factories/node-factory.d.ts +17 -16
  3. package/dist/form/nodes/array-node.d.ts +3 -3
  4. package/dist/form/nodes/field-node.d.ts +6 -3
  5. package/dist/form/nodes/group-node.d.ts +7 -7
  6. package/dist/form/nodes/model-array-node.d.ts +2 -2
  7. package/dist/form/types/deep-schema.d.ts +5 -5
  8. package/dist/form/validators/email.d.ts +5 -6
  9. package/dist/form/validators/file-type.d.ts +5 -6
  10. package/dist/form/validators/future-date.d.ts +5 -6
  11. package/dist/form/validators/index.d.ts +3 -2
  12. package/dist/form/validators/integer.d.ts +5 -6
  13. package/dist/form/validators/is-date.d.ts +5 -6
  14. package/dist/form/validators/is-number.d.ts +5 -6
  15. package/dist/form/validators/max-age.d.ts +5 -6
  16. package/dist/form/validators/max-date.d.ts +5 -6
  17. package/dist/form/validators/max-file-size.d.ts +5 -6
  18. package/dist/form/validators/max-files.d.ts +5 -6
  19. package/dist/form/validators/max-length.d.ts +6 -7
  20. package/dist/form/validators/max-total-file-size.d.ts +5 -6
  21. package/dist/form/validators/max.d.ts +6 -7
  22. package/dist/form/validators/min-age.d.ts +5 -6
  23. package/dist/form/validators/min-date.d.ts +5 -6
  24. package/dist/form/validators/min-file-size.d.ts +5 -6
  25. package/dist/form/validators/min-files.d.ts +5 -6
  26. package/dist/form/validators/min-length.d.ts +6 -7
  27. package/dist/form/validators/min.d.ts +6 -7
  28. package/dist/form/validators/multiple-of.d.ts +5 -6
  29. package/dist/form/validators/non-negative.d.ts +5 -6
  30. package/dist/form/validators/non-zero.d.ts +5 -6
  31. package/dist/form/validators/past-date.d.ts +5 -6
  32. package/dist/form/validators/pattern.d.ts +6 -14
  33. package/dist/form/validators/phone.d.ts +5 -6
  34. package/dist/form/validators/required.d.ts +7 -12
  35. package/dist/form/validators/url.d.ts +7 -12
  36. package/dist/index.js +26 -23
  37. package/docs/llms/02-quick-start.md +6 -6
  38. package/docs/llms/03-api-signatures.md +3 -3
  39. package/docs/llms/05-common-mistakes.md +1 -1
  40. package/docs/llms/09-formschema.md +11 -11
  41. package/docs/llms/10-arrays.md +4 -4
  42. package/docs/llms/14-extended-mistakes.md +1 -1
  43. package/docs/llms/15-project-structure.md +8 -7
  44. package/docs/llms/16-ui-components.md +6 -6
  45. package/docs/llms/17-nonexistent-api.md +2 -2
  46. package/docs/llms/29-async-preload.md +4 -4
  47. package/docs/llms/30-type-safety-recipes.md +1 -1
  48. package/llms-index.json +1 -0
  49. package/llms.txt +2043 -224
  50. 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,9 +51,10 @@ 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: InputField },
55
56
  * // вложенная группа: `model.$.profile.name` (≡ под-модель `model.profile.$.name` — тот же сигнал)
56
- * { value: model.$.profile.name, component: Input },
57
+ * { value: model.$.profile.name, component: InputField },
57
58
  * ],
58
59
  * };
59
60
  *
@@ -92,8 +93,8 @@ export declare function createFormFromModel<T>(args: CreateFormFromModelArgs<T>)
92
93
  * // Layout-схема НЕ несёт validators — только component/componentProps.
93
94
  * const schema = {
94
95
  * children: [
95
- * { value: model.$.email, component: Input },
96
- * { value: model.$.password, component: Input },
96
+ * { value: model.$.email, component: InputField },
97
+ * { value: model.$.password, component: InputField },
97
98
  * ],
98
99
  * };
99
100
  *
@@ -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-доступом к полям
@@ -123,8 +125,8 @@ export declare function createForm<T>(config: GroupNodeConfig<T>): FormProxy<T>;
123
125
  * @example Legacy (back-compat) — плоская схема без модели
124
126
  * ```typescript
125
127
  * const form = createForm<UserForm>({
126
- * email: { value: '', component: Input },
127
- * password: { value: '', component: Input },
128
+ * email: { value: '', component: InputField },
129
+ * password: { value: '', component: InputField },
128
130
  * });
129
131
  * ```
130
132
  */
@@ -11,7 +11,7 @@ import { ConfigWithSchema, ConfigWithValue, UnknownRecord } from '../types/index
11
11
  * import { NodeFactory } from '@reformer/core';
12
12
  *
13
13
  * const factory = new NodeFactory();
14
- * const node = factory.createNode({ value: '', component: Input }); // → FieldNode<string>
14
+ * const node = factory.createNode({ value: '', component: InputField }); // → FieldNode<string>
15
15
  * ```
16
16
  */
17
17
  export declare class NodeFactory {
@@ -33,28 +33,29 @@ 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',
39
- * component: Input,
40
+ * component: InputField,
40
41
  * validators: [required, email]
41
42
  * });
42
43
  *
43
44
  * // GroupNode
44
45
  * const group = factory.createNode({
45
- * email: { value: '', component: Input },
46
- * password: { value: '', component: Input }
46
+ * email: { value: '', component: InputField },
47
+ * password: { value: '', component: InputField }
47
48
  * });
48
49
  *
49
50
  * // ArrayNode (объект)
50
51
  * const array = factory.createNode({
51
- * schema: { title: { value: '', component: Input } },
52
+ * schema: { title: { value: '', component: InputField } },
52
53
  * initialItems: [{ title: 'Item 1' }]
53
54
  * });
54
55
  *
55
56
  * // ArrayNode (массив) - новый формат
56
57
  * const array2 = factory.createNode([
57
- * { title: { value: '', component: Input } }, // schema
58
+ * { title: { value: '', component: InputField } }, // schema
58
59
  * { title: 'Item 1' }, // initial item 1
59
60
  * { title: 'Item 2' } // initial item 2
60
61
  * ]);
@@ -79,7 +80,7 @@ export declare class NodeFactory {
79
80
  *
80
81
  * // Массив с начальными элементами
81
82
  * const array = factory.createArrayNodeFromArray([
82
- * { title: { value: '', component: Input } }, // schema
83
+ * { title: { value: '', component: InputField } }, // schema
83
84
  * { title: 'Item 1' }, // initial value
84
85
  * { title: 'Item 2' } // initial value
85
86
  * ]);
@@ -93,7 +94,7 @@ export declare class NodeFactory {
93
94
  * ✅ НОВОЕ: Извлечено из GroupNode для централизации логики
94
95
  *
95
96
  * Преобразует схему формы в объект со значениями:
96
- * - `{ name: { value: 'John', component: Input } } → { name: 'John' }`
97
+ * - `{ name: { value: 'John', component: InputField } } → { name: 'John' }`
97
98
  * - Поддерживает вложенные группы
98
99
  * - Поддерживает массивы
99
100
  *
@@ -105,10 +106,10 @@ export declare class NodeFactory {
105
106
  * const factory = new NodeFactory();
106
107
  *
107
108
  * const schema = {
108
- * name: { value: 'John', component: Input },
109
- * age: { value: 30, component: Input },
109
+ * name: { value: 'John', component: InputField },
110
+ * age: { value: 30, component: InputField },
110
111
  * address: {
111
- * city: { value: 'Moscow', component: Input }
112
+ * city: { value: 'Moscow', component: InputField }
112
113
  * }
113
114
  * };
114
115
  *
@@ -131,7 +132,7 @@ export declare class NodeFactory {
131
132
  * ```typescript
132
133
  * const factory = new NodeFactory();
133
134
  *
134
- * factory.isFieldConfig({ value: '', component: Input }); // true
135
+ * factory.isFieldConfig({ value: '', component: InputField }); // true
135
136
  * factory.isFieldConfig({ email: { value: '' } }); // false
136
137
  * factory.isFieldConfig(null); // false
137
138
  * ```
@@ -154,7 +155,7 @@ export declare class NodeFactory {
154
155
  * const factory = new NodeFactory();
155
156
  *
156
157
  * factory.isArrayConfig({ schema: {}, initialItems: [] }); // true
157
- * factory.isArrayConfig({ value: '', component: Input }); // false
158
+ * factory.isArrayConfig({ value: '', component: InputField }); // false
158
159
  * factory.isArrayConfig({ email: { value: '' } }); // false
159
160
  * ```
160
161
  */
@@ -175,11 +176,11 @@ export declare class NodeFactory {
175
176
  * const factory = new NodeFactory();
176
177
  *
177
178
  * factory.isGroupConfig({
178
- * email: { value: '', component: Input },
179
- * password: { value: '', component: Input }
179
+ * email: { value: '', component: InputField },
180
+ * password: { value: '', component: InputField }
180
181
  * }); // true
181
182
  *
182
- * factory.isGroupConfig({ value: '', component: Input }); // false
183
+ * factory.isGroupConfig({ value: '', component: InputField }); // false
183
184
  * factory.isGroupConfig({ schema: {} }); // false
184
185
  * factory.isGroupConfig(null); // false
185
186
  * ```
@@ -11,8 +11,8 @@ import { FormProxy } from '../types/form-proxy';
11
11
  * @example
12
12
  * ```typescript
13
13
  * const array = new ArrayNode({
14
- * title: { value: '', component: Input },
15
- * price: { value: 0, component: Input },
14
+ * title: { value: '', component: InputField },
15
+ * price: { value: 0, component: InputField },
16
16
  * });
17
17
  *
18
18
  * array.push({ title: 'Item 1', price: 100 });
@@ -141,7 +141,7 @@ export declare class ArrayNode<T extends object> extends FormNode<T[]> {
141
141
  * @example
142
142
  * ```typescript
143
143
  * const arrayNode = new ArrayNode(
144
- * { name: { value: '', component: Input } },
144
+ * { name: { value: '', component: InputField } },
145
145
  * [{ name: 'Initial 1' }, { name: 'Initial 2' }]
146
146
  * );
147
147
  *
@@ -7,10 +7,11 @@ 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: '',
13
- * component: Input,
14
+ * component: InputField,
14
15
  * validators: [required, email],
15
16
  * });
16
17
  *
@@ -102,7 +103,7 @@ export declare class FieldNode<T> extends FormNode<T> {
102
103
  *
103
104
  * @example
104
105
  * ```typescript
105
- * const field = new FieldNode({ value: 'initial', component: Input });
106
+ * const field = new FieldNode({ value: 'initial', component: InputField });
106
107
  *
107
108
  * field.setValue('changed');
108
109
  * field.reset('temp value');
@@ -194,12 +195,14 @@ 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({
200
203
  * email: {
201
204
  * value: '',
202
- * component: Input,
205
+ * component: InputField,
203
206
  * updateOn: 'submit', // Изначально валидация только при submit
204
207
  * validators: [required, email],
205
208
  * },
@@ -15,8 +15,8 @@ import { SubmitOptions, SubmitResult } from '../form-submitter';
15
15
  * @example
16
16
  * ```typescript
17
17
  * const form = new GroupNode({
18
- * email: { valueSignal: model.$.email, component: Input },
19
- * password: { valueSignal: model.$.password, component: Input },
18
+ * email: { valueSignal: model.$.email, component: InputField },
19
+ * password: { valueSignal: model.$.password, component: InputField },
20
20
  * });
21
21
  *
22
22
  * // Прямой доступ к полям через Proxy
@@ -136,8 +136,8 @@ export declare class GroupNode<T> extends FormNode<T> {
136
136
  * @example
137
137
  * ```typescript
138
138
  * const form = new GroupNode({
139
- * email: { value: '', component: Input },
140
- * name: { value: '', component: Input },
139
+ * email: { value: '', component: InputField },
140
+ * name: { value: '', component: InputField },
141
141
  * });
142
142
  *
143
143
  * const proxy = form.getProxy();
@@ -189,11 +189,11 @@ export declare class GroupNode<T> extends FormNode<T> {
189
189
  * @example
190
190
  * ```typescript
191
191
  * const form = new GroupNode({
192
- * email: { value: '', component: Input },
192
+ * email: { value: '', component: InputField },
193
193
  * address: {
194
- * city: { value: '', component: Input }
194
+ * city: { value: '', component: InputField }
195
195
  * },
196
- * items: [{ name: { value: '', component: Input } }]
196
+ * items: [{ name: { value: '', component: InputField } }]
197
197
  * });
198
198
  *
199
199
  * form.getFieldByPath('email'); // FieldNode
@@ -36,8 +36,8 @@ export interface ModelArrayControl<TItem extends object> {
36
36
  * const model = createModel<{ rows: { name: string; qty: number }[] }>({ rows: [] });
37
37
  *
38
38
  * const rowItem = (item: FormModel<{ name: string; qty: number }>) => ({
39
- * name: { value: item.$.name, component: Input },
40
- * qty: { value: item.$.qty, component: Input },
39
+ * name: { value: item.$.name, component: InputField },
40
+ * qty: { value: item.$.qty, component: InputField },
41
41
  * });
42
42
  *
43
43
  * const form = createForm({
@@ -89,14 +89,14 @@ type NonEmptyFieldConfig<T> = RequireAtLeastOne<FieldConfig<T>>;
89
89
  * }
90
90
  *
91
91
  * const schema: FormSchema<Form> = {
92
- * name: { value: '', component: Input },
92
+ * name: { value: '', component: InputField },
93
93
  * address: {
94
- * city: { value: '', component: Input },
95
- * street: { value: '', component: Input },
94
+ * city: { value: '', component: InputField },
95
+ * street: { value: '', component: InputField },
96
96
  * },
97
97
  * items: [{
98
- * title: { value: '', component: Input },
99
- * price: { value: 0, component: Input },
98
+ * title: { value: '', component: InputField },
99
+ * price: { value: 0, component: InputField },
100
100
  * }],
101
101
  * };
102
102
  * ```
@@ -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>;