@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.
- package/dist/form/create-form.d.ts +11 -9
- package/dist/form/factories/node-factory.d.ts +17 -16
- package/dist/form/nodes/array-node.d.ts +3 -3
- package/dist/form/nodes/field-node.d.ts +6 -3
- package/dist/form/nodes/group-node.d.ts +7 -7
- package/dist/form/nodes/model-array-node.d.ts +2 -2
- package/dist/form/types/deep-schema.d.ts +5 -5
- package/dist/form/validators/email.d.ts +5 -6
- package/dist/form/validators/file-type.d.ts +5 -6
- package/dist/form/validators/future-date.d.ts +5 -6
- package/dist/form/validators/index.d.ts +3 -2
- package/dist/form/validators/integer.d.ts +5 -6
- package/dist/form/validators/is-date.d.ts +5 -6
- package/dist/form/validators/is-number.d.ts +5 -6
- package/dist/form/validators/max-age.d.ts +5 -6
- package/dist/form/validators/max-date.d.ts +5 -6
- package/dist/form/validators/max-file-size.d.ts +5 -6
- package/dist/form/validators/max-files.d.ts +5 -6
- package/dist/form/validators/max-length.d.ts +6 -7
- package/dist/form/validators/max-total-file-size.d.ts +5 -6
- package/dist/form/validators/max.d.ts +6 -7
- package/dist/form/validators/min-age.d.ts +5 -6
- package/dist/form/validators/min-date.d.ts +5 -6
- package/dist/form/validators/min-file-size.d.ts +5 -6
- package/dist/form/validators/min-files.d.ts +5 -6
- package/dist/form/validators/min-length.d.ts +6 -7
- package/dist/form/validators/min.d.ts +6 -7
- package/dist/form/validators/multiple-of.d.ts +5 -6
- package/dist/form/validators/non-negative.d.ts +5 -6
- package/dist/form/validators/non-zero.d.ts +5 -6
- package/dist/form/validators/past-date.d.ts +5 -6
- package/dist/form/validators/pattern.d.ts +6 -14
- package/dist/form/validators/phone.d.ts +5 -6
- package/dist/form/validators/required.d.ts +7 -12
- package/dist/form/validators/url.d.ts +7 -12
- package/dist/index.js +26 -23
- package/docs/llms/02-quick-start.md +6 -6
- package/docs/llms/03-api-signatures.md +3 -3
- package/docs/llms/05-common-mistakes.md +1 -1
- package/docs/llms/09-formschema.md +11 -11
- package/docs/llms/10-arrays.md +4 -4
- package/docs/llms/14-extended-mistakes.md +1 -1
- package/docs/llms/15-project-structure.md +8 -7
- package/docs/llms/16-ui-components.md +6 -6
- package/docs/llms/17-nonexistent-api.md +2 -2
- package/docs/llms/29-async-preload.md +4 -4
- package/docs/llms/30-type-safety-recipes.md +1 -1
- package/llms-index.json +1 -0
- package/llms.txt +2043 -224
- 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
|
|
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
|
|
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
|
-
*
|
|
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:
|
|
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:
|
|
96
|
-
* { value: model.$.password, component:
|
|
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},
|
|
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:
|
|
127
|
-
* password: { value: '', component:
|
|
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:
|
|
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:
|
|
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:
|
|
46
|
-
* password: { value: '', component:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
109
|
-
* age: { value: 30, component:
|
|
109
|
+
* name: { value: 'John', component: InputField },
|
|
110
|
+
* age: { value: 30, component: InputField },
|
|
110
111
|
* address: {
|
|
111
|
-
* city: { value: 'Moscow', component:
|
|
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:
|
|
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:
|
|
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:
|
|
179
|
-
* password: { value: '', component:
|
|
179
|
+
* email: { value: '', component: InputField },
|
|
180
|
+
* password: { value: '', component: InputField }
|
|
180
181
|
* }); // true
|
|
181
182
|
*
|
|
182
|
-
* factory.isGroupConfig({ value: '', component:
|
|
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:
|
|
15
|
-
* price: { value: 0, component:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
19
|
-
* password: { valueSignal: model.$.password, component:
|
|
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:
|
|
140
|
-
* name: { value: '', component:
|
|
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:
|
|
192
|
+
* email: { value: '', component: InputField },
|
|
193
193
|
* address: {
|
|
194
|
-
* city: { value: '', component:
|
|
194
|
+
* city: { value: '', component: InputField }
|
|
195
195
|
* },
|
|
196
|
-
* items: [{ name: { value: '', component:
|
|
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:
|
|
40
|
-
* qty: { value: item.$.qty, component:
|
|
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:
|
|
92
|
+
* name: { value: '', component: InputField },
|
|
93
93
|
* address: {
|
|
94
|
-
* city: { value: '', component:
|
|
95
|
-
* street: { value: '', component:
|
|
94
|
+
* city: { value: '', component: InputField },
|
|
95
|
+
* street: { value: '', component: InputField },
|
|
96
96
|
* },
|
|
97
97
|
* items: [{
|
|
98
|
-
* title: { value: '', component:
|
|
99
|
-
* price: { value: 0, component:
|
|
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
|
-
* //
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
-
* //
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
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
|
-
* //
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
-
*
|
|
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
|
-
* //
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
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
|
-
* //
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
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
|
-
* //
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
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
|
-
* //
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
-
* //
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
-
* //
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
* //
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
-
* //
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
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
|
-
* //
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
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
|
-
* //
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
-
* //
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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>;
|