@reformer/core 11.0.0-beta.1 → 11.0.0-beta.10

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 (283) hide show
  1. package/README.md +90 -68
  2. package/dist/behaviors-value-D05z3my6.js +109 -0
  3. package/dist/behaviors.d.ts +1 -1
  4. package/dist/behaviors.js +376 -211
  5. package/dist/create-model-DPSG3I0O.js +30 -0
  6. package/dist/date-utils-90-qZbse.js +43 -0
  7. package/dist/en-HP8XEych.js +44 -0
  8. package/dist/form/aggregate-signals.d.ts +21 -63
  9. package/dist/form/behaviors/collections.d.ts +84 -0
  10. package/dist/form/behaviors/context.d.ts +56 -0
  11. package/dist/form/behaviors/index.d.ts +30 -0
  12. package/dist/form/behaviors/internals.d.ts +41 -0
  13. package/dist/form/{behaviors-node.d.ts → behaviors/node.d.ts} +28 -5
  14. package/dist/form/behaviors/operators.d.ts +59 -0
  15. package/dist/form/behaviors/schema-operators.d.ts +83 -0
  16. package/dist/form/behaviors/types.d.ts +37 -0
  17. package/dist/form/create-form.d.ts +59 -70
  18. package/dist/form/flow/flow.d.ts +87 -0
  19. package/dist/form/form-bundle.d.ts +153 -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 +23 -24
  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 +159 -0
  37. package/dist/form/schema-subtree.d.ts +28 -0
  38. package/dist/form/signal-node-registry.d.ts +27 -22
  39. package/dist/form/submission.d.ts +93 -0
  40. package/dist/form/type-guards.d.ts +14 -73
  41. package/dist/form/types/contracts.d.ts +21 -85
  42. package/dist/form/types/field-config.d.ts +27 -0
  43. package/dist/form/types/index.d.ts +5 -57
  44. package/dist/form/types/nodes.d.ts +159 -0
  45. package/dist/form/types/schema-node.d.ts +147 -46
  46. package/dist/form/types/validation-schema.d.ts +25 -17
  47. package/dist/form/validation/context.d.ts +67 -0
  48. package/dist/form/validation/index.d.ts +24 -28
  49. package/dist/form/validation/operators.d.ts +101 -0
  50. package/dist/form/validation/run.d.ts +120 -0
  51. package/dist/form/validation/strategy.d.ts +89 -0
  52. package/dist/form/validation/types.d.ts +83 -0
  53. package/dist/form/validators/date-utils.d.ts +42 -0
  54. package/dist/form/validators/email.d.ts +23 -0
  55. package/dist/form/{validation/validators → validators}/file-type.d.ts +10 -10
  56. package/dist/form/{validation/validators → validators}/file-utils.d.ts +3 -2
  57. package/dist/form/validators/future-date.d.ts +23 -0
  58. package/dist/form/{validation/validators → validators}/index.d.ts +7 -4
  59. package/dist/form/validators/integer.d.ts +22 -0
  60. package/dist/form/validators/is-date.d.ts +24 -0
  61. package/dist/form/validators/is-number.d.ts +25 -0
  62. package/dist/form/validators/max-age.d.ts +28 -0
  63. package/dist/form/validators/max-date.d.ts +25 -0
  64. package/dist/form/{validation/validators → validators}/max-file-size.d.ts +10 -10
  65. package/dist/form/validators/max-files.d.ts +26 -0
  66. package/dist/form/validators/max-length.d.ts +33 -0
  67. package/dist/form/validators/max-total-file-size.d.ts +26 -0
  68. package/dist/form/validators/max.d.ts +26 -0
  69. package/dist/form/validators/min-age.d.ts +27 -0
  70. package/dist/form/validators/min-date.d.ts +25 -0
  71. package/dist/form/{validation/validators → validators}/min-file-size.d.ts +10 -10
  72. package/dist/form/validators/min-files.d.ts +27 -0
  73. package/dist/form/validators/min-length.d.ts +33 -0
  74. package/dist/form/validators/min.d.ts +26 -0
  75. package/dist/form/validators/multiple-of.d.ts +25 -0
  76. package/dist/form/validators/non-negative.d.ts +22 -0
  77. package/dist/form/validators/non-zero.d.ts +22 -0
  78. package/dist/form/validators/past-date.d.ts +23 -0
  79. package/dist/form/validators/pattern.d.ts +26 -0
  80. package/dist/form/{validation/validators → validators}/phone.d.ts +11 -11
  81. package/dist/form/validators/required.d.ts +29 -0
  82. package/dist/form/validators/url.d.ts +45 -0
  83. package/dist/form/validators/validation-issue.d.ts +8 -0
  84. package/dist/i18n/descriptor.d.ts +54 -0
  85. package/dist/i18n/en.json.d.ts +49 -0
  86. package/dist/i18n/loader.d.ts +71 -0
  87. package/dist/i18n/locale-store.d.ts +46 -0
  88. package/dist/i18n/locale.d.ts +90 -0
  89. package/dist/i18n/message-format.d.ts +136 -0
  90. package/dist/i18n/resolve-localized.d.ts +17 -0
  91. package/dist/i18n/ru.json.d.ts +49 -0
  92. package/dist/i18n/translator.d.ts +61 -0
  93. package/dist/i18n/validation-message.d.ts +53 -0
  94. package/dist/i18n.d.ts +26 -0
  95. package/dist/i18n.js +86 -0
  96. package/dist/index.d.ts +17 -5
  97. package/dist/index.js +942 -2601
  98. package/dist/loader-BWkigpVe.js +52 -0
  99. package/dist/locale/en.d.ts +2 -0
  100. package/dist/locale/en.js +5 -0
  101. package/dist/locale/en.json +45 -0
  102. package/dist/locale/index.d.ts +18 -0
  103. package/dist/locale/ru.d.ts +2 -0
  104. package/dist/locale/ru.js +44 -0
  105. package/dist/locale/ru.json +45 -0
  106. package/dist/locale-CG54AU2Q.js +219 -0
  107. package/dist/locale.d.ts +2 -0
  108. package/dist/locale.js +9 -0
  109. package/dist/{state → model}/behaviors-value.d.ts +24 -6
  110. package/dist/{state/form-model.d.ts → model/create-model.d.ts} +18 -4
  111. package/dist/{state → model}/derived-registry.d.ts +1 -1
  112. package/dist/model/index.d.ts +42 -0
  113. package/dist/model/model-nodes.d.ts +190 -0
  114. package/dist/model/model-signals-proxy.d.ts +63 -0
  115. package/dist/model/model-value-proxy.d.ts +84 -0
  116. package/dist/{state → model}/safe-effect.d.ts +50 -2
  117. package/dist/model/types.d.ts +239 -0
  118. package/dist/model.d.ts +2 -0
  119. package/dist/model.js +27 -0
  120. package/dist/node-kind-C-r6ZMdo.js +15 -0
  121. package/dist/platforms/react/field-binding/field-adapter.d.ts +87 -0
  122. package/dist/platforms/react/field-binding/field-handle.d.ts +53 -0
  123. package/dist/platforms/react/form-bundle-context.d.ts +27 -0
  124. package/dist/{form → platforms/react}/hooks/types.d.ts +58 -36
  125. package/dist/platforms/react/hooks/use-form-bundle.d.ts +41 -0
  126. package/dist/platforms/react/hooks/use-form-flow.d.ts +40 -0
  127. package/dist/{form → platforms/react}/hooks/use-form-validation.d.ts +13 -7
  128. package/dist/{form → platforms/react}/hooks/useArrayLength.d.ts +6 -6
  129. package/dist/{form → platforms/react}/hooks/useFormControl.d.ts +7 -9
  130. package/dist/{form → platforms/react}/hooks/useFormControlValue.d.ts +18 -18
  131. package/dist/{form → platforms/react}/hooks/useSignalSubscription.d.ts +9 -1
  132. package/dist/platforms/react/i18n/context.d.ts +18 -0
  133. package/dist/platforms/react/i18n/hooks.d.ts +65 -0
  134. package/dist/platforms/react/i18n/provider.d.ts +59 -0
  135. package/dist/platforms/react/index.d.ts +30 -0
  136. package/dist/react.d.ts +22 -0
  137. package/dist/react.js +505 -0
  138. package/dist/runtime-token.d.ts +1 -2
  139. package/dist/safe-effect-BazLOv1g.js +669 -0
  140. package/dist/schema-controller-CpiO2JoK.js +143 -0
  141. package/dist/signals.d.ts +15 -9
  142. package/dist/signals.js +11 -6
  143. package/dist/strategy-DzvnsWLh.js +375 -0
  144. package/dist/type-guards-D-N_5Ddh.js +19 -0
  145. package/dist/validation-issue-B9mjI8jz.js +7 -0
  146. package/dist/validation-message-Ced9MGxs.js +194 -0
  147. package/dist/validation.d.ts +1 -1
  148. package/dist/validation.js +11 -165
  149. package/dist/validators/email.d.ts +1 -1
  150. package/dist/validators/email.js +5 -8
  151. package/dist/validators/future-date.d.ts +1 -1
  152. package/dist/validators/future-date.js +10 -13
  153. package/dist/validators/integer.d.ts +1 -1
  154. package/dist/validators/integer.js +4 -7
  155. package/dist/validators/is-date.d.ts +1 -1
  156. package/dist/validators/is-date.js +5 -8
  157. package/dist/validators/is-number.d.ts +1 -1
  158. package/dist/validators/is-number.js +4 -7
  159. package/dist/validators/max-age.d.ts +1 -1
  160. package/dist/validators/max-age.js +8 -12
  161. package/dist/validators/max-date.d.ts +1 -1
  162. package/dist/validators/max-date.js +10 -13
  163. package/dist/validators/max-length.d.ts +1 -1
  164. package/dist/validators/max-length.js +7 -10
  165. package/dist/validators/max.d.ts +1 -1
  166. package/dist/validators/max.js +4 -7
  167. package/dist/validators/min-age.d.ts +1 -1
  168. package/dist/validators/min-age.js +10 -11
  169. package/dist/validators/min-date.d.ts +1 -1
  170. package/dist/validators/min-date.js +8 -11
  171. package/dist/validators/min-length.d.ts +1 -1
  172. package/dist/validators/min-length.js +4 -7
  173. package/dist/validators/min.d.ts +1 -1
  174. package/dist/validators/min.js +4 -7
  175. package/dist/validators/multiple-of.d.ts +1 -1
  176. package/dist/validators/multiple-of.js +11 -10
  177. package/dist/validators/non-negative.d.ts +1 -1
  178. package/dist/validators/non-negative.js +2 -5
  179. package/dist/validators/non-zero.d.ts +1 -1
  180. package/dist/validators/non-zero.js +4 -7
  181. package/dist/validators/past-date.d.ts +1 -1
  182. package/dist/validators/past-date.js +10 -13
  183. package/dist/validators/pattern.d.ts +1 -1
  184. package/dist/validators/pattern.js +5 -8
  185. package/dist/validators/phone.d.ts +1 -1
  186. package/dist/validators/phone.js +10 -11
  187. package/dist/validators/required.d.ts +1 -1
  188. package/dist/validators/required.js +4 -7
  189. package/dist/validators/url.d.ts +1 -1
  190. package/dist/validators/url.js +48 -17
  191. package/dist/validators.d.ts +1 -1
  192. package/dist/validators.js +86 -108
  193. package/docs/llms/01-api-reference.md +60 -34
  194. package/docs/llms/02-quick-start.md +112 -74
  195. package/docs/llms/03-api-signatures.md +369 -148
  196. package/docs/llms/04-common-patterns.md +58 -56
  197. package/docs/llms/05-common-mistakes.md +69 -44
  198. package/docs/llms/06-troubleshooting.md +14 -9
  199. package/docs/llms/07-complete-import.md +74 -43
  200. package/docs/llms/08-form-types.md +11 -4
  201. package/docs/llms/09-formschema.md +132 -84
  202. package/docs/llms/10-arrays.md +141 -61
  203. package/docs/llms/11-async-watchfield.md +2 -2
  204. package/docs/llms/13-multi-step.md +134 -63
  205. package/docs/llms/14-extended-mistakes.md +20 -17
  206. package/docs/llms/15-project-structure.md +224 -70
  207. package/docs/llms/16-ui-components.md +86 -46
  208. package/docs/llms/17-nonexistent-api.md +217 -32
  209. package/docs/llms/18-conditional-fields.md +71 -32
  210. package/docs/llms/19-reading-values.md +45 -4
  211. package/docs/llms/20-compute-vs-watch.md +25 -10
  212. package/docs/llms/21-array-operations.md +76 -26
  213. package/docs/llms/22-cycle-detection.md +1 -1
  214. package/docs/llms/23-copy-from.md +2 -2
  215. package/docs/llms/24-sync-fields.md +6 -5
  216. package/docs/llms/25-reset-when.md +14 -7
  217. package/docs/llms/26-transform-value.md +4 -4
  218. package/docs/llms/27-revalidate-when.md +16 -15
  219. package/docs/llms/28-submit-and-reset.md +278 -128
  220. package/docs/llms/29-async-preload.md +41 -31
  221. package/docs/llms/30-type-safety-recipes.md +105 -51
  222. package/docs/llms/31-async-validator-debounce.md +96 -53
  223. package/docs/llms/33-validation-strategy.md +178 -66
  224. package/docs/llms/34-i18n.md +298 -0
  225. package/docs/llms/35-unified-contract.md +309 -0
  226. package/docs/llms/36-issue-messages.md +284 -0
  227. package/docs/llms/37-compiled-schema.md +332 -0
  228. package/docs/llms/38-form-flow.md +396 -0
  229. package/llms-index.json +1 -0
  230. package/llms.txt +10690 -3089
  231. package/package.json +48 -9
  232. package/dist/behaviors-node-DGEFMTQu.js +0 -18
  233. package/dist/behaviors-value-C7dSEhCc.js +0 -134
  234. package/dist/date-utils-dTT_x_Be.js +0 -31
  235. package/dist/derived-registry-CluZCQ7U.js +0 -16
  236. package/dist/form/behaviors.d.ts +0 -133
  237. package/dist/form/error-handler.d.ts +0 -166
  238. package/dist/form/factories/index.d.ts +0 -6
  239. package/dist/form/factories/node-factory.d.ts +0 -188
  240. package/dist/form/form-submitter.d.ts +0 -121
  241. package/dist/form/nodes/array-node.d.ts +0 -276
  242. package/dist/form/nodes/field-node.d.ts +0 -294
  243. package/dist/form/nodes/form-node.d.ts +0 -326
  244. package/dist/form/nodes/group-node.d.ts +0 -284
  245. package/dist/form/nodes/model-array-node.d.ts +0 -121
  246. package/dist/form/status-machine.d.ts +0 -115
  247. package/dist/form/types/deep-schema.d.ts +0 -107
  248. package/dist/form/types/form-proxy.d.ts +0 -141
  249. package/dist/form/unique-id.d.ts +0 -45
  250. package/dist/form/validation/validators/date-utils.d.ts +0 -30
  251. package/dist/form/validation/validators/email.d.ts +0 -23
  252. package/dist/form/validation/validators/future-date.d.ts +0 -23
  253. package/dist/form/validation/validators/integer.d.ts +0 -22
  254. package/dist/form/validation/validators/is-date.d.ts +0 -23
  255. package/dist/form/validation/validators/is-number.d.ts +0 -24
  256. package/dist/form/validation/validators/max-age.d.ts +0 -25
  257. package/dist/form/validation/validators/max-date.d.ts +0 -25
  258. package/dist/form/validation/validators/max-files.d.ts +0 -26
  259. package/dist/form/validation/validators/max-length.d.ts +0 -27
  260. package/dist/form/validation/validators/max-total-file-size.d.ts +0 -26
  261. package/dist/form/validation/validators/max.d.ts +0 -25
  262. package/dist/form/validation/validators/min-age.d.ts +0 -25
  263. package/dist/form/validation/validators/min-date.d.ts +0 -25
  264. package/dist/form/validation/validators/min-files.d.ts +0 -26
  265. package/dist/form/validation/validators/min-length.d.ts +0 -27
  266. package/dist/form/validation/validators/min.d.ts +0 -25
  267. package/dist/form/validation/validators/multiple-of.d.ts +0 -24
  268. package/dist/form/validation/validators/non-negative.d.ts +0 -22
  269. package/dist/form/validation/validators/non-zero.d.ts +0 -22
  270. package/dist/form/validation/validators/past-date.d.ts +0 -23
  271. package/dist/form/validation/validators/pattern.d.ts +0 -33
  272. package/dist/form/validation/validators/required.d.ts +0 -32
  273. package/dist/form/validation/validators/url.d.ts +0 -43
  274. package/dist/form/validation-schema.d.ts +0 -106
  275. package/dist/form/validation-strategy.d.ts +0 -55
  276. package/dist/form/validators.d.ts +0 -11
  277. package/dist/form-model-DYCzGGKF.js +0 -286
  278. package/dist/state/index.d.ts +0 -31
  279. package/dist/state/subscription-manager.d.ts +0 -180
  280. package/dist/state/types.d.ts +0 -144
  281. package/dist/state.d.ts +0 -2
  282. package/dist/state.js +0 -21
  283. package/dist/subscription-manager-705bls97.js +0 -171
@@ -1,141 +0,0 @@
1
- import { FieldNode } from '../nodes/field-node';
2
- import { GroupNode } from '../nodes/group-node';
3
- import { ArrayNode } from '../nodes/array-node';
4
- /**
5
- * Признак «объект-группа» — обычный объект, который нужно обернуть в под-форму.
6
- *
7
- * Исключает массивы, спец-объекты (`Date`/`File`/`Blob`) и примитивы.
8
- * Используется как дискриминатор вместо `extends FormFields` (`Record<string, FormValue>`):
9
- * пользовательские модели почти всегда объявлены через `interface`, который НЕ assignable
10
- * к Record-типу (у интерфейса нет неявной index signature), и потому ошибочно проваливался
11
- * бы в ветку `FieldNode`. Проверка `extends object` корректно ловит и `interface`, и `type`.
12
- *
13
- * @internal
14
- */
15
- type IsGroupObject<V> = V extends ReadonlyArray<unknown> ? false : V extends Date | File | Blob ? false : V extends (...args: never[]) => unknown ? false : V extends object ? true : false;
16
- /**
17
- * Мапит тип модели данных T на правильные типы узлов формы
18
- *
19
- * Рекурсивно определяет типы узлов на основе структуры данных:
20
- * - `T[K] extends Array<infer U>` где U - объект → `FormArrayProxy<U>`
21
- * - `T[K] extends Array<infer U>` где U - примитив → `FieldNode<T[K]>` (массив как обычное поле)
22
- * - `T[K] extends object` → `FormProxy<T[K]>` (вложенная форма с типизацией)
23
- * - `T[K]` примитив → `FieldNode<T[K]>` (простое поле)
24
- *
25
- * Использует NonNullable для правильной обработки опциональных полей
26
- *
27
- * @group Types
28
- * @category Proxy Types
29
- *
30
- * @template T - Тип модели данных формы
31
- */
32
- export type FormControlsProxy<T> = {
33
- [K in keyof T]-?: NonNullable<T[K]> extends ReadonlyArray<infer U> ? IsGroupObject<U> extends true ? FormArrayProxy<U & object> : FieldNode<T[K]> : IsGroupObject<NonNullable<T[K]>> extends true ? FormProxy<NonNullable<T[K]>> : FieldNode<T[K]>;
34
- };
35
- /**
36
- * Комбинированный тип для GroupNode с Proxy доступом к полям
37
- *
38
- * Объединяет методы и свойства GroupNode с типизированными полями формы.
39
- * Это позволяет использовать как API GroupNode, так и прямой доступ к полям.
40
- *
41
- * @group Types
42
- * @category Proxy Types
43
- *
44
- * @template T - Тип модели данных формы
45
- *
46
- * @example
47
- * ```typescript
48
- * interface UserForm {
49
- * email: string;
50
- * profile: {
51
- * name: string;
52
- * age: number;
53
- * };
54
- * }
55
- *
56
- * const form = createForm<UserForm>(schema);
57
- *
58
- * // Доступ к методам GroupNode
59
- * await form.validate();
60
- * const values = form.getValue();
61
- * console.log(form.valid.value);
62
- *
63
- * // Прямой доступ к полям (через Proxy)
64
- * form.email.setValue('test@mail.com');
65
- * form.profile.name.setValue('John');
66
- * ```
67
- *
68
- * @remarks
69
- * **Зарезервированные имена.** Прямой доступ `form.<name>` отдаёт приоритет собственным
70
- * членам {@link GroupNode} (`value`, `status`, `id`, `errors`, `disabled`, `reset`, `submit`, …).
71
- * Поэтому поле модели, названное любым из этих имён, недостижимо как `form.<name>` — там будет
72
- * агрегированный сигнал/метод узла, а не {@link FieldNode}. Такие имена исключены из полевого
73
- * пространства имён на уровне типов (через `Omit<…, keyof GroupNode>`), чтобы затенение не
74
- * компилировалось молча. Для доступа к любому полю по имени — включая затенённые — используйте
75
- * escape-hatch пространство {@link FormProxy.$}: `form.$.status`, `form.$.id`, `form.$.value`.
76
- */
77
- export type FormProxy<T> = GroupNode<T> & Omit<FormControlsProxy<T>, keyof GroupNode<T>> & {
78
- /**
79
- * Escape-hatch пространство имён «controls»: типобезопасный доступ ко ВСЕМ полям формы
80
- * по имени, включая поля, чьи имена совпадают с членами {@link GroupNode}
81
- * (`value`/`status`/`id`/`errors`/…), недостижимые через `form.<name>`.
82
- *
83
- * @example
84
- * ```typescript
85
- * // модель: { status: string; email: string }
86
- * form.status; // ReadonlySignal<FieldStatus> — агрегат GroupNode (не поле!)
87
- * form.$.status; // FieldNode<string> — поле пользователя
88
- * form.$.status.setValue('active');
89
- * form.$.email; // FieldNode<string> — так же доступны и незатенённые поля
90
- * ```
91
- */
92
- readonly $: FormControlsProxy<T>;
93
- };
94
- /**
95
- * Комбинированный тип для ArrayNode с Proxy доступом к элементам
96
- *
97
- * Объединяет методы и свойства ArrayNode с типизированным доступом к элементам массива.
98
- *
99
- * @group Types
100
- * @category Proxy Types
101
- *
102
- * @template T - Тип модели данных элемента массива
103
- *
104
- * @example
105
- * ```typescript
106
- * interface TodoItem {
107
- * title: string;
108
- * completed: boolean;
109
- * }
110
- *
111
- * const todos: FormArrayProxy<TodoItem> = new ArrayNode(schema);
112
- *
113
- * // Доступ к методам ArrayNode
114
- * todos.push({ title: 'New todo', completed: false });
115
- * todos.removeAt(0);
116
- *
117
- * // Доступ к элементам (через Proxy)
118
- * todos.at(0)?.title.setValue('Updated title');
119
- *
120
- * // Итерация
121
- * todos.forEach((item, i) => {
122
- * console.log(item.title.value.value);
123
- * });
124
- * ```
125
- */
126
- export type FormArrayProxy<T extends object> = ArrayNode<T> & {
127
- /**
128
- * Безопасный доступ к элементу массива по индексу
129
- * Возвращает GroupNode с типизированными полями или undefined
130
- */
131
- at(index: number): FormProxy<T> | undefined;
132
- /**
133
- * Итерация по элементам массива с типизированными элементами
134
- */
135
- forEach(callback: (item: FormProxy<T>, index: number) => void): void;
136
- /**
137
- * Маппинг элементов массива с типизированными элементами
138
- */
139
- map<R>(callback: (item: FormProxy<T>, index: number) => R): R[];
140
- };
141
- export {};
@@ -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,30 +0,0 @@
1
- /**
2
- * Утилиты для работы с датами в валидаторах
3
- *
4
- * @group Validation
5
- * @category Validators
6
- * @module validators/date-utils
7
- */
8
- /**
9
- * Парсит значение в объект Date
10
- *
11
- * @param value - Значение для парсинга (Date, string или undefined)
12
- * @returns Date объект или null если парсинг не удался
13
- */
14
- export declare function parseDate(value: string | Date | null | undefined): Date | null;
15
- /**
16
- * Возвращает сегодняшнюю дату с обнулённым временем
17
- */
18
- export declare function getToday(): Date;
19
- /**
20
- * Нормализует дату, обнуляя время
21
- */
22
- export declare function normalizeDate(date: Date): Date;
23
- /**
24
- * Вычисляет полный возраст (в годах) по календарным полям.
25
- *
26
- * Считаем по годам/месяцам/дням, а не делением миллисекунд на усреднённый год (365.25 дн): усреднение
27
- * даёт off-by-one на границе — в день N-летия накопленных реальных дней меньше `N * 365.25`, и `floor`
28
- * роняет возраст до `N - 1` (т.е. `minAge(18)` ошибочно отклонял 18-летнего в его день рождения).
29
- */
30
- export declare function calculateAge(birthDate: Date): number;
@@ -1,23 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора формата email.
4
- *
5
- * Проверяет по упрощённому regex `^[^\s@]+@[^\s@]+\.[^\s@]+$`. Пустые значения
6
- * (`''`/`null`/`undefined`) пропускаются (используйте {@link required} для обязательности).
7
- *
8
- * @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
9
- * @returns Чистый валидатор {@link Validator} для строкового поля
10
- *
11
- * @example Проверка формата email
12
- * ```typescript
13
- * import { required, email } from '@reformer/core/validators';
14
- *
15
- * // Внутри FieldConfig схемы формы:
16
- * email: {
17
- * value: model.$.email,
18
- * component: Input,
19
- * validators: [required(), email({ message: 'Введите корректный email' })],
20
- * },
21
- * ```
22
- */
23
- export declare function email<TForm = unknown, TField extends string | null | undefined = string>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,23 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора, проверяющего что дата не в прошлом.
4
- *
5
- * Дата не должна быть раньше сегодняшнего дня (сравнение по нормализованным датам).
6
- * Пустые и невалидные даты пропускаются (используйте {@link required} и {@link isDate}).
7
- *
8
- * @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
9
- * @returns Чистый валидатор {@link Validator} для поля даты (`string | Date`)
10
- *
11
- * @example Дата не в прошлом
12
- * ```typescript
13
- * import { required, futureDate } from '@reformer/core/validators';
14
- *
15
- * // Внутри FieldConfig схемы формы:
16
- * appointmentDate: {
17
- * value: model.$.appointmentDate,
18
- * component: DatePicker,
19
- * validators: [required(), futureDate({ message: 'Дата записи должна быть в будущем' })],
20
- * },
21
- * ```
22
- */
23
- export declare function futureDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,22 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора, проверяющего что число — целое.
4
- *
5
- * Пустые значения и не-числа пропускаются (используйте {@link required} и {@link isNumber}).
6
- *
7
- * @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
8
- * @returns Чистый валидатор {@link Validator} для числового поля
9
- *
10
- * @example Проверка целого числа
11
- * ```typescript
12
- * import { required, integer } from '@reformer/core/validators';
13
- *
14
- * // Внутри FieldConfig схемы формы:
15
- * count: {
16
- * value: model.$.count,
17
- * component: Input,
18
- * validators: [required(), integer({ message: 'Должно быть целым числом' })],
19
- * },
20
- * ```
21
- */
22
- export declare function integer<TForm = unknown, TField extends number | null | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,23 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора, проверяющего что значение — валидная дата.
4
- *
5
- * Принимает `Date` или строку, парсимую в дату. Пустые значения (`''`/`null`/`undefined`)
6
- * пропускаются (используйте {@link required} для обязательности).
7
- *
8
- * @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
9
- * @returns Чистый валидатор {@link Validator} для поля даты (`string | Date`)
10
- *
11
- * @example Проверка валидности даты
12
- * ```typescript
13
- * import { required, isDate } from '@reformer/core/validators';
14
- *
15
- * // Внутри FieldConfig схемы формы:
16
- * eventDate: {
17
- * value: model.$.eventDate,
18
- * component: DatePicker,
19
- * validators: [required(), isDate({ message: 'Введите корректную дату' })],
20
- * },
21
- * ```
22
- */
23
- export declare function isDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,24 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора, проверяющего что значение — конечное число (не NaN, не строка).
4
- *
5
- * Пустые значения (`null`/`undefined`) пропускаются (используйте {@link required} для
6
- * обязательности). В отличие от других number-валидаторов, **не** пропускает не-числа
7
- * и `NaN` — это его задача.
8
- *
9
- * @param options - Опции валидатора ({@link ValidateOptions}): `message`, `params`
10
- * @returns Чистый валидатор {@link Validator} для числового поля
11
- *
12
- * @example Проверка, что значение — число
13
- * ```typescript
14
- * import { required, isNumber } from '@reformer/core/validators';
15
- *
16
- * // Внутри FieldConfig схемы формы:
17
- * amount: {
18
- * value: model.$.amount,
19
- * component: Input,
20
- * validators: [required(), isNumber({ message: 'Введите число' })],
21
- * },
22
- * ```
23
- */
24
- export declare function isNumber<TForm = unknown, TField extends number | null | undefined = number>(options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,25 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора максимального возраста (по дате рождения).
4
- *
5
- * Возраст вычисляется по дате рождения относительно сегодняшнего дня. Пустые и невалидные
6
- * даты пропускаются (используйте {@link required} и {@link isDate}).
7
- *
8
- * @param maxAgeValue - Максимально допустимый возраст (в полных годах)
9
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
10
- * попадают `maxAge` и `currentAge`.
11
- * @returns Чистый валидатор {@link Validator} для поля даты рождения (`string | Date`)
12
- *
13
- * @example Максимальный возраст
14
- * ```typescript
15
- * import { maxAge } from '@reformer/core/validators';
16
- *
17
- * // Внутри FieldConfig схемы формы:
18
- * birthDate: {
19
- * value: model.$.birthDate,
20
- * component: DatePicker,
21
- * validators: [maxAge(100, { message: 'Проверьте дату рождения' })],
22
- * },
23
- * ```
24
- */
25
- export declare function maxAge<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(maxAgeValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,25 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора максимальной даты (включительно).
4
- *
5
- * Сравнение по нормализованным датам (время обнуляется). Пустые и невалидные даты
6
- * пропускаются (используйте {@link required} и {@link isDate}).
7
- *
8
- * @param maxDateValue - Максимально допустимая дата (включительно)
9
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
10
- * попадает `maxDate`.
11
- * @returns Чистый валидатор {@link Validator} для поля даты (`string | Date`)
12
- *
13
- * @example Максимальная дата
14
- * ```typescript
15
- * import { maxDate } from '@reformer/core/validators';
16
- *
17
- * // Внутри FieldConfig схемы формы:
18
- * birthDate: {
19
- * value: model.$.birthDate,
20
- * component: DatePicker,
21
- * validators: [maxDate(new Date(), { message: 'Дата не может быть в будущем' })],
22
- * },
23
- * ```
24
- */
25
- export declare function maxDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(maxDateValue: Date, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,26 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора максимального количества файлов.
4
- *
5
- * Работает с массивом файлов (одиночный файл считается как 1). Пустые значения
6
- * (`null`/`undefined`/`''`/`[]`) пропускаются (используйте {@link required}
7
- * для обязательности).
8
- *
9
- * @param max - Максимально допустимое количество файлов (включительно)
10
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
11
- * попадают `maxFiles` и `actualCount`.
12
- * @returns Чистый валидатор {@link Validator} для файла или массива файлов
13
- *
14
- * @example Не более трёх вложений
15
- * ```typescript
16
- * import { maxFiles } from '@reformer/core/validators';
17
- *
18
- * // Внутри FieldConfig схемы формы:
19
- * documents: {
20
- * value: model.$.documents,
21
- * component: FileUploadField,
22
- * validators: [maxFiles(3, { message: 'Максимум 3 файла' })],
23
- * },
24
- * ```
25
- */
26
- export declare function maxFiles<TForm = unknown, TField = unknown>(max: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,27 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора максимальной длины строки или массива.
4
- *
5
- * Работает со строкой или массивом (проверяется `value.length`). Пустые значения
6
- * (`null`/`undefined`/`''`) и значения без числового `length` пропускаются
7
- * (используйте {@link required} для обязательности).
8
- *
9
- * @param maxLen - Максимально допустимая длина (включительно)
10
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
11
- * попадают `maxLength` и `actualLength`.
12
- * @returns Чистый валидатор {@link Validator} для строки или массива
13
- *
14
- * @example Максимальная длина строки
15
- * ```typescript
16
- * import { maxLength } from '@reformer/core/validators';
17
- *
18
- * // Внутри FieldConfig схемы формы:
19
- * name: { value: model.$.name, component: Input, validators: [maxLength(50)] },
20
- * bio: {
21
- * value: model.$.bio,
22
- * component: Textarea,
23
- * validators: [maxLength(500, { message: 'Максимум 500 символов' })],
24
- * },
25
- * ```
26
- */
27
- export declare function maxLength<TForm = unknown, TField = unknown>(maxLen: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,26 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора суммарного размера всех файлов.
4
- *
5
- * Складывает `size` всех файлов значения (элементы без числового `size` в сумму
6
- * не входят). Пустые значения (`null`/`undefined`/`''`/`[]`) пропускаются
7
- * (используйте {@link required} для обязательности).
8
- *
9
- * @param maxTotal - Максимально допустимый суммарный размер в байтах (включительно)
10
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
11
- * попадают `maxTotalFileSize` и `actualTotal`.
12
- * @returns Чистый валидатор {@link Validator} для файла или массива файлов
13
- *
14
- * @example Суммарно не более 20 МБ
15
- * ```typescript
16
- * import { maxTotalFileSize } from '@reformer/core/validators';
17
- *
18
- * // Внутри FieldConfig схемы формы:
19
- * documents: {
20
- * value: model.$.documents,
21
- * component: FileUploadField,
22
- * validators: [maxTotalFileSize(20 * 1024 * 1024, { message: 'Суммарно не более 20 МБ' })],
23
- * },
24
- * ```
25
- */
26
- export declare function maxTotalFileSize<TForm = unknown, TField = unknown>(maxTotal: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,25 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора максимального числового значения.
4
- *
5
- * Пустые значения (`null`/`undefined`) пропускаются (используйте {@link required} для обязательности).
6
- *
7
- * @param maxValue - Максимально допустимое значение (включительно)
8
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
9
- * попадают `max` и `actual`.
10
- * @returns Чистый валидатор {@link Validator} для числового поля
11
- *
12
- * @example Максимальное значение числового поля
13
- * ```typescript
14
- * import { required, max } from '@reformer/core/validators';
15
- *
16
- * // Внутри FieldConfig схемы формы:
17
- * quantity: { value: model.$.quantity, component: Input, validators: [max(100)] },
18
- * discount: {
19
- * value: model.$.discount,
20
- * component: Input,
21
- * validators: [required(), max(50, { message: 'Не более 50%' })],
22
- * },
23
- * ```
24
- */
25
- export declare function max<TForm = unknown, TField extends number | null | undefined = number>(maxValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,25 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора минимального возраста (по дате рождения).
4
- *
5
- * Возраст вычисляется по дате рождения относительно сегодняшнего дня. Пустые и невалидные
6
- * даты пропускаются (используйте {@link required} и {@link isDate}).
7
- *
8
- * @param minAgeValue - Минимально допустимый возраст (в полных годах)
9
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
10
- * попадают `minAge` и `currentAge`.
11
- * @returns Чистый валидатор {@link Validator} для поля даты рождения (`string | Date`)
12
- *
13
- * @example Минимальный возраст
14
- * ```typescript
15
- * import { required, minAge } from '@reformer/core/validators';
16
- *
17
- * // Внутри FieldConfig схемы формы:
18
- * birthDate: {
19
- * value: model.$.birthDate,
20
- * component: DatePicker,
21
- * validators: [required(), minAge(18, { message: 'Вам должно быть не менее 18 лет' })],
22
- * },
23
- * ```
24
- */
25
- export declare function minAge<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(minAgeValue: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,25 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора минимальной даты (включительно).
4
- *
5
- * Сравнение по нормализованным датам (время обнуляется). Пустые и невалидные даты
6
- * пропускаются (используйте {@link required} и {@link isDate}).
7
- *
8
- * @param minDateValue - Минимально допустимая дата (включительно)
9
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
10
- * попадает `minDate`.
11
- * @returns Чистый валидатор {@link Validator} для поля даты (`string | Date`)
12
- *
13
- * @example Минимальная дата
14
- * ```typescript
15
- * import { required, minDate } from '@reformer/core/validators';
16
- *
17
- * // Внутри FieldConfig схемы формы:
18
- * startDate: {
19
- * value: model.$.startDate,
20
- * component: DatePicker,
21
- * validators: [required(), minDate(new Date(), { message: 'Дата не раньше сегодня' })],
22
- * },
23
- * ```
24
- */
25
- export declare function minDate<TForm = unknown, TField extends string | Date | null | undefined = string | Date>(minDateValue: Date, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,26 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора минимального количества файлов.
4
- *
5
- * Работает с массивом файлов (одиночный файл считается как 1). Пустые значения
6
- * (`null`/`undefined`/`''`/`[]`) пропускаются — «нужен хотя бы один файл» выражается
7
- * связкой `required()` + `minFiles(n)`, как и у {@link minLength}.
8
- *
9
- * @param min - Минимально допустимое количество файлов (включительно)
10
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
11
- * попадают `minFiles` и `actualCount`.
12
- * @returns Чистый валидатор {@link Validator} для файла или массива файлов
13
- *
14
- * @example Не менее двух документов
15
- * ```typescript
16
- * import { required, minFiles } from '@reformer/core/validators';
17
- *
18
- * // Внутри FieldConfig схемы формы:
19
- * documents: {
20
- * value: model.$.documents,
21
- * component: FileUploadField,
22
- * validators: [required(), minFiles(2, { message: 'Приложите минимум 2 документа' })],
23
- * },
24
- * ```
25
- */
26
- export declare function minFiles<TForm = unknown, TField = unknown>(min: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,27 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора минимальной длины строки или массива.
4
- *
5
- * Работает со строкой или массивом (проверяется `value.length`). Пустые значения
6
- * (`null`/`undefined`/`''`) и значения без числового `length` пропускаются
7
- * (используйте {@link required} для обязательности).
8
- *
9
- * @param minLen - Минимально допустимая длина (включительно)
10
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
11
- * попадают `minLength` и `actualLength`.
12
- * @returns Чистый валидатор {@link Validator} для строки или массива
13
- *
14
- * @example Минимальная длина строки
15
- * ```typescript
16
- * import { required, minLength } from '@reformer/core/validators';
17
- *
18
- * // Внутри FieldConfig схемы формы:
19
- * name: { value: model.$.name, component: Input, validators: [minLength(2)] },
20
- * password: {
21
- * value: model.$.password,
22
- * component: Input,
23
- * validators: [required(), minLength(8, { message: 'Минимум 8 символов' })],
24
- * },
25
- * ```
26
- */
27
- export declare function minLength<TForm = unknown, TField = unknown>(minLen: number, options?: ValidateOptions): Validator<TForm, TField>;
@@ -1,25 +0,0 @@
1
- import { Validator, ValidateOptions } from '../../types/validation-schema';
2
- /**
3
- * Фабрика валидатора минимального числового значения.
4
- *
5
- * Пустые значения (`null`/`undefined`) пропускаются (используйте {@link required} для обязательности).
6
- *
7
- * @param minValue - Минимально допустимое значение (включительно)
8
- * @param options - Опции валидатора ({@link ValidateOptions}). В `params` ошибки автоматически
9
- * попадают `min` и `actual`.
10
- * @returns Чистый валидатор {@link Validator} для числового поля
11
- *
12
- * @example Минимальное значение числового поля
13
- * ```typescript
14
- * import { required, min } from '@reformer/core/validators';
15
- *
16
- * // Внутри FieldConfig схемы формы:
17
- * age: { value: model.$.age, component: Input, validators: [min(18)] },
18
- * quantity: {
19
- * value: model.$.quantity,
20
- * component: Input,
21
- * validators: [required(), min(1, { message: 'Минимум 1' })],
22
- * },
23
- * ```
24
- */
25
- export declare function min<TForm = unknown, TField extends number | null | undefined = number>(minValue: number, options?: ValidateOptions): Validator<TForm, TField>;