@reformer/core 1.1.0 → 2.0.0-beta.3
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/behaviors-DzYL8kY_.js +499 -0
- package/dist/behaviors.d.ts +6 -2
- package/dist/behaviors.js +19 -227
- package/dist/core/behavior/behavior-context.d.ts +6 -2
- package/dist/core/behavior/create-field-path.d.ts +3 -16
- package/dist/core/nodes/group-node.d.ts +14 -193
- package/dist/core/types/form-context.d.ts +10 -4
- package/dist/core/utils/field-path.d.ts +48 -0
- package/dist/core/utils/index.d.ts +1 -0
- package/dist/core/validation/core/validate-tree.d.ts +10 -4
- package/dist/core/validation/field-path.d.ts +3 -39
- package/dist/core/validation/validation-context.d.ts +23 -0
- package/dist/hooks/types.d.ts +328 -0
- package/dist/hooks/useFormControl.d.ts +13 -37
- package/dist/hooks/useFormControlValue.d.ts +167 -0
- package/dist/hooks/useSignalSubscription.d.ts +17 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.js +2886 -8
- package/dist/{create-field-path-CdPF3lIK.js → registry-helpers-BRxAr6nG.js} +133 -347
- package/dist/validators-gXoHPdqM.js +418 -0
- package/dist/validators.d.ts +6 -2
- package/dist/validators.js +29 -296
- package/llms.txt +1283 -22
- package/package.json +8 -4
- package/dist/core/behavior/behavior-applicator.d.ts +0 -71
- package/dist/core/behavior/behavior-applicator.js +0 -92
- package/dist/core/behavior/behavior-context.js +0 -38
- package/dist/core/behavior/behavior-registry.js +0 -198
- package/dist/core/behavior/behaviors/compute-from.js +0 -84
- package/dist/core/behavior/behaviors/copy-from.js +0 -64
- package/dist/core/behavior/behaviors/enable-when.js +0 -81
- package/dist/core/behavior/behaviors/index.js +0 -11
- package/dist/core/behavior/behaviors/reset-when.js +0 -63
- package/dist/core/behavior/behaviors/revalidate-when.js +0 -51
- package/dist/core/behavior/behaviors/sync-fields.js +0 -66
- package/dist/core/behavior/behaviors/transform-value.js +0 -110
- package/dist/core/behavior/behaviors/watch-field.js +0 -56
- package/dist/core/behavior/compose-behavior.js +0 -166
- package/dist/core/behavior/create-field-path.js +0 -69
- package/dist/core/behavior/index.js +0 -17
- package/dist/core/behavior/types.js +0 -7
- package/dist/core/context/form-context-impl.js +0 -37
- package/dist/core/factories/index.js +0 -6
- package/dist/core/factories/node-factory.js +0 -281
- package/dist/core/nodes/array-node.js +0 -534
- package/dist/core/nodes/field-node.js +0 -510
- package/dist/core/nodes/form-node.js +0 -343
- package/dist/core/nodes/group-node/field-registry.d.ts +0 -191
- package/dist/core/nodes/group-node/field-registry.js +0 -215
- package/dist/core/nodes/group-node/index.d.ts +0 -11
- package/dist/core/nodes/group-node/index.js +0 -11
- package/dist/core/nodes/group-node/proxy-builder.d.ts +0 -71
- package/dist/core/nodes/group-node/proxy-builder.js +0 -161
- package/dist/core/nodes/group-node/state-manager.d.ts +0 -184
- package/dist/core/nodes/group-node/state-manager.js +0 -265
- package/dist/core/nodes/group-node.js +0 -770
- package/dist/core/types/deep-schema.js +0 -11
- package/dist/core/types/field-path.js +0 -4
- package/dist/core/types/form-context.js +0 -25
- package/dist/core/types/group-node-proxy.js +0 -31
- package/dist/core/types/index.js +0 -4
- package/dist/core/types/validation-schema.js +0 -10
- package/dist/core/utils/create-form.js +0 -24
- package/dist/core/utils/debounce.js +0 -197
- package/dist/core/utils/error-handler.js +0 -226
- package/dist/core/utils/field-path-navigator.js +0 -374
- package/dist/core/utils/index.js +0 -14
- package/dist/core/utils/registry-helpers.js +0 -79
- package/dist/core/utils/registry-stack.js +0 -86
- package/dist/core/utils/resources.js +0 -69
- package/dist/core/utils/subscription-manager.js +0 -214
- package/dist/core/utils/type-guards.js +0 -169
- package/dist/core/validation/core/apply-when.js +0 -41
- package/dist/core/validation/core/apply.js +0 -38
- package/dist/core/validation/core/index.js +0 -8
- package/dist/core/validation/core/validate-async.js +0 -45
- package/dist/core/validation/core/validate-tree.js +0 -37
- package/dist/core/validation/core/validate.js +0 -38
- package/dist/core/validation/field-path.js +0 -147
- package/dist/core/validation/index.js +0 -33
- package/dist/core/validation/validate-form.js +0 -152
- package/dist/core/validation/validation-applicator.js +0 -217
- package/dist/core/validation/validation-context.js +0 -75
- package/dist/core/validation/validation-registry.js +0 -298
- package/dist/core/validation/validators/array-validators.js +0 -86
- package/dist/core/validation/validators/date.js +0 -117
- package/dist/core/validation/validators/email.js +0 -60
- package/dist/core/validation/validators/index.js +0 -14
- package/dist/core/validation/validators/max-length.js +0 -60
- package/dist/core/validation/validators/max.js +0 -60
- package/dist/core/validation/validators/min-length.js +0 -60
- package/dist/core/validation/validators/min.js +0 -60
- package/dist/core/validation/validators/number.js +0 -90
- package/dist/core/validation/validators/pattern.js +0 -62
- package/dist/core/validation/validators/phone.js +0 -58
- package/dist/core/validation/validators/required.js +0 -69
- package/dist/core/validation/validators/url.js +0 -55
- package/dist/hooks/useFormControl.js +0 -298
- package/dist/node-factory-D7DOnSSN.js +0 -3200
|
@@ -1,281 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NodeFactory - фабрика для создания узлов формы
|
|
3
|
-
*
|
|
4
|
-
* Инкапсулирует логику определения типа конфига и создания соответствующего узла.
|
|
5
|
-
* Используется в GroupNode и ArrayNode для создания дочерних узлов.
|
|
6
|
-
*
|
|
7
|
-
* Паттерн Factory Method упрощает создание узлов и делает код более читаемым:
|
|
8
|
-
* - Вместо if-else в GroupNode/ArrayNode
|
|
9
|
-
* - Единая точка для создания узлов
|
|
10
|
-
* - Легко добавлять новые типы узлов
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const factory = new NodeFactory();
|
|
15
|
-
*
|
|
16
|
-
* // Создание FieldNode
|
|
17
|
-
* const field = factory.createNode({ value: '', component: Input });
|
|
18
|
-
*
|
|
19
|
-
* // Создание GroupNode
|
|
20
|
-
* const group = factory.createNode({
|
|
21
|
-
* email: { value: '', component: Input },
|
|
22
|
-
* password: { value: '', component: Input }
|
|
23
|
-
* });
|
|
24
|
-
*
|
|
25
|
-
* // Создание ArrayNode
|
|
26
|
-
* const array = factory.createNode({
|
|
27
|
-
* schema: { title: { value: '', component: Input } },
|
|
28
|
-
* initialItems: []
|
|
29
|
-
* });
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
import { FieldNode } from '../nodes/field-node';
|
|
33
|
-
import { GroupNode } from '../nodes/group-node';
|
|
34
|
-
import { ArrayNode } from '../nodes/array-node';
|
|
35
|
-
/**
|
|
36
|
-
* Фабрика для создания узлов формы
|
|
37
|
-
*
|
|
38
|
-
* Определяет тип конфига и создает соответствующий узел (FieldNode, GroupNode, ArrayNode)
|
|
39
|
-
*/
|
|
40
|
-
export class NodeFactory {
|
|
41
|
-
/**
|
|
42
|
-
* Создает узел формы на основе конфигурации
|
|
43
|
-
*
|
|
44
|
-
* ✅ ОБНОВЛЕНО: Теперь поддерживает массивы напрямую
|
|
45
|
-
*
|
|
46
|
-
* Автоматически определяет тип узла:
|
|
47
|
-
* - FieldNode: имеет value и component
|
|
48
|
-
* - ArrayNode: массив [schema, ...items] или { schema, initialItems }
|
|
49
|
-
* - GroupNode: объект без value, component, schema
|
|
50
|
-
*
|
|
51
|
-
* @param config Конфигурация узла
|
|
52
|
-
* @returns Экземпляр FieldNode, GroupNode или ArrayNode
|
|
53
|
-
* @throws Error если конфиг не соответствует ни одному типу
|
|
54
|
-
*
|
|
55
|
-
* @example
|
|
56
|
-
* ```typescript
|
|
57
|
-
* const factory = new NodeFactory();
|
|
58
|
-
*
|
|
59
|
-
* // FieldNode
|
|
60
|
-
* const field = factory.createNode({
|
|
61
|
-
* value: 'test@mail.com',
|
|
62
|
-
* component: Input,
|
|
63
|
-
* validators: [required, email]
|
|
64
|
-
* });
|
|
65
|
-
*
|
|
66
|
-
* // GroupNode
|
|
67
|
-
* const group = factory.createNode({
|
|
68
|
-
* email: { value: '', component: Input },
|
|
69
|
-
* password: { value: '', component: Input }
|
|
70
|
-
* });
|
|
71
|
-
*
|
|
72
|
-
* // ArrayNode (объект)
|
|
73
|
-
* const array = factory.createNode({
|
|
74
|
-
* schema: { title: { value: '', component: Input } },
|
|
75
|
-
* initialItems: [{ title: 'Item 1' }]
|
|
76
|
-
* });
|
|
77
|
-
*
|
|
78
|
-
* // ArrayNode (массив) - новый формат
|
|
79
|
-
* const array2 = factory.createNode([
|
|
80
|
-
* { title: { value: '', component: Input } }, // schema
|
|
81
|
-
* { title: 'Item 1' }, // initial item 1
|
|
82
|
-
* { title: 'Item 2' } // initial item 2
|
|
83
|
-
* ]);
|
|
84
|
-
* ```
|
|
85
|
-
*/
|
|
86
|
-
createNode(config) {
|
|
87
|
-
// 0. ✅ НОВОЕ: Проверка массива (приоритет: специфический формат)
|
|
88
|
-
if (Array.isArray(config) && config.length >= 1) {
|
|
89
|
-
return this.createArrayNodeFromArray(config);
|
|
90
|
-
}
|
|
91
|
-
// 1. Проверка FieldConfig (приоритет: самый специфичный тип)
|
|
92
|
-
if (this.isFieldConfig(config)) {
|
|
93
|
-
return new FieldNode(config);
|
|
94
|
-
}
|
|
95
|
-
// 2. Проверка ArrayConfig
|
|
96
|
-
if (this.isArrayConfig(config)) {
|
|
97
|
-
const arrayConfig = config;
|
|
98
|
-
return new ArrayNode(arrayConfig.schema, arrayConfig.initialItems);
|
|
99
|
-
}
|
|
100
|
-
// 3. Проверка GroupConfig (самый общий тип)
|
|
101
|
-
if (this.isGroupConfig(config)) {
|
|
102
|
-
return new GroupNode(config);
|
|
103
|
-
}
|
|
104
|
-
// Неизвестный конфиг
|
|
105
|
-
throw new Error(`NodeFactory: Unknown node config. Expected FieldConfig, GroupConfig, or ArrayConfig, but got: ${JSON.stringify(config)}`);
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* Создать ArrayNode из массива [schema, ...initialItems]
|
|
109
|
-
*
|
|
110
|
-
* ✅ НОВОЕ: Извлечено из GroupNode для централизации логики
|
|
111
|
-
*
|
|
112
|
-
* Формат: [itemSchema, ...initialItems]
|
|
113
|
-
* - Первый элемент - схема элемента массива
|
|
114
|
-
* - Остальные элементы - начальные значения
|
|
115
|
-
*
|
|
116
|
-
* @param config Массив с схемой и начальными элементами
|
|
117
|
-
* @returns ArrayNode
|
|
118
|
-
*
|
|
119
|
-
* @example
|
|
120
|
-
* ```typescript
|
|
121
|
-
* const factory = new NodeFactory();
|
|
122
|
-
*
|
|
123
|
-
* // Массив с начальными элементами
|
|
124
|
-
* const array = factory.createArrayNodeFromArray([
|
|
125
|
-
* { title: { value: '', component: Input } }, // schema
|
|
126
|
-
* { title: 'Item 1' }, // initial value
|
|
127
|
-
* { title: 'Item 2' } // initial value
|
|
128
|
-
* ]);
|
|
129
|
-
* ```
|
|
130
|
-
* @private
|
|
131
|
-
*/
|
|
132
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
133
|
-
createArrayNodeFromArray(config) {
|
|
134
|
-
const [itemSchema, ...restItems] = config;
|
|
135
|
-
// Обработка начальных элементов:
|
|
136
|
-
// Если элемент - схема группы, извлечь значения
|
|
137
|
-
const initialItems = [];
|
|
138
|
-
// ИСПРАВЛЕНИЕ: Первый элемент является и схемой, и первым элементом данных
|
|
139
|
-
// Если первый элемент имеет значения (GroupConfig с value), добавляем его как первый item
|
|
140
|
-
if (this.isGroupConfig(itemSchema)) {
|
|
141
|
-
initialItems.push(this.extractValues(itemSchema));
|
|
142
|
-
}
|
|
143
|
-
// Добавляем остальные элементы
|
|
144
|
-
for (const item of restItems) {
|
|
145
|
-
if (this.isGroupConfig(item)) {
|
|
146
|
-
initialItems.push(this.extractValues(item));
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
initialItems.push(item);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
153
|
-
return new ArrayNode(itemSchema, initialItems);
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Извлечь значения из схемы (рекурсивно)
|
|
157
|
-
*
|
|
158
|
-
* ✅ НОВОЕ: Извлечено из GroupNode для централизации логики
|
|
159
|
-
*
|
|
160
|
-
* Преобразует схему формы в объект со значениями:
|
|
161
|
-
* - `{ name: { value: 'John', component: Input } } → { name: 'John' }`
|
|
162
|
-
* - Поддерживает вложенные группы
|
|
163
|
-
* - Поддерживает массивы
|
|
164
|
-
*
|
|
165
|
-
* @param schema Схема формы
|
|
166
|
-
* @returns Объект со значениями полей
|
|
167
|
-
*
|
|
168
|
-
* @example
|
|
169
|
-
* ```typescript
|
|
170
|
-
* const factory = new NodeFactory();
|
|
171
|
-
*
|
|
172
|
-
* const schema = {
|
|
173
|
-
* name: { value: 'John', component: Input },
|
|
174
|
-
* age: { value: 30, component: Input },
|
|
175
|
-
* address: {
|
|
176
|
-
* city: { value: 'Moscow', component: Input }
|
|
177
|
-
* }
|
|
178
|
-
* };
|
|
179
|
-
*
|
|
180
|
-
* factory.extractValues(schema);
|
|
181
|
-
* // { name: 'John', age: 30, address: { city: 'Moscow' } }
|
|
182
|
-
* ```
|
|
183
|
-
*/
|
|
184
|
-
extractValues(schema) {
|
|
185
|
-
// 1. FieldConfig - вернуть value
|
|
186
|
-
if (this.isFieldConfig(schema)) {
|
|
187
|
-
return schema.value;
|
|
188
|
-
}
|
|
189
|
-
// 2. Массив - рекурсивно обработать элементы
|
|
190
|
-
if (Array.isArray(schema)) {
|
|
191
|
-
return schema.map((item) => this.extractValues(item));
|
|
192
|
-
}
|
|
193
|
-
// 3. GroupConfig - рекурсивно извлечь значения всех полей
|
|
194
|
-
if (this.isGroupConfig(schema)) {
|
|
195
|
-
const result = {};
|
|
196
|
-
for (const [key, config] of Object.entries(schema)) {
|
|
197
|
-
result[key] = this.extractValues(config);
|
|
198
|
-
}
|
|
199
|
-
return result;
|
|
200
|
-
}
|
|
201
|
-
// 4. Примитивное значение - вернуть как есть
|
|
202
|
-
return schema;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* Проверяет, является ли конфиг конфигурацией поля (FieldConfig)
|
|
206
|
-
*
|
|
207
|
-
* FieldConfig имеет обязательные свойства:
|
|
208
|
-
* - value: начальное значение поля
|
|
209
|
-
* - component: React-компонент для отображения
|
|
210
|
-
*
|
|
211
|
-
* @param config Проверяемая конфигурация
|
|
212
|
-
* @returns true если config является FieldConfig
|
|
213
|
-
*
|
|
214
|
-
* @example
|
|
215
|
-
* ```typescript
|
|
216
|
-
* const factory = new NodeFactory();
|
|
217
|
-
*
|
|
218
|
-
* factory.isFieldConfig({ value: '', component: Input }); // true
|
|
219
|
-
* factory.isFieldConfig({ email: { value: '' } }); // false
|
|
220
|
-
* factory.isFieldConfig(null); // false
|
|
221
|
-
* ```
|
|
222
|
-
*/
|
|
223
|
-
isFieldConfig(config) {
|
|
224
|
-
return (config != null && typeof config === 'object' && 'value' in config && 'component' in config);
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* Проверяет, является ли конфиг конфигурацией массива (ArrayConfig)
|
|
228
|
-
*
|
|
229
|
-
* ArrayConfig имеет обязательное свойство:
|
|
230
|
-
* - schema: схема для элементов массива
|
|
231
|
-
*
|
|
232
|
-
* И НЕ имеет:
|
|
233
|
-
* - value (отличие от FieldConfig)
|
|
234
|
-
*
|
|
235
|
-
* @param config Проверяемая конфигурация
|
|
236
|
-
* @returns true если config является ArrayConfig
|
|
237
|
-
*
|
|
238
|
-
* @example
|
|
239
|
-
* ```typescript
|
|
240
|
-
* const factory = new NodeFactory();
|
|
241
|
-
*
|
|
242
|
-
* factory.isArrayConfig({ schema: {}, initialItems: [] }); // true
|
|
243
|
-
* factory.isArrayConfig({ value: '', component: Input }); // false
|
|
244
|
-
* factory.isArrayConfig({ email: { value: '' } }); // false
|
|
245
|
-
* ```
|
|
246
|
-
*/
|
|
247
|
-
isArrayConfig(config) {
|
|
248
|
-
return (config != null && typeof config === 'object' && 'schema' in config && !('value' in config));
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* Проверяет, является ли конфиг конфигурацией группы (GroupConfig)
|
|
252
|
-
*
|
|
253
|
-
* GroupConfig - это объект, который:
|
|
254
|
-
* - НЕ является FieldConfig (нет value/component)
|
|
255
|
-
* - НЕ является ArrayConfig (нет schema)
|
|
256
|
-
* - Содержит вложенные конфиги полей/групп/массивов
|
|
257
|
-
*
|
|
258
|
-
* @param config Проверяемая конфигурация
|
|
259
|
-
* @returns true если config является GroupConfig
|
|
260
|
-
*
|
|
261
|
-
* @example
|
|
262
|
-
* ```typescript
|
|
263
|
-
* const factory = new NodeFactory();
|
|
264
|
-
*
|
|
265
|
-
* factory.isGroupConfig({
|
|
266
|
-
* email: { value: '', component: Input },
|
|
267
|
-
* password: { value: '', component: Input }
|
|
268
|
-
* }); // true
|
|
269
|
-
*
|
|
270
|
-
* factory.isGroupConfig({ value: '', component: Input }); // false
|
|
271
|
-
* factory.isGroupConfig({ schema: {} }); // false
|
|
272
|
-
* factory.isGroupConfig(null); // false
|
|
273
|
-
* ```
|
|
274
|
-
*/
|
|
275
|
-
isGroupConfig(config) {
|
|
276
|
-
return (config != null &&
|
|
277
|
-
typeof config === 'object' &&
|
|
278
|
-
!this.isFieldConfig(config) &&
|
|
279
|
-
!this.isArrayConfig(config));
|
|
280
|
-
}
|
|
281
|
-
}
|