@reformer/core 11.0.0-beta.8 → 11.0.0-beta.9

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 (224) hide show
  1. package/README.md +91 -73
  2. package/dist/behaviors-value-HA_Q03hc.js +108 -0
  3. package/dist/behaviors.js +370 -242
  4. package/dist/{create-model-BBRHhHwK.js → create-model-BvcbNPgL.js} +6 -6
  5. package/dist/date-utils-90-qZbse.js +43 -0
  6. package/dist/{en-CjAqn7h0.js → en-HP8XEych.js} +6 -3
  7. package/dist/form/aggregate-signals.d.ts +21 -63
  8. package/dist/form/behaviors/collections.d.ts +28 -7
  9. package/dist/form/behaviors/context.d.ts +19 -2
  10. package/dist/form/behaviors/index.d.ts +3 -3
  11. package/dist/form/behaviors/internals.d.ts +9 -2
  12. package/dist/form/behaviors/node.d.ts +25 -2
  13. package/dist/form/behaviors/operators.d.ts +17 -9
  14. package/dist/form/behaviors/schema-operators.d.ts +6 -4
  15. package/dist/form/behaviors/types.d.ts +12 -4
  16. package/dist/form/create-form.d.ts +47 -35
  17. package/dist/form/flow/flow.d.ts +87 -0
  18. package/dist/form/form-bundle.d.ts +45 -28
  19. package/dist/form/form-config-base.d.ts +46 -0
  20. package/dist/form/form-level.d.ts +121 -0
  21. package/dist/form/form-proxy-builder.d.ts +6 -22
  22. package/dist/form/index.d.ts +16 -21
  23. package/dist/form/nodes/form-array-node.d.ts +100 -0
  24. package/dist/form/nodes/form-control-node.d.ts +73 -0
  25. package/dist/form/nodes/form-group-node.d.ts +66 -0
  26. package/dist/form/nodes/node-kind.d.ts +29 -0
  27. package/dist/form/nodes/state/availability.d.ts +6 -0
  28. package/dist/form/nodes/state/component.d.ts +6 -0
  29. package/dist/form/nodes/state/index.d.ts +12 -0
  30. package/dist/form/nodes/state/interaction.d.ts +13 -0
  31. package/dist/form/nodes/state/issues.d.ts +9 -0
  32. package/dist/form/nodes/state/pending.d.ts +6 -0
  33. package/dist/form/schema/compile.d.ts +59 -0
  34. package/dist/form/schema/compiled.d.ts +143 -0
  35. package/dist/form/schema/row-key.d.ts +11 -0
  36. package/dist/form/schema-controller.d.ts +30 -14
  37. package/dist/form/signal-node-registry.d.ts +6 -7
  38. package/dist/form/submission.d.ts +93 -0
  39. package/dist/form/type-guards.d.ts +14 -73
  40. package/dist/form/types/contracts.d.ts +19 -92
  41. package/dist/form/types/field-config.d.ts +27 -0
  42. package/dist/form/types/index.d.ts +5 -57
  43. package/dist/form/types/nodes.d.ts +159 -0
  44. package/dist/form/types/schema-node.d.ts +139 -63
  45. package/dist/form/types/validation-schema.d.ts +23 -27
  46. package/dist/form/validation/context.d.ts +42 -7
  47. package/dist/form/validation/index.d.ts +9 -8
  48. package/dist/form/validation/operators.d.ts +22 -30
  49. package/dist/form/validation/run.d.ts +93 -18
  50. package/dist/form/validation/strategy.d.ts +41 -13
  51. package/dist/form/validation/types.d.ts +74 -20
  52. package/dist/form/validators/date-utils.d.ts +13 -1
  53. package/dist/form/validators/email.d.ts +8 -7
  54. package/dist/form/validators/file-type.d.ts +8 -7
  55. package/dist/form/validators/file-utils.d.ts +2 -1
  56. package/dist/form/validators/future-date.d.ts +8 -7
  57. package/dist/form/validators/index.d.ts +1 -1
  58. package/dist/form/validators/integer.d.ts +8 -7
  59. package/dist/form/validators/is-date.d.ts +11 -9
  60. package/dist/form/validators/is-number.d.ts +11 -9
  61. package/dist/form/validators/max-age.d.ts +13 -9
  62. package/dist/form/validators/max-date.d.ts +8 -7
  63. package/dist/form/validators/max-file-size.d.ts +8 -7
  64. package/dist/form/validators/max-files.d.ts +8 -7
  65. package/dist/form/validators/max-length.d.ts +14 -7
  66. package/dist/form/validators/max-total-file-size.d.ts +8 -7
  67. package/dist/form/validators/max.d.ts +10 -8
  68. package/dist/form/validators/min-age.d.ts +12 -9
  69. package/dist/form/validators/min-date.d.ts +8 -7
  70. package/dist/form/validators/min-file-size.d.ts +8 -7
  71. package/dist/form/validators/min-files.d.ts +11 -9
  72. package/dist/form/validators/min-length.d.ts +14 -7
  73. package/dist/form/validators/min.d.ts +10 -8
  74. package/dist/form/validators/multiple-of.d.ts +10 -8
  75. package/dist/form/validators/non-negative.d.ts +8 -7
  76. package/dist/form/validators/non-zero.d.ts +8 -7
  77. package/dist/form/validators/past-date.d.ts +8 -7
  78. package/dist/form/validators/pattern.d.ts +9 -8
  79. package/dist/form/validators/phone.d.ts +8 -7
  80. package/dist/form/validators/required.d.ts +11 -9
  81. package/dist/form/validators/url.d.ts +20 -13
  82. package/dist/form/validators/validation-issue.d.ts +8 -0
  83. package/dist/i18n/descriptor.d.ts +1 -1
  84. package/dist/i18n/en.json.d.ts +5 -1
  85. package/dist/i18n/locale-store.d.ts +7 -0
  86. package/dist/i18n/message-format.d.ts +24 -4
  87. package/dist/i18n/ru.json.d.ts +5 -1
  88. package/dist/i18n/translator.d.ts +11 -0
  89. package/dist/i18n/validation-message.d.ts +42 -7
  90. package/dist/i18n.d.ts +7 -12
  91. package/dist/i18n.js +66 -283
  92. package/dist/index.d.ts +16 -7
  93. package/dist/index.js +924 -2855
  94. package/dist/loader-BWkigpVe.js +52 -0
  95. package/dist/locale/en.js +1 -1
  96. package/dist/locale/en.json +4 -1
  97. package/dist/locale/ru.js +4 -1
  98. package/dist/locale/ru.json +4 -1
  99. package/dist/locale-CG54AU2Q.js +219 -0
  100. package/dist/locale.js +1 -1
  101. package/dist/model/behaviors-value.d.ts +24 -6
  102. package/dist/model/create-model.d.ts +2 -2
  103. package/dist/model/derived-registry.d.ts +1 -1
  104. package/dist/model/index.d.ts +11 -5
  105. package/dist/model/model-nodes.d.ts +79 -12
  106. package/dist/model/model-signals-proxy.d.ts +5 -6
  107. package/dist/model/model-value-proxy.d.ts +20 -15
  108. package/dist/model/safe-effect.d.ts +33 -1
  109. package/dist/model/types.d.ts +63 -13
  110. package/dist/model.js +20 -18
  111. package/dist/node-kind-C-r6ZMdo.js +15 -0
  112. package/dist/platforms/react/field-binding/field-adapter.d.ts +1 -1
  113. package/dist/platforms/react/field-binding/field-handle.d.ts +5 -2
  114. package/dist/platforms/react/form-bundle-context.d.ts +2 -2
  115. package/dist/platforms/react/hooks/types.d.ts +57 -38
  116. package/dist/platforms/react/hooks/use-form-bundle.d.ts +19 -4
  117. package/dist/platforms/react/hooks/use-form-flow.d.ts +40 -0
  118. package/dist/platforms/react/hooks/use-form-validation.d.ts +12 -6
  119. package/dist/platforms/react/hooks/useArrayLength.d.ts +6 -6
  120. package/dist/platforms/react/hooks/useFormControl.d.ts +7 -9
  121. package/dist/platforms/react/hooks/useFormControlValue.d.ts +18 -19
  122. package/dist/platforms/react/hooks/useSignalSubscription.d.ts +9 -1
  123. package/dist/platforms/react/i18n/context.d.ts +6 -1
  124. package/dist/platforms/react/i18n/hooks.d.ts +16 -10
  125. package/dist/platforms/react/i18n/provider.d.ts +9 -2
  126. package/dist/platforms/react/index.d.ts +6 -4
  127. package/dist/react.d.ts +22 -0
  128. package/dist/react.js +505 -0
  129. package/dist/runtime-token.d.ts +1 -2
  130. package/dist/safe-effect-BbtX3KuN.js +643 -0
  131. package/dist/schema-controller-CpiO2JoK.js +143 -0
  132. package/dist/signals.d.ts +15 -9
  133. package/dist/signals.js +11 -6
  134. package/dist/strategy-CoFSemuP.js +375 -0
  135. package/dist/type-guards-D-N_5Ddh.js +19 -0
  136. package/dist/validation-issue-B9mjI8jz.js +7 -0
  137. package/dist/validation-message-Ced9MGxs.js +194 -0
  138. package/dist/validation.js +9 -9
  139. package/dist/validators/email.js +5 -5
  140. package/dist/validators/future-date.js +8 -8
  141. package/dist/validators/integer.js +3 -3
  142. package/dist/validators/is-date.js +4 -4
  143. package/dist/validators/is-number.js +4 -4
  144. package/dist/validators/max-age.js +8 -9
  145. package/dist/validators/max-date.js +8 -8
  146. package/dist/validators/max-length.js +7 -7
  147. package/dist/validators/max.js +4 -4
  148. package/dist/validators/min-age.js +10 -8
  149. package/dist/validators/min-date.js +3 -3
  150. package/dist/validators/min-length.js +5 -5
  151. package/dist/validators/min.js +4 -4
  152. package/dist/validators/multiple-of.js +11 -7
  153. package/dist/validators/non-negative.js +3 -3
  154. package/dist/validators/non-zero.js +3 -3
  155. package/dist/validators/past-date.js +8 -8
  156. package/dist/validators/pattern.js +5 -5
  157. package/dist/validators/phone.js +11 -9
  158. package/dist/validators/required.js +2 -2
  159. package/dist/validators/url.js +48 -12
  160. package/dist/validators.js +17 -17
  161. package/docs/llms/01-api-reference.md +60 -34
  162. package/docs/llms/02-quick-start.md +111 -80
  163. package/docs/llms/03-api-signatures.md +368 -153
  164. package/docs/llms/04-common-patterns.md +58 -56
  165. package/docs/llms/05-common-mistakes.md +69 -44
  166. package/docs/llms/06-troubleshooting.md +14 -9
  167. package/docs/llms/07-complete-import.md +74 -43
  168. package/docs/llms/08-form-types.md +11 -4
  169. package/docs/llms/09-formschema.md +129 -81
  170. package/docs/llms/10-arrays.md +106 -75
  171. package/docs/llms/11-async-watchfield.md +2 -2
  172. package/docs/llms/13-multi-step.md +134 -63
  173. package/docs/llms/14-extended-mistakes.md +20 -17
  174. package/docs/llms/15-project-structure.md +221 -74
  175. package/docs/llms/16-ui-components.md +55 -42
  176. package/docs/llms/17-nonexistent-api.md +199 -32
  177. package/docs/llms/18-conditional-fields.md +66 -32
  178. package/docs/llms/19-reading-values.md +15 -3
  179. package/docs/llms/20-compute-vs-watch.md +16 -10
  180. package/docs/llms/21-array-operations.md +51 -27
  181. package/docs/llms/22-cycle-detection.md +1 -1
  182. package/docs/llms/23-copy-from.md +2 -2
  183. package/docs/llms/24-sync-fields.md +6 -5
  184. package/docs/llms/25-reset-when.md +14 -7
  185. package/docs/llms/26-transform-value.md +4 -4
  186. package/docs/llms/27-revalidate-when.md +16 -15
  187. package/docs/llms/28-submit-and-reset.md +276 -128
  188. package/docs/llms/29-async-preload.md +39 -29
  189. package/docs/llms/30-type-safety-recipes.md +105 -51
  190. package/docs/llms/31-async-validator-debounce.md +96 -53
  191. package/docs/llms/33-validation-strategy.md +177 -65
  192. package/docs/llms/34-i18n.md +69 -43
  193. package/docs/llms/35-unified-contract.md +100 -39
  194. package/docs/llms/36-issue-messages.md +284 -0
  195. package/docs/llms/37-compiled-schema.md +332 -0
  196. package/docs/llms/38-form-flow.md +397 -0
  197. package/llms-index.json +1 -1
  198. package/llms.txt +6084 -3420
  199. package/package.json +23 -4
  200. package/dist/behaviors-value-C7dSEhCc.js +0 -134
  201. package/dist/date-utils-dTT_x_Be.js +0 -31
  202. package/dist/form/create-core-form.d.ts +0 -72
  203. package/dist/form/factories/index.d.ts +0 -6
  204. package/dist/form/factories/node-factory.d.ts +0 -189
  205. package/dist/form/form-submitter.d.ts +0 -121
  206. package/dist/form/nodes/array-node.d.ts +0 -276
  207. package/dist/form/nodes/field-node.d.ts +0 -297
  208. package/dist/form/nodes/form-node.d.ts +0 -326
  209. package/dist/form/nodes/group-node.d.ts +0 -284
  210. package/dist/form/nodes/model-array-node.d.ts +0 -126
  211. package/dist/form/nodes/subscription-manager.d.ts +0 -180
  212. package/dist/form/status-machine.d.ts +0 -115
  213. package/dist/form/types/deep-schema.d.ts +0 -107
  214. package/dist/form/types/form-proxy.d.ts +0 -141
  215. package/dist/form/unique-id.d.ts +0 -45
  216. package/dist/form/validation/config.d.ts +0 -73
  217. package/dist/form/validation/error-handler.d.ts +0 -166
  218. package/dist/form/validators/validation-error.d.ts +0 -8
  219. package/dist/index-BrNkQj1y.js +0 -105
  220. package/dist/loader-Dv_Hl7JC.js +0 -216
  221. package/dist/model-value-proxy-caTmAiUd.js +0 -419
  222. package/dist/node-BeV_lV5i.js +0 -100
  223. package/dist/strategy-DgzELWno.js +0 -204
  224. package/dist/validation-error-B-U3RsV0.js +0 -11
@@ -1,45 +0,0 @@
1
- /**
2
- * Генератор уникальных идентификаторов
3
- *
4
- * Использует атомный счётчик для генерации гарантированно уникальных ключей.
5
- * Решает проблему возможного дублирования ключей при использовании
6
- * Date.now() + Math.random() в быстрых последовательных вызовах.
7
- *
8
- * @example
9
- * ```typescript
10
- * const key1 = uniqueId(SubscriptionKey.Watch); // "watch-1"
11
- * const key2 = uniqueId(SubscriptionKey.Watch); // "watch-2"
12
- * const key3 = uniqueId(SubscriptionKey.ComputeFrom); // "computeFrom-3"
13
- * ```
14
- */
15
- /**
16
- * Типобезопасные ключи для подписок
17
- * Используются с uniqueId() для генерации уникальных идентификаторов
18
- */
19
- export declare const SubscriptionKey: {
20
- /** FieldNode.watch() */
21
- readonly Watch: "watch";
22
- /** FieldNode.computeFrom() */
23
- readonly ComputeFrom: "computeFrom";
24
- /** GroupNode.linkFields() */
25
- readonly LinkFields: "linkFields";
26
- /** GroupNode.watchField() */
27
- readonly WatchField: "watchField";
28
- };
29
- export type SubscriptionKeyType = (typeof SubscriptionKey)[keyof typeof SubscriptionKey];
30
- /**
31
- * Генерирует уникальный идентификатор с указанным префиксом.
32
- *
33
- * @param prefix - Префикс для идентификатора (используйте {@link SubscriptionKey}).
34
- * @returns Уникальный идентификатор в формате `${prefix}-${counter}`.
35
- *
36
- * ⚠️ `SubscriptionKey`/`SubscriptionKeyType` — внутренние: барель `@reformer/core` их не отдаёт,
37
- * поэтому вызвать `uniqueId` извне пакета типобезопасно нельзя. Пример ниже — внутрипакетный.
38
- *
39
- * @example
40
- * ```typescript
41
- * uniqueId(SubscriptionKey.WatchField); // → 'watchField-1'
42
- * uniqueId(SubscriptionKey.WatchField); // → 'watchField-2'
43
- * ```
44
- */
45
- export declare function uniqueId(prefix: SubscriptionKeyType): string;
@@ -1,73 +0,0 @@
1
- import { ReadonlySignal } from '@preact/signals-core';
2
- import { FormModel } from '../../model/types';
3
- import { ValidationSchema } from './types';
4
- import { FormValidationController, ValidationStrategyKind } from './strategy';
5
- /**
6
- * Правила валидации формы — ДАННЫЕ (без привязки к рендеру).
7
- *
8
- * ⚠️ `schema` и значения `steps` обязаны быть **стабильными ссылками**: отмена устаревших прогонов
9
- * ключуется по паре `(model, schema)` через `WeakMap`, поэтому инлайн-стрелка ломает дедупликацию —
10
- * валидация начнёт возвращать `false` от уже отменённых прогонов. Держите их
11
- * module-level-константами (`defineValidationSchema`).
12
- */
13
- export interface FormValidation<T> {
14
- /** Полный набор правил — для submit и `validateAll`. Без него собирается из `steps` + `extras`. */
15
- schema?: ValidationSchema<T>;
16
- /**
17
- * Пошаговая валидация визарда: ключ = `selector` шага. `null` означает «шаг без правил» ЯВНО —
18
- * чтобы опечатка в ключе не выглядела как пустой шаг.
19
- */
20
- steps?: Record<string, ValidationSchema<T> | null>;
21
- /** Cross-field правила, которые проверяются только целиком (в `validateAll`), но не по шагам. */
22
- extras?: ValidationSchema<T>;
23
- /** Когда запускать живую валидацию. По умолчанию `'submit'` (реактивно молчит). */
24
- strategy?: ValidationStrategyKind;
25
- debounce?: number;
26
- /** Режим live-фазы для `afterFirstSubmit`. По умолчанию `'change'`. */
27
- liveAfterSubmit?: 'change' | 'blur';
28
- }
29
- /**
30
- * Собранная валидация формы. Структурно совместима с `FormWizardConfig` и `StepValidationConfig`
31
- * из `@reformer/cdk`, поэтому уходит в визард как есть: `config={bundle.validation}` либо
32
- * `patchProps({ form, ...bundle.validation })`.
33
- */
34
- export interface FormValidationBundle<T> {
35
- /** Полная схема (стабильная ссылка) — та, по которой идёт `validateAll`. */
36
- readonly schema: ValidationSchema<T>;
37
- /** Селекторы шагов в порядке объявления. Пусто, если `steps` не заданы. */
38
- readonly stepSelectors: readonly string[];
39
- /** Полный прогон с раскрытием ошибок. Синоним {@link FormValidationBundle.validateAll}. */
40
- validate(): Promise<boolean>;
41
- validateAll(): Promise<boolean>;
42
- /** Прогон правил одного шага: по номеру (1-based, как у визарда) или по селектору. */
43
- validateStep(step: number | string): Promise<boolean>;
44
- /** Контроллер живой валидации ШАГА; `null` — у шага нет правил либо стратегия `submit`. */
45
- createStepController(step: number | string): FormValidationController | null;
46
- /** Контроллер живой валидации ФОРМЫ. Армится хуком (`useFormBundle`), не фабрикой. */
47
- readonly controller: FormValidationController;
48
- /** Идёт ли прогон — реактивный сигнал (для тонкой подписки в UI). */
49
- readonly validating: ReadonlySignal<boolean>;
50
- }
51
- /**
52
- * Собрать {@link FormValidationBundle} из правил. Принимает либо готовую схему (сахар для простых
53
- * форм), либо {@link FormValidation} с шагами и стратегией.
54
- *
55
- * Схема для `validateAll` собирается ОДИН раз на бандл — иначе ломается дедупликация прогонов.
56
- *
57
- * @typeParam T - Форма данных модели.
58
- * @param model - Модель, по которой идут прогоны.
59
- * @param validation - Правила; `undefined` — валидации у формы нет.
60
- * @returns Бандл валидации либо `undefined`, если правила не заданы.
61
- *
62
- * @example
63
- * ```ts
64
- * const v = buildValidation(model, {
65
- * steps: { loan: loanRules, applicant: applicantRules, confirm: null },
66
- * extras: crossFieldRules,
67
- * strategy: 'blur',
68
- * });
69
- * await v!.validateStep(1); // правила шага `loan`
70
- * await v!.validateAll(); // все шаги + extras
71
- * ```
72
- */
73
- export declare function buildValidation<T>(model: FormModel<T>, validation?: FormValidation<T> | ValidationSchema<T>): FormValidationBundle<T> | undefined;
@@ -1,166 +0,0 @@
1
- import { ValidationError } from '../types/contracts';
2
- /**
3
- * Стратегия обработки ошибок
4
- *
5
- * Определяет, что делать с ошибкой после логирования
6
- */
7
- export declare enum ErrorStrategy {
8
- /**
9
- * Пробросить ошибку дальше (throw)
10
- * Используется когда ошибка критична и должна остановить выполнение
11
- */
12
- THROW = "throw",
13
- /**
14
- * Залогировать и проглотить ошибку (продолжить выполнение)
15
- * Используется когда ошибка не критична
16
- */
17
- LOG = "log",
18
- /**
19
- * Конвертировать ошибку в ValidationError
20
- * Используется в async validators для отображения ошибки валидации пользователю
21
- */
22
- CONVERT = "convert"
23
- }
24
- /**
25
- * Централизованный обработчик ошибок для форм
26
- *
27
- * Обеспечивает:
28
- * - Единообразное логирование ошибок в DEV режиме
29
- * - Гибкие стратегии обработки (throw/log/convert)
30
- * - Типобезопасное извлечение сообщений из Error/string/unknown
31
- *
32
- * @example
33
- * ```typescript
34
- * // В async validator (конвертировать в ValidationError)
35
- * try {
36
- * await validateEmail(value);
37
- * } catch (error) {
38
- * return FormErrorHandler.handle(error, 'EmailValidator', ErrorStrategy.CONVERT);
39
- * }
40
- *
41
- * // В behavior applicator (пробросить критичную ошибку)
42
- * try {
43
- * applyBehavior(schema);
44
- * } catch (error) {
45
- * FormErrorHandler.handle(error, 'BehaviorApplicator', ErrorStrategy.THROW);
46
- * }
47
- *
48
- * // В validator (залогировать и продолжить)
49
- * try {
50
- * validator(value);
51
- * } catch (error) {
52
- * FormErrorHandler.handle(error, 'Validator', ErrorStrategy.LOG);
53
- * }
54
- * ```
55
- */
56
- export declare class FormErrorHandler {
57
- /**
58
- * Обработать ошибку согласно заданной стратегии
59
- *
60
- * @param error Ошибка для обработки (Error | string | unknown)
61
- * @param context Контекст ошибки для логирования (например, 'AsyncValidator', 'BehaviorRegistry')
62
- * @param strategy Стратегия обработки (THROW | LOG | CONVERT)
63
- * @returns ValidationError если strategy = CONVERT, undefined если strategy = LOG, никогда не возвращается если strategy = THROW
64
- *
65
- * @example
66
- * ```typescript
67
- * // THROW - пробросить ошибку
68
- * try {
69
- * riskyOperation();
70
- * } catch (error) {
71
- * FormErrorHandler.handle(error, 'RiskyOperation', ErrorStrategy.THROW);
72
- * // Этот код никогда не выполнится
73
- * }
74
- *
75
- * // LOG - залогировать и продолжить
76
- * try {
77
- * nonCriticalOperation();
78
- * } catch (error) {
79
- * FormErrorHandler.handle(error, 'NonCritical', ErrorStrategy.LOG);
80
- * // Продолжаем выполнение
81
- * }
82
- *
83
- * // CONVERT - конвертировать в ValidationError
84
- * try {
85
- * await validator(value);
86
- * } catch (error) {
87
- * const validationError = FormErrorHandler.handle(
88
- * error,
89
- * 'AsyncValidator',
90
- * ErrorStrategy.CONVERT
91
- * );
92
- * return validationError;
93
- * }
94
- * ```
95
- */
96
- static handle(error: unknown, context: string, strategy: ErrorStrategy.CONVERT): ValidationError;
97
- static handle(error: unknown, context: string, strategy: ErrorStrategy.THROW): never;
98
- static handle(error: unknown, context: string, strategy: ErrorStrategy.LOG): void;
99
- static handle(error: unknown, context: string): never;
100
- /**
101
- * Извлечь сообщение из ошибки
102
- *
103
- * Обрабатывает различные типы ошибок:
104
- * - Error объекты → error.message
105
- * - Строки → возвращает как есть
106
- * - Объекты с message → извлекает message
107
- * - Другое → String(error)
108
- *
109
- * @param error Ошибка для извлечения сообщения
110
- * @returns Сообщение ошибки
111
- * @private
112
- *
113
- * @example
114
- * ```typescript
115
- * FormErrorHandler.extractMessage(new Error('Test'));
116
- * // 'Test'
117
- *
118
- * FormErrorHandler.extractMessage('String error');
119
- * // 'String error'
120
- *
121
- * FormErrorHandler.extractMessage({ message: 'Object error' });
122
- * // 'Object error'
123
- *
124
- * FormErrorHandler.extractMessage(null);
125
- * // 'null'
126
- * ```
127
- */
128
- private static extractMessage;
129
- /**
130
- * Создать ValidationError с заданными параметрами
131
- *
132
- * Утилитная функция для создания ValidationError объектов
133
- *
134
- * @param code Код ошибки
135
- * @param message Сообщение ошибки
136
- * @param field Поле (опционально)
137
- * @returns ValidationError объект
138
- *
139
- * @example
140
- * ```typescript
141
- * const error = FormErrorHandler.createValidationError(
142
- * 'required',
143
- * 'This field is required',
144
- * 'email'
145
- * );
146
- * // { code: 'required', message: 'This field is required', field: 'email' }
147
- * ```
148
- */
149
- static createValidationError(code: string, message: string, field?: string): ValidationError;
150
- /**
151
- * Проверить, является ли объект ValidationError
152
- *
153
- * Type guard для ValidationError
154
- *
155
- * @param value Значение для проверки
156
- * @returns true если value является ValidationError
157
- *
158
- * @example
159
- * ```typescript
160
- * if (FormErrorHandler.isValidationError(result)) {
161
- * console.log(result.code); // OK, типобезопасно
162
- * }
163
- * ```
164
- */
165
- static isValidationError(value: unknown): value is ValidationError;
166
- }
@@ -1,8 +0,0 @@
1
- import { FormValue, ValidationError } from '../types/contracts';
2
- import { ValidateOptions } from '../types/validation-schema';
3
- /**
4
- * @param code - Код ошибки; по нему ищется текст в словаре локали (`validation.<code>`).
5
- * @param options - Опции правила: явное сообщение, ключ сообщения, дополнительные параметры.
6
- * @param params - Параметры, которые правило заполняет само; параметры из `options` важнее.
7
- */
8
- export declare function validationError(code: string, options: ValidateOptions | undefined, params?: Record<string, FormValue>): ValidationError;
@@ -1,105 +0,0 @@
1
- import T from "react";
2
- var l = { exports: {} }, y = {};
3
- var L;
4
- function A() {
5
- if (L) return y;
6
- L = 1;
7
- var i = T;
8
- function _(t, o) {
9
- return t === o && (t !== 0 || 1 / t === 1 / o) || t !== t && o !== o;
10
- }
11
- var c = typeof Object.is == "function" ? Object.is : _, p = i.useState, u = i.useEffect, S = i.useLayoutEffect, E = i.useDebugValue;
12
- function O(t, o) {
13
- var e = o(), r = p({ inst: { value: e, getSnapshot: o } }), n = r[0].inst, a = r[1];
14
- return S(
15
- function() {
16
- n.value = e, n.getSnapshot = o, f(n) && a({ inst: n });
17
- },
18
- [t, e, o]
19
- ), u(
20
- function() {
21
- return f(n) && a({ inst: n }), t(function() {
22
- f(n) && a({ inst: n });
23
- });
24
- },
25
- [t]
26
- ), E(e), e;
27
- }
28
- function f(t) {
29
- var o = t.getSnapshot;
30
- t = t.value;
31
- try {
32
- var e = o();
33
- return !c(t, e);
34
- } catch {
35
- return !0;
36
- }
37
- }
38
- function v(t, o) {
39
- return o();
40
- }
41
- var d = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? v : O;
42
- return y.useSyncExternalStore = i.useSyncExternalStore !== void 0 ? i.useSyncExternalStore : d, y;
43
- }
44
- var m = {};
45
- var x;
46
- function g() {
47
- return x || (x = 1, process.env.NODE_ENV !== "production" && (function() {
48
- function i(e, r) {
49
- return e === r && (e !== 0 || 1 / e === 1 / r) || e !== e && r !== r;
50
- }
51
- function _(e, r) {
52
- d || u.startTransition === void 0 || (d = !0, console.error(
53
- "You are using an outdated, pre-release alpha of React 18 that does not support useSyncExternalStore. The use-sync-external-store shim will not work correctly. Upgrade to a newer pre-release."
54
- ));
55
- var n = r();
56
- if (!t) {
57
- var a = r();
58
- S(n, a) || (console.error(
59
- "The result of getSnapshot should be cached to avoid an infinite loop"
60
- ), t = !0);
61
- }
62
- a = E({
63
- inst: { value: n, getSnapshot: r }
64
- });
65
- var s = a[0].inst, h = a[1];
66
- return f(
67
- function() {
68
- s.value = n, s.getSnapshot = r, c(s) && h({ inst: s });
69
- },
70
- [e, n, r]
71
- ), O(
72
- function() {
73
- return c(s) && h({ inst: s }), e(function() {
74
- c(s) && h({ inst: s });
75
- });
76
- },
77
- [e]
78
- ), v(n), n;
79
- }
80
- function c(e) {
81
- var r = e.getSnapshot;
82
- e = e.value;
83
- try {
84
- var n = r();
85
- return !S(e, n);
86
- } catch {
87
- return !0;
88
- }
89
- }
90
- function p(e, r) {
91
- return r();
92
- }
93
- typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(Error());
94
- var u = T, S = typeof Object.is == "function" ? Object.is : i, E = u.useState, O = u.useEffect, f = u.useLayoutEffect, v = u.useDebugValue, d = !1, t = !1, o = typeof window > "u" || typeof window.document > "u" || typeof window.document.createElement > "u" ? p : _;
95
- m.useSyncExternalStore = u.useSyncExternalStore !== void 0 ? u.useSyncExternalStore : o, typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ < "u" && typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop == "function" && __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error());
96
- })()), m;
97
- }
98
- var w;
99
- function D() {
100
- return w || (w = 1, process.env.NODE_ENV === "production" ? l.exports = A() : l.exports = g()), l.exports;
101
- }
102
- var G = D();
103
- export {
104
- G as s
105
- };
@@ -1,216 +0,0 @@
1
- class $ extends Error {
2
- name = "MessageSyntaxError";
3
- }
4
- const v = (t) => `⟦${t}⟧`, b = /* @__PURE__ */ new Map(), y = /* @__PURE__ */ new Map();
5
- function g(t) {
6
- let e = 0;
7
- const s = (r) => {
8
- throw new $(`${r} (позиция ${e}) в сообщении: ${t}`);
9
- }, o = (r, i) => r === "{" || r === "}" || i && r === "#", n = () => {
10
- for (; e < t.length && /\s/.test(t[e]); ) e++;
11
- }, f = () => {
12
- const r = e;
13
- for (; e < t.length && !/[\s,{}#]/.test(t[e]); ) e++;
14
- return e === r && s("ожидалось имя"), t.slice(r, e);
15
- }, l = (r) => {
16
- if (e++, t[e] === "'")
17
- return e++, "'";
18
- if (!o(t[e], r)) return "'";
19
- let i = "";
20
- for (; e < t.length; )
21
- if (t[e] !== "'") i += t[e++];
22
- else if (t[e + 1] === "'")
23
- i += "'", e += 2;
24
- else
25
- return e++, i;
26
- return i;
27
- }, h = (r, i) => {
28
- const u = [];
29
- let m = "";
30
- const p = () => {
31
- m !== "" && (u.push({ kind: "text", value: m }), m = "");
32
- };
33
- for (; e < t.length; ) {
34
- const d = t[e];
35
- if (d === "}") {
36
- r || s("непарная «}» — литерал пишется как '}'");
37
- break;
38
- }
39
- d === "'" ? m += l(i !== null) : d === "#" && i !== null ? (e++, p(), u.push({ kind: "number", name: i })) : d === "{" ? (p(), u.push(a(i))) : (m += d, e++);
40
- }
41
- return p(), u;
42
- }, c = (r, i, u) => {
43
- const m = /* @__PURE__ */ new Map();
44
- for (n(); e < t.length && t[e] !== "}"; ) {
45
- const p = f();
46
- n(), t[e] !== "{" && s(`ожидалась «{» после ветки «${p}»`), e++, m.set(p, h(!0, u)), t[e] !== "}" && s(`ветка «${p}» не закрыта`), e++, n();
47
- }
48
- return t[e] !== "}" && s(`«${r}, ${i}» не закрыт «}»`), e++, m.has("other") || s(`в «${r}, ${i}» нет обязательной ветки other`), m;
49
- }, a = (r) => {
50
- e++, n();
51
- const i = f();
52
- if (n(), t[e] === "}")
53
- return e++, { kind: "arg", name: i };
54
- t[e] !== "," && s(`ожидались «,» или «}» после аргумента «${i}»`), e++, n();
55
- const u = f();
56
- return u !== "plural" && u !== "select" && s(`неизвестный тип «${u}» у «${i}» — поддерживаются plural и select`), n(), t[e] !== "," && s(`ожидалась «,» после «${u}»`), e++, {
57
- kind: u,
58
- name: i,
59
- branches: c(i, u, u === "plural" ? i : r)
60
- };
61
- };
62
- return h(!1, null);
63
- }
64
- function M(t, e, s, o = {}) {
65
- const n = o.onMissingArgument ?? v, f = (h) => {
66
- const c = e[h];
67
- return typeof c == "number" && Number.isFinite(c) ? c : null;
68
- }, l = (h) => {
69
- let c = "";
70
- for (const a of h)
71
- if (a.kind === "text") c += a.value;
72
- else if (a.kind === "arg")
73
- c += e[a.name] === void 0 ? n(a.name) : String(e[a.name]);
74
- else if (a.kind === "number") {
75
- const r = f(a.name);
76
- c += r === null ? n(a.name) : j(s).format(r);
77
- } else if (a.kind === "plural") {
78
- const r = f(a.name);
79
- c += r === null ? n(a.name) : l(
80
- a.branches.get(`=${r}`) ?? a.branches.get(x(s).select(r)) ?? a.branches.get("other")
81
- );
82
- } else {
83
- const r = e[a.name];
84
- c += r === void 0 ? n(a.name) : l(a.branches.get(String(r)) ?? a.branches.get("other"));
85
- }
86
- return c;
87
- };
88
- return l(t);
89
- }
90
- function x(t) {
91
- let e = b.get(t);
92
- return e === void 0 && b.set(t, e = new Intl.PluralRules(t)), e;
93
- }
94
- function j(t) {
95
- let e = y.get(t);
96
- return e === void 0 && y.set(t, e = new Intl.NumberFormat(t)), e;
97
- }
98
- function E(t, e = {}) {
99
- const s = /* @__PURE__ */ new Map();
100
- return (o, n = {}) => {
101
- let f = s.get(o);
102
- return f === void 0 && s.set(o, f = g(o)), M(f, n, t, e);
103
- };
104
- }
105
- const P = Object.freeze({
106
- code: "en",
107
- messages: Object.freeze({})
108
- });
109
- function O(t, e) {
110
- const { messages: s, ...o } = e;
111
- return {
112
- ...t,
113
- ...o,
114
- messages: s === void 0 ? t.messages : { ...t.messages, ...s }
115
- };
116
- }
117
- function k(t, e) {
118
- return Object.prototype.hasOwnProperty.call(t, e);
119
- }
120
- function w(t, e = /* @__PURE__ */ new Set()) {
121
- for (const s of t)
122
- if (s.kind !== "text" && (e.add(s.name), s.kind === "plural" || s.kind === "select"))
123
- for (const o of s.branches.values()) w(o, e);
124
- return e;
125
- }
126
- function F(t, e) {
127
- const s = [], o = /* @__PURE__ */ new Map();
128
- for (const [n, f] of Object.entries(t))
129
- try {
130
- o.set(n, g(f));
131
- } catch (l) {
132
- s.push({
133
- key: n,
134
- kind: "syntax",
135
- message: l instanceof Error ? l.message : String(l)
136
- });
137
- }
138
- if (e === void 0) return s;
139
- for (const n of Object.keys(t))
140
- k(e, n) || s.push({ key: n, kind: "extra", message: "ключа нет в образце" });
141
- for (const [n, f] of Object.entries(e)) {
142
- if (!k(t, n)) {
143
- s.push({ key: n, kind: "missing", message: "ключ есть в образце, но не переведён" });
144
- continue;
145
- }
146
- const l = o.get(n);
147
- if (l === void 0) continue;
148
- const h = [...w(g(f))].sort().join(", "), c = [...w(l)].sort().join(", ");
149
- h !== c && s.push({
150
- key: n,
151
- kind: "arguments",
152
- message: `образец ждёт {${h}}, словарь — {${c}}`
153
- });
154
- }
155
- return s;
156
- }
157
- function S(t) {
158
- const e = t.messages;
159
- return e !== null && typeof e == "object";
160
- }
161
- function L(t) {
162
- if (t != null) {
163
- if (typeof t != "object" || Array.isArray(t))
164
- throw new TypeError("источник локали вернул не объект");
165
- return S(t) ? t : { messages: t };
166
- }
167
- }
168
- function A(t) {
169
- const e = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), o = (n) => {
170
- const f = e.get(n);
171
- if (f !== void 0) return Promise.resolve(f);
172
- const l = s.get(n);
173
- if (l !== void 0) return l;
174
- const h = Promise.all(t.map(async (c) => L(await c(n)))).then((c) => {
175
- let a = { code: n, messages: {} };
176
- for (const r of c)
177
- r !== void 0 && (a = O(a, r));
178
- return a = { ...a, code: n }, e.set(n, a), a;
179
- }).finally(() => {
180
- s.delete(n);
181
- });
182
- return s.set(n, h), h;
183
- };
184
- return Object.assign(o, {
185
- peek: (n) => e.get(n),
186
- preload: o
187
- });
188
- }
189
- function N(t, e) {
190
- return async (s) => {
191
- const o = t(s), n = await fetch(o, e);
192
- if (!n.ok)
193
- throw new Error(`локаль «${s}»: ${o} ответил ${n.status}`);
194
- return await n.json();
195
- };
196
- }
197
- function C(t) {
198
- return (e) => {
199
- const s = e.split("-")[0].toLowerCase(), n = (Object.prototype.hasOwnProperty.call(t, e) ? t[e] : void 0) ?? (Object.prototype.hasOwnProperty.call(t, s) ? t[s] : void 0);
200
- return n === void 0 ? null : n();
201
- };
202
- }
203
- export {
204
- P as D,
205
- $ as M,
206
- A as a,
207
- C as b,
208
- E as c,
209
- N as d,
210
- O as e,
211
- M as f,
212
- k as h,
213
- w as m,
214
- g as p,
215
- F as v
216
- };