@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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@reformer/core",
3
- "version": "10.2.0",
4
- "description": "Reactive form state management library for React with signals-based architecture",
3
+ "version": "11.0.0-beta.10",
4
+ "description": "Reactive form state management on signals: a UI-agnostic core with React bindings in @reformer/core/react",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
@@ -15,9 +15,31 @@
15
15
  "types": "./dist/signals.d.ts",
16
16
  "import": "./dist/signals.js"
17
17
  },
18
- "./state": {
19
- "types": "./dist/state.d.ts",
20
- "import": "./dist/state.js"
18
+ "./i18n": {
19
+ "types": "./dist/i18n.d.ts",
20
+ "import": "./dist/i18n.js"
21
+ },
22
+ "./react": {
23
+ "types": "./dist/react.d.ts",
24
+ "import": "./dist/react.js"
25
+ },
26
+ "./locale": {
27
+ "types": "./dist/locale.d.ts",
28
+ "import": "./dist/locale.js"
29
+ },
30
+ "./locale/en": {
31
+ "types": "./dist/locale/en.d.ts",
32
+ "import": "./dist/locale/en.js"
33
+ },
34
+ "./locale/ru": {
35
+ "types": "./dist/locale/ru.d.ts",
36
+ "import": "./dist/locale/ru.js"
37
+ },
38
+ "./locale/en.json": "./dist/locale/en.json",
39
+ "./locale/ru.json": "./dist/locale/ru.json",
40
+ "./model": {
41
+ "types": "./dist/model.d.ts",
42
+ "import": "./dist/model.js"
21
43
  },
22
44
  "./behaviors": {
23
45
  "types": "./dist/behaviors.d.ts",
@@ -87,9 +109,33 @@
87
109
  "types": "./dist/validators/non-zero.d.ts",
88
110
  "import": "./dist/validators/non-zero.js"
89
111
  },
90
- "./validators/date": {
91
- "types": "./dist/validators/date.d.ts",
92
- "import": "./dist/validators/date.js"
112
+ "./validators/is-date": {
113
+ "types": "./dist/validators/is-date.d.ts",
114
+ "import": "./dist/validators/is-date.js"
115
+ },
116
+ "./validators/min-date": {
117
+ "types": "./dist/validators/min-date.d.ts",
118
+ "import": "./dist/validators/min-date.js"
119
+ },
120
+ "./validators/max-date": {
121
+ "types": "./dist/validators/max-date.d.ts",
122
+ "import": "./dist/validators/max-date.js"
123
+ },
124
+ "./validators/past-date": {
125
+ "types": "./dist/validators/past-date.d.ts",
126
+ "import": "./dist/validators/past-date.js"
127
+ },
128
+ "./validators/future-date": {
129
+ "types": "./dist/validators/future-date.d.ts",
130
+ "import": "./dist/validators/future-date.js"
131
+ },
132
+ "./validators/min-age": {
133
+ "types": "./dist/validators/min-age.d.ts",
134
+ "import": "./dist/validators/min-age.js"
135
+ },
136
+ "./validators/max-age": {
137
+ "types": "./dist/validators/max-age.d.ts",
138
+ "import": "./dist/validators/max-age.js"
93
139
  }
94
140
  },
95
141
  "sideEffects": false,
@@ -99,7 +145,9 @@
99
145
  "build:stackblitz": "vite build",
100
146
  "dev": "vite",
101
147
  "test": "node ../../scripts/run-vitest.mjs",
102
- "test:watch": "vitest watch"
148
+ "test:watch": "vitest watch",
149
+ "coverage": "node ../../scripts/run-vitest.mjs --coverage && node ../../scripts/check-coverage-per-file.mjs",
150
+ "typecheck": "tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.tests.json"
103
151
  },
104
152
  "keywords": [
105
153
  "react",
@@ -134,26 +182,40 @@
134
182
  "dist",
135
183
  "README.md",
136
184
  "LICENSE",
137
- "llms.txt"
185
+ "llms.txt",
186
+ "llms-index.json",
187
+ "docs/llms"
138
188
  ],
139
189
  "peerDependencies": {
140
190
  "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
141
191
  "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
142
192
  },
193
+ "peerDependenciesMeta": {
194
+ "react": {
195
+ "optional": true
196
+ },
197
+ "react-dom": {
198
+ "optional": true
199
+ }
200
+ },
143
201
  "dependencies": {
144
202
  "@preact/signals-core": "^1.8.0",
145
203
  "use-sync-external-store": "^1.2.0"
146
204
  },
147
205
  "devDependencies": {
148
- "@types/use-sync-external-store": "^0.0.6",
206
+ "@testing-library/dom": "^10.4.2",
207
+ "@testing-library/react": "^16.3.3",
149
208
  "@types/node": "^24.10.1",
150
- "tsx": "^4.19.2",
151
209
  "@types/react": "^19.2.7",
152
- "@types/react-dom": "^19.2.3",
153
- "@vitejs/plugin-react": "^5.1.0",
154
- "@vitest/utils": "^4.0.8",
210
+ "@types/react-dom": "^19.3.0",
211
+ "@types/use-sync-external-store": "^0.0.6",
212
+ "@vitest/coverage-v8": "4.0.15",
213
+ "fast-check": "^4.10.2",
214
+ "happy-dom": "^20.14.6",
215
+ "intl-messageformat": "^12.1.2",
155
216
  "react": "^19.2.1",
156
217
  "react-dom": "^19.2.1",
218
+ "tsx": "^4.19.2",
157
219
  "typescript": "^5.9.3",
158
220
  "vite": "^7.2.2",
159
221
  "vite-plugin-dts": "^4.5.4",
@@ -1,18 +0,0 @@
1
- import { effect as i } from "@preact/signals-core";
2
- import { g as s } from "./signal-node-registry-tiwel-TV.js";
3
- import { d as f } from "./behaviors-value-C7dSEhCc.js";
4
- function a(n, r, t) {
5
- return i(() => {
6
- const o = r(), e = s(n);
7
- e && f(() => {
8
- o ? e.enable() : (e.disable(), t?.resetOnDisable && e.reset());
9
- });
10
- });
11
- }
12
- function b(n, r, t) {
13
- return a(n, () => !r(), t);
14
- }
15
- export {
16
- b as d,
17
- a as e
18
- };
@@ -1,134 +0,0 @@
1
- import { effect as f } from "@preact/signals-core";
2
- const d = "runOutsideEffect";
3
- function i(e, n) {
4
- process.env.NODE_ENV !== "production" && console.error(`[${n}]`, e);
5
- }
6
- function m(e) {
7
- return typeof e == "object" && e !== null && typeof e.then == "function";
8
- }
9
- function v(e, n) {
10
- try {
11
- const t = e();
12
- m(t) && t.then(void 0, (r) => i(r, n));
13
- } catch (t) {
14
- i(t, n);
15
- }
16
- }
17
- function y(e) {
18
- return (...n) => {
19
- a(() => e(...n));
20
- };
21
- }
22
- function a(e) {
23
- let n = !1;
24
- return queueMicrotask(() => {
25
- n || v(e, d);
26
- }), () => {
27
- n = !0;
28
- };
29
- }
30
- function h(e, n) {
31
- return () => {
32
- n(() => v(e, "safeDebouncedCallback"));
33
- };
34
- }
35
- function k(e, n, t, r) {
36
- return f(() => {
37
- const u = e.map((c) => c.value);
38
- if (r?.when && !r.when(...u)) return;
39
- const s = t(...u);
40
- n.peek() !== s && (n.value = s);
41
- });
42
- }
43
- function E(e, n, t) {
44
- return f(() => {
45
- const r = e.value;
46
- if (t?.when && !t.when()) return;
47
- const u = t?.transform ? t.transform(r) : r;
48
- n.peek() !== u && (n.value = u);
49
- });
50
- }
51
- function w(e, n, t) {
52
- let r = !0;
53
- return f(() => {
54
- const u = e.value;
55
- r && (r = !1, !t?.immediate) || n(u);
56
- });
57
- }
58
- function b(e, n) {
59
- let t = !1;
60
- return f(() => {
61
- const r = e.value;
62
- t || a(() => {
63
- const u = n(r);
64
- if (e.peek() !== u) {
65
- t = !0;
66
- try {
67
- e.value = u;
68
- } finally {
69
- t = !1;
70
- }
71
- }
72
- });
73
- });
74
- }
75
- function D(e, n, t) {
76
- const r = t?.resetValue ?? null;
77
- return f(() => {
78
- const u = n();
79
- a(() => {
80
- u && e.peek() !== r && (e.value = r);
81
- });
82
- });
83
- }
84
- function F(e, n, t) {
85
- const r = t?.transform;
86
- let u = !1;
87
- const s = f(() => {
88
- const l = e.value;
89
- u || a(() => {
90
- u = !0;
91
- try {
92
- const o = r ? r(l) : l;
93
- n.peek() !== o && (n.value = o);
94
- } finally {
95
- u = !1;
96
- }
97
- });
98
- }), c = f(() => {
99
- const l = n.value;
100
- u || a(() => {
101
- u = !0;
102
- try {
103
- e.peek() !== l && (e.value = l);
104
- } finally {
105
- u = !1;
106
- }
107
- });
108
- });
109
- return () => {
110
- s(), c();
111
- };
112
- }
113
- function x(e, n) {
114
- let t = !0;
115
- return f(() => {
116
- if (e.forEach((r) => r.value), t) {
117
- t = !1;
118
- return;
119
- }
120
- a(() => n());
121
- });
122
- }
123
- export {
124
- E as a,
125
- x as b,
126
- k as c,
127
- a as d,
128
- y as e,
129
- h as f,
130
- D as r,
131
- F as s,
132
- b as t,
133
- w
134
- };
@@ -1,31 +0,0 @@
1
- function i(t) {
2
- if (t == null || t === "")
3
- return null;
4
- if (t instanceof Date)
5
- return isNaN(t.getTime()) ? null : t;
6
- if (typeof t == "string") {
7
- const n = new Date(t);
8
- return isNaN(n.getTime()) ? null : n;
9
- }
10
- return null;
11
- }
12
- function s() {
13
- const t = /* @__PURE__ */ new Date();
14
- return t.setHours(0, 0, 0, 0), t;
15
- }
16
- function a(t) {
17
- const n = new Date(t);
18
- return n.setHours(0, 0, 0, 0), n;
19
- }
20
- function c(t) {
21
- const n = s(), e = a(t);
22
- let r = n.getFullYear() - e.getFullYear();
23
- const o = n.getMonth() - e.getMonth();
24
- return (o < 0 || o === 0 && n.getDate() < e.getDate()) && (r -= 1), r;
25
- }
26
- export {
27
- c,
28
- s as g,
29
- a as n,
30
- i as p
31
- };
@@ -1,16 +0,0 @@
1
- const t = /* @__PURE__ */ new WeakMap();
2
- function n(e) {
3
- t.set(e, (t.get(e) ?? 0) + 1);
4
- }
5
- function i(e) {
6
- const r = t.get(e);
7
- r !== void 0 && (r <= 1 ? t.delete(e) : t.set(e, r - 1));
8
- }
9
- function o(e) {
10
- return t.has(e);
11
- }
12
- export {
13
- o as i,
14
- n as m,
15
- i as u
16
- };
@@ -1,133 +0,0 @@
1
- import { Signal, ReadonlySignal } from '@preact/signals-core';
2
- import { BehaviorCleanup, FormModel, FormProxy } from '../index';
3
- /** Контекст схемы поведения: модель (значения/сигналы) + форма (ноды). */
4
- export type BehaviorScope<T> = {
5
- model: FormModel<T>;
6
- form: FormProxy<T>;
7
- };
8
- /** Результат {@link defineFormBehavior}; передаётся в `createForm({ behavior })`. */
9
- export interface FormBehavior<T> {
10
- /** @internal Запускается `createForm` после построения нод и заполнения реестра сигнал→нода. */
11
- __run(model: FormModel<T>, form: FormProxy<T>): BehaviorCleanup;
12
- }
13
- export type { Signal, ReadonlySignal, BehaviorCleanup };
14
- /** Зарегистрировать произвольную отписку в активной схеме. */
15
- export declare function onDispose(cleanup: BehaviorCleanup): void;
16
- /** Текущий scope ({ model, form }) активной схемы (escape hatch для кросс-операторов). */
17
- export declare function getScope<T>(): BehaviorScope<T>;
18
- /**
19
- * Описать поведение формы декларативно. Возвращает {@link FormBehavior} для `createForm({ behavior })`.
20
- *
21
- * @example
22
- * ```ts
23
- * export const myBehavior = defineFormBehavior<MyForm>(({ model, form }) => {
24
- * compute(model.$.total, () => model.price * model.qty);
25
- * enableWhen([model.$.city], () => Boolean(model.country));
26
- * onChange(model.$.country, async (c) => form.city.updateComponentProps({ options: await load(c) }));
27
- * });
28
- * ```
29
- */
30
- export declare function defineFormBehavior<T>(setup: (scope: BehaviorScope<T>) => void): FormBehavior<T>;
31
- /** Реактивный эффект (авто-dispose). Колбэк может вернуть собственный cleanup. */
32
- export declare function effect(fn: () => void | (() => void)): void;
33
- /** Отложенная запись вне effect-контекста (микротаск) — защита от «Cycle detected». */
34
- export declare function defer(fn: () => void): void;
35
- /** Вычисляемое поле с auto-tracking: `target = read()` при изменении прочитанных сигналов. */
36
- export declare function compute<R>(target: Signal<R>, read: () => R, options?: {
37
- when?: () => boolean;
38
- }): void;
39
- /** Вычисляемое поле с явным списком зависимостей (escape hatch). */
40
- export declare function computeFrom<R>(sources: ReadonlySignal<unknown>[], target: Signal<R>, fn: (...values: any[]) => R, options?: {
41
- when?: (...values: any[]) => boolean;
42
- }): void;
43
- /** Копирование `source → target` — скаляр или группа (объект целиком). */
44
- export declare function copyFrom<T>(source: ReadonlySignal<T> | object, target: Signal<T> | object, options?: {
45
- when?: () => boolean;
46
- transform?: (value: T) => T;
47
- }): void;
48
- /** Контекст async-реакции: `signal` аннулируется, когда поле меняется снова до завершения колбэка. */
49
- export interface ChangeContext {
50
- signal: AbortSignal;
51
- }
52
- /**
53
- * Реакция на изменение поля; `{ debounce, immediate }`.
54
- *
55
- * Колбэк выполняется ВНЕ effect-контекста (микротаск/таймер) — можно безопасно писать сигналы и ноды
56
- * (`updateComponentProps`/`reset`/`clear`) без ручного `defer` и без «Cycle detected».
57
- *
58
- * Для async-колбэков 2-м аргументом приходит `{ signal }` (AbortSignal): при следующей смене значения
59
- * предыдущий `signal` аннулируется. Передавай его в `fetch` (сетевая отмена) или проверяй
60
- * `signal.aborted` перед применением результата — это убирает гонки устаревших ответов (F2).
61
- */
62
- export declare function onChange<T>(source: ReadonlySignal<T>, cb: (value: T, ctx: ChangeContext) => void, options?: {
63
- immediate?: boolean;
64
- debounce?: number;
65
- }): void;
66
- type EnableTarget = ReadonlySignal<unknown> | object;
67
- /** Условное включение поля(ей) — скаляр, массив целей или группа. `resetOnDisable=false` по умолчанию. */
68
- export declare function enableWhen(target: EnableTarget | EnableTarget[], condition: () => boolean, options?: {
69
- resetOnDisable?: boolean;
70
- }): void;
71
- /** Условное выключение поля(ей) (инверсия {@link enableWhen}). */
72
- export declare function disableWhen(target: EnableTarget | EnableTarget[], condition: () => boolean, options?: {
73
- resetOnDisable?: boolean;
74
- }): void;
75
- /** Трансформация значения поля (идемпотентная). */
76
- export declare function transformValue<T>(target: Signal<T>, transformer: (value: T) => T): void;
77
- /** Сброс значения по условию. */
78
- export declare function resetWhen<T>(target: Signal<T>, condition: () => boolean, options?: {
79
- resetValue?: T;
80
- }): void;
81
- /** Двусторонняя синхронизация двух полей. */
82
- export declare function syncFields<T>(a: Signal<T>, b: Signal<T>, options?: {
83
- transform?: (value: T) => T;
84
- }): void;
85
- /** Ревалидация при изменении зависимостей. */
86
- export declare function revalidateWhen(deps: ReadonlySignal<unknown>[], revalidate: () => void): void;
87
- /**
88
- * Применить под-схему к КАЖДОМУ элементу динамического массива (per-item поведение).
89
- * Реагирует на добавление/удаление строк: новым строкам поведение применяется, удалённым — отписывается.
90
- *
91
- * Под-схема получает scope строки: `model` (под-модель строки — `row.$.field`) и `form` (нода строки).
92
- * - Value-операции (`compute`/`copyFrom`/`transformValue` на `row.$.*`) работают всегда.
93
- * - Node-операции (`enableWhen`/`updateComponentProps`/`reset` через `form.*`) требуют, чтобы массив был
94
- * МАТЕРИАЛИЗОВАН в форме (узел `{ array, item }` в схеме) — тогда `form` строки = та же нода, что
95
- * рендерится, а её сигналы зарегистрированы (`enableWhen` резолвит ноду). Без материализации доступ
96
- * к `form.*` бросит понятную ошибку (см. {@link unmaterializedRowForm}).
97
- *
98
- * @example
99
- * applyEach(model.$.items, defineFormBehavior<Item>(({ model: row, form }) => {
100
- * compute(row.$.lineTotal, () => row.qty * row.price); // value-op — всегда
101
- * enableWhen(row.$.discount, () => row.qty > 10); // node-op — нужна материализация массива
102
- * }));
103
- */
104
- export declare function applyEach<TItem>(array: object, itemSchema: FormBehavior<TItem>): void;
105
- /**
106
- * Взаимное исключение булева флага среди строк массива (single-selection — «единственный primary»).
107
- * Когда флаг строки становится true, у остальных строк он сбрасывается в false. Не хрупок к push:
108
- * новые строки с флагом false исключения не запускают.
109
- *
110
- * @example
111
- * exclusiveFlag(model.$.contacts, (row) => row.$.primary);
112
- */
113
- export declare function exclusiveFlag<TItem>(array: object, getFlag: (row: FormModel<TItem>) => Signal<boolean>): void;
114
- /**
115
- * Агрегатная запись в строки массива. `derive(snapshot)` получает СНИМОК строк и возвращает список
116
- * `{ index, patch }`, который применяется к строкам. Записи КОАЛЕСИРУЮТСЯ в один отложенный проход на
117
- * финальном состоянии — поэтому массовые синхронные мутации (push в цикле) не вызывают каскад на
118
- * промежуточных состояниях. `derive` должна сходиться (на фикспоинте возвращать те же значения).
119
- *
120
- * @example
121
- * // последняя строка = 100 − Σ(остальные)
122
- * aggregateInto(model.$.rows, (rows) => {
123
- * const n = rows.length; if (n === 0) return [];
124
- * const others = rows.slice(0, n - 1).reduce((s, r) => s + r.percent, 0);
125
- * return [{ index: n - 1, patch: { percent: 100 - others } }];
126
- * });
127
- */
128
- export declare function aggregateInto<TItem>(array: object, derive: (rows: TItem[]) => Array<{
129
- index: number;
130
- patch: Partial<TItem>;
131
- }>): void;
132
- /** Применить под-схему к одному или нескольким полям-группам (переиспользование). */
133
- export declare function apply<TField>(targets: object | object[], subSchema: FormBehavior<TField>): void;
@@ -1,166 +0,0 @@
1
- import { ValidationError } from './types/contracts';
2
- /**
3
- * Стратегия обработки ошибок
4
- *
5
- * Определяет, что делать с ошибкой после логирования
6
- */
7
- export declare enum ErrorStrategy {
8
- /**
9
- * Пробросить ошибку дальше (throw)
10
- * Используется когда ошибка критична и должна остановить выполнение
11
- */
12
- THROW = "throw",
13
- /**
14
- * Залогировать и проглотить ошибку (продолжить выполнение)
15
- * Используется когда ошибка не критична
16
- */
17
- LOG = "log",
18
- /**
19
- * Конвертировать ошибку в ValidationError
20
- * Используется в async validators для отображения ошибки валидации пользователю
21
- */
22
- CONVERT = "convert"
23
- }
24
- /**
25
- * Централизованный обработчик ошибок для форм
26
- *
27
- * Обеспечивает:
28
- * - Единообразное логирование ошибок в DEV режиме
29
- * - Гибкие стратегии обработки (throw/log/convert)
30
- * - Типобезопасное извлечение сообщений из Error/string/unknown
31
- *
32
- * @example
33
- * ```typescript
34
- * // В async validator (конвертировать в ValidationError)
35
- * try {
36
- * await validateEmail(value);
37
- * } catch (error) {
38
- * return FormErrorHandler.handle(error, 'EmailValidator', ErrorStrategy.CONVERT);
39
- * }
40
- *
41
- * // В behavior applicator (пробросить критичную ошибку)
42
- * try {
43
- * applyBehavior(schema);
44
- * } catch (error) {
45
- * FormErrorHandler.handle(error, 'BehaviorApplicator', ErrorStrategy.THROW);
46
- * }
47
- *
48
- * // В validator (залогировать и продолжить)
49
- * try {
50
- * validator(value);
51
- * } catch (error) {
52
- * FormErrorHandler.handle(error, 'Validator', ErrorStrategy.LOG);
53
- * }
54
- * ```
55
- */
56
- export declare class FormErrorHandler {
57
- /**
58
- * Обработать ошибку согласно заданной стратегии
59
- *
60
- * @param error Ошибка для обработки (Error | string | unknown)
61
- * @param context Контекст ошибки для логирования (например, 'AsyncValidator', 'BehaviorRegistry')
62
- * @param strategy Стратегия обработки (THROW | LOG | CONVERT)
63
- * @returns ValidationError если strategy = CONVERT, undefined если strategy = LOG, никогда не возвращается если strategy = THROW
64
- *
65
- * @example
66
- * ```typescript
67
- * // THROW - пробросить ошибку
68
- * try {
69
- * riskyOperation();
70
- * } catch (error) {
71
- * FormErrorHandler.handle(error, 'RiskyOperation', ErrorStrategy.THROW);
72
- * // Этот код никогда не выполнится
73
- * }
74
- *
75
- * // LOG - залогировать и продолжить
76
- * try {
77
- * nonCriticalOperation();
78
- * } catch (error) {
79
- * FormErrorHandler.handle(error, 'NonCritical', ErrorStrategy.LOG);
80
- * // Продолжаем выполнение
81
- * }
82
- *
83
- * // CONVERT - конвертировать в ValidationError
84
- * try {
85
- * await validator(value);
86
- * } catch (error) {
87
- * const validationError = FormErrorHandler.handle(
88
- * error,
89
- * 'AsyncValidator',
90
- * ErrorStrategy.CONVERT
91
- * );
92
- * return validationError;
93
- * }
94
- * ```
95
- */
96
- static handle(error: unknown, context: string, strategy: ErrorStrategy.CONVERT): ValidationError;
97
- static handle(error: unknown, context: string, strategy: ErrorStrategy.THROW): never;
98
- static handle(error: unknown, context: string, strategy: ErrorStrategy.LOG): void;
99
- static handle(error: unknown, context: string): never;
100
- /**
101
- * Извлечь сообщение из ошибки
102
- *
103
- * Обрабатывает различные типы ошибок:
104
- * - Error объекты → error.message
105
- * - Строки → возвращает как есть
106
- * - Объекты с message → извлекает message
107
- * - Другое → String(error)
108
- *
109
- * @param error Ошибка для извлечения сообщения
110
- * @returns Сообщение ошибки
111
- * @private
112
- *
113
- * @example
114
- * ```typescript
115
- * FormErrorHandler.extractMessage(new Error('Test'));
116
- * // 'Test'
117
- *
118
- * FormErrorHandler.extractMessage('String error');
119
- * // 'String error'
120
- *
121
- * FormErrorHandler.extractMessage({ message: 'Object error' });
122
- * // 'Object error'
123
- *
124
- * FormErrorHandler.extractMessage(null);
125
- * // 'null'
126
- * ```
127
- */
128
- private static extractMessage;
129
- /**
130
- * Создать ValidationError с заданными параметрами
131
- *
132
- * Утилитная функция для создания ValidationError объектов
133
- *
134
- * @param code Код ошибки
135
- * @param message Сообщение ошибки
136
- * @param field Поле (опционально)
137
- * @returns ValidationError объект
138
- *
139
- * @example
140
- * ```typescript
141
- * const error = FormErrorHandler.createValidationError(
142
- * 'required',
143
- * 'This field is required',
144
- * 'email'
145
- * );
146
- * // { code: 'required', message: 'This field is required', field: 'email' }
147
- * ```
148
- */
149
- static createValidationError(code: string, message: string, field?: string): ValidationError;
150
- /**
151
- * Проверить, является ли объект ValidationError
152
- *
153
- * Type guard для ValidationError
154
- *
155
- * @param value Значение для проверки
156
- * @returns true если value является ValidationError
157
- *
158
- * @example
159
- * ```typescript
160
- * if (FormErrorHandler.isValidationError(result)) {
161
- * console.log(result.code); // OK, типобезопасно
162
- * }
163
- * ```
164
- */
165
- static isValidationError(value: unknown): value is ValidationError;
166
- }
@@ -1,6 +0,0 @@
1
- /**
2
- * Фабрики для создания узлов формы
3
- *
4
- * Централизованное место для всех фабрик и builder-паттернов.
5
- */
6
- export { NodeFactory } from './node-factory';