@reformer/core 10.2.0 → 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 (285) 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 -27
  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 -91
  42. package/dist/form/types/field-config.d.ts +27 -0
  43. package/dist/form/types/index.d.ts +5 -91
  44. package/dist/form/types/nodes.d.ts +159 -0
  45. package/dist/form/types/schema-node.d.ts +148 -50
  46. package/dist/form/types/validation-schema.d.ts +24 -41
  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 +18 -6
  97. package/dist/index.js +932 -2779
  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 +60 -38
  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 +22 -0
  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 -5
  192. package/dist/validators.js +98 -154
  193. package/docs/llms/01-api-reference.md +89 -0
  194. package/docs/llms/02-quick-start.md +181 -0
  195. package/docs/llms/03-api-signatures.md +494 -0
  196. package/docs/llms/04-common-patterns.md +204 -0
  197. package/docs/llms/05-common-mistakes.md +192 -0
  198. package/docs/llms/06-troubleshooting.md +16 -0
  199. package/docs/llms/07-complete-import.md +130 -0
  200. package/docs/llms/08-form-types.md +54 -0
  201. package/docs/llms/09-formschema.md +191 -0
  202. package/docs/llms/10-arrays.md +241 -0
  203. package/docs/llms/11-async-watchfield.md +53 -0
  204. package/docs/llms/12-array-cleanup.md +31 -0
  205. package/docs/llms/13-multi-step.md +162 -0
  206. package/docs/llms/14-extended-mistakes.md +101 -0
  207. package/docs/llms/15-project-structure.md +279 -0
  208. package/docs/llms/16-ui-components.md +229 -0
  209. package/docs/llms/17-nonexistent-api.md +278 -0
  210. package/docs/llms/18-conditional-fields.md +222 -0
  211. package/docs/llms/19-reading-values.md +100 -0
  212. package/docs/llms/20-compute-vs-watch.md +153 -0
  213. package/docs/llms/21-array-operations.md +163 -0
  214. package/docs/llms/22-cycle-detection.md +86 -0
  215. package/docs/llms/23-copy-from.md +141 -0
  216. package/docs/llms/24-sync-fields.md +115 -0
  217. package/docs/llms/25-reset-when.md +122 -0
  218. package/docs/llms/26-transform-value.md +136 -0
  219. package/docs/llms/27-revalidate-when.md +133 -0
  220. package/docs/llms/28-submit-and-reset.md +409 -0
  221. package/docs/llms/29-async-preload.md +203 -0
  222. package/docs/llms/30-type-safety-recipes.md +213 -0
  223. package/docs/llms/31-async-validator-debounce.md +178 -0
  224. package/docs/llms/32-async-options-loading.md +108 -0
  225. package/docs/llms/33-validation-strategy.md +305 -0
  226. package/docs/llms/34-i18n.md +298 -0
  227. package/docs/llms/35-unified-contract.md +309 -0
  228. package/docs/llms/36-issue-messages.md +284 -0
  229. package/docs/llms/37-compiled-schema.md +332 -0
  230. package/docs/llms/38-form-flow.md +396 -0
  231. package/llms-index.json +1 -0
  232. package/llms.txt +10014 -3826
  233. package/package.json +77 -15
  234. package/dist/behaviors-node-DGEFMTQu.js +0 -18
  235. package/dist/behaviors-value-C7dSEhCc.js +0 -134
  236. package/dist/date-utils-dTT_x_Be.js +0 -31
  237. package/dist/derived-registry-CluZCQ7U.js +0 -16
  238. package/dist/form/behaviors.d.ts +0 -133
  239. package/dist/form/error-handler.d.ts +0 -166
  240. package/dist/form/factories/index.d.ts +0 -6
  241. package/dist/form/factories/node-factory.d.ts +0 -188
  242. package/dist/form/form-submitter.d.ts +0 -125
  243. package/dist/form/nodes/array-node.d.ts +0 -360
  244. package/dist/form/nodes/field-node.d.ts +0 -294
  245. package/dist/form/nodes/form-node.d.ts +0 -340
  246. package/dist/form/nodes/group-node.d.ts +0 -288
  247. package/dist/form/nodes/model-array-node.d.ts +0 -121
  248. package/dist/form/status-machine.d.ts +0 -153
  249. package/dist/form/types/deep-schema.d.ts +0 -116
  250. package/dist/form/types/form-proxy.d.ts +0 -141
  251. package/dist/form/unique-id.d.ts +0 -53
  252. package/dist/form/validation/validators/date-utils.d.ts +0 -30
  253. package/dist/form/validation/validators/email.d.ts +0 -23
  254. package/dist/form/validation/validators/future-date.d.ts +0 -23
  255. package/dist/form/validation/validators/integer.d.ts +0 -22
  256. package/dist/form/validation/validators/is-date.d.ts +0 -23
  257. package/dist/form/validation/validators/is-number.d.ts +0 -24
  258. package/dist/form/validation/validators/max-age.d.ts +0 -25
  259. package/dist/form/validation/validators/max-date.d.ts +0 -25
  260. package/dist/form/validation/validators/max-files.d.ts +0 -26
  261. package/dist/form/validation/validators/max-length.d.ts +0 -27
  262. package/dist/form/validation/validators/max-total-file-size.d.ts +0 -26
  263. package/dist/form/validation/validators/max.d.ts +0 -25
  264. package/dist/form/validation/validators/min-age.d.ts +0 -25
  265. package/dist/form/validation/validators/min-date.d.ts +0 -25
  266. package/dist/form/validation/validators/min-files.d.ts +0 -26
  267. package/dist/form/validation/validators/min-length.d.ts +0 -27
  268. package/dist/form/validation/validators/min.d.ts +0 -25
  269. package/dist/form/validation/validators/multiple-of.d.ts +0 -24
  270. package/dist/form/validation/validators/non-negative.d.ts +0 -22
  271. package/dist/form/validation/validators/non-zero.d.ts +0 -22
  272. package/dist/form/validation/validators/past-date.d.ts +0 -23
  273. package/dist/form/validation/validators/pattern.d.ts +0 -33
  274. package/dist/form/validation/validators/required.d.ts +0 -32
  275. package/dist/form/validation/validators/url.d.ts +0 -43
  276. package/dist/form/validation-schema.d.ts +0 -106
  277. package/dist/form/validation-strategy.d.ts +0 -55
  278. package/dist/form/validators.d.ts +0 -6
  279. package/dist/form-model-DYCzGGKF.js +0 -286
  280. package/dist/state/index.d.ts +0 -31
  281. package/dist/state/subscription-manager.d.ts +0 -180
  282. package/dist/state/types.d.ts +0 -144
  283. package/dist/state.d.ts +0 -2
  284. package/dist/state.js +0 -21
  285. package/dist/subscription-manager-705bls97.js +0 -171
@@ -1,31 +0,0 @@
1
- /**
2
- * `@reformer/core/state` — низкоуровневый реактивный **state-субстрат** (M1) и barrel модуля `state`.
3
- *
4
- * Это «прокси-объект с сигналами» и инструментарий для построения доменных модулей поверх него
5
- * (form, table, …). Модуль СТРОГО реактивный: НИЧЕГО связанного с формами/валидацией/схемами здесь
6
- * нет — только модель, value-операции, producer-флаг и утилиты субстрата. Граница state⇏form
7
- * зафиксирована ESLint-правилом (`no-restricted-imports` на `src/state/**`).
8
- *
9
- * Реактивный рантайм (`signal/computed/effect/…`) живёт в отдельном subpath `@reformer/core/signals`
10
- * (единый владелец `@preact/signals-core`) — импортируй его оттуда; здесь он НЕ реэкспортируется,
11
- * чтобы зонтичный barrel `.` не разрастался рантаймом.
12
- *
13
- * Состав (реэкспорты — из тех же файлов, что использует зонтик `.`, поэтому `.` и `/state` — один
14
- * module-инстанс: общий `derived`-WeakMap, единая идентичность `Signal`):
15
- * - **модель** — `createModel` + типы `FormModel`/`ModelArray`/… + `PathAwareSignal`;
16
- * - **value-операции** (реактивные правила) — `computeFrom`/`copyFrom`/`watchField`/`transformValue`/
17
- * `resetWhen`/`syncFields`/`revalidateWhen`;
18
- * - **producer-owned флаг** — `markDerived`/`isDerived`/`unmarkDerived`;
19
- * - **утилиты субстрата** — `runOutsideEffect`/`safeCallback`/`safeDebouncedCallback`,
20
- * `SubscriptionManager`.
21
- *
22
- * @group State
23
- * @module state
24
- */
25
- export { createModel } from './form-model';
26
- export type { FormModel, ModelArray, ModelObject, ModelValue, ModelSignals, ModelApi, PathAwareSignal, } from './types';
27
- export { computeFrom, copyFrom, watchField, transformValue, resetWhen, syncFields, revalidateWhen, } from './behaviors-value';
28
- export type { BehaviorCleanup } from './behaviors-value';
29
- export { markDerived, isDerived, unmarkDerived } from './derived-registry';
30
- export { runOutsideEffect, safeCallback, safeDebouncedCallback } from './safe-effect';
31
- export { SubscriptionManager } from './subscription-manager';
@@ -1,180 +0,0 @@
1
- /**
2
- * Менеджер подписок для FormNode
3
- *
4
- * Централизует управление effect-подписками в узлах формы,
5
- * предотвращает утечки памяти и упрощает отладку.
6
- *
7
- * Каждая подписка имеет уникальный ключ, что позволяет:
8
- * - Отписываться от конкретной подписки по ключу
9
- * - Автоматически заменять существующие подписки
10
- * - Отслеживать количество активных подписок (для отладки)
11
- *
12
- * @internal
13
- *
14
- * @example
15
- * ```typescript
16
- * class FieldNode {
17
- * private subscriptions = new SubscriptionManager();
18
- *
19
- * watch(callback: Function) {
20
- * const dispose = effect(() => callback(this.value.value));
21
- * return this.subscriptions.add('watch', dispose);
22
- * }
23
- *
24
- * dispose() {
25
- * this.subscriptions.clear();
26
- * }
27
- * }
28
- * ```
29
- */
30
- export declare class SubscriptionManager {
31
- /**
32
- * Хранилище подписок
33
- * Ключ: уникальный идентификатор подписки
34
- * Значение: функция отписки (dispose)
35
- */
36
- private subscriptions;
37
- /**
38
- * Добавляет подписку
39
- *
40
- * Если подписка с таким ключом уже существует, отписывается от неё
41
- * и заменяет новой. Это предотвращает утечки памяти при повторной
42
- * регистрации подписки с тем же ключом.
43
- *
44
- * @param key Уникальный ключ подписки
45
- * @param dispose Функция отписки (обычно возвращаемая из effect())
46
- * @returns Функция для отписки от этой конкретной подписки
47
- *
48
- * @example
49
- * ```typescript
50
- * const manager = new SubscriptionManager();
51
- *
52
- * // Добавление подписки
53
- * const unsubscribe = manager.add('mySubscription', () => {
54
- * console.log('Disposing subscription');
55
- * });
56
- *
57
- * // Отписка через возвращаемую функцию
58
- * unsubscribe();
59
- *
60
- * // Или через manager.remove()
61
- * manager.add('anotherSub', disposeFn);
62
- * manager.remove('anotherSub');
63
- * ```
64
- */
65
- add(key: string, dispose: () => void): () => void;
66
- /**
67
- * Удаляет подписку по ключу
68
- *
69
- * Вызывает функцию отписки и удаляет подписку из хранилища.
70
- * Если подписка с таким ключом не найдена, ничего не делает.
71
- *
72
- * @param key Ключ подписки
73
- * @returns true, если подписка была удалена, false если не найдена
74
- *
75
- * @example
76
- * ```typescript
77
- * const manager = new SubscriptionManager();
78
- * manager.add('mySub', disposeFn);
79
- *
80
- * // Удаление подписки
81
- * const removed = manager.remove('mySub'); // true
82
- *
83
- * // Попытка удалить несуществующую подписку
84
- * const removed2 = manager.remove('nonExistent'); // false
85
- * ```
86
- */
87
- remove(key: string): boolean;
88
- /**
89
- * Очищает все подписки
90
- *
91
- * Вызывает функции отписки для всех активных подписок
92
- * и очищает хранилище. Обычно используется при dispose узла формы.
93
- *
94
- * @example
95
- * ```typescript
96
- * class FieldNode {
97
- * private subscriptions = new SubscriptionManager();
98
- *
99
- * dispose() {
100
- * // Отписываемся от всех effect
101
- * this.subscriptions.clear();
102
- * }
103
- * }
104
- * ```
105
- */
106
- clear(): void;
107
- /**
108
- * Возвращает количество активных подписок
109
- *
110
- * Полезно для отладки утечек памяти. Если количество подписок
111
- * растет без ограничений, это может указывать на то, что
112
- * компоненты не отписываются должным образом.
113
- *
114
- * @returns Количество активных подписок
115
- *
116
- * @example
117
- * ```typescript
118
- * const manager = new SubscriptionManager();
119
- * console.log(manager.size()); // 0
120
- *
121
- * manager.add('sub1', disposeFn1);
122
- * manager.add('sub2', disposeFn2);
123
- * console.log(manager.size()); // 2
124
- *
125
- * manager.clear();
126
- * console.log(manager.size()); // 0
127
- * ```
128
- */
129
- size(): number;
130
- /**
131
- * Проверяет, есть ли подписка с данным ключом
132
- *
133
- * @param key Ключ подписки
134
- * @returns true, если подписка существует
135
- *
136
- * @example
137
- * ```typescript
138
- * const manager = new SubscriptionManager();
139
- * manager.add('mySub', disposeFn);
140
- *
141
- * console.log(manager.has('mySub')); // true
142
- * console.log(manager.has('nonExistent')); // false
143
- * ```
144
- */
145
- has(key: string): boolean;
146
- /**
147
- * Возвращает список всех ключей активных подписок
148
- *
149
- * Полезно для отладки: можно увидеть, какие подписки активны.
150
- *
151
- * @returns Массив ключей всех активных подписок
152
- *
153
- * @example
154
- * ```typescript
155
- * const manager = new SubscriptionManager();
156
- * manager.add('watch-value', disposeFn1);
157
- * manager.add('watch-errors', disposeFn2);
158
- *
159
- * console.log(manager.getKeys()); // ['watch-value', 'watch-errors']
160
- * ```
161
- */
162
- getKeys(): string[];
163
- /**
164
- * Отписывается от всех подписок (алиас для clear())
165
- *
166
- * Используется при dispose() узла формы для совместимости с ожидаемым API.
167
- *
168
- * @example
169
- * ```typescript
170
- * class FieldNode {
171
- * private subscriptions = new SubscriptionManager();
172
- *
173
- * dispose() {
174
- * this.subscriptions.dispose();
175
- * }
176
- * }
177
- * ```
178
- */
179
- dispose(): void;
180
- }
@@ -1,144 +0,0 @@
1
- import { Signal } from '@preact/signals-core';
2
- /**
3
- * Сигнал, который знает свой путь в модели (`'personalData.lastName'`).
4
- * Используется как «ручка поля»: и привязка value в схеме, и идентичность для testId/devtools.
5
- *
6
- * @group Model
7
- */
8
- export type PathAwareSignal<T> = Signal<T> & {
9
- /** Путь поля в модели (dot-нотация). На элементах массива включает индекс. */
10
- readonly __path: string;
11
- };
12
- /**
13
- * Спец-объекты, которые трактуются как листья (не разворачиваются в под-модель).
14
- * @internal
15
- */
16
- type Opaque = Date | File | Blob;
17
- /**
18
- * Фасад элемента массива при обходе (`at`/`map`/`forEach`): массив → {@link ModelArray},
19
- * Opaque (Date/File/Blob) и примитив → значение, объект → под-модель {@link FormModel}.
20
- * Зеркалит листовой/объектный сплит {@link ModelValue} (но объект → под-модель с API),
21
- * чтобы `files: File[]`/`dates: Date[]`/вложенные массивы не мис-типизировались как `FormModel`.
22
- * @internal
23
- */
24
- type ModelArrayItem<U> = NonNullable<U> extends ReadonlyArray<infer E> ? ModelArray<E> : NonNullable<U> extends Opaque ? U : NonNullable<U> extends object ? FormModel<NonNullable<U>> : U;
25
- /**
26
- * Значение поля в value-доступе модели:
27
- * - массив → {@link ModelArray}
28
- * - спец-объект (Date/File/Blob) → как есть
29
- * - объект → под-модель {@link FormModel} (value-доступ + `.$`-сигналы + API get/set/patch/…);
30
- * промоутится рантаймом (`makeFormModel`); сигналы идентичны `model.$.<path>`
31
- * - примитив → значение
32
- *
33
- * @group Model
34
- */
35
- export type ModelValue<V> = NonNullable<V> extends ReadonlyArray<infer U> ? ModelArray<U> : NonNullable<V> extends Opaque ? V : NonNullable<V> extends object ? FormModel<NonNullable<V>> : V;
36
- /**
37
- * Карта value-полей объекта (value-половина {@link FormModel}): поля доступны как обычные свойства
38
- * (чтение реактивно внутри `effect`/`computed`, запись — присваиванием). Вложенные объекты-поля
39
- * резолвятся в под-модели {@link FormModel} (см. {@link ModelValue}), массивы — в {@link ModelArray}.
40
- *
41
- * @group Model
42
- */
43
- export type ModelObject<T> = {
44
- [K in keyof T]: ModelValue<T[K]>;
45
- };
46
- /**
47
- * Реактивный массив модели. Мутации (`push`/`removeAt`/…) меняют длину реактивно;
48
- * `map`/`forEach`/`at` отдают под-модель элемента ({@link FormModel}) для объектных элементов.
49
- *
50
- * @group Model
51
- */
52
- export interface ModelArray<U> {
53
- /**
54
- * Путь массива в модели (dot-нотация). Предоставляется рантаймом (value-прокси) и требуется
55
- * рендер-слою для резолва узла массива (напр. `ArrayRenderNode` в `@reformer/renderer-react`).
56
- */
57
- readonly __path: string;
58
- /** Реактивная длина. */
59
- readonly length: number;
60
- /** Добавить элемент в конец (значение элемента целиком). */
61
- push(item: U): void;
62
- /** Вставить элемент по индексу. */
63
- insertAt(index: number, item: U): void;
64
- /** Удалить элемент по индексу. */
65
- removeAt(index: number): void;
66
- /** Переместить элемент. */
67
- move(from: number, to: number): void;
68
- /** Поменять местами два элемента. */
69
- swap(a: number, b: number): void;
70
- /** Очистить массив. */
71
- clear(): void;
72
- /** Элемент по индексу: объект → под-модель, массив → {@link ModelArray}, лист → значение. */
73
- at(index: number): NonNullable<U> extends object ? ModelArrayItem<U> : ModelArrayItem<U> | undefined;
74
- /** Map по элементам (объект → {@link FormModel}, Opaque/примитив → значение, массив → {@link ModelArray}). */
75
- map<R>(fn: (item: ModelArrayItem<U>, index: number) => R): R[];
76
- /** Итерация по элементам (см. {@link ModelArrayItem}). */
77
- forEach(fn: (item: ModelArrayItem<U>, index: number) => void): void;
78
- /** Снимок массива значений (без подписки). */
79
- toArray(): U[];
80
- /** Индексный value-доступ. */
81
- [index: number]: ModelValue<U>;
82
- }
83
- /**
84
- * Дерево сигналов (escape-hatch `model.$`): листья → {@link PathAwareSignal},
85
- * объекты → вложенное дерево, массивы → индексируемое дерево под-сигналов.
86
- *
87
- * @group Model
88
- */
89
- export type ModelSignals<T> = {
90
- [K in keyof T]: ModelSignalNode<T[K]>;
91
- };
92
- /**
93
- * Узел дерева сигналов `model.$`: массив → индексируемый узел под-сигналов, Opaque (Date/File/Blob)
94
- * и примитив → {@link PathAwareSignal}, объект → вложенное дерево {@link ModelSignals}. Для примитивных
95
- * и Opaque массивов элемент — сам сигнал листа (а не под-дерево), поэтому `model.$.tags[0]` — это
96
- * `PathAwareSignal<string>`, а не `ModelSignals<never>`.
97
- * @internal
98
- */
99
- type ModelSignalNode<V> = NonNullable<V> extends ReadonlyArray<infer U> ? {
100
- readonly length: number;
101
- readonly [index: number]: ModelSignalNode<U>;
102
- } : NonNullable<V> extends Opaque ? PathAwareSignal<V> : NonNullable<V> extends object ? ModelSignals<NonNullable<V>> : PathAwareSignal<V>;
103
- /**
104
- * API уровня модели (доступно на корне, под-моделях вложенных объектов-групп и элементов массива).
105
- *
106
- * ⚠️ Имена методов (`$`/`get`/`set`/`patch`/`isDirty`/`reset`/`signalAt`/`captureInitial`)
107
- * зарезервированы: одноимённое поле формы их затеняет (редкий краевой случай).
108
- *
109
- * @group Model
110
- */
111
- export interface ModelApi<T> {
112
- /** Escape-hatch к сигналам: `model.$.loanType` → `PathAwareSignal<LoanType>`. */
113
- readonly $: ModelSignals<T>;
114
- /** Снимок значений (без подписки) — для submit. */
115
- get(): T;
116
- /**
117
- * Полная установка значений: принимает объект целиком (все ключи `T`) и записывает их в модель.
118
- * Производными полями (цели `compute`) владеет compute — их значения из payload игнорируются.
119
- * Не меняет initial-снимок. Для частичного обновления (только переданные ключи) — {@link ModelApi.patch}.
120
- */
121
- set(value: T): void;
122
- /**
123
- * Частичное слияние значений (load/patch с сервера): обновляет только переданные ключи,
124
- * отсутствующие ключи НЕ трогаются. Не меняет initial-снимок.
125
- */
126
- patch(value: Partial<T>): void;
127
- /** Отличаются ли текущие значения от initial-снимка (value-diff). */
128
- isDirty(): boolean;
129
- /** Сбросить значения к initial-снимку. */
130
- reset(): void;
131
- /** Зафиксировать текущие значения как новый initial-снимок («точка отсчёта»). */
132
- captureInitial(): void;
133
- /** Резолв строкового пути в сигнал (для error-routing/мостов). */
134
- signalAt(path: string): PathAwareSignal<unknown> | undefined;
135
- }
136
- /**
137
- * FormModel — под-модель объекта `T`: value-доступ ({@link ModelObject}) + `.$`-сигналы + {@link ModelApi}
138
- * (get/set/patch/isDirty/reset/signalAt). Вложенные объекты-группы модели — тоже {@link FormModel}
139
- * (доступны как `model.<group>`), поэтому `model.<group>.$.<field>` эквивалентно `model.$.<group>.<field>`.
140
- *
141
- * @group Model
142
- */
143
- export type FormModel<T> = ModelObject<T> & ModelApi<T>;
144
- export {};
package/dist/state.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './state/index'
2
- export {}
package/dist/state.js DELETED
@@ -1,21 +0,0 @@
1
- import { c as s } from "./form-model-DYCzGGKF.js";
2
- import { c as o, a as t, r as c, b as i, d as m, e as d, f, s as l, t as n, w as u } from "./behaviors-value-C7dSEhCc.js";
3
- import { i as b, m as k, u as v } from "./derived-registry-CluZCQ7U.js";
4
- import { S as D } from "./subscription-manager-705bls97.js";
5
- export {
6
- D as SubscriptionManager,
7
- o as computeFrom,
8
- t as copyFrom,
9
- s as createModel,
10
- b as isDerived,
11
- k as markDerived,
12
- c as resetWhen,
13
- i as revalidateWhen,
14
- m as runOutsideEffect,
15
- d as safeCallback,
16
- f as safeDebouncedCallback,
17
- l as syncFields,
18
- n as transformValue,
19
- v as unmarkDerived,
20
- u as watchField
21
- };
@@ -1,171 +0,0 @@
1
- class t {
2
- /**
3
- * Хранилище подписок
4
- * Ключ: уникальный идентификатор подписки
5
- * Значение: функция отписки (dispose)
6
- */
7
- subscriptions = /* @__PURE__ */ new Map();
8
- /**
9
- * Добавляет подписку
10
- *
11
- * Если подписка с таким ключом уже существует, отписывается от неё
12
- * и заменяет новой. Это предотвращает утечки памяти при повторной
13
- * регистрации подписки с тем же ключом.
14
- *
15
- * @param key Уникальный ключ подписки
16
- * @param dispose Функция отписки (обычно возвращаемая из effect())
17
- * @returns Функция для отписки от этой конкретной подписки
18
- *
19
- * @example
20
- * ```typescript
21
- * const manager = new SubscriptionManager();
22
- *
23
- * // Добавление подписки
24
- * const unsubscribe = manager.add('mySubscription', () => {
25
- * console.log('Disposing subscription');
26
- * });
27
- *
28
- * // Отписка через возвращаемую функцию
29
- * unsubscribe();
30
- *
31
- * // Или через manager.remove()
32
- * manager.add('anotherSub', disposeFn);
33
- * manager.remove('anotherSub');
34
- * ```
35
- */
36
- add(s, i) {
37
- return this.subscriptions.has(s) && (process.env.NODE_ENV !== "production" && console.warn(`[SubscriptionManager] Subscription "${s}" already exists, replacing`), this.subscriptions.get(s)?.()), this.subscriptions.set(s, i), () => this.remove(s);
38
- }
39
- /**
40
- * Удаляет подписку по ключу
41
- *
42
- * Вызывает функцию отписки и удаляет подписку из хранилища.
43
- * Если подписка с таким ключом не найдена, ничего не делает.
44
- *
45
- * @param key Ключ подписки
46
- * @returns true, если подписка была удалена, false если не найдена
47
- *
48
- * @example
49
- * ```typescript
50
- * const manager = new SubscriptionManager();
51
- * manager.add('mySub', disposeFn);
52
- *
53
- * // Удаление подписки
54
- * const removed = manager.remove('mySub'); // true
55
- *
56
- * // Попытка удалить несуществующую подписку
57
- * const removed2 = manager.remove('nonExistent'); // false
58
- * ```
59
- */
60
- remove(s) {
61
- const i = this.subscriptions.get(s);
62
- return i ? (i(), this.subscriptions.delete(s), !0) : !1;
63
- }
64
- /**
65
- * Очищает все подписки
66
- *
67
- * Вызывает функции отписки для всех активных подписок
68
- * и очищает хранилище. Обычно используется при dispose узла формы.
69
- *
70
- * @example
71
- * ```typescript
72
- * class FieldNode {
73
- * private subscriptions = new SubscriptionManager();
74
- *
75
- * dispose() {
76
- * // Отписываемся от всех effect
77
- * this.subscriptions.clear();
78
- * }
79
- * }
80
- * ```
81
- */
82
- clear() {
83
- this.subscriptions.forEach((s) => {
84
- s();
85
- }), this.subscriptions.clear();
86
- }
87
- /**
88
- * Возвращает количество активных подписок
89
- *
90
- * Полезно для отладки утечек памяти. Если количество подписок
91
- * растет без ограничений, это может указывать на то, что
92
- * компоненты не отписываются должным образом.
93
- *
94
- * @returns Количество активных подписок
95
- *
96
- * @example
97
- * ```typescript
98
- * const manager = new SubscriptionManager();
99
- * console.log(manager.size()); // 0
100
- *
101
- * manager.add('sub1', disposeFn1);
102
- * manager.add('sub2', disposeFn2);
103
- * console.log(manager.size()); // 2
104
- *
105
- * manager.clear();
106
- * console.log(manager.size()); // 0
107
- * ```
108
- */
109
- size() {
110
- return this.subscriptions.size;
111
- }
112
- /**
113
- * Проверяет, есть ли подписка с данным ключом
114
- *
115
- * @param key Ключ подписки
116
- * @returns true, если подписка существует
117
- *
118
- * @example
119
- * ```typescript
120
- * const manager = new SubscriptionManager();
121
- * manager.add('mySub', disposeFn);
122
- *
123
- * console.log(manager.has('mySub')); // true
124
- * console.log(manager.has('nonExistent')); // false
125
- * ```
126
- */
127
- has(s) {
128
- return this.subscriptions.has(s);
129
- }
130
- /**
131
- * Возвращает список всех ключей активных подписок
132
- *
133
- * Полезно для отладки: можно увидеть, какие подписки активны.
134
- *
135
- * @returns Массив ключей всех активных подписок
136
- *
137
- * @example
138
- * ```typescript
139
- * const manager = new SubscriptionManager();
140
- * manager.add('watch-value', disposeFn1);
141
- * manager.add('watch-errors', disposeFn2);
142
- *
143
- * console.log(manager.getKeys()); // ['watch-value', 'watch-errors']
144
- * ```
145
- */
146
- getKeys() {
147
- return Array.from(this.subscriptions.keys());
148
- }
149
- /**
150
- * Отписывается от всех подписок (алиас для clear())
151
- *
152
- * Используется при dispose() узла формы для совместимости с ожидаемым API.
153
- *
154
- * @example
155
- * ```typescript
156
- * class FieldNode {
157
- * private subscriptions = new SubscriptionManager();
158
- *
159
- * dispose() {
160
- * this.subscriptions.dispose();
161
- * }
162
- * }
163
- * ```
164
- */
165
- dispose() {
166
- this.clear();
167
- }
168
- }
169
- export {
170
- t as S
171
- };