@reformer/core 1.1.0-beta.8 → 2.0.0-beta.2

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.
@@ -1,191 +0,0 @@
1
- /**
2
- * FieldRegistry - управление полями в GroupNode
3
- *
4
- * Извлечено из GroupNode для соблюдения SRP (Single Responsibility Principle).
5
- * Отвечает только за хранение и управление коллекцией полей формы.
6
- *
7
- * @template T Тип формы (объект)
8
- *
9
- * @example
10
- * ```typescript
11
- * const registry = new FieldRegistry<{ email: string; name: string }>();
12
- * registry.set('email', emailField);
13
- * registry.set('name', nameField);
14
- *
15
- * const emailField = registry.get('email');
16
- * registry.forEach((field, key) => {
17
- * console.log(key, field.value.value);
18
- * });
19
- * ```
20
- */
21
- import type { FormNode } from '../form-node';
22
- import type { FormValue } from '../../types';
23
- /**
24
- * Реестр полей формы
25
- *
26
- * Предоставляет типобезопасный доступ к полям формы
27
- * через Map-подобный интерфейс
28
- *
29
- * @template T Тип формы (объект)
30
- */
31
- export declare class FieldRegistry<T> {
32
- /**
33
- * Внутреннее хранилище полей
34
- * Map обеспечивает быструю lookup производительность O(1)
35
- */
36
- private fields;
37
- /**
38
- * Установить поле в реестр
39
- *
40
- * @param key - Ключ поля (имя свойства в типе T)
41
- * @param node - FormNode для этого поля
42
- *
43
- * @example
44
- * ```typescript
45
- * registry.set('email', new FieldNode({ value: '' }));
46
- * ```
47
- */
48
- set<K extends keyof T>(key: K, node: FormNode<T[K]>): void;
49
- /**
50
- * Получить поле из реестра
51
- *
52
- * @param key - Ключ поля
53
- * @returns FormNode или undefined, если поле не найдено
54
- *
55
- * @example
56
- * ```typescript
57
- * const emailField = registry.get('email');
58
- * if (emailField) {
59
- * console.log(emailField.value.value);
60
- * }
61
- * ```
62
- */
63
- get<K extends keyof T>(key: K): FormNode<T[K]> | undefined;
64
- /**
65
- * Проверить наличие поля в реестре
66
- *
67
- * @param key - Ключ поля
68
- * @returns true если поле существует
69
- *
70
- * @example
71
- * ```typescript
72
- * if (registry.has('email')) {
73
- * console.log('Email field exists');
74
- * }
75
- * ```
76
- */
77
- has(key: keyof T): boolean;
78
- /**
79
- * Удалить поле из реестра
80
- *
81
- * @param key - Ключ поля
82
- * @returns true если поле было удалено, false если поля не было
83
- *
84
- * @example
85
- * ```typescript
86
- * registry.delete('email');
87
- * ```
88
- */
89
- delete(key: keyof T): boolean;
90
- /**
91
- * Перебрать все поля
92
- *
93
- * @param callback - Функция обратного вызова для каждого поля
94
- *
95
- * @example
96
- * ```typescript
97
- * registry.forEach((field, key) => {
98
- * console.log(`${key}: ${field.value.value}`);
99
- * });
100
- * ```
101
- */
102
- forEach(callback: (field: FormNode<FormValue>, key: keyof T) => void): void;
103
- /**
104
- * Получить итератор значений (полей)
105
- *
106
- * @returns Итератор по всем полям
107
- *
108
- * @example
109
- * ```typescript
110
- * for (const field of registry.values()) {
111
- * await field.validate();
112
- * }
113
- * ```
114
- */
115
- values(): IterableIterator<FormNode<FormValue>>;
116
- /**
117
- * Получить итератор пар [ключ, значение]
118
- *
119
- * @returns Итератор по всем записям
120
- *
121
- * @example
122
- * ```typescript
123
- * for (const [key, field] of registry.entries()) {
124
- * console.log(key, field.value.value);
125
- * }
126
- * ```
127
- */
128
- entries(): IterableIterator<[keyof T, FormNode<FormValue>]>;
129
- /**
130
- * Получить итератор ключей полей
131
- *
132
- * @returns Итератор по всем ключам
133
- *
134
- * @example
135
- * ```typescript
136
- * const fieldNames = Array.from(registry.keys());
137
- * // ['email', 'name', 'age']
138
- * ```
139
- */
140
- keys(): IterableIterator<keyof T>;
141
- /**
142
- * Получить количество полей
143
- *
144
- * @returns Количество зарегистрированных полей
145
- *
146
- * @example
147
- * ```typescript
148
- * console.log(`Form has ${registry.size()} fields`);
149
- * ```
150
- */
151
- size(): number;
152
- /**
153
- * Очистить все поля
154
- *
155
- * Удаляет все поля из реестра
156
- *
157
- * @example
158
- * ```typescript
159
- * registry.clear();
160
- * console.log(registry.size()); // 0
161
- * ```
162
- */
163
- clear(): void;
164
- /**
165
- * Получить все поля как массив
166
- *
167
- * Полезно для операций, требующих работу с массивом
168
- *
169
- * @returns Массив всех полей
170
- *
171
- * @example
172
- * ```typescript
173
- * const allValid = registry.toArray().every(field => field.valid.value);
174
- * ```
175
- */
176
- toArray(): FormNode<FormValue>[];
177
- /**
178
- * Получить Map-представление реестра (readonly)
179
- *
180
- * Используйте для совместимости с существующим кодом
181
- *
182
- * @returns ReadonlyMap с полями
183
- * @internal
184
- *
185
- * @example
186
- * ```typescript
187
- * const mapView = registry.asMap();
188
- * ```
189
- */
190
- asMap(): ReadonlyMap<keyof T, FormNode<FormValue>>;
191
- }
@@ -1,11 +0,0 @@
1
- /**
2
- * GroupNode modules
3
- *
4
- * Модульная структура для GroupNode:
5
- * - FieldRegistry: Управление коллекцией полей
6
- * - ProxyBuilder: Создание Proxy для типобезопасного доступа к полям
7
- * - StateManager: Управление состоянием формы (signals)
8
- */
9
- export { FieldRegistry } from './field-registry';
10
- export { ProxyBuilder } from './proxy-builder';
11
- export { StateManager } from './state-manager';
@@ -1,71 +0,0 @@
1
- /**
2
- * ProxyBuilder - создание Proxy для типобезопасного доступа к полям GroupNode
3
- *
4
- * Извлечено из GroupNode для соблюдения SRP (Single Responsibility Principle).
5
- * Отвечает только за создание Proxy с расширенной поддержкой операций.
6
- *
7
- * @template T Тип формы (объект)
8
- *
9
- * @example
10
- * ```typescript
11
- * const fieldRegistry = new FieldRegistry<FormType>();
12
- * const proxyBuilder = new ProxyBuilder(fieldRegistry);
13
- * const proxy = proxyBuilder.build(groupNode);
14
- *
15
- * // Теперь можно обращаться к полям напрямую:
16
- * console.log(proxy.email.value);
17
- * console.log('email' in proxy); // true
18
- * ```
19
- */
20
- import type { GroupNode } from '../group-node';
21
- import type { GroupNodeWithControls } from '../../types/group-node-proxy';
22
- import type { FieldRegistry } from './field-registry';
23
- /**
24
- * Строитель Proxy для GroupNode
25
- *
26
- * Создает Proxy с поддержкой:
27
- * - get: Прямой доступ к полям через точечную нотацию
28
- * - set: Предупреждение о попытке прямой установки полей
29
- * - has: Проверка существования поля ('email' in form)
30
- * - ownKeys: Перечисление всех ключей (Object.keys(form))
31
- * - getOwnPropertyDescriptor: Получение дескрипторов полей
32
- *
33
- * @template T Тип формы (объект)
34
- */
35
- export declare class ProxyBuilder<T> {
36
- private fieldRegistry;
37
- /**
38
- * @param fieldRegistry - Реестр полей для доступа к коллекции
39
- */
40
- constructor(fieldRegistry: FieldRegistry<T>);
41
- /**
42
- * Создать Proxy для GroupNode
43
- *
44
- * Proxy позволяет обращаться к полям формы напрямую:
45
- * - form.email вместо form.fields.get('email')
46
- * - form.address.city вместо form.fields.get('address').fields.get('city')
47
- *
48
- * @param target - GroupNode для которого создается Proxy
49
- * @returns Proxy с типобезопасным доступом к полям
50
- *
51
- * @example
52
- * ```typescript
53
- * const proxy = proxyBuilder.build(groupNode);
54
- *
55
- * // Доступ к полям
56
- * console.log(proxy.email.value); // Работает!
57
- * console.log(proxy.name.value); // Работает!
58
- *
59
- * // Доступ к методам GroupNode
60
- * await proxy.validate(); // Работает!
61
- * proxy.markAsTouched(); // Работает!
62
- *
63
- * // Проверка существования
64
- * if ('email' in proxy) { ... }
65
- *
66
- * // Перечисление ключей
67
- * Object.keys(proxy); // ['email', 'name', ...]
68
- * ```
69
- */
70
- build(target: GroupNode<T>): GroupNodeWithControls<T>;
71
- }
@@ -1,184 +0,0 @@
1
- /**
2
- * StateManager - управление состоянием GroupNode
3
- *
4
- * Инкапсулирует всю логику создания и управления сигналами состояния:
5
- * - Приватные сигналы (submitting, disabled, formErrors)
6
- * - Публичные computed signals (value, valid, invalid, touched, dirty, pending, errors, status, submitting)
7
- *
8
- * Извлечено из GroupNode для соблюдения SRP (Single Responsibility Principle).
9
- * Отвечает только за логику управления состоянием формы.
10
- *
11
- * @template T Тип формы (объект)
12
- *
13
- * @example
14
- * ```typescript
15
- * class GroupNode {
16
- * private stateManager: StateManager<T>;
17
- *
18
- * constructor(schema: FormSchema<T>) {
19
- * this.fieldRegistry = new FieldRegistry<T>();
20
- * // ... создание полей ...
21
- * this.stateManager = new StateManager(this.fieldRegistry);
22
- *
23
- * // Доступ к computed signals
24
- * this.value = this.stateManager.value;
25
- * this.valid = this.stateManager.valid;
26
- * }
27
- * }
28
- * ```
29
- */
30
- import type { ReadonlySignal } from '@preact/signals-core';
31
- import type { ValidationError, FieldStatus } from '../../types';
32
- import type { FieldRegistry } from './field-registry';
33
- /**
34
- * Менеджер состояния для GroupNode
35
- *
36
- * Создает и управляет всеми сигналами состояния формы:
37
- * - value - значение формы как объект
38
- * - valid/invalid - валидность формы
39
- * - touched/dirty - пользовательское взаимодействие
40
- * - pending - асинхронная валидация в процессе
41
- * - errors - все ошибки валидации (form-level + field-level)
42
- * - status - общий статус формы
43
- * - submitting - флаг отправки формы
44
- *
45
- * @template T Тип формы (объект)
46
- */
47
- export declare class StateManager<T> {
48
- private readonly fieldRegistry;
49
- /**
50
- * Флаг отправки формы
51
- * Устанавливается в true во время отправки формы на сервер
52
- */
53
- private _submitting;
54
- /**
55
- * Флаг disabled состояния
56
- * Если true, форма считается disabled
57
- */
58
- private _disabled;
59
- /**
60
- * Form-level validation errors (не связанные с конкретным полем)
61
- * Используется для server-side errors или кросс-полевой валидации
62
- */
63
- private _formErrors;
64
- /**
65
- * Значение формы как объект
66
- *
67
- * Computed signal, который автоматически пересчитывается при изменении любого поля.
68
- * Использует мемоизацию - если зависимости не изменились, вернет закешированный объект.
69
- *
70
- * @example
71
- * ```typescript
72
- * const form = new GroupNode({ email: { value: 'test@mail.com' } });
73
- * console.log(form.value.value); // { email: 'test@mail.com' }
74
- * ```
75
- */
76
- readonly value: ReadonlySignal<T>;
77
- /**
78
- * Форма валидна?
79
- *
80
- * Computed signal. Форма валидна, если:
81
- * - Нет form-level errors
82
- * - Все поля валидны
83
- */
84
- readonly valid: ReadonlySignal<boolean>;
85
- /**
86
- * Форма невалидна?
87
- *
88
- * Computed signal. Инверсия valid.
89
- */
90
- readonly invalid: ReadonlySignal<boolean>;
91
- /**
92
- * Хотя бы одно поле touched?
93
- *
94
- * Computed signal. Возвращает true, если хотя бы одно поле было touched.
95
- */
96
- readonly touched: ReadonlySignal<boolean>;
97
- /**
98
- * Хотя бы одно поле dirty?
99
- *
100
- * Computed signal. Возвращает true, если хотя бы одно поле изменилось.
101
- */
102
- readonly dirty: ReadonlySignal<boolean>;
103
- /**
104
- * Асинхронная валидация в процессе?
105
- *
106
- * Computed signal. Возвращает true, если хотя бы одно поле находится в pending состоянии.
107
- */
108
- readonly pending: ReadonlySignal<boolean>;
109
- /**
110
- * Все ошибки валидации
111
- *
112
- * Computed signal. Возвращает массив всех ошибок:
113
- * - Form-level errors
114
- * - Field-level errors (из всех вложенных полей)
115
- */
116
- readonly errors: ReadonlySignal<ValidationError[]>;
117
- /**
118
- * Общий статус формы
119
- *
120
- * Computed signal. Возможные значения:
121
- * - 'disabled' - форма disabled
122
- * - 'pending' - асинхронная валидация в процессе
123
- * - 'invalid' - форма невалидна
124
- * - 'valid' - форма валидна
125
- */
126
- readonly status: ReadonlySignal<FieldStatus>;
127
- /**
128
- * Форма в процессе отправки?
129
- *
130
- * Computed signal (обертка над _submitting для read-only доступа).
131
- */
132
- readonly submitting: ReadonlySignal<boolean>;
133
- /**
134
- * Создать менеджер состояния
135
- *
136
- * @param fieldRegistry - реестр полей формы
137
- */
138
- constructor(fieldRegistry: FieldRegistry<T>);
139
- /**
140
- * Установить form-level ошибки
141
- *
142
- * @param errors - массив ошибок валидации
143
- *
144
- * @example
145
- * ```typescript
146
- * // Server-side ошибки
147
- * stateManager.setFormErrors([
148
- * { code: 'server_error', message: 'Пользователь с таким email уже существует' }
149
- * ]);
150
- * ```
151
- */
152
- setFormErrors(errors: ValidationError[]): void;
153
- /**
154
- * Очистить form-level ошибки
155
- */
156
- clearFormErrors(): void;
157
- /**
158
- * Получить form-level ошибки
159
- */
160
- getFormErrors(): ValidationError[];
161
- /**
162
- * Установить флаг submitting
163
- *
164
- * @param value - true если форма отправляется, false если нет
165
- *
166
- * @example
167
- * ```typescript
168
- * stateManager.setSubmitting(true);
169
- * await api.submitForm(form.getValue());
170
- * stateManager.setSubmitting(false);
171
- * ```
172
- */
173
- setSubmitting(value: boolean): void;
174
- /**
175
- * Установить флаг disabled
176
- *
177
- * @param value - true если форма disabled, false если нет
178
- */
179
- setDisabled(value: boolean): void;
180
- /**
181
- * Получить флаг disabled
182
- */
183
- isDisabled(): boolean;
184
- }