mobx-formkit 1.0.0

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 (256) hide show
  1. package/AGENTS.md +761 -0
  2. package/LICENSE +21 -0
  3. package/README.md +214 -0
  4. package/lib/ArrayMap.d.ts +50 -0
  5. package/lib/ArrayMap.d.ts.map +1 -0
  6. package/lib/ArrayMap.js +151 -0
  7. package/lib/ArrayMap.js.map +1 -0
  8. package/lib/Base.d.ts +237 -0
  9. package/lib/Base.d.ts.map +1 -0
  10. package/lib/Base.js +872 -0
  11. package/lib/Base.js.map +1 -0
  12. package/lib/Bindings.d.ts +28 -0
  13. package/lib/Bindings.d.ts.map +1 -0
  14. package/lib/Bindings.js +73 -0
  15. package/lib/Bindings.js.map +1 -0
  16. package/lib/Field.d.ts +195 -0
  17. package/lib/Field.d.ts.map +1 -0
  18. package/lib/Field.js +734 -0
  19. package/lib/Field.js.map +1 -0
  20. package/lib/Form.d.ts +75 -0
  21. package/lib/Form.d.ts.map +1 -0
  22. package/lib/Form.js +199 -0
  23. package/lib/Form.js.map +1 -0
  24. package/lib/Options.d.ts +9 -0
  25. package/lib/Options.d.ts.map +1 -0
  26. package/lib/Options.js +85 -0
  27. package/lib/Options.js.map +1 -0
  28. package/lib/State.d.ts +43 -0
  29. package/lib/State.d.ts.map +1 -0
  30. package/lib/State.js +147 -0
  31. package/lib/State.js.map +1 -0
  32. package/lib/Validator.d.ts +25 -0
  33. package/lib/Validator.d.ts.map +1 -0
  34. package/lib/Validator.js +143 -0
  35. package/lib/Validator.js.map +1 -0
  36. package/lib/compat.d.ts +29 -0
  37. package/lib/compat.d.ts.map +1 -0
  38. package/lib/compat.js +117 -0
  39. package/lib/compat.js.map +1 -0
  40. package/lib/composer.d.ts +26 -0
  41. package/lib/composer.d.ts.map +1 -0
  42. package/lib/composer.js +65 -0
  43. package/lib/composer.js.map +1 -0
  44. package/lib/esm/ArrayMap.js +146 -0
  45. package/lib/esm/ArrayMap.js.map +1 -0
  46. package/lib/esm/Base.js +868 -0
  47. package/lib/esm/Base.js.map +1 -0
  48. package/lib/esm/Bindings.js +69 -0
  49. package/lib/esm/Bindings.js.map +1 -0
  50. package/lib/esm/Field.js +730 -0
  51. package/lib/esm/Field.js.map +1 -0
  52. package/lib/esm/Form.js +195 -0
  53. package/lib/esm/Form.js.map +1 -0
  54. package/lib/esm/Options.js +81 -0
  55. package/lib/esm/Options.js.map +1 -0
  56. package/lib/esm/State.js +143 -0
  57. package/lib/esm/State.js.map +1 -0
  58. package/lib/esm/Validator.js +139 -0
  59. package/lib/esm/Validator.js.map +1 -0
  60. package/lib/esm/compat.js +96 -0
  61. package/lib/esm/compat.js.map +1 -0
  62. package/lib/esm/composer.js +63 -0
  63. package/lib/esm/composer.js.map +1 -0
  64. package/lib/esm/index.js +8 -0
  65. package/lib/esm/index.js.map +1 -0
  66. package/lib/esm/models/FieldProps.js +116 -0
  67. package/lib/esm/models/FieldProps.js.map +1 -0
  68. package/lib/esm/models/OptionsModel.js +51 -0
  69. package/lib/esm/models/OptionsModel.js.map +1 -0
  70. package/lib/esm/models/StateInterface.js +9 -0
  71. package/lib/esm/models/StateInterface.js.map +1 -0
  72. package/lib/esm/models/ValidatorInterface.js +8 -0
  73. package/lib/esm/models/ValidatorInterface.js.map +1 -0
  74. package/lib/esm/parser.js +235 -0
  75. package/lib/esm/parser.js.map +1 -0
  76. package/lib/esm/props.js +118 -0
  77. package/lib/esm/props.js.map +1 -0
  78. package/lib/esm/utils.js +156 -0
  79. package/lib/esm/utils.js.map +1 -0
  80. package/lib/esm/validators/AJV.js +105 -0
  81. package/lib/esm/validators/AJV.js.map +1 -0
  82. package/lib/esm/validators/DVR.js +104 -0
  83. package/lib/esm/validators/DVR.js.map +1 -0
  84. package/lib/esm/validators/JOI.js +54 -0
  85. package/lib/esm/validators/JOI.js.map +1 -0
  86. package/lib/esm/validators/VALIBOT.js +50 -0
  87. package/lib/esm/validators/VALIBOT.js.map +1 -0
  88. package/lib/esm/validators/VINEJS.js +60 -0
  89. package/lib/esm/validators/VINEJS.js.map +1 -0
  90. package/lib/esm/validators/VJF.js +88 -0
  91. package/lib/esm/validators/VJF.js.map +1 -0
  92. package/lib/esm/validators/YUP.js +69 -0
  93. package/lib/esm/validators/YUP.js.map +1 -0
  94. package/lib/esm/validators/ZOD.js +43 -0
  95. package/lib/esm/validators/ZOD.js.map +1 -0
  96. package/lib/index.d.ts +7 -0
  97. package/lib/index.d.ts.map +1 -0
  98. package/lib/index.js +15 -0
  99. package/lib/index.js.map +1 -0
  100. package/lib/models/BaseInterface.d.ts +40 -0
  101. package/lib/models/BaseInterface.d.ts.map +1 -0
  102. package/lib/models/BindingsInterface.d.ts +18 -0
  103. package/lib/models/BindingsInterface.d.ts.map +1 -0
  104. package/lib/models/FieldInterface.d.ts +88 -0
  105. package/lib/models/FieldInterface.d.ts.map +1 -0
  106. package/lib/models/FieldProps.d.ts +111 -0
  107. package/lib/models/FieldProps.d.ts.map +1 -0
  108. package/lib/models/FieldProps.js +116 -0
  109. package/lib/models/FieldProps.js.map +1 -0
  110. package/lib/models/FormInterface.d.ts +184 -0
  111. package/lib/models/FormInterface.d.ts.map +1 -0
  112. package/lib/models/OptionsInterface.d.ts +8 -0
  113. package/lib/models/OptionsInterface.d.ts.map +1 -0
  114. package/lib/models/OptionsModel.d.ts +99 -0
  115. package/lib/models/OptionsModel.d.ts.map +1 -0
  116. package/lib/models/OptionsModel.js +51 -0
  117. package/lib/models/OptionsModel.js.map +1 -0
  118. package/lib/models/SharedActionsInterface.d.ts +27 -0
  119. package/lib/models/SharedActionsInterface.d.ts.map +1 -0
  120. package/lib/models/SharedEventsInterface.d.ts +8 -0
  121. package/lib/models/SharedEventsInterface.d.ts.map +1 -0
  122. package/lib/models/SharedHelpersInterface.d.ts +26 -0
  123. package/lib/models/SharedHelpersInterface.d.ts.map +1 -0
  124. package/lib/models/SharedInitializerInterface.d.ts +6 -0
  125. package/lib/models/SharedInitializerInterface.d.ts.map +1 -0
  126. package/lib/models/SharedUtilsInterface.d.ts +10 -0
  127. package/lib/models/SharedUtilsInterface.d.ts.map +1 -0
  128. package/lib/models/StateInterface.d.ts +37 -0
  129. package/lib/models/StateInterface.d.ts.map +1 -0
  130. package/lib/models/StateInterface.js +9 -0
  131. package/lib/models/StateInterface.js.map +1 -0
  132. package/lib/models/ValidatorInterface.d.ts +74 -0
  133. package/lib/models/ValidatorInterface.d.ts.map +1 -0
  134. package/lib/models/ValidatorInterface.js +8 -0
  135. package/lib/models/ValidatorInterface.js.map +1 -0
  136. package/lib/parser.d.ts +13 -0
  137. package/lib/parser.d.ts.map +1 -0
  138. package/lib/parser.js +247 -0
  139. package/lib/parser.js.map +1 -0
  140. package/lib/props.d.ts +14 -0
  141. package/lib/props.d.ts.map +1 -0
  142. package/lib/props.js +120 -0
  143. package/lib/props.js.map +1 -0
  144. package/lib/utils.d.ts +34 -0
  145. package/lib/utils.d.ts.map +1 -0
  146. package/lib/utils.js +182 -0
  147. package/lib/utils.js.map +1 -0
  148. package/lib/validators/AJV.d.ts +4 -0
  149. package/lib/validators/AJV.d.ts.map +1 -0
  150. package/lib/validators/AJV.js +109 -0
  151. package/lib/validators/AJV.js.map +1 -0
  152. package/lib/validators/DVR.d.ts +4 -0
  153. package/lib/validators/DVR.d.ts.map +1 -0
  154. package/lib/validators/DVR.js +108 -0
  155. package/lib/validators/DVR.js.map +1 -0
  156. package/lib/validators/JOI.d.ts +4 -0
  157. package/lib/validators/JOI.d.ts.map +1 -0
  158. package/lib/validators/JOI.js +58 -0
  159. package/lib/validators/JOI.js.map +1 -0
  160. package/lib/validators/VALIBOT.d.ts +4 -0
  161. package/lib/validators/VALIBOT.d.ts.map +1 -0
  162. package/lib/validators/VALIBOT.js +73 -0
  163. package/lib/validators/VALIBOT.js.map +1 -0
  164. package/lib/validators/VINEJS.d.ts +4 -0
  165. package/lib/validators/VINEJS.d.ts.map +1 -0
  166. package/lib/validators/VINEJS.js +64 -0
  167. package/lib/validators/VINEJS.js.map +1 -0
  168. package/lib/validators/VJF.d.ts +4 -0
  169. package/lib/validators/VJF.d.ts.map +1 -0
  170. package/lib/validators/VJF.js +92 -0
  171. package/lib/validators/VJF.js.map +1 -0
  172. package/lib/validators/YUP.d.ts +4 -0
  173. package/lib/validators/YUP.d.ts.map +1 -0
  174. package/lib/validators/YUP.js +73 -0
  175. package/lib/validators/YUP.js.map +1 -0
  176. package/lib/validators/ZOD.d.ts +4 -0
  177. package/lib/validators/ZOD.d.ts.map +1 -0
  178. package/lib/validators/ZOD.js +47 -0
  179. package/lib/validators/ZOD.js.map +1 -0
  180. package/package.json +183 -0
  181. package/src/ArrayMap.ts +165 -0
  182. package/src/Base.ts +1229 -0
  183. package/src/Bindings.ts +85 -0
  184. package/src/Field.ts +1034 -0
  185. package/src/Form.ts +264 -0
  186. package/src/Options.ts +91 -0
  187. package/src/State.ts +183 -0
  188. package/src/Validator.ts +177 -0
  189. package/src/compat.ts +104 -0
  190. package/src/composer.ts +82 -0
  191. package/src/index.ts +7 -0
  192. package/src/models/BaseInterface.ts +45 -0
  193. package/src/models/BindingsInterface.ts +25 -0
  194. package/src/models/FieldInterface.ts +97 -0
  195. package/src/models/FieldProps.ts +116 -0
  196. package/src/models/FormInterface.ts +203 -0
  197. package/src/models/OptionsInterface.ts +9 -0
  198. package/src/models/OptionsModel.ts +100 -0
  199. package/src/models/SharedActionsInterface.ts +30 -0
  200. package/src/models/SharedEventsInterface.ts +8 -0
  201. package/src/models/SharedHelpersInterface.ts +12 -0
  202. package/src/models/SharedInitializerInterface.ts +6 -0
  203. package/src/models/SharedUtilsInterface.ts +10 -0
  204. package/src/models/StateInterface.ts +44 -0
  205. package/src/models/ValidatorInterface.ts +88 -0
  206. package/src/parser.ts +327 -0
  207. package/src/props.ts +127 -0
  208. package/src/utils.ts +218 -0
  209. package/src/validators/AJV.ts +140 -0
  210. package/src/validators/DVR.ts +145 -0
  211. package/src/validators/JOI.ts +79 -0
  212. package/src/validators/VALIBOT.ts +70 -0
  213. package/src/validators/VINEJS.ts +83 -0
  214. package/src/validators/VJF.ts +123 -0
  215. package/src/validators/YUP.ts +90 -0
  216. package/src/validators/ZOD.ts +66 -0
  217. package/umd/MobxFormkit.umd.js +3093 -0
  218. package/umd/MobxFormkit.umd.js.map +1 -0
  219. package/umd/MobxFormkit.umd.min.js +2 -0
  220. package/umd/MobxFormkit.umd.min.js.map +1 -0
  221. package/umd/MobxFormkitComposer.umd.js +183 -0
  222. package/umd/MobxFormkitComposer.umd.js.map +1 -0
  223. package/umd/MobxFormkitComposer.umd.min.js +2 -0
  224. package/umd/MobxFormkitComposer.umd.min.js.map +1 -0
  225. package/umd/MobxFormkitValidatorAJV.umd.js +113 -0
  226. package/umd/MobxFormkitValidatorAJV.umd.js.map +1 -0
  227. package/umd/MobxFormkitValidatorAJV.umd.min.js +2 -0
  228. package/umd/MobxFormkitValidatorAJV.umd.min.js.map +1 -0
  229. package/umd/MobxFormkitValidatorDVR.umd.js +110 -0
  230. package/umd/MobxFormkitValidatorDVR.umd.js.map +1 -0
  231. package/umd/MobxFormkitValidatorDVR.umd.min.js +2 -0
  232. package/umd/MobxFormkitValidatorDVR.umd.min.js.map +1 -0
  233. package/umd/MobxFormkitValidatorJOI.umd.js +62 -0
  234. package/umd/MobxFormkitValidatorJOI.umd.js.map +1 -0
  235. package/umd/MobxFormkitValidatorJOI.umd.min.js +2 -0
  236. package/umd/MobxFormkitValidatorJOI.umd.min.js.map +1 -0
  237. package/umd/MobxFormkitValidatorVALIBOT.umd.js +8032 -0
  238. package/umd/MobxFormkitValidatorVALIBOT.umd.js.map +1 -0
  239. package/umd/MobxFormkitValidatorVALIBOT.umd.min.js +2 -0
  240. package/umd/MobxFormkitValidatorVALIBOT.umd.min.js.map +1 -0
  241. package/umd/MobxFormkitValidatorVINEJS.umd.js +11737 -0
  242. package/umd/MobxFormkitValidatorVINEJS.umd.js.map +1 -0
  243. package/umd/MobxFormkitValidatorVINEJS.umd.min.js +2 -0
  244. package/umd/MobxFormkitValidatorVINEJS.umd.min.js.map +1 -0
  245. package/umd/MobxFormkitValidatorVJF.umd.js +96 -0
  246. package/umd/MobxFormkitValidatorVJF.umd.js.map +1 -0
  247. package/umd/MobxFormkitValidatorVJF.umd.min.js +2 -0
  248. package/umd/MobxFormkitValidatorVJF.umd.min.js.map +1 -0
  249. package/umd/MobxFormkitValidatorYUP.umd.js +77 -0
  250. package/umd/MobxFormkitValidatorYUP.umd.js.map +1 -0
  251. package/umd/MobxFormkitValidatorYUP.umd.min.js +2 -0
  252. package/umd/MobxFormkitValidatorYUP.umd.min.js.map +1 -0
  253. package/umd/MobxFormkitValidatorZOD.umd.js +49 -0
  254. package/umd/MobxFormkitValidatorZOD.umd.js.map +1 -0
  255. package/umd/MobxFormkitValidatorZOD.umd.min.js +2 -0
  256. package/umd/MobxFormkitValidatorZOD.umd.min.js.map +1 -0
@@ -0,0 +1,64 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var vine = require('@vinejs/vine');
6
+
7
+ class VINEJS {
8
+ promises = [];
9
+ config;
10
+ state;
11
+ extend;
12
+ validator;
13
+ schema;
14
+ compiled;
15
+ constructor({ config, state = null, promises = [], }) {
16
+ this.state = state;
17
+ this.promises = promises;
18
+ this.config = config;
19
+ this.extend = config?.extend;
20
+ this.validator = config.package ?? vine;
21
+ this.schema = config.schema;
22
+ this.compiled = this.validator.compile(this.schema);
23
+ this.extendValidator();
24
+ }
25
+ extendValidator() {
26
+ if (typeof this.extend === "function") {
27
+ this.extend({
28
+ validator: this.validator,
29
+ form: this.state.form,
30
+ });
31
+ }
32
+ }
33
+ // VineJS emits dot-notation paths (e.g. 'members.0.name') which match
34
+ // the MRF field.path convention.
35
+ validate(field) {
36
+ const validationPromise = this.compiled
37
+ .validate(field.state.form.flatMapValues)
38
+ .then(() => field.setValidationAsyncData(true))
39
+ .catch((error) => this.handleAsyncFail(field, error))
40
+ .then(() => this.executeAsyncValidation(field));
41
+ this.promises.push(validationPromise);
42
+ }
43
+ handleAsyncFail(field, error) {
44
+ const messages = error?.messages ?? [];
45
+ if (!messages.length)
46
+ return;
47
+ const fieldError = messages.find((item) => item.field === field.path);
48
+ if (fieldError) {
49
+ field.setValidationAsyncData(false, fieldError.message);
50
+ }
51
+ }
52
+ executeAsyncValidation(field) {
53
+ if (field.validationAsyncData.valid === false) {
54
+ field.invalidate(field.validationAsyncData.message ?? undefined, false, true);
55
+ }
56
+ }
57
+ }
58
+ var VINEJS_default = (config) => ({
59
+ class: (VINEJS),
60
+ config,
61
+ });
62
+
63
+ exports.default = VINEJS_default;
64
+ //# sourceMappingURL=VINEJS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VINEJS.js","sources":["../../src/validators/VINEJS.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAWA,MAAM,MAAM,CAAA;IACV,QAAQ,GAAmB,EAAE;AAC7B,IAAA,MAAM;AACN,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,MAAM;AACN,IAAA,QAAQ;IAER,WAAA,CAAY,EACV,MAAM,EACN,KAAK,GAAG,IAAI,EACZ,QAAQ,GAAG,EAAE,GAC2B,EAAA;AACxC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM;QAC5B,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,IAAI,IAAI;AACvC,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;QAEnD,IAAI,CAAC,eAAe,EAAE;IACxB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC;gBACV,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAM,CAAC,IAAI;AACvB,aAAA,CAAC;QACJ;IACF;;;AAIA,IAAA,QAAQ,CAAC,KAAqB,EAAA;AAC5B,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC;aAC5B,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa;aACvC,IAAI,CAAC,MAAM,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC;AAC7C,aAAA,KAAK,CAAC,CAAC,KAAU,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;aACxD,IAAI,CAAC,MAAM,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;AAEjD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACvC;IAEA,eAAe,CAAC,KAAqB,EAAE,KAAU,EAAA;AAC/C,QAAA,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE;AAEtB,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAC9B,CAAC,IAAS,KAAK,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CACzC;QAED,IAAI,UAAU,EAAE;YACd,KAAK,CAAC,sBAAsB,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;QACzD;IACF;AAEA,IAAA,sBAAsB,CAAC,KAAqB,EAAA;QAC1C,IAAI,KAAK,CAAC,mBAAmB,CAAC,KAAK,KAAK,KAAK,EAAE;AAC7C,YAAA,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,IAAI,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC;QAC/E;IACF;AACD;AAED,qBAAe,CACb,MAA2C,MACT;IAClC,KAAK,GAAE,MAAkB,CAAA;IACzB,MAAM;AACP,CAAA,CAAC;;;;"}
@@ -0,0 +1,4 @@
1
+ import { ValidationPlugin, ValidationPluginConfig } from "../models/ValidatorInterface";
2
+ declare const _default: <TValidator = any>(config?: ValidationPluginConfig<TValidator>) => ValidationPlugin<TValidator>;
3
+ export default _default;
4
+ //# sourceMappingURL=VJF.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VJF.d.ts","sourceRoot":"","sources":["../../src/validators/VJF.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EAGvB,MAAM,8BAA8B,CAAC;yBA4GtB,UAAU,GAAG,GAAG,EAC9B,SAAS,sBAAsB,CAAC,UAAU,CAAC,KAC1C,gBAAgB,CAAC,UAAU,CAAC;AAF/B,wBAKK"}
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ function isPromise(obj) {
6
+ return (!!obj &&
7
+ typeof obj.then === "function" &&
8
+ (typeof obj === "object" || typeof obj === "function"));
9
+ }
10
+ class VJF {
11
+ promises;
12
+ config;
13
+ state;
14
+ extend;
15
+ validator;
16
+ constructor({ config, state = null, promises = [], }) {
17
+ this.state = state;
18
+ this.promises = promises;
19
+ this.config = config;
20
+ this.extend = config?.extend;
21
+ this.validator = config?.package;
22
+ this.extendValidator();
23
+ }
24
+ extendValidator() {
25
+ if (typeof this.extend === "function") {
26
+ this.extend({
27
+ validator: this.validator,
28
+ form: this.state.form,
29
+ });
30
+ }
31
+ }
32
+ validate(field) {
33
+ if (!field.validators)
34
+ return;
35
+ const validators = Array.isArray(field.validators) ? field.validators : [field.validators];
36
+ validators.forEach((fn) => this.collectData(fn, field));
37
+ this.executeValidation(field);
38
+ }
39
+ collectData(fn, field) {
40
+ const result = this.handleFunctionResult(fn, field);
41
+ if (isPromise(result)) {
42
+ const $p = result
43
+ .then(([valid, message]) => field.setValidationAsyncData(valid, message))
44
+ .then(() => this.executeAsyncValidation(field));
45
+ this.promises.push($p);
46
+ return;
47
+ }
48
+ field.validationFunctionsData.unshift({
49
+ valid: result[0],
50
+ message: result[1],
51
+ });
52
+ }
53
+ executeValidation(field) {
54
+ field.validationFunctionsData.forEach(({ valid, message }) => {
55
+ if (valid === false) {
56
+ field.invalidate(message, false);
57
+ }
58
+ });
59
+ }
60
+ executeAsyncValidation(field) {
61
+ if (field.validationAsyncData.valid === false) {
62
+ field.invalidate(field.validationAsyncData.message ?? undefined, false, true);
63
+ }
64
+ }
65
+ handleFunctionResult(fn, field) {
66
+ const result = fn({
67
+ validator: this.validator,
68
+ form: this.state.form,
69
+ field,
70
+ });
71
+ if (Array.isArray(result)) {
72
+ return [result[0] || false, result[1] || "Error"];
73
+ }
74
+ if (typeof result === 'boolean') {
75
+ return [result, "Error"];
76
+ }
77
+ if (typeof result === 'string') {
78
+ return [false, result];
79
+ }
80
+ if (isPromise(result)) {
81
+ return result;
82
+ }
83
+ return [false, "Error"];
84
+ }
85
+ }
86
+ var VJF_default = (config) => ({
87
+ class: (VJF),
88
+ config,
89
+ });
90
+
91
+ exports.default = VJF_default;
92
+ //# sourceMappingURL=VJF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VJF.js","sources":["../../src/validators/VJF.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ValidationPlugin, ValidationPluginConfig } from "../models/ValidatorInterface";
2
+ declare const _default: <TValidator = any>(config?: ValidationPluginConfig<TValidator>) => ValidationPlugin<TValidator>;
3
+ export default _default;
4
+ //# sourceMappingURL=YUP.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YUP.d.ts","sourceRoot":"","sources":["../../src/validators/YUP.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EAGvB,MAAM,8BAA8B,CAAC;yBA+EtB,UAAU,GAAG,GAAG,EAC9B,SAAS,sBAAsB,CAAC,UAAU,CAAC,KAC1C,gBAAgB,CAAC,UAAU,CAAC;AAF/B,wBAKK"}
@@ -0,0 +1,73 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ class YUP {
6
+ promises = [];
7
+ config;
8
+ state;
9
+ extend;
10
+ validator;
11
+ schema;
12
+ constructor({ config, state = null, promises = [], }) {
13
+ this.state = state;
14
+ this.promises = promises;
15
+ this.config = config;
16
+ this.extend = config?.extend;
17
+ this.validator = config.package;
18
+ this.schema = config.schema(this.validator);
19
+ this.extendValidator();
20
+ }
21
+ // Metodo per estendere il validatore
22
+ extendValidator() {
23
+ if (typeof this.extend === 'function') {
24
+ this.extend({
25
+ validator: this.validator,
26
+ form: this.state.form,
27
+ });
28
+ }
29
+ }
30
+ // Metodo di validazione principale
31
+ validate(field) {
32
+ const fieldValidationPromise = this.createValidationPromise(field);
33
+ this.promises.push(fieldValidationPromise);
34
+ }
35
+ // Creazione della promise per la validazione
36
+ createValidationPromise(field) {
37
+ return new Promise((resolve) => {
38
+ this.schema
39
+ .validateAt(field.path, this.state.form.values(), { strict: true })
40
+ .then(() => this.handleAsyncPasses(field, resolve))
41
+ .catch((error) => this.handleAsyncFails(field, resolve, error));
42
+ });
43
+ }
44
+ // Gestione dei successi della validazione asincrona
45
+ handleAsyncPasses(field, resolve) {
46
+ field.setValidationAsyncData(true);
47
+ resolve();
48
+ }
49
+ // Gestione dei fallimenti della validazione asincrona
50
+ handleAsyncFails(field, resolve, error) {
51
+ // Yup a volte restituisce errori senza path (es. array vuoti)
52
+ const isSameField = error.path === field.path || error.path === undefined;
53
+ if (isSameField) {
54
+ const message = error.message?.replace(error.path ?? field.path, field.label);
55
+ field.setValidationAsyncData(false, message);
56
+ this.executeAsyncValidation(field);
57
+ }
58
+ resolve(undefined);
59
+ }
60
+ // Esecuzione della validazione asincrona
61
+ executeAsyncValidation(field) {
62
+ if (field.validationAsyncData.valid === false) {
63
+ field.invalidate(field.validationAsyncData.message, false, true);
64
+ }
65
+ }
66
+ }
67
+ var YUP_default = (config) => ({
68
+ class: (YUP),
69
+ config,
70
+ });
71
+
72
+ exports.default = YUP_default;
73
+ //# sourceMappingURL=YUP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YUP.js","sources":["../../src/validators/YUP.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ValidationPlugin, ValidationPluginConfig } from "../models/ValidatorInterface";
2
+ declare const _default: <TValidator = any>(config?: ValidationPluginConfig<TValidator>) => ValidationPlugin<TValidator>;
3
+ export default _default;
4
+ //# sourceMappingURL=ZOD.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZOD.d.ts","sourceRoot":"","sources":["../../src/validators/ZOD.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EAGvB,MAAM,8BAA8B,CAAC;yBAkDtB,UAAU,GAAG,GAAG,EAC9B,SAAS,sBAAsB,CAAC,UAAU,CAAC,KAC1C,gBAAgB,CAAC,UAAU,CAAC;AAF/B,wBAKG"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var lodash = require('lodash');
6
+
7
+ class ZOD {
8
+ promises;
9
+ config;
10
+ state;
11
+ extend;
12
+ validator;
13
+ schema;
14
+ constructor({ config, state = null, promises = [], }) {
15
+ this.state = state;
16
+ this.promises = promises;
17
+ this.config = config;
18
+ this.extend = config?.extend;
19
+ this.validator = config.package;
20
+ this.schema = config.schema;
21
+ this.extendValidator();
22
+ }
23
+ extendValidator() {
24
+ if (typeof this.extend === "function") {
25
+ this.extend({
26
+ validator: this.validator,
27
+ form: this.state.form,
28
+ });
29
+ }
30
+ }
31
+ validate(field) {
32
+ const result = this.schema.safeParse(field.state.form.flatMapValues);
33
+ if (result.success)
34
+ return;
35
+ const fieldErrors = lodash.get(result.error.format(), field.path ?? "")?._errors;
36
+ if (fieldErrors?.length) {
37
+ field.validationErrorStack = fieldErrors;
38
+ }
39
+ }
40
+ }
41
+ var ZOD_default = (config) => ({
42
+ class: (ZOD),
43
+ config,
44
+ });
45
+
46
+ exports.default = ZOD_default;
47
+ //# sourceMappingURL=ZOD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZOD.js","sources":["../../src/validators/ZOD.ts"],"sourcesContent":[null],"names":["get"],"mappings":";;;;;;AAYA,MAAM,GAAG,CAAA;AACP,IAAA,QAAQ;AACR,IAAA,MAAM;AACN,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,MAAM;IAEN,WAAA,CAAY,EACV,MAAM,EACN,KAAK,GAAG,IAAI,EACZ,QAAQ,GAAG,EAAE,GACe,EAAA;AAC5B,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM;AAC5B,QAAA,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO;AAC/B,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAwB;QAE7C,IAAI,CAAC,eAAe,EAAE;IACxB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,UAAU,EAAE;YACrC,IAAI,CAAC,MAAM,CAAC;gBACV,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,gBAAA,IAAI,EAAE,IAAI,CAAC,KAAM,CAAC,IAAI;AACvB,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,QAAQ,CAAC,KAAqB,EAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;QAEpE,IAAI,MAAM,CAAC,OAAO;YAAE;AAEpB,QAAA,MAAM,WAAW,GAAGA,UAAG,CACpB,MAAc,CAAC,KAAK,CAAC,MAAM,EAAE,EAC9B,KAAK,CAAC,IAAI,IAAI,EAAE,CACjB,EAAE,OAAO;AAEV,QAAA,IAAI,WAAW,EAAE,MAAM,EAAE;AACvB,YAAA,KAAK,CAAC,oBAAoB,GAAG,WAAW;QAC1C;IACF;AACD;AAED,kBAAe,CACb,MAA2C,MACT;IAClC,KAAK,GAAE,GAAe,CAAA;IACtB,MAAM;AACP,CAAA,CAAC;;;;"}
package/package.json ADDED
@@ -0,0 +1,183 @@
1
+ {
2
+ "name": "mobx-formkit",
3
+ "license": "MIT",
4
+ "version": "1.0.0",
5
+ "author": "Claudio Savino <claudio.savino@me.com> (https://twitter.com/foxhound87)",
6
+ "description": "Reactive MobX Form State Management",
7
+ "homepage": "https://github.com/foxhound87/mobx-formkit#readme",
8
+ "main": "./lib/index.js",
9
+ "module": "./lib/esm/index.js",
10
+ "types": "./lib/index.d.ts",
11
+ "sideEffects": false,
12
+ "typesVersions": {
13
+ "*": {
14
+ "composer": [
15
+ "./lib/composer.d.ts"
16
+ ],
17
+ "lib/composer": [
18
+ "./lib/composer.d.ts"
19
+ ],
20
+ "validators/*": [
21
+ "./lib/validators/*.d.ts"
22
+ ],
23
+ "lib/validators/*": [
24
+ "./lib/validators/*.d.ts"
25
+ ],
26
+ "lib/utils": [
27
+ "./lib/utils.d.ts"
28
+ ]
29
+ }
30
+ },
31
+ "exports": {
32
+ ".": {
33
+ "types": "./lib/index.d.ts",
34
+ "import": "./lib/esm/index.js",
35
+ "require": "./lib/index.js"
36
+ },
37
+ "./composer": {
38
+ "types": "./lib/composer.d.ts",
39
+ "import": "./lib/esm/composer.js",
40
+ "require": "./lib/composer.js"
41
+ },
42
+ "./validators/*": {
43
+ "types": "./lib/validators/*.d.ts",
44
+ "import": "./lib/esm/validators/*.js",
45
+ "require": "./lib/validators/*.js"
46
+ },
47
+ "./lib/validators/*": {
48
+ "types": "./lib/validators/*.d.ts",
49
+ "import": "./lib/esm/validators/*.js",
50
+ "require": "./lib/validators/*.js"
51
+ },
52
+ "./lib/composer": {
53
+ "types": "./lib/composer.d.ts",
54
+ "import": "./lib/esm/composer.js",
55
+ "require": "./lib/composer.js"
56
+ },
57
+ "./lib/utils": {
58
+ "types": "./lib/utils.d.ts",
59
+ "import": "./lib/esm/utils.js",
60
+ "require": "./lib/utils.js"
61
+ }
62
+ },
63
+ "scripts": {
64
+ "clean:build": "rimraf lib && rimraf umd",
65
+ "clean:modules": "rimraf node_modules && npm cache clean",
66
+ "clean:all": "npm run clean:build && npm run clean:modules",
67
+ "lint": "eslint . --ext .ts --ignore-path .gitignore",
68
+ "build": "rollup -c rollup.config.mjs",
69
+ "prebuild": "npm run clean:build",
70
+ "precommit": "npm run lint && npm run cover",
71
+ "commit": "git-cz && git push origin",
72
+ "watch:build": "rollup -c rollup.config.mjs --watch",
73
+ "watch:test": "npm run test -- -w",
74
+ "test": "cross-env TEST=true TS_NODE_TRANSPILE_ONLY=true NODE_OPTIONS=--no-experimental-strip-types\\ --no-experimental-detect-module mocha -r ts-node/register ./tests/integration/*.ts ./tests/unit/*.ts",
75
+ "test:mobx5": "npm install --no-save --force mobx@^5.15.0 && npm test",
76
+ "cover": "nyc npm test",
77
+ "coverage:check": "nyc check-coverage --statements 95 --branches 80 --functions 86 --lines 90",
78
+ "coverage:report": "mkdir -p coverage && nyc --report-dir=coverage report --reporter=lcov > ./coverage/lcov.info",
79
+ "semantic-release": "semantic-release"
80
+ },
81
+ "repository": {
82
+ "type": "git",
83
+ "url": "git+https://github.com/foxhound87/mobx-formkit.git"
84
+ },
85
+ "bugs": {
86
+ "url": "https://github.com/foxhound87/mobx-formkit/issues"
87
+ },
88
+ "collective": {
89
+ "type": "opencollective",
90
+ "url": "https://opencollective.com/mobx-react-form"
91
+ },
92
+ "release": {
93
+ "branches": [
94
+ "master",
95
+ "next"
96
+ ]
97
+ },
98
+ "keywords": [
99
+ "form",
100
+ "mobx",
101
+ "state",
102
+ "events",
103
+ "nested",
104
+ "fields",
105
+ "bindings",
106
+ "react",
107
+ "reactive",
108
+ "validation",
109
+ "validator",
110
+ "json",
111
+ "schema",
112
+ "declarative",
113
+ "rules"
114
+ ],
115
+ "files": [
116
+ "src",
117
+ "lib",
118
+ "umd",
119
+ "AGENTS.md"
120
+ ],
121
+ "engines": {
122
+ "node": ">=18.0.0"
123
+ },
124
+ "config": {
125
+ "commitizen": {
126
+ "path": "cz-conventional-changelog"
127
+ }
128
+ },
129
+ "overrides": {
130
+ "serialize-javascript": "^7.1.0"
131
+ },
132
+ "dependencies": {
133
+ "lodash": "^4.17.24",
134
+ "lodash-es": "^4.17.24"
135
+ },
136
+ "peerDependencies": {
137
+ "mobx": "^5.15.0 || ^6.0.0 || ^7.0.0",
138
+ "zod": "^3.25.0 || ^4.0.0"
139
+ },
140
+ "peerDependenciesMeta": {
141
+ "zod": {
142
+ "optional": true
143
+ }
144
+ },
145
+ "devDependencies": {
146
+ "@rollup/plugin-alias": "^6.0.0",
147
+ "@rollup/plugin-commonjs": "^29.0.2",
148
+ "@rollup/plugin-node-resolve": "^16.0.3",
149
+ "@rollup/plugin-terser": "^1.0.0",
150
+ "@rollup/plugin-typescript": "^12.3.0",
151
+ "@types/chai": "^4.3.0",
152
+ "@types/lodash": "^4.14.178",
153
+ "@types/mocha": "^10.0.10",
154
+ "@types/node": "^17.0.18",
155
+ "@types/validator": "^13.7.1",
156
+ "@types/validatorjs": "^3.15.0",
157
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
158
+ "@typescript-eslint/parser": "^5.54.0",
159
+ "@vinejs/vine": "^4.4.0",
160
+ "ajv": "^8.0.0",
161
+ "chai": "3.5.0",
162
+ "commitizen": "^4.3.2",
163
+ "cross-env": "^5.1.4",
164
+ "cz-conventional-changelog": "^3.3.0",
165
+ "eslint": "^8.35.0",
166
+ "eslint-plugin-import": "^2.27.5",
167
+ "husky": "0.13.1",
168
+ "joi": "^17.13.3",
169
+ "mobx": "^5.15.0 || ^6.3.3 || ^7.0.0",
170
+ "mocha": "^11.8.0",
171
+ "nyc": "^17.1.0",
172
+ "rimraf": "2.5.4",
173
+ "rollup": "^4.59.0",
174
+ "semantic-release": "^24.0.0",
175
+ "ts-node": "^10.5.0",
176
+ "typescript": "^5.9.3",
177
+ "valibot": "^1.4.2",
178
+ "validator": "^13.15.20",
179
+ "validatorjs": "^3.15.1",
180
+ "yup": "^0.32.11",
181
+ "zod": "^3.25.0 || ^4.0.0"
182
+ }
183
+ }
@@ -0,0 +1,165 @@
1
+ import { observable, runInAction, IObservableArray } from "mobx";
2
+
3
+ /**
4
+ * ArrayMap: an ordered key-value collection backed by an observable array.
5
+ *
6
+ * Exposes the full ObservableMap-compatible API (get, set, has, delete,
7
+ * merge, forEach, keys, values, entries, intercept, etc.) while
8
+ * maintaining insertion order via an internal observable array.
9
+ *
10
+ * The observable array backing allows array-like operations such as
11
+ * `move(fromIndex, toIndex)` which directly re-orders entries via
12
+ * splice — fully MobX reactive.
13
+ */
14
+ export class ArrayMap<K = string, V = any> {
15
+ /** Duck-typing marker for utility code */
16
+ _isArrayMap = true;
17
+
18
+ /** Internal observable array: entries stored as [key, value] pairs */
19
+ private _entries: IObservableArray<[K, V]> = observable.array<[K, V]>([]);
20
+
21
+ constructor(entries?: [K, V][] | null) {
22
+ if (entries && entries.length > 0) {
23
+ this._entries.replace(entries);
24
+ }
25
+ }
26
+
27
+ // ------------------------------------------------------------------
28
+ // ObservableMap-compatible API
29
+ // ------------------------------------------------------------------
30
+
31
+ get size(): number {
32
+ return this._entries.length;
33
+ }
34
+
35
+ get(key: K): V | undefined {
36
+ const entry = this._entries.find(([k]) => k === key);
37
+ return entry ? entry[1] : undefined;
38
+ }
39
+
40
+ set(key: K, value: V): this {
41
+ const existing = this._entries.find(([k]) => k === key);
42
+ if (existing) {
43
+ existing[1] = value;
44
+ } else {
45
+ this._entries.push([key, value]);
46
+ }
47
+ return this;
48
+ }
49
+
50
+ has(key: K): boolean {
51
+ return this._entries.some(([k]) => k === key);
52
+ }
53
+
54
+ delete(key: K): boolean {
55
+ const index = this._entries.findIndex(([k]) => k === key);
56
+ if (index !== -1) {
57
+ this._entries.splice(index, 1);
58
+ return true;
59
+ }
60
+ return false;
61
+ }
62
+
63
+ clear(): void {
64
+ this._entries.clear();
65
+ }
66
+
67
+ keys(): IterableIterator<K> {
68
+ return this._entries.map(([k]) => k)[Symbol.iterator]();
69
+ }
70
+
71
+ values(): IterableIterator<V> {
72
+ return this._entries.map(([, v]) => v)[Symbol.iterator]();
73
+ }
74
+
75
+ entries(): IterableIterator<[K, V]> {
76
+ return this._entries[Symbol.iterator]();
77
+ }
78
+
79
+ forEach(
80
+ callbackfn: (value: V, key: K, map: this) => void,
81
+ thisArg?: any,
82
+ ): void {
83
+ this._entries.forEach(([key, value]) => {
84
+ callbackfn.call(thisArg, value, key, this);
85
+ });
86
+ }
87
+
88
+ toJSON(): { [key: string]: V } {
89
+ const result: { [key: string]: V } = {};
90
+ this._entries.forEach(([key, value]) => {
91
+ result[String(key)] = value;
92
+ });
93
+ return result;
94
+ }
95
+
96
+ toString(): string {
97
+ return `[object ArrayMap]`;
98
+ }
99
+
100
+ merge(other: any): this {
101
+ if (other && typeof other === "object") {
102
+ if (other.forEach && typeof other.forEach === "function") {
103
+ // ObservableMap or Map-like
104
+ other.forEach((value: V, key: K) => {
105
+ this.set(key, value);
106
+ });
107
+ } else if (Array.isArray(other)) {
108
+ // Array of [key, value] pairs
109
+ other.forEach(([key, value]) => {
110
+ this.set(key, value);
111
+ });
112
+ } else {
113
+ // Plain object { key: value }
114
+ Object.keys(other).forEach((key) => {
115
+ this.set(key as any, other[key]);
116
+ });
117
+ }
118
+ }
119
+ return this;
120
+ }
121
+
122
+ replace(values: any): this {
123
+ this.clear();
124
+ return this.merge(values);
125
+ }
126
+
127
+ get intercept(): any {
128
+ return (this._entries as any).intercept;
129
+ }
130
+
131
+ [Symbol.iterator](): IterableIterator<[K, V]> {
132
+ return this._entries[Symbol.iterator]();
133
+ }
134
+
135
+ // ------------------------------------------------------------------
136
+ // Array-specific methods
137
+ // ------------------------------------------------------------------
138
+
139
+ /**
140
+ * Move an entry from `fromIndex` to `toIndex`.
141
+ *
142
+ * Directly splices the internal observable array, so MobX
143
+ * tracks the change as a single array splice operation.
144
+ */
145
+ move(fromIndex: number, toIndex: number): void {
146
+ runInAction(() => {
147
+ if (fromIndex < 0 || fromIndex >= this._entries.length) return;
148
+ if (toIndex < 0 || toIndex >= this._entries.length) return;
149
+ if (fromIndex === toIndex) return;
150
+
151
+ const [entry] = this._entries.splice(fromIndex, 1);
152
+ this._entries.splice(toIndex, 0, entry);
153
+ });
154
+ }
155
+
156
+ /**
157
+ * Expose the underlying observable array for direct MobX
158
+ * observation (e.g. `observe(arr, cb)` from mobx).
159
+ */
160
+ toArray(): Array<[K, V]> {
161
+ return this._entries;
162
+ }
163
+ }
164
+
165
+ export default ArrayMap;