@reformer/core 11.0.0-beta.7 → 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 (226) hide show
  1. package/README.md +90 -68
  2. package/dist/behaviors-value-HA_Q03hc.js +108 -0
  3. package/dist/behaviors.js +382 -217
  4. package/dist/create-model-BvcbNPgL.js +30 -0
  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 +42 -8
  9. package/dist/form/behaviors/context.d.ts +37 -4
  10. package/dist/form/behaviors/index.d.ts +6 -4
  11. package/dist/form/behaviors/internals.d.ts +9 -3
  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 +78 -0
  15. package/dist/form/behaviors/types.d.ts +25 -5
  16. package/dist/form/create-form.d.ts +57 -70
  17. package/dist/form/flow/flow.d.ts +87 -0
  18. package/dist/form/form-bundle.d.ts +153 -0
  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 +20 -20
  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 +153 -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 +19 -92
  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 +23 -27
  47. package/dist/form/validation/context.d.ts +46 -6
  48. package/dist/form/validation/index.d.ts +9 -8
  49. package/dist/form/validation/operators.d.ts +71 -17
  50. package/dist/form/validation/run.d.ts +93 -18
  51. package/dist/form/validation/strategy.d.ts +41 -13
  52. package/dist/form/validation/types.d.ts +74 -19
  53. package/dist/form/validators/date-utils.d.ts +13 -1
  54. package/dist/form/validators/email.d.ts +8 -7
  55. package/dist/form/validators/file-type.d.ts +8 -7
  56. package/dist/form/validators/file-utils.d.ts +2 -1
  57. package/dist/form/validators/future-date.d.ts +8 -7
  58. package/dist/form/validators/index.d.ts +1 -1
  59. package/dist/form/validators/integer.d.ts +8 -7
  60. package/dist/form/validators/is-date.d.ts +11 -9
  61. package/dist/form/validators/is-number.d.ts +11 -9
  62. package/dist/form/validators/max-age.d.ts +13 -9
  63. package/dist/form/validators/max-date.d.ts +8 -7
  64. package/dist/form/validators/max-file-size.d.ts +8 -7
  65. package/dist/form/validators/max-files.d.ts +8 -7
  66. package/dist/form/validators/max-length.d.ts +14 -7
  67. package/dist/form/validators/max-total-file-size.d.ts +8 -7
  68. package/dist/form/validators/max.d.ts +10 -8
  69. package/dist/form/validators/min-age.d.ts +12 -9
  70. package/dist/form/validators/min-date.d.ts +8 -7
  71. package/dist/form/validators/min-file-size.d.ts +8 -7
  72. package/dist/form/validators/min-files.d.ts +11 -9
  73. package/dist/form/validators/min-length.d.ts +14 -7
  74. package/dist/form/validators/min.d.ts +10 -8
  75. package/dist/form/validators/multiple-of.d.ts +10 -8
  76. package/dist/form/validators/non-negative.d.ts +8 -7
  77. package/dist/form/validators/non-zero.d.ts +8 -7
  78. package/dist/form/validators/past-date.d.ts +8 -7
  79. package/dist/form/validators/pattern.d.ts +9 -8
  80. package/dist/form/validators/phone.d.ts +8 -7
  81. package/dist/form/validators/required.d.ts +11 -9
  82. package/dist/form/validators/url.d.ts +20 -13
  83. package/dist/form/validators/validation-issue.d.ts +8 -0
  84. package/dist/i18n/descriptor.d.ts +1 -1
  85. package/dist/i18n/en.json.d.ts +5 -1
  86. package/dist/i18n/locale-store.d.ts +7 -0
  87. package/dist/i18n/message-format.d.ts +24 -4
  88. package/dist/i18n/ru.json.d.ts +5 -1
  89. package/dist/i18n/translator.d.ts +11 -0
  90. package/dist/i18n/validation-message.d.ts +42 -7
  91. package/dist/i18n.d.ts +7 -12
  92. package/dist/i18n.js +66 -283
  93. package/dist/index.d.ts +16 -7
  94. package/dist/index.js +958 -2798
  95. package/dist/loader-BWkigpVe.js +52 -0
  96. package/dist/locale/en.js +1 -1
  97. package/dist/locale/en.json +4 -1
  98. package/dist/locale/ru.js +4 -1
  99. package/dist/locale/ru.json +4 -1
  100. package/dist/locale-CG54AU2Q.js +219 -0
  101. package/dist/locale.js +1 -1
  102. package/dist/model/behaviors-value.d.ts +24 -6
  103. package/dist/model/create-model.d.ts +2 -2
  104. package/dist/model/derived-registry.d.ts +1 -1
  105. package/dist/model/index.d.ts +16 -5
  106. package/dist/model/model-nodes.d.ts +138 -8
  107. package/dist/model/model-signals-proxy.d.ts +11 -5
  108. package/dist/model/model-value-proxy.d.ts +84 -3
  109. package/dist/model/safe-effect.d.ts +33 -1
  110. package/dist/model/types.d.ts +70 -17
  111. package/dist/model.js +21 -17
  112. package/dist/node-kind-C-r6ZMdo.js +15 -0
  113. package/dist/platforms/react/field-binding/field-adapter.d.ts +1 -1
  114. package/dist/platforms/react/field-binding/field-handle.d.ts +5 -2
  115. package/dist/platforms/react/form-bundle-context.d.ts +27 -0
  116. package/dist/platforms/react/hooks/types.d.ts +57 -38
  117. package/dist/platforms/react/hooks/use-form-bundle.d.ts +19 -4
  118. package/dist/platforms/react/hooks/use-form-flow.d.ts +40 -0
  119. package/dist/platforms/react/hooks/use-form-validation.d.ts +12 -6
  120. package/dist/platforms/react/hooks/useArrayLength.d.ts +6 -6
  121. package/dist/platforms/react/hooks/useFormControl.d.ts +7 -9
  122. package/dist/platforms/react/hooks/useFormControlValue.d.ts +18 -19
  123. package/dist/platforms/react/hooks/useSignalSubscription.d.ts +9 -1
  124. package/dist/platforms/react/i18n/context.d.ts +6 -1
  125. package/dist/platforms/react/i18n/hooks.d.ts +16 -10
  126. package/dist/platforms/react/i18n/provider.d.ts +9 -2
  127. package/dist/platforms/react/index.d.ts +7 -4
  128. package/dist/react.d.ts +22 -0
  129. package/dist/react.js +505 -0
  130. package/dist/runtime-token.d.ts +1 -2
  131. package/dist/safe-effect-BbtX3KuN.js +643 -0
  132. package/dist/schema-controller-CpiO2JoK.js +143 -0
  133. package/dist/signals.d.ts +15 -9
  134. package/dist/signals.js +11 -6
  135. package/dist/strategy-CoFSemuP.js +375 -0
  136. package/dist/type-guards-D-N_5Ddh.js +19 -0
  137. package/dist/validation-issue-B9mjI8jz.js +7 -0
  138. package/dist/validation-message-Ced9MGxs.js +194 -0
  139. package/dist/validation.js +9 -8
  140. package/dist/validators/email.js +5 -5
  141. package/dist/validators/future-date.js +8 -8
  142. package/dist/validators/integer.js +3 -3
  143. package/dist/validators/is-date.js +4 -4
  144. package/dist/validators/is-number.js +4 -4
  145. package/dist/validators/max-age.js +8 -9
  146. package/dist/validators/max-date.js +8 -8
  147. package/dist/validators/max-length.js +7 -7
  148. package/dist/validators/max.js +4 -4
  149. package/dist/validators/min-age.js +10 -8
  150. package/dist/validators/min-date.js +3 -3
  151. package/dist/validators/min-length.js +5 -5
  152. package/dist/validators/min.js +4 -4
  153. package/dist/validators/multiple-of.js +11 -7
  154. package/dist/validators/non-negative.js +3 -3
  155. package/dist/validators/non-zero.js +3 -3
  156. package/dist/validators/past-date.js +8 -8
  157. package/dist/validators/pattern.js +5 -5
  158. package/dist/validators/phone.js +11 -9
  159. package/dist/validators/required.js +2 -2
  160. package/dist/validators/url.js +48 -12
  161. package/dist/validators.js +17 -17
  162. package/docs/llms/01-api-reference.md +60 -34
  163. package/docs/llms/02-quick-start.md +111 -80
  164. package/docs/llms/03-api-signatures.md +368 -153
  165. package/docs/llms/04-common-patterns.md +58 -56
  166. package/docs/llms/05-common-mistakes.md +69 -44
  167. package/docs/llms/06-troubleshooting.md +14 -9
  168. package/docs/llms/07-complete-import.md +74 -43
  169. package/docs/llms/08-form-types.md +11 -4
  170. package/docs/llms/09-formschema.md +131 -83
  171. package/docs/llms/10-arrays.md +119 -69
  172. package/docs/llms/11-async-watchfield.md +2 -2
  173. package/docs/llms/13-multi-step.md +134 -63
  174. package/docs/llms/14-extended-mistakes.md +20 -17
  175. package/docs/llms/15-project-structure.md +221 -74
  176. package/docs/llms/16-ui-components.md +55 -42
  177. package/docs/llms/17-nonexistent-api.md +199 -32
  178. package/docs/llms/18-conditional-fields.md +66 -32
  179. package/docs/llms/19-reading-values.md +15 -3
  180. package/docs/llms/20-compute-vs-watch.md +16 -10
  181. package/docs/llms/21-array-operations.md +76 -26
  182. package/docs/llms/22-cycle-detection.md +1 -1
  183. package/docs/llms/23-copy-from.md +2 -2
  184. package/docs/llms/24-sync-fields.md +6 -5
  185. package/docs/llms/25-reset-when.md +14 -7
  186. package/docs/llms/26-transform-value.md +4 -4
  187. package/docs/llms/27-revalidate-when.md +16 -15
  188. package/docs/llms/28-submit-and-reset.md +276 -128
  189. package/docs/llms/29-async-preload.md +40 -30
  190. package/docs/llms/30-type-safety-recipes.md +105 -51
  191. package/docs/llms/31-async-validator-debounce.md +96 -53
  192. package/docs/llms/33-validation-strategy.md +178 -66
  193. package/docs/llms/34-i18n.md +69 -43
  194. package/docs/llms/35-unified-contract.md +307 -0
  195. package/docs/llms/36-issue-messages.md +284 -0
  196. package/docs/llms/37-compiled-schema.md +332 -0
  197. package/docs/llms/38-form-flow.md +397 -0
  198. package/llms-index.json +1 -1
  199. package/llms.txt +6968 -3278
  200. package/package.json +23 -4
  201. package/dist/behaviors-value-C7dSEhCc.js +0 -134
  202. package/dist/create-model-B8U-COv-.js +0 -103
  203. package/dist/date-utils-dTT_x_Be.js +0 -31
  204. package/dist/form/create-core-form.d.ts +0 -70
  205. package/dist/form/factories/index.d.ts +0 -6
  206. package/dist/form/factories/node-factory.d.ts +0 -189
  207. package/dist/form/form-submitter.d.ts +0 -121
  208. package/dist/form/nodes/array-node.d.ts +0 -276
  209. package/dist/form/nodes/field-node.d.ts +0 -297
  210. package/dist/form/nodes/form-node.d.ts +0 -326
  211. package/dist/form/nodes/group-node.d.ts +0 -284
  212. package/dist/form/nodes/model-array-node.d.ts +0 -121
  213. package/dist/form/nodes/subscription-manager.d.ts +0 -180
  214. package/dist/form/status-machine.d.ts +0 -115
  215. package/dist/form/types/deep-schema.d.ts +0 -107
  216. package/dist/form/types/form-proxy.d.ts +0 -141
  217. package/dist/form/unique-id.d.ts +0 -45
  218. package/dist/form/validation/config.d.ts +0 -73
  219. package/dist/form/validation/error-handler.d.ts +0 -166
  220. package/dist/form/validators/validation-error.d.ts +0 -8
  221. package/dist/index-BrNkQj1y.js +0 -105
  222. package/dist/loader-Dv_Hl7JC.js +0 -216
  223. package/dist/model-signals-proxy-2vqS243J.js +0 -250
  224. package/dist/node-DGEFMTQu.js +0 -18
  225. package/dist/strategy-BXS_gBfz.js +0 -170
  226. package/dist/validation-error-B-U3RsV0.js +0 -11
package/dist/behaviors.js CHANGED
@@ -1,302 +1,467 @@
1
- import { effect as j } from "@preact/signals-core";
2
- import { d as k, a as A, w as $, t as C, r as O, s as D, b as G } from "./behaviors-value-C7dSEhCc.js";
3
- import { d as T, i as I, m as x, u as P } from "./model-signals-proxy-2vqS243J.js";
4
- import { e as R } from "./node-DGEFMTQu.js";
5
- let h = null;
6
- function B(e) {
7
- if (!h)
1
+ import { effect as N, untracked as F } from "@preact/signals-core";
2
+ import { r as H, h as j, p as Q, i as P, c as V, u as I, o as b, m as O, n as A } from "./safe-effect-BbtX3KuN.js";
3
+ import { c as X } from "./schema-controller-CpiO2JoK.js";
4
+ import { a as Y, w as M, t as Z, r as ee, s as ne, b as oe } from "./behaviors-value-HA_Q03hc.js";
5
+ import { g as v } from "./signal-node-registry-tiwel-TV.js";
6
+ import { r as re } from "./node-kind-C-r6ZMdo.js";
7
+ let m = null, g = null;
8
+ function C(e, n) {
9
+ const o = g;
10
+ g = e;
11
+ try {
12
+ return n();
13
+ } finally {
14
+ g = o;
15
+ }
16
+ }
17
+ function D(e) {
18
+ for (const n of e.cleanups) n();
19
+ for (const n of e.deferred) n();
20
+ e.deferred.clear(), e.rollback?.();
21
+ }
22
+ function w(e) {
23
+ if (!m)
8
24
  throw new Error(
9
25
  `[@reformer/core/behaviors] "${e}" вызван вне defineFormBehavior(...) — операторы поведения можно вызывать только внутри схемы.`
10
26
  );
11
- return h;
27
+ return m;
28
+ }
29
+ function u(e) {
30
+ w("onDispose").cleanups.push(e);
31
+ }
32
+ function p(e) {
33
+ w(e);
34
+ }
35
+ function k(e) {
36
+ m?.cleanups.push(e);
37
+ }
38
+ function ve() {
39
+ const e = w("getScope");
40
+ return R(e);
12
41
  }
13
- function a(e) {
14
- B("onDispose").cleanups.push(e);
42
+ function T(e = "getController") {
43
+ return w(e).controller;
15
44
  }
16
- function p() {
17
- const e = B("getScope");
18
- return { model: e.model, form: e.form };
45
+ function G(e = "getFlow") {
46
+ return w(e).flow;
19
47
  }
20
- function q(e) {
48
+ function te(e) {
49
+ if (e.schema) return e.schema;
50
+ const n = e.controller.scopeOf(e.model), o = n.__overrideMaps, r = /* @__PURE__ */ new Map(), c = (t) => {
51
+ let s = r.get(t);
52
+ return s || (s = { props: /* @__PURE__ */ new Map() }, r.set(t, s)), s;
53
+ };
54
+ return e.rollback = () => {
55
+ for (const [t, s] of r) {
56
+ const i = n.node(t);
57
+ s.hidden !== void 0 && o.hiddenOverrides.get(t) === s.hidden && i.resetHidden();
58
+ const f = o.propsOverrides.get(t);
59
+ if (f == null || s.props.size === 0) continue;
60
+ const a = Object.entries(f).filter(
61
+ ([h, l]) => !(s.props.has(h) && Object.is(s.props.get(h), l))
62
+ );
63
+ a.length !== Object.keys(f).length && (i.resetProps(), a.length > 0 && i.patchProps(Object.fromEntries(a)));
64
+ }
65
+ r.clear();
66
+ }, e.schema = {
67
+ ...n,
68
+ node(t) {
69
+ const s = n.node(t), i = {
70
+ ...s,
71
+ setHidden(f) {
72
+ return s.setHidden(f), c(t).hidden = f, i;
73
+ },
74
+ patchProps(f) {
75
+ s.patchProps(f);
76
+ const a = c(t);
77
+ for (const [h, l] of Object.entries(f)) a.props.set(h, l);
78
+ return i;
79
+ },
80
+ resetHidden() {
81
+ s.resetHidden();
82
+ const f = r.get(t);
83
+ return f && (f.hidden = void 0), i;
84
+ },
85
+ resetProps() {
86
+ return s.resetProps(), r.get(t)?.props.clear(), i;
87
+ }
88
+ };
89
+ return i;
90
+ }
91
+ }, e.schema;
92
+ }
93
+ const R = (e) => ({
94
+ model: e.model,
95
+ form: e.form,
96
+ schema: te(e),
97
+ flow: e.flow
98
+ });
99
+ function ce(e) {
21
100
  return {
22
- __run(t, n) {
23
- const o = { cleanups: [], model: t, form: n }, r = h;
24
- h = o;
101
+ __run(n, o, r = X(), c) {
102
+ const t = {
103
+ cleanups: [],
104
+ deferred: /* @__PURE__ */ new Set(),
105
+ model: n,
106
+ form: o,
107
+ controller: r,
108
+ flow: c
109
+ }, s = m;
110
+ m = t;
25
111
  try {
26
- e({ model: t, form: n });
112
+ C(t.deferred, () => e(R(t)));
113
+ } catch (i) {
114
+ throw D(t), i;
27
115
  } finally {
28
- h = r;
116
+ m = s;
29
117
  }
30
- return () => {
31
- for (const c of o.cleanups) c();
32
- };
118
+ return () => D(t);
33
119
  }
34
120
  };
35
121
  }
36
- function m(e) {
37
- a(j(e));
122
+ function y(e) {
123
+ const n = w("effect"), o = n.deferred;
124
+ n.cleanups.push(N(() => C(o, e)));
125
+ }
126
+ function B(e) {
127
+ const n = g ?? m?.deferred;
128
+ if (!n) {
129
+ H(e);
130
+ return;
131
+ }
132
+ const o = H(() => {
133
+ n.delete(o), C(n, e);
134
+ });
135
+ n.add(o);
38
136
  }
39
- function g(e) {
40
- k(e);
137
+ function L(e, n) {
138
+ const o = j();
139
+ return {
140
+ schedule(r) {
141
+ o.cancelAll(), o.schedule(() => {
142
+ F(e) ? r.enable() : (r.disable(), n?.resetOnDisable && re(r).resetToCreation());
143
+ });
144
+ },
145
+ cancel: () => o.cancelAll()
146
+ };
41
147
  }
42
- const _ = (e) => typeof e == "object" && e !== null && typeof e.peek == "function" && !I(e), b = (e) => _(e) || T(e), E = (e) => Array.isArray(e) ? e : [e];
43
- function S(e) {
44
- const t = {};
45
- for (const n of Object.keys(e)) {
46
- const o = e[n];
47
- t[n] = b(o) ? o.value : S(o);
148
+ function se(e, n, o) {
149
+ const r = L(n, o), c = N(() => {
150
+ n();
151
+ const t = v(e);
152
+ t && r.schedule(t);
153
+ });
154
+ return () => {
155
+ c(), r.cancel();
156
+ };
157
+ }
158
+ const z = (e) => typeof e == "object" && e !== null && typeof e.peek == "function" && !P(e), E = (e) => z(e) || Q(e), U = (e) => Array.isArray(e) ? e : [e];
159
+ function W(e) {
160
+ const n = {};
161
+ for (const o of Object.keys(e)) {
162
+ const r = e[o];
163
+ n[o] = E(r) ? r.value : W(r);
48
164
  }
49
- return t;
165
+ return n;
50
166
  }
51
- function V(e, t) {
52
- for (const n of Object.keys(e)) {
53
- const o = e[n];
54
- b(o) ? o.value = t?.[n] : V(o, t?.[n] ?? {});
167
+ function q(e, n, o, r = "") {
168
+ if (n == null || typeof n != "object") {
169
+ o?.push(r === "" ? "(вся группа)" : r);
170
+ return;
171
+ }
172
+ for (const c of Object.keys(e)) {
173
+ const t = r === "" ? c : `${r}.${c}`;
174
+ if (!(c in n)) {
175
+ o?.push(t);
176
+ continue;
177
+ }
178
+ const s = e[c];
179
+ E(s) ? s.value = n[c] : q(s, n[c], o, t);
55
180
  }
56
181
  }
57
- function W(e) {
58
- return (t) => {
182
+ function x(e) {
183
+ return (n) => {
59
184
  try {
60
- t();
61
- } catch (n) {
62
- if (n instanceof Error && /cycle detected/i.test(n.message)) {
63
- const o = e.__path ?? "?";
185
+ n();
186
+ } catch (o) {
187
+ if (o instanceof Error && /cycle detected/i.test(o.message)) {
188
+ const r = e.__path ?? "?";
64
189
  throw new Error(
65
- `[@reformer/core/behaviors] compute("${o}"): расходящийся цикл пересчёта — взаимные compute/computeFrom без стабилизации. Проверьте зависимости или добавьте стабилизирующее условие (when) / разорвите цикл через peek.`
190
+ `[@reformer/core/behaviors] compute("${r}"): расходящийся цикл пересчёта — взаимные compute/computeFrom без стабилизации. Проверьте зависимости или добавьте стабилизирующее условие (when) / разорвите цикл через peek.`
66
191
  );
67
192
  }
68
- throw n;
193
+ throw o;
69
194
  }
70
195
  };
71
196
  }
72
- function F(e, t) {
73
- return t.split(".").reduce((n, o) => n?.[o], e);
74
- }
75
- function z(e) {
76
- if (!e) return;
77
- const { form: t } = p();
78
- return t.getFieldByPath(e);
79
- }
80
- function Z(e, t, n) {
81
- x(e), a(() => P(e));
82
- const o = W(e);
83
- m(() => {
84
- if (n?.when && !n.when()) return;
85
- const r = t();
86
- e.peek() !== r && o(() => {
87
- e.value = r;
197
+ function ke(e, n, o) {
198
+ p("compute"), V(e), u(() => I(e));
199
+ const r = x(e);
200
+ y(() => {
201
+ if (o?.when && !o.when()) return;
202
+ const c = n();
203
+ e.peek() !== c && r(() => {
204
+ e.value = c;
88
205
  });
89
206
  });
90
207
  }
91
- function ee(e, t, n, o) {
92
- x(t), a(() => P(t));
93
- const r = W(t);
94
- m(() => {
95
- const c = e.map((s) => s.value);
96
- if (o?.when && !o.when(...c)) return;
97
- const i = n(...c);
98
- t.peek() !== i && r(() => {
99
- t.value = i;
208
+ function $e(e, n, o, r) {
209
+ p("computeFrom"), V(n), u(() => I(n));
210
+ const c = x(n);
211
+ y(() => {
212
+ const t = e.map((i) => i.value);
213
+ if (r?.when && !r.when(...t)) return;
214
+ const s = o(...t);
215
+ n.peek() !== s && c(() => {
216
+ n.value = s;
100
217
  });
101
218
  });
102
219
  }
103
- function ne(e, t, n) {
104
- if (b(e) && b(t)) {
105
- a(A(e, t, n));
220
+ function ge(e, n, o) {
221
+ if (p("copyFrom"), E(e) && E(n)) {
222
+ u(Y(e, n, o));
106
223
  return;
107
224
  }
108
- const o = e, r = t;
109
- m(() => {
110
- const c = S(o);
111
- n?.when && !n.when() || g(() => V(r, c));
112
- });
225
+ const r = e, c = n, t = o?.when, s = o?.transform, i = j();
226
+ let f = !1;
227
+ y(() => {
228
+ W(r), i.cancelAll(), !(t && !t()) && i.schedule(() => {
229
+ if (t && !F(t)) return;
230
+ const a = F(() => W(r)), h = s ? s(a) : a, l = [];
231
+ q(c, h, l), l.length > 0 && !f && process.env.NODE_ENV !== "production" && (f = !0, console.warn(
232
+ `[@reformer/core/behaviors] copyFrom(…, "${c.__path ?? "?"}"): в значении нет полей цели ${l.map((d) => `«${d}»`).join(", ")} — они остались прежними. Для групп разной формы соберите значение цели целиком в \`transform\`.`
233
+ ));
234
+ });
235
+ }), u(() => i.cancelAll());
113
236
  }
114
- function H(e, t, n) {
115
- let o;
116
- const r = (c) => {
117
- o?.abort(), o = new AbortController();
118
- const { signal: i } = o;
119
- k(() => t(c, { signal: i }));
237
+ function ie(e, n, o) {
238
+ p("onChange");
239
+ let r;
240
+ const c = j(), t = (s) => {
241
+ r?.abort(), r = new AbortController();
242
+ const { signal: i } = r;
243
+ c.schedule(() => n(s, { signal: i }));
120
244
  };
121
- if (!n?.debounce)
122
- a($(e, r, { immediate: n?.immediate }));
245
+ if (!o?.debounce)
246
+ u(M(e, t, { immediate: o?.immediate }));
123
247
  else {
124
- let c;
125
- const i = $(
248
+ let s;
249
+ const i = M(
126
250
  e,
127
- (s) => {
128
- c && clearTimeout(c), c = setTimeout(() => r(s), n.debounce);
251
+ (f) => {
252
+ r?.abort(), s && clearTimeout(s), s = setTimeout(() => t(f), o.debounce);
129
253
  },
130
- { immediate: n?.immediate }
254
+ { immediate: o?.immediate }
131
255
  );
132
- a(() => {
133
- c && clearTimeout(c), i();
256
+ u(() => {
257
+ s && clearTimeout(s), i();
134
258
  });
135
259
  }
136
- a(() => o?.abort());
260
+ u(() => {
261
+ c.cancelAll(), r?.abort();
262
+ });
137
263
  }
138
- function L(e, t, n) {
139
- for (const o of E(e))
140
- _(o) ? a(R(o, t, n)) : N(o, t, n);
264
+ function Ee(e, n, o) {
265
+ p("enableWhen"), J("enableWhen", e, n, o);
141
266
  }
142
- function te(e, t, n) {
143
- L(e, () => !t(), n);
267
+ function Oe(e, n, o) {
268
+ p("disableWhen"), J("disableWhen", e, () => !n(), o);
144
269
  }
145
- function N(e, t, n) {
146
- const o = z(e.__path);
147
- o && m(() => {
148
- const r = t();
149
- g(() => {
150
- r ? o.enable() : (o.disable(), n?.resetOnDisable && o.reset());
151
- });
152
- });
270
+ function fe(e, n) {
271
+ if (process.env.NODE_ENV === "production" || v(n)) return;
272
+ const o = n.__path ?? "?";
273
+ console.warn(
274
+ `[@reformer/core/behaviors] ${e}("${o}"): у поля нет ноды формы — правило ничего не сделает. Поле не описано в схеме формы, либо ручка взята из другой модели.`
275
+ );
153
276
  }
154
- function oe(e, t) {
155
- a(C(e, t));
277
+ function J(e, n, o, r) {
278
+ for (const c of U(n))
279
+ fe(e, c), z(c) ? u(se(c, o, r)) : le(c, o, r);
156
280
  }
157
- function re(e, t, n) {
158
- a(O(e, t, n));
281
+ function le(e, n, o) {
282
+ const r = v(e);
283
+ if (!r) return;
284
+ const c = L(n, o);
285
+ y(() => {
286
+ n(), c.schedule(r);
287
+ }), u(c.cancel);
159
288
  }
160
- function ce(e, t, n) {
161
- a(D(e, t, n));
289
+ function _e(e, n) {
290
+ p("transformValue"), u(Z(e, n));
162
291
  }
163
- function ie(e, t) {
164
- a(G(e, t));
292
+ function Fe(e, n, ...o) {
293
+ p("resetWhen"), u(ee(e, n, ...o));
165
294
  }
166
- function M(e) {
167
- return new Proxy(
168
- {},
169
- {
170
- get: (t, n) => {
171
- if (n === "$") return e;
172
- if (typeof n != "string") return;
173
- const o = e[n];
174
- if (o != null)
175
- return _(o) ? o.value : M(o);
176
- }
177
- }
178
- );
295
+ function We(e, n, o) {
296
+ p("syncFields"), u(ne(e, n, o));
297
+ }
298
+ function Se(e, n) {
299
+ p("revalidateWhen"), u(oe(e, n));
179
300
  }
180
- function J(e) {
301
+ const K = (e) => e.__path ?? "?";
302
+ function ae(e) {
303
+ return e == null ? String(e) : b(e) ? "массив" : A(e) ? "группа" : typeof e == "object" && typeof e.peek == "function" && !P(e) ? "поле-лист" : "не ручка модели";
304
+ }
305
+ function _(e, n, o) {
306
+ if (process.env.NODE_ENV === "production") return;
307
+ const c = (n !== null && typeof n == "object" ? b(n) ?? A(n) ?? n : void 0)?.__path, t = typeof c == "string" ? `("${c}")` : "", s = o === "массив" ? "нужен массив. Передайте ручку `model.$.<массив>` или фасад `model.<массив>`; группу подключают через `apply`." : "нужна группа. Передайте ручку `model.$.<группа>` или фасад `model.<группа>`; массив подключают через `applyEach`. Группа с начальным значением `null` под-модели не имеет — задайте ей объект.";
308
+ throw new Error(`[@reformer/core/behaviors] ${e}${t}: цель — ${ae(n)}, а ${s}`);
309
+ }
310
+ function ue(e) {
181
311
  return new Proxy(
182
312
  {},
183
313
  {
184
- get(t, n) {
185
- if (!(typeof n == "symbol" || n === "then"))
314
+ get(n, o) {
315
+ if (!(typeof o == "symbol" || o === "then"))
186
316
  throw new Error(
187
317
  `[@reformer/core/behaviors] applyEach: форма строки массива "${e}" недоступна (form.${String(
188
- n
189
- )}) — массив не материализован в схеме формы. Per-row node-операции (enableWhen/updateComponentProps/reset) требуют узла { array, item } в схеме; value-операции (row.$.*: compute/copyFrom/transformValue) работают и без материализации.`
318
+ o
319
+ )}) — массив не материализован в схеме формы. Per-row node-операции (enableWhen/updateComponentProps/reset) требуют узла { model, item } в схеме; value-операции (row.$.*: compute/copyFrom/transformValue) работают и без материализации.`
190
320
  );
191
321
  }
192
322
  }
193
323
  );
194
324
  }
195
- function K(e, t) {
196
- const { model: n, form: o } = p(), r = e.__path;
197
- if (!r) return;
198
- const c = F(n, r);
199
- if (!c) return;
200
- const i = o.getFieldByPath(
201
- r
202
- ), s = i?.length, f = /* @__PURE__ */ new Map();
203
- m(() => {
204
- const d = s ? s.value : c.length, y = /* @__PURE__ */ new Set();
205
- for (let u = 0; u < d; u++) {
206
- const l = c.at(u);
207
- if (l != null && (y.add(l), !f.has(l))) {
208
- const w = i?.at?.(u) ?? J(r);
209
- f.set(l, t.__run(l, w));
325
+ function de(e, n) {
326
+ const o = T("applyEach"), r = G("applyEach"), c = b(e);
327
+ if (!c) return _("applyEach", e, "массив");
328
+ const t = O(c), s = v(c), i = typeof s?.at == "function" ? s : void 0, f = /* @__PURE__ */ new Map();
329
+ y(() => {
330
+ const a = i ? i.length ?? 0 : t.length, h = /* @__PURE__ */ new Set();
331
+ for (let l = 0; l < a; l++) {
332
+ const d = t.at(l);
333
+ if (d != null && (h.add(d), !f.has(d))) {
334
+ const $ = i?.at?.(l) ?? ue(K(c));
335
+ f.set(d, n.__run(d, $, o, r));
210
336
  }
211
337
  }
212
- for (const [u, l] of f)
213
- y.has(u) || (l(), f.delete(u));
214
- }), a(() => {
215
- for (const d of f.values()) d();
338
+ for (const [l, d] of f)
339
+ h.has(l) || (d(), f.delete(l));
340
+ }), u(() => {
341
+ for (const a of f.values()) a();
216
342
  f.clear();
217
343
  });
218
344
  }
219
- function v(e) {
345
+ function S(e) {
220
346
  if (e == null || typeof e != "object") return;
221
- const t = e;
222
- if (typeof t.at == "function" && typeof t.length == "number") {
223
- const n = t.length;
224
- for (let o = 0; o < n; o++) v(t.at(o));
347
+ const n = e;
348
+ if (typeof n.at == "function" && typeof n.length == "number") {
349
+ const o = n.length;
350
+ for (let r = 0; r < o; r++) S(n.at(r));
225
351
  return;
226
352
  }
227
- for (const n of Object.keys(e)) v(e[n]);
228
- }
229
- function se(e, t) {
230
- const { model: n } = p(), o = e.__path;
231
- if (!o) return;
232
- const r = F(n, o);
233
- r && K(
234
- e,
235
- q(({ model: c }) => {
236
- H(t(c), (i) => {
237
- if (i)
238
- for (let s = 0; s < r.length; s++) {
239
- const f = r.at(s);
240
- if (f && f !== c) {
241
- const d = t(f);
242
- d.peek() && (d.value = !1);
353
+ for (const o of Object.keys(e)) S(e[o]);
354
+ }
355
+ function je(e, n) {
356
+ p("exclusiveFlag");
357
+ const o = b(e);
358
+ if (!o) return _("exclusiveFlag", e, "массив");
359
+ const r = O(o), c = /* @__PURE__ */ new Set();
360
+ de(
361
+ o,
362
+ ce(({ model: t }) => {
363
+ n(t).peek() && (c.add(t), u(() => c.delete(t)), B(() => {
364
+ c.delete(t);
365
+ const s = n(t);
366
+ if (s.peek())
367
+ for (let i = 0; i < r.length; i++) {
368
+ const f = r.at(i);
369
+ if (f && f !== t && !c.has(f) && n(f).peek()) {
370
+ s.value = !1;
371
+ return;
372
+ }
373
+ }
374
+ })), ie(n(t), (s) => {
375
+ if (!(!s || !n(t).peek()))
376
+ for (let i = 0; i < r.length; i++) {
377
+ const f = r.at(i);
378
+ if (f && f !== t) {
379
+ const a = n(f);
380
+ a.peek() && (a.value = !1);
243
381
  }
244
382
  }
245
383
  });
246
384
  })
247
385
  );
248
386
  }
249
- function ae(e, t) {
250
- const { model: n } = p(), o = e.__path;
251
- if (!o) return;
252
- const r = F(n, o);
253
- if (!r) return;
254
- let c = !1, i = 0;
255
- m(() => {
256
- v(r), !c && (c = !0, g(() => {
257
- c = !1;
258
- const s = t(r.toArray());
387
+ function Ae(e, n) {
388
+ p("aggregateInto");
389
+ const o = b(e);
390
+ if (!o) return _("aggregateInto", e, "массив");
391
+ const r = O(o);
392
+ let c = !1, t = 0, s = !1;
393
+ y(() => {
394
+ S(r), !(c || s) && (c = !0, B(() => {
395
+ if (c = !1, s) return;
396
+ const i = n(r.toArray());
259
397
  let f = !1;
260
- for (const { index: d, patch: y } of s) {
261
- const u = r.at(d);
262
- if (u)
263
- for (const [l, w] of Object.entries(y))
264
- u[l] !== w && (u[l] = w, f = !0);
398
+ for (const { index: a, patch: h } of i) {
399
+ const l = r.at(a);
400
+ if (l)
401
+ for (const [d, $] of Object.entries(h))
402
+ l[d] !== $ && (l[d] = $, f = !0);
265
403
  }
266
- if (i = f ? i + 1 : 0, i > 50)
267
- throw i = 0, new Error(
268
- `[@reformer/core/behaviors] aggregateInto("${o}"): запись не сходится (>50 проходов) — derive должна быть идемпотентной на фикспоинте.`
404
+ if (t = f ? t + 1 : 0, t > 50)
405
+ throw s = !0, new Error(
406
+ `[@reformer/core/behaviors] aggregateInto("${K(o)}"): запись не сходится (>50 проходов) — derive должна быть идемпотентной на фикспоинте.`
269
407
  );
270
408
  }));
271
409
  });
272
410
  }
273
- function fe(e, t) {
274
- const { form: n } = p();
275
- for (const o of E(e)) {
276
- const r = o, c = r.__path;
277
- if (!c) continue;
278
- const i = n ? n.getFieldByPath(c) : void 0, s = i ? i.getProxy?.() ?? i : void 0;
279
- a(t.__run(M(r), s));
411
+ function Ce(e, n) {
412
+ const o = T("apply"), r = G("apply");
413
+ for (const c of U(e)) {
414
+ const t = A(c);
415
+ if (!t) {
416
+ _("apply", c, "группа");
417
+ continue;
418
+ }
419
+ const s = O(t), i = v(t);
420
+ u(n.__run(s, i, o, r));
280
421
  }
281
422
  }
423
+ function He(e, n) {
424
+ k(e.addHideCondition(n));
425
+ }
426
+ function Me(e, n, o) {
427
+ k(e.addEventHandler(n, o));
428
+ }
429
+ function De(e, n) {
430
+ k(e.addRenderEffect(n));
431
+ }
432
+ function Ne(e, n) {
433
+ n();
434
+ }
435
+ function Pe(e, n) {
436
+ k(e.addLifecycleHook("onMount", n));
437
+ }
438
+ function Ve(e, n) {
439
+ k(e.addLifecycleHook("onUnmount", n));
440
+ }
282
441
  export {
283
- ae as aggregateInto,
284
- fe as apply,
285
- K as applyEach,
286
- Z as compute,
287
- ee as computeFrom,
288
- ne as copyFrom,
289
- g as defer,
290
- q as defineFormBehavior,
291
- te as disableWhen,
292
- m as effect,
293
- L as enableWhen,
294
- se as exclusiveFlag,
295
- p as getScope,
296
- H as onChange,
297
- a as onDispose,
298
- re as resetWhen,
299
- ie as revalidateWhen,
300
- ce as syncFields,
301
- oe as transformValue
442
+ Ae as aggregateInto,
443
+ Ce as apply,
444
+ de as applyEach,
445
+ ke as compute,
446
+ $e as computeFrom,
447
+ ge as copyFrom,
448
+ B as defer,
449
+ ce as defineFormBehavior,
450
+ Oe as disableWhen,
451
+ y as effect,
452
+ Ee as enableWhen,
453
+ je as exclusiveFlag,
454
+ ve as getScope,
455
+ He as hideWhen,
456
+ ie as onChange,
457
+ Me as onComponentEvent,
458
+ u as onDispose,
459
+ Ne as onInit,
460
+ Pe as onMount,
461
+ Ve as onUnmount,
462
+ De as renderEffect,
463
+ Fe as resetWhen,
464
+ Se as revalidateWhen,
465
+ We as syncFields,
466
+ _e as transformValue
302
467
  };