@reformer/core 1.1.0 → 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.
Files changed (99) hide show
  1. package/dist/behaviors-DzYL8kY_.js +499 -0
  2. package/dist/behaviors.d.ts +6 -2
  3. package/dist/behaviors.js +19 -227
  4. package/dist/core/behavior/behavior-context.d.ts +6 -2
  5. package/dist/core/behavior/create-field-path.d.ts +3 -16
  6. package/dist/core/nodes/group-node.d.ts +14 -193
  7. package/dist/core/types/form-context.d.ts +10 -4
  8. package/dist/core/utils/field-path.d.ts +48 -0
  9. package/dist/core/utils/index.d.ts +1 -0
  10. package/dist/core/validation/core/validate-tree.d.ts +10 -4
  11. package/dist/core/validation/field-path.d.ts +3 -39
  12. package/dist/core/validation/validation-context.d.ts +23 -0
  13. package/dist/hooks/types.d.ts +328 -0
  14. package/dist/hooks/useFormControl.d.ts +13 -37
  15. package/dist/hooks/useFormControlValue.d.ts +167 -0
  16. package/dist/hooks/useSignalSubscription.d.ts +17 -0
  17. package/dist/index.d.ts +6 -1
  18. package/dist/index.js +2886 -8
  19. package/dist/{create-field-path-CdPF3lIK.js → registry-helpers-BRxAr6nG.js} +133 -347
  20. package/dist/validators-gXoHPdqM.js +418 -0
  21. package/dist/validators.d.ts +6 -2
  22. package/dist/validators.js +29 -296
  23. package/llms.txt +1283 -22
  24. package/package.json +8 -4
  25. package/dist/core/behavior/behavior-applicator.d.ts +0 -71
  26. package/dist/core/behavior/behavior-applicator.js +0 -92
  27. package/dist/core/behavior/behavior-context.js +0 -38
  28. package/dist/core/behavior/behavior-registry.js +0 -198
  29. package/dist/core/behavior/behaviors/compute-from.js +0 -84
  30. package/dist/core/behavior/behaviors/copy-from.js +0 -64
  31. package/dist/core/behavior/behaviors/enable-when.js +0 -81
  32. package/dist/core/behavior/behaviors/index.js +0 -11
  33. package/dist/core/behavior/behaviors/reset-when.js +0 -63
  34. package/dist/core/behavior/behaviors/revalidate-when.js +0 -51
  35. package/dist/core/behavior/behaviors/sync-fields.js +0 -66
  36. package/dist/core/behavior/behaviors/transform-value.js +0 -110
  37. package/dist/core/behavior/behaviors/watch-field.js +0 -56
  38. package/dist/core/behavior/compose-behavior.js +0 -166
  39. package/dist/core/behavior/create-field-path.js +0 -69
  40. package/dist/core/behavior/index.js +0 -17
  41. package/dist/core/behavior/types.js +0 -7
  42. package/dist/core/context/form-context-impl.js +0 -37
  43. package/dist/core/factories/index.js +0 -6
  44. package/dist/core/factories/node-factory.js +0 -281
  45. package/dist/core/nodes/array-node.js +0 -534
  46. package/dist/core/nodes/field-node.js +0 -510
  47. package/dist/core/nodes/form-node.js +0 -343
  48. package/dist/core/nodes/group-node/field-registry.d.ts +0 -191
  49. package/dist/core/nodes/group-node/field-registry.js +0 -215
  50. package/dist/core/nodes/group-node/index.d.ts +0 -11
  51. package/dist/core/nodes/group-node/index.js +0 -11
  52. package/dist/core/nodes/group-node/proxy-builder.d.ts +0 -71
  53. package/dist/core/nodes/group-node/proxy-builder.js +0 -161
  54. package/dist/core/nodes/group-node/state-manager.d.ts +0 -184
  55. package/dist/core/nodes/group-node/state-manager.js +0 -265
  56. package/dist/core/nodes/group-node.js +0 -770
  57. package/dist/core/types/deep-schema.js +0 -11
  58. package/dist/core/types/field-path.js +0 -4
  59. package/dist/core/types/form-context.js +0 -25
  60. package/dist/core/types/group-node-proxy.js +0 -31
  61. package/dist/core/types/index.js +0 -4
  62. package/dist/core/types/validation-schema.js +0 -10
  63. package/dist/core/utils/create-form.js +0 -24
  64. package/dist/core/utils/debounce.js +0 -197
  65. package/dist/core/utils/error-handler.js +0 -226
  66. package/dist/core/utils/field-path-navigator.js +0 -374
  67. package/dist/core/utils/index.js +0 -14
  68. package/dist/core/utils/registry-helpers.js +0 -79
  69. package/dist/core/utils/registry-stack.js +0 -86
  70. package/dist/core/utils/resources.js +0 -69
  71. package/dist/core/utils/subscription-manager.js +0 -214
  72. package/dist/core/utils/type-guards.js +0 -169
  73. package/dist/core/validation/core/apply-when.js +0 -41
  74. package/dist/core/validation/core/apply.js +0 -38
  75. package/dist/core/validation/core/index.js +0 -8
  76. package/dist/core/validation/core/validate-async.js +0 -45
  77. package/dist/core/validation/core/validate-tree.js +0 -37
  78. package/dist/core/validation/core/validate.js +0 -38
  79. package/dist/core/validation/field-path.js +0 -147
  80. package/dist/core/validation/index.js +0 -33
  81. package/dist/core/validation/validate-form.js +0 -152
  82. package/dist/core/validation/validation-applicator.js +0 -217
  83. package/dist/core/validation/validation-context.js +0 -75
  84. package/dist/core/validation/validation-registry.js +0 -298
  85. package/dist/core/validation/validators/array-validators.js +0 -86
  86. package/dist/core/validation/validators/date.js +0 -117
  87. package/dist/core/validation/validators/email.js +0 -60
  88. package/dist/core/validation/validators/index.js +0 -14
  89. package/dist/core/validation/validators/max-length.js +0 -60
  90. package/dist/core/validation/validators/max.js +0 -60
  91. package/dist/core/validation/validators/min-length.js +0 -60
  92. package/dist/core/validation/validators/min.js +0 -60
  93. package/dist/core/validation/validators/number.js +0 -90
  94. package/dist/core/validation/validators/pattern.js +0 -62
  95. package/dist/core/validation/validators/phone.js +0 -58
  96. package/dist/core/validation/validators/required.js +0 -69
  97. package/dist/core/validation/validators/url.js +0 -55
  98. package/dist/hooks/useFormControl.js +0 -298
  99. package/dist/node-factory-D7DOnSSN.js +0 -3200
@@ -1,11 +0,0 @@
1
- /**
2
- * Типы для схемы формы (Deep Schema)
3
- *
4
- * Автоматическое определение типов схемы на основе структуры данных:
5
- * - `[{...}]` → массив форм
6
- * - `{...}` → вложенная группа
7
- * - `{value, component}` → конфигурация поля
8
- *
9
- * @group Types
10
- */
11
- export {};
@@ -1,4 +0,0 @@
1
- // ============================================================================
2
- // FieldPath - proxy для доступа к путям полей
3
- // ============================================================================
4
- export {};
@@ -1,25 +0,0 @@
1
- /**
2
- * Единый контекст для работы с формой
3
- *
4
- * Используется в:
5
- * - Behavior схемах (watchField, copyFrom, transformValue, etc.)
6
- * - Validation схемах (validate, validateAsync, validateTree)
7
- *
8
- * @example
9
- * ```typescript
10
- * // Behavior
11
- * watchField(path.country, (country, ctx) => {
12
- * ctx.form.city.updateComponentProps({ options: cities });
13
- * ctx.setFieldValue('city', null);
14
- * });
15
- *
16
- * // Validation
17
- * validate(path.email, (value, ctx) => {
18
- * if (!value) return { code: 'required', message: 'Required' };
19
- * const confirm = ctx.form.confirmEmail.value.value;
20
- * if (value !== confirm) return { code: 'mismatch', message: 'Emails must match' };
21
- * return null;
22
- * });
23
- * ```
24
- */
25
- export {};
@@ -1,31 +0,0 @@
1
- /**
2
- * Типы для Proxy-доступа к полям GroupNode
3
- *
4
- * Решает проблему типизации, когда GroupNode<T> использует Proxy для прямого доступа к полям.
5
- * TypeScript не может автоматически определить правильные типы для вложенных форм и массивов.
6
- *
7
- * @group Types
8
- *
9
- * @example
10
- * ```typescript
11
- * interface MyForm {
12
- * name: string;
13
- * address: {
14
- * city: string;
15
- * };
16
- * items: Array<{ title: string }>;
17
- * }
18
- *
19
- * const form: GroupNodeWithControls<MyForm> = new GroupNode(schema);
20
- *
21
- * // TypeScript знает, что это FieldNode<string>
22
- * form.name.setValue('John');
23
- *
24
- * // TypeScript знает, что это GroupNode<{city: string}>
25
- * form.address.city.setValue('Moscow');
26
- *
27
- * // TypeScript знает, что это ArrayNode<{title: string}>
28
- * form.items.push({ title: 'New Item' });
29
- * ```
30
- */
31
- export {};
@@ -1,4 +0,0 @@
1
- // ============================================================================
2
- // Form Value Types
3
- // ============================================================================
4
- export {};
@@ -1,10 +0,0 @@
1
- /**
2
- * Типы для validation schema паттерна
3
- *
4
- * Основано на Angular Signal Forms подходе:
5
- * - Валидация определяется отдельно от схемы полей
6
- * - Поддержка условной валидации (applyWhen)
7
- * - Cross-field валидация (validateTree)
8
- * - Асинхронная валидация с контекстом
9
- */
10
- export {};
@@ -1,24 +0,0 @@
1
- /**
2
- * Фабричная функция для создания формы с правильной типизацией
3
- *
4
- * Решает проблему с типизацией конструктора GroupNode, который возвращает
5
- * Proxy (GroupNodeWithControls), но TypeScript не может это вывести автоматически.
6
- *
7
- * @group Utilities
8
- *
9
- * @example
10
- * ```typescript
11
- * // Вместо:
12
- * const form: GroupNodeWithControls<MyForm> = new GroupNode<MyForm>(config);
13
- *
14
- * // Используйте:
15
- * const form = createForm<MyForm>(config);
16
- * ```
17
- */
18
- import { GroupNode } from '../nodes/group-node';
19
- /**
20
- * Реализация фабричной функции
21
- */
22
- export function createForm(schemaOrConfig) {
23
- return new GroupNode(schemaOrConfig);
24
- }
@@ -1,197 +0,0 @@
1
- /**
2
- * Debouncer - утилита для отложенного выполнения функций
3
- *
4
- * Устраняет дублирование debounce логики между field-node.ts и behavior-registry.ts
5
- *
6
- * @internal
7
- *
8
- * @example
9
- * ```typescript
10
- * const debouncer = new Debouncer(300);
11
- *
12
- * // Отложить выполнение на 300мс
13
- * await debouncer.debounce(async () => {
14
- * await validateField();
15
- * });
16
- *
17
- * // Отменить отложенное выполнение
18
- * debouncer.cancel();
19
- *
20
- * // Выполнить немедленно, отменив отложенное
21
- * await debouncer.flush(async () => {
22
- * await validateField();
23
- * });
24
- * ```
25
- */
26
- /**
27
- * Класс для debouncing (отложенного выполнения) функций
28
- *
29
- * @internal
30
- *
31
- * Откладывает выполнение функции на заданное время. Если функция вызывается
32
- * повторно до истечения времени, предыдущий вызов отменяется.
33
- *
34
- * Полезно для:
35
- * - Отложенной валидации при вводе (debounced validation)
36
- * - Отложенного сохранения данных
37
- * - Отложенной обработки событий behaviors
38
- *
39
- * @example
40
- * ```typescript
41
- * // В FieldNode
42
- * class FieldNode {
43
- * private validationDebouncer: Debouncer;
44
- *
45
- * constructor(config) {
46
- * this.validationDebouncer = new Debouncer(config.debounce || 0);
47
- * }
48
- *
49
- * async validate(): Promise<boolean> {
50
- * return this.validationDebouncer.debounce(async () => {
51
- * // Валидация выполнится через debounce мс
52
- * return await this.runValidation();
53
- * });
54
- * }
55
- * }
56
- * ```
57
- */
58
- export class Debouncer {
59
- delay;
60
- /**
61
- * Таймер для отложенного выполнения
62
- * @private
63
- */
64
- timer;
65
- /**
66
- * Создать Debouncer с заданной задержкой
67
- *
68
- * @param delay Задержка в миллисекундах (0 = без задержки)
69
- *
70
- * @example
71
- * ```typescript
72
- * const debouncer = new Debouncer(300); // 300мс задержка
73
- * const immediate = new Debouncer(0); // Без задержки
74
- * ```
75
- */
76
- constructor(delay) {
77
- this.delay = delay;
78
- }
79
- /**
80
- * Отложить выполнение функции
81
- *
82
- * Если вызывается повторно до истечения delay, предыдущий вызов отменяется
83
- * и таймер перезапускается.
84
- *
85
- * @param fn Функция для выполнения (может быть async)
86
- * @returns Promise, который разрешается результатом функции
87
- *
88
- * @example
89
- * ```typescript
90
- * const debouncer = new Debouncer(300);
91
- *
92
- * // Первый вызов - запланирован через 300мс
93
- * debouncer.debounce(async () => console.log('First'));
94
- *
95
- * // Второй вызов через 100мс - отменяет первый, запланирован через 300мс
96
- * debouncer.debounce(async () => console.log('Second'));
97
- *
98
- * // Через 300мс выведет только: "Second"
99
- * ```
100
- */
101
- async debounce(fn) {
102
- return new Promise((resolve, reject) => {
103
- // Отменяем предыдущий таймер, если есть
104
- if (this.timer) {
105
- clearTimeout(this.timer);
106
- }
107
- // Если delay = 0, выполняем немедленно
108
- if (this.delay === 0) {
109
- Promise.resolve()
110
- .then(() => fn())
111
- .then(resolve)
112
- .catch(reject);
113
- return;
114
- }
115
- // Запускаем новый таймер
116
- this.timer = setTimeout(async () => {
117
- try {
118
- const result = await fn();
119
- resolve(result);
120
- }
121
- catch (error) {
122
- reject(error);
123
- }
124
- }, this.delay);
125
- });
126
- }
127
- /**
128
- * Отменить отложенное выполнение
129
- *
130
- * Если есть запланированный вызов, он будет отменен и не выполнится.
131
- * Promise из debounce() никогда не разрешится.
132
- *
133
- * @example
134
- * ```typescript
135
- * const debouncer = new Debouncer(300);
136
- *
137
- * debouncer.debounce(async () => {
138
- * console.log('This will not execute');
139
- * });
140
- *
141
- * debouncer.cancel(); // Отменяем вызов
142
- * ```
143
- */
144
- cancel() {
145
- if (this.timer) {
146
- clearTimeout(this.timer);
147
- this.timer = undefined;
148
- }
149
- }
150
- /**
151
- * Выполнить функцию немедленно, отменив любой отложенный вызов
152
- *
153
- * Полезно когда нужно принудительно выполнить действие сейчас,
154
- * игнорируя debounce.
155
- *
156
- * @param fn Функция для немедленного выполнения
157
- * @returns Promise с результатом функции
158
- *
159
- * @example
160
- * ```typescript
161
- * const debouncer = new Debouncer(300);
162
- *
163
- * // Запланировано через 300мс
164
- * debouncer.debounce(async () => console.log('Delayed'));
165
- *
166
- * // Отменяем отложенный и выполняем немедленно
167
- * await debouncer.flush(async () => console.log('Immediate'));
168
- * // Выведет: "Immediate" (сразу)
169
- * // "Delayed" не выполнится (отменен)
170
- * ```
171
- */
172
- async flush(fn) {
173
- this.cancel();
174
- return await fn();
175
- }
176
- /**
177
- * Проверить, есть ли активный (запланированный) вызов
178
- *
179
- * @returns true если есть запланированный вызов
180
- *
181
- * @example
182
- * ```typescript
183
- * const debouncer = new Debouncer(300);
184
- *
185
- * console.log(debouncer.isPending()); // false
186
- *
187
- * debouncer.debounce(() => console.log('Test'));
188
- * console.log(debouncer.isPending()); // true
189
- *
190
- * // Через 300мс
191
- * console.log(debouncer.isPending()); // false
192
- * ```
193
- */
194
- isPending() {
195
- return this.timer !== undefined;
196
- }
197
- }
@@ -1,226 +0,0 @@
1
- /**
2
- * FormErrorHandler - централизованная обработка ошибок в формах
3
- *
4
- * Устраняет несогласованность обработки ошибок между:
5
- * - field-node.ts (логирует и конвертирует в ValidationError)
6
- * - behavior-applicator.ts (логирует и пробрасывает)
7
- * - validation-applicator.ts (логирует и проглатывает)
8
- *
9
- * @example
10
- * ```typescript
11
- * try {
12
- * await validator(value);
13
- * } catch (error) {
14
- * return FormErrorHandler.handle(error, 'AsyncValidator', ErrorStrategy.CONVERT);
15
- * }
16
- * ```
17
- */
18
- /**
19
- * Стратегия обработки ошибок
20
- *
21
- * Определяет, что делать с ошибкой после логирования
22
- */
23
- export var ErrorStrategy;
24
- (function (ErrorStrategy) {
25
- /**
26
- * Пробросить ошибку дальше (throw)
27
- * Используется когда ошибка критична и должна остановить выполнение
28
- */
29
- ErrorStrategy["THROW"] = "throw";
30
- /**
31
- * Залогировать и проглотить ошибку (продолжить выполнение)
32
- * Используется когда ошибка не критична
33
- */
34
- ErrorStrategy["LOG"] = "log";
35
- /**
36
- * Конвертировать ошибку в ValidationError
37
- * Используется в async validators для отображения ошибки валидации пользователю
38
- */
39
- ErrorStrategy["CONVERT"] = "convert";
40
- })(ErrorStrategy || (ErrorStrategy = {}));
41
- /**
42
- * Централизованный обработчик ошибок для форм
43
- *
44
- * Обеспечивает:
45
- * - Единообразное логирование ошибок в DEV режиме
46
- * - Гибкие стратегии обработки (throw/log/convert)
47
- * - Типобезопасное извлечение сообщений из Error/string/unknown
48
- *
49
- * @example
50
- * ```typescript
51
- * // В async validator (конвертировать в ValidationError)
52
- * try {
53
- * await validateEmail(value);
54
- * } catch (error) {
55
- * return FormErrorHandler.handle(error, 'EmailValidator', ErrorStrategy.CONVERT);
56
- * }
57
- *
58
- * // В behavior applicator (пробросить критичную ошибку)
59
- * try {
60
- * applyBehavior(schema);
61
- * } catch (error) {
62
- * FormErrorHandler.handle(error, 'BehaviorApplicator', ErrorStrategy.THROW);
63
- * }
64
- *
65
- * // В validator (залогировать и продолжить)
66
- * try {
67
- * validator(value);
68
- * } catch (error) {
69
- * FormErrorHandler.handle(error, 'Validator', ErrorStrategy.LOG);
70
- * }
71
- * ```
72
- */
73
- export class FormErrorHandler {
74
- /**
75
- * Обработать ошибку согласно заданной стратегии
76
- *
77
- * @param error Ошибка для обработки (Error | string | unknown)
78
- * @param context Контекст ошибки для логирования (например, 'AsyncValidator', 'BehaviorRegistry')
79
- * @param strategy Стратегия обработки (THROW | LOG | CONVERT)
80
- * @returns ValidationError если strategy = CONVERT, undefined если strategy = LOG, никогда не возвращается если strategy = THROW
81
- *
82
- * @example
83
- * ```typescript
84
- * // THROW - пробросить ошибку
85
- * try {
86
- * riskyOperation();
87
- * } catch (error) {
88
- * FormErrorHandler.handle(error, 'RiskyOperation', ErrorStrategy.THROW);
89
- * // Этот код никогда не выполнится
90
- * }
91
- *
92
- * // LOG - залогировать и продолжить
93
- * try {
94
- * nonCriticalOperation();
95
- * } catch (error) {
96
- * FormErrorHandler.handle(error, 'NonCritical', ErrorStrategy.LOG);
97
- * // Продолжаем выполнение
98
- * }
99
- *
100
- * // CONVERT - конвертировать в ValidationError
101
- * try {
102
- * await validator(value);
103
- * } catch (error) {
104
- * const validationError = FormErrorHandler.handle(
105
- * error,
106
- * 'AsyncValidator',
107
- * ErrorStrategy.CONVERT
108
- * );
109
- * return validationError;
110
- * }
111
- * ```
112
- */
113
- static handle(error, context, strategy = ErrorStrategy.THROW) {
114
- // Извлекаем сообщение из ошибки
115
- const message = this.extractMessage(error);
116
- // Логируем в DEV режиме
117
- if (import.meta.env.DEV) {
118
- console.error(`[${context}]`, error);
119
- }
120
- // Применяем стратегию
121
- switch (strategy) {
122
- case ErrorStrategy.THROW:
123
- throw error;
124
- case ErrorStrategy.LOG:
125
- // Просто логируем, не возвращаем ничего
126
- return;
127
- case ErrorStrategy.CONVERT:
128
- // Конвертируем в ValidationError
129
- return {
130
- code: 'validator_error',
131
- message,
132
- params: { field: context },
133
- };
134
- }
135
- }
136
- /**
137
- * Извлечь сообщение из ошибки
138
- *
139
- * Обрабатывает различные типы ошибок:
140
- * - Error объекты → error.message
141
- * - Строки → возвращает как есть
142
- * - Объекты с message → извлекает message
143
- * - Другое → String(error)
144
- *
145
- * @param error Ошибка для извлечения сообщения
146
- * @returns Сообщение ошибки
147
- * @private
148
- *
149
- * @example
150
- * ```typescript
151
- * FormErrorHandler.extractMessage(new Error('Test'));
152
- * // 'Test'
153
- *
154
- * FormErrorHandler.extractMessage('String error');
155
- * // 'String error'
156
- *
157
- * FormErrorHandler.extractMessage({ message: 'Object error' });
158
- * // 'Object error'
159
- *
160
- * FormErrorHandler.extractMessage(null);
161
- * // 'null'
162
- * ```
163
- */
164
- static extractMessage(error) {
165
- if (error instanceof Error) {
166
- return error.message;
167
- }
168
- if (typeof error === 'string') {
169
- return error;
170
- }
171
- if (typeof error === 'object' && error !== null && 'message' in error) {
172
- return String(error.message);
173
- }
174
- return String(error);
175
- }
176
- /**
177
- * Создать ValidationError с заданными параметрами
178
- *
179
- * Утилитная функция для создания ValidationError объектов
180
- *
181
- * @param code Код ошибки
182
- * @param message Сообщение ошибки
183
- * @param field Поле (опционально)
184
- * @returns ValidationError объект
185
- *
186
- * @example
187
- * ```typescript
188
- * const error = FormErrorHandler.createValidationError(
189
- * 'required',
190
- * 'This field is required',
191
- * 'email'
192
- * );
193
- * // { code: 'required', message: 'This field is required', field: 'email' }
194
- * ```
195
- */
196
- static createValidationError(code, message, field) {
197
- return {
198
- code,
199
- message,
200
- params: field ? { field } : undefined,
201
- };
202
- }
203
- /**
204
- * Проверить, является ли объект ValidationError
205
- *
206
- * Type guard для ValidationError
207
- *
208
- * @param value Значение для проверки
209
- * @returns true если value является ValidationError
210
- *
211
- * @example
212
- * ```typescript
213
- * if (FormErrorHandler.isValidationError(result)) {
214
- * console.log(result.code); // OK, типобезопасно
215
- * }
216
- * ```
217
- */
218
- static isValidationError(value) {
219
- return (typeof value === 'object' &&
220
- value !== null &&
221
- 'code' in value &&
222
- 'message' in value &&
223
- typeof value.code === 'string' &&
224
- typeof value.message === 'string');
225
- }
226
- }