@reformer/core 7.0.0-beta.1 → 7.0.0
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/core/factories/node-factory.d.ts +2 -1
- package/dist/core/model/behaviors.d.ts +13 -1
- package/dist/core/model/validate-model.d.ts +22 -0
- package/dist/core/nodes/field-node.d.ts +3 -3
- package/dist/core/nodes/group-node.d.ts +3 -5
- package/dist/core/nodes/model-array-node.d.ts +38 -0
- package/dist/core/types/validation-schema.d.ts +8 -2
- package/dist/core/utils/create-form.d.ts +83 -18
- package/dist/core/utils/derived-registry.d.ts +41 -2
- package/dist/core/utils/index.d.ts +0 -4
- package/dist/core/utils/signal-node-registry.d.ts +38 -4
- package/dist/core/validation/validators/email.d.ts +14 -4
- package/dist/core/validation/validators/future-date.d.ts +14 -4
- package/dist/core/validation/validators/index.d.ts +2 -1
- package/dist/core/validation/validators/integer.d.ts +13 -4
- package/dist/core/validation/validators/is-date.d.ts +14 -4
- package/dist/core/validation/validators/is-number.d.ts +15 -5
- package/dist/core/validation/validators/max-age.d.ts +16 -4
- package/dist/core/validation/validators/max-date.d.ts +16 -4
- package/dist/core/validation/validators/max-length.d.ts +18 -4
- package/dist/core/validation/validators/max.d.ts +15 -6
- package/dist/core/validation/validators/min-age.d.ts +16 -4
- package/dist/core/validation/validators/min-date.d.ts +16 -4
- package/dist/core/validation/validators/min-length.d.ts +18 -4
- package/dist/core/validation/validators/min.d.ts +15 -6
- package/dist/core/validation/validators/multiple-of.d.ts +15 -4
- package/dist/core/validation/validators/non-negative.d.ts +13 -4
- package/dist/core/validation/validators/non-zero.d.ts +13 -4
- package/dist/core/validation/validators/past-date.d.ts +14 -3
- package/dist/core/validation/validators/pattern.d.ts +24 -4
- package/dist/core/validation/validators/phone.d.ts +28 -4
- package/dist/core/validation/validators/required.d.ts +16 -5
- package/dist/core/validation/validators/url.d.ts +30 -7
- package/dist/hooks/useFormControlValue.d.ts +15 -10
- package/dist/index.js +562 -896
- package/llms.txt +2567 -2854
- package/package.json +1 -1
- package/dist/core/utils/abstract-registry.d.ts +0 -74
- package/dist/core/utils/form-observer.d.ts +0 -176
- package/dist/core/utils/registry-stack.d.ts +0 -69
package/package.json
CHANGED
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { RegistryStack } from './registry-stack';
|
|
2
|
-
/**
|
|
3
|
-
* Базовый класс для реестров (BehaviorRegistry, ValidationRegistry).
|
|
4
|
-
*
|
|
5
|
-
* Реализует паттерн Template Method для управления регистрацией:
|
|
6
|
-
* `beginRegistration()` → `onBeginRegistration()`, `endRegistration()` → `onEndRegistration()`.
|
|
7
|
-
*
|
|
8
|
-
* @typeParam TRegistration - Тип регистрируемых элементов.
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* import { AbstractRegistry } from '@reformer/core';
|
|
13
|
-
*
|
|
14
|
-
* class MyRegistry extends AbstractRegistry<{ name: string }> {
|
|
15
|
-
* protected onEndRegistration(items: { name: string }[]) {
|
|
16
|
-
* console.log('Registered', items.length);
|
|
17
|
-
* }
|
|
18
|
-
* }
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
export declare abstract class AbstractRegistry<TRegistration> {
|
|
22
|
-
/** Флаг активной регистрации */
|
|
23
|
-
protected isRegistering: boolean;
|
|
24
|
-
/** Массив зарегистрированных элементов */
|
|
25
|
-
protected registrations: TRegistration[];
|
|
26
|
-
/**
|
|
27
|
-
* Получить стек для конкретного класса реестра
|
|
28
|
-
* Создает новый стек если не существует
|
|
29
|
-
*
|
|
30
|
-
* @param ctor - Конструктор класса реестра
|
|
31
|
-
* @returns RegistryStack для данного класса
|
|
32
|
-
*/
|
|
33
|
-
protected static getStack<T extends AbstractRegistry<any>>(ctor: new (...args: any[]) => T): RegistryStack<T>;
|
|
34
|
-
/**
|
|
35
|
-
* Получить текущий активный реестр из стека
|
|
36
|
-
* Должен быть переопределен в наследниках как static метод
|
|
37
|
-
*
|
|
38
|
-
* @param ctor - Конструктор класса реестра
|
|
39
|
-
* @returns Текущий активный реестр или null
|
|
40
|
-
*/
|
|
41
|
-
protected static getCurrentFromStack<T extends AbstractRegistry<any>>(ctor: new (...args: any[]) => T): T | null;
|
|
42
|
-
/**
|
|
43
|
-
* Начать регистрацию
|
|
44
|
-
*
|
|
45
|
-
* Помещает this в global stack для изоляции форм
|
|
46
|
-
* Вызывает hook onBeginRegistration()
|
|
47
|
-
*/
|
|
48
|
-
beginRegistration(): void;
|
|
49
|
-
/**
|
|
50
|
-
* Проверить, активна ли регистрация
|
|
51
|
-
*/
|
|
52
|
-
isActive(): boolean;
|
|
53
|
-
/**
|
|
54
|
-
* Получить зарегистрированные элементы
|
|
55
|
-
*/
|
|
56
|
-
getRegistrations(): TRegistration[];
|
|
57
|
-
/**
|
|
58
|
-
* Hook: вызывается в начале регистрации
|
|
59
|
-
* Может быть переопределен в наследниках для инициализации
|
|
60
|
-
*/
|
|
61
|
-
protected onBeginRegistration(): void;
|
|
62
|
-
/**
|
|
63
|
-
* Завершить регистрацию и извлечь из стека
|
|
64
|
-
*
|
|
65
|
-
* @param registryName - Имя реестра для отладки
|
|
66
|
-
*/
|
|
67
|
-
protected completeRegistration(registryName: string): void;
|
|
68
|
-
/**
|
|
69
|
-
* Отменить регистрацию без применения
|
|
70
|
-
*
|
|
71
|
-
* @param registryName - Имя реестра для отладки
|
|
72
|
-
*/
|
|
73
|
-
cancelRegistration(registryName: string): void;
|
|
74
|
-
}
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import { FormFields, FormValue, FieldStatus, ValidationError } from '../types';
|
|
2
|
-
/**
|
|
3
|
-
* Тип события изменения в форме
|
|
4
|
-
*/
|
|
5
|
-
export type FormChangeType = 'value' | 'status' | 'errors' | 'touched' | 'dirty';
|
|
6
|
-
/**
|
|
7
|
-
* Событие изменения в форме
|
|
8
|
-
*/
|
|
9
|
-
export interface FormChangeEvent {
|
|
10
|
-
/** Тип изменения */
|
|
11
|
-
type: FormChangeType;
|
|
12
|
-
/** Путь к полю */
|
|
13
|
-
path: string;
|
|
14
|
-
/** Timestamp события */
|
|
15
|
-
timestamp: number;
|
|
16
|
-
/** Старое значение */
|
|
17
|
-
oldValue?: unknown;
|
|
18
|
-
/** Новое значение */
|
|
19
|
-
newValue: unknown;
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Интерфейс узла формы для observer
|
|
23
|
-
*/
|
|
24
|
-
export interface ObservableFormNode {
|
|
25
|
-
value: {
|
|
26
|
-
value: FormValue;
|
|
27
|
-
};
|
|
28
|
-
status: {
|
|
29
|
-
value: FieldStatus;
|
|
30
|
-
};
|
|
31
|
-
errors: {
|
|
32
|
-
value: ValidationError[];
|
|
33
|
-
};
|
|
34
|
-
touched: {
|
|
35
|
-
value: boolean;
|
|
36
|
-
};
|
|
37
|
-
dirty: {
|
|
38
|
-
value: boolean;
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Интерфейс формы для observer
|
|
43
|
-
*/
|
|
44
|
-
export interface ObservableForm<T extends FormFields> {
|
|
45
|
-
value: {
|
|
46
|
-
value: T;
|
|
47
|
-
};
|
|
48
|
-
status: {
|
|
49
|
-
value: FieldStatus;
|
|
50
|
-
};
|
|
51
|
-
errors: {
|
|
52
|
-
value: ValidationError[];
|
|
53
|
-
};
|
|
54
|
-
touched: {
|
|
55
|
-
value: boolean;
|
|
56
|
-
};
|
|
57
|
-
dirty: {
|
|
58
|
-
value: boolean;
|
|
59
|
-
};
|
|
60
|
-
getFieldByPath(path: string): ObservableFormNode | undefined;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Callback для обработки событий изменения
|
|
64
|
-
*/
|
|
65
|
-
export type FormChangeCallback = (event: FormChangeEvent) => void;
|
|
66
|
-
/**
|
|
67
|
-
* Опции для FormObserver
|
|
68
|
-
*/
|
|
69
|
-
export interface FormObserverOptions {
|
|
70
|
-
/** Включить логирование в консоль (по умолчанию true в DEV) */
|
|
71
|
-
enableLogging?: boolean;
|
|
72
|
-
/** Фильтр типов событий */
|
|
73
|
-
eventTypes?: FormChangeType[];
|
|
74
|
-
/** Фильтр путей полей (regex или массив) */
|
|
75
|
-
pathFilter?: RegExp | string[];
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* FormObserver - мониторинг изменений в форме
|
|
79
|
-
*
|
|
80
|
-
* Полезен для:
|
|
81
|
-
* - Отладки сложных форм
|
|
82
|
-
* - Логирования изменений для аудита
|
|
83
|
-
* - Синхронизации с внешними системами
|
|
84
|
-
*
|
|
85
|
-
* @example
|
|
86
|
-
* ```typescript
|
|
87
|
-
* const observer = new FormObserver(form, {
|
|
88
|
-
* enableLogging: true,
|
|
89
|
-
* eventTypes: ['value', 'errors']
|
|
90
|
-
* });
|
|
91
|
-
*
|
|
92
|
-
* // Подписка на события
|
|
93
|
-
* const unsubscribe = observer.subscribe((event) => {
|
|
94
|
-
* console.log(`${event.type} at ${event.path}:`, event.newValue);
|
|
95
|
-
* });
|
|
96
|
-
*
|
|
97
|
-
* // Включить трассировку
|
|
98
|
-
* const disposeTracing = observer.enableTracing();
|
|
99
|
-
*
|
|
100
|
-
* // Cleanup
|
|
101
|
-
* unsubscribe();
|
|
102
|
-
* disposeTracing();
|
|
103
|
-
* ```
|
|
104
|
-
*/
|
|
105
|
-
export declare class FormObserver<T extends FormFields> {
|
|
106
|
-
private readonly form;
|
|
107
|
-
private listeners;
|
|
108
|
-
private disposers;
|
|
109
|
-
private options;
|
|
110
|
-
/**
|
|
111
|
-
* @param form - Форма для наблюдения
|
|
112
|
-
* @param options - Опции observer
|
|
113
|
-
*/
|
|
114
|
-
constructor(form: ObservableForm<T>, options?: FormObserverOptions);
|
|
115
|
-
/**
|
|
116
|
-
* Подписаться на события изменения
|
|
117
|
-
*
|
|
118
|
-
* @param callback - Функция обработки события
|
|
119
|
-
* @returns Функция отписки
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* const unsubscribe = observer.subscribe((event) => {
|
|
124
|
-
* // Отправить событие в analytics
|
|
125
|
-
* analytics.track('form_change', event);
|
|
126
|
-
* });
|
|
127
|
-
* ```
|
|
128
|
-
*/
|
|
129
|
-
subscribe(callback: FormChangeCallback): () => void;
|
|
130
|
-
/**
|
|
131
|
-
* Включить трассировку формы
|
|
132
|
-
*
|
|
133
|
-
* Подписывается на изменения основных сигналов формы
|
|
134
|
-
* и вызывает listeners при каждом изменении
|
|
135
|
-
*
|
|
136
|
-
* @returns Функция для отключения трассировки
|
|
137
|
-
*
|
|
138
|
-
* @example
|
|
139
|
-
* ```typescript
|
|
140
|
-
* const dispose = observer.enableTracing();
|
|
141
|
-
*
|
|
142
|
-
* // Позже, для отключения
|
|
143
|
-
* dispose();
|
|
144
|
-
* ```
|
|
145
|
-
*/
|
|
146
|
-
enableTracing(): () => void;
|
|
147
|
-
/**
|
|
148
|
-
* Наблюдать за конкретным полем
|
|
149
|
-
*
|
|
150
|
-
* @param path - Путь к полю
|
|
151
|
-
* @returns Функция для отключения наблюдения
|
|
152
|
-
*
|
|
153
|
-
* @example
|
|
154
|
-
* ```typescript
|
|
155
|
-
* // Наблюдать за полем email
|
|
156
|
-
* const dispose = observer.watchField('email');
|
|
157
|
-
* ```
|
|
158
|
-
*/
|
|
159
|
-
watchField(path: string): () => void;
|
|
160
|
-
/**
|
|
161
|
-
* Отправить событие всем listeners
|
|
162
|
-
*/
|
|
163
|
-
private emit;
|
|
164
|
-
/**
|
|
165
|
-
* Проверить, нужно ли отслеживать тип события
|
|
166
|
-
*/
|
|
167
|
-
private shouldTrack;
|
|
168
|
-
/**
|
|
169
|
-
* Проверить, соответствует ли путь фильтру
|
|
170
|
-
*/
|
|
171
|
-
private matchesPathFilter;
|
|
172
|
-
/**
|
|
173
|
-
* Очистить все подписки и disposers
|
|
174
|
-
*/
|
|
175
|
-
dispose(): void;
|
|
176
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generic Registry Stack - утилита для управления стеком регистрации
|
|
3
|
-
*
|
|
4
|
-
* Используется ValidationRegistry и BehaviorRegistry для tracking активного контекста.
|
|
5
|
-
* Устраняет дублирование кода между параллельными системами.
|
|
6
|
-
*
|
|
7
|
-
* @template T - Тип элементов в стеке (ValidationRegistry или BehaviorRegistry)
|
|
8
|
-
*
|
|
9
|
-
* @internal
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* class ValidationRegistry {
|
|
14
|
-
* private static registryStack = new RegistryStack<ValidationRegistry>();
|
|
15
|
-
*
|
|
16
|
-
* static getCurrent() {
|
|
17
|
-
* return ValidationRegistry.registryStack.getCurrent();
|
|
18
|
-
* }
|
|
19
|
-
*
|
|
20
|
-
* beginRegistration() {
|
|
21
|
-
* ValidationRegistry.registryStack.push(this);
|
|
22
|
-
* }
|
|
23
|
-
*
|
|
24
|
-
* endRegistration() {
|
|
25
|
-
* ValidationRegistry.registryStack.verify(this, 'ValidationRegistry');
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare class RegistryStack<T> {
|
|
31
|
-
private stack;
|
|
32
|
-
/**
|
|
33
|
-
* Добавить элемент в стек
|
|
34
|
-
* @param item - Элемент для добавления
|
|
35
|
-
*/
|
|
36
|
-
push(item: T): void;
|
|
37
|
-
/**
|
|
38
|
-
* Извлечь элемент из стека
|
|
39
|
-
* @returns Извлеченный элемент или undefined если стек пуст
|
|
40
|
-
*/
|
|
41
|
-
pop(): T | undefined;
|
|
42
|
-
/**
|
|
43
|
-
* Получить текущий элемент (вершину стека) без извлечения
|
|
44
|
-
* @returns Текущий элемент или null если стек пуст
|
|
45
|
-
*/
|
|
46
|
-
getCurrent(): T | null;
|
|
47
|
-
/**
|
|
48
|
-
* Извлечь элемент из стека с проверкой
|
|
49
|
-
* Выводит предупреждение в DEV режиме если извлеченный элемент не совпадает с ожидаемым
|
|
50
|
-
*
|
|
51
|
-
* @param expected - Ожидаемый элемент
|
|
52
|
-
* @param name - Имя реестра для отладки (например, 'ValidationRegistry')
|
|
53
|
-
*/
|
|
54
|
-
verify(expected: T, name: string): void;
|
|
55
|
-
/**
|
|
56
|
-
* Получить длину стека
|
|
57
|
-
* @returns Количество элементов в стеке
|
|
58
|
-
*/
|
|
59
|
-
get length(): number;
|
|
60
|
-
/**
|
|
61
|
-
* Проверить, пуст ли стек
|
|
62
|
-
* @returns true если стек пуст
|
|
63
|
-
*/
|
|
64
|
-
isEmpty(): boolean;
|
|
65
|
-
/**
|
|
66
|
-
* Очистить стек
|
|
67
|
-
*/
|
|
68
|
-
clear(): void;
|
|
69
|
-
}
|