@axenstudio/axen-form 0.1.1

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 (210) hide show
  1. package/README.md +665 -0
  2. package/dist/adapters/yupAdapter.cjs +61 -0
  3. package/dist/adapters/yupAdapter.d.ts +21 -0
  4. package/dist/adapters/yupAdapter.d.ts.map +1 -0
  5. package/dist/adapters/yupAdapter.js +61 -0
  6. package/dist/adapters/zodAdapter.cjs +59 -0
  7. package/dist/adapters/zodAdapter.d.ts +22 -0
  8. package/dist/adapters/zodAdapter.d.ts.map +1 -0
  9. package/dist/adapters/zodAdapter.js +59 -0
  10. package/dist/core/dateUtils.cjs +69 -0
  11. package/dist/core/dateUtils.d.ts +28 -0
  12. package/dist/core/dateUtils.d.ts.map +1 -0
  13. package/dist/core/dateUtils.js +69 -0
  14. package/dist/core/formStore.cjs +184 -0
  15. package/dist/core/formStore.d.ts +39 -0
  16. package/dist/core/formStore.d.ts.map +1 -0
  17. package/dist/core/formStore.js +184 -0
  18. package/dist/core/numberUtils.cjs +59 -0
  19. package/dist/core/numberUtils.d.ts +26 -0
  20. package/dist/core/numberUtils.d.ts.map +1 -0
  21. package/dist/core/numberUtils.js +59 -0
  22. package/dist/core/pathUtils.cjs +44 -0
  23. package/dist/core/pathUtils.d.ts +15 -0
  24. package/dist/core/pathUtils.d.ts.map +1 -0
  25. package/dist/core/pathUtils.js +44 -0
  26. package/dist/core/payloadUtils.cjs +26 -0
  27. package/dist/core/payloadUtils.d.ts +22 -0
  28. package/dist/core/payloadUtils.d.ts.map +1 -0
  29. package/dist/core/payloadUtils.js +26 -0
  30. package/dist/core/validation.cjs +41 -0
  31. package/dist/core/validation.d.ts +7 -0
  32. package/dist/core/validation.d.ts.map +1 -0
  33. package/dist/core/validation.js +41 -0
  34. package/dist/fields/AutocompleteField/AutocompleteField.cjs +242 -0
  35. package/dist/fields/AutocompleteField/AutocompleteField.d.ts +6 -0
  36. package/dist/fields/AutocompleteField/AutocompleteField.d.ts.map +1 -0
  37. package/dist/fields/AutocompleteField/AutocompleteField.js +242 -0
  38. package/dist/fields/AutocompleteField/AutocompleteField.module.css +168 -0
  39. package/dist/fields/AutocompleteField/AutocompleteField.module.css.cjs +44 -0
  40. package/dist/fields/AutocompleteField/AutocompleteField.module.css.js +44 -0
  41. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.cjs +286 -0
  42. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.d.ts +6 -0
  43. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.d.ts.map +1 -0
  44. package/dist/fields/AutocompleteMultiField/AutocompleteMultiField.js +286 -0
  45. package/dist/fields/AutocompletePredictField/AutocompletePredictField.cjs +289 -0
  46. package/dist/fields/AutocompletePredictField/AutocompletePredictField.d.ts +10 -0
  47. package/dist/fields/AutocompletePredictField/AutocompletePredictField.d.ts.map +1 -0
  48. package/dist/fields/AutocompletePredictField/AutocompletePredictField.js +289 -0
  49. package/dist/fields/CheckboxField/CheckboxField.cjs +60 -0
  50. package/dist/fields/CheckboxField/CheckboxField.d.ts +3 -0
  51. package/dist/fields/CheckboxField/CheckboxField.d.ts.map +1 -0
  52. package/dist/fields/CheckboxField/CheckboxField.js +60 -0
  53. package/dist/fields/CheckboxField/CheckboxField.module.css +29 -0
  54. package/dist/fields/CheckboxField/CheckboxField.module.css.cjs +11 -0
  55. package/dist/fields/CheckboxField/CheckboxField.module.css.js +11 -0
  56. package/dist/fields/ColorField/ColorField.cjs +69 -0
  57. package/dist/fields/ColorField/ColorField.d.ts +3 -0
  58. package/dist/fields/ColorField/ColorField.d.ts.map +1 -0
  59. package/dist/fields/ColorField/ColorField.js +69 -0
  60. package/dist/fields/ColorField/ColorField.module.css +33 -0
  61. package/dist/fields/ColorField/ColorField.module.css.cjs +14 -0
  62. package/dist/fields/ColorField/ColorField.module.css.js +14 -0
  63. package/dist/fields/CurrencyField/CurrencyField.cjs +120 -0
  64. package/dist/fields/CurrencyField/CurrencyField.d.ts +10 -0
  65. package/dist/fields/CurrencyField/CurrencyField.d.ts.map +1 -0
  66. package/dist/fields/CurrencyField/CurrencyField.js +120 -0
  67. package/dist/fields/DateField/DateField.cjs +70 -0
  68. package/dist/fields/DateField/DateField.d.ts +7 -0
  69. package/dist/fields/DateField/DateField.d.ts.map +1 -0
  70. package/dist/fields/DateField/DateField.js +70 -0
  71. package/dist/fields/DateTimeField/DateTimeField.cjs +71 -0
  72. package/dist/fields/DateTimeField/DateTimeField.d.ts +8 -0
  73. package/dist/fields/DateTimeField/DateTimeField.d.ts.map +1 -0
  74. package/dist/fields/DateTimeField/DateTimeField.js +71 -0
  75. package/dist/fields/EmailField/EmailField.cjs +57 -0
  76. package/dist/fields/EmailField/EmailField.d.ts +3 -0
  77. package/dist/fields/EmailField/EmailField.d.ts.map +1 -0
  78. package/dist/fields/EmailField/EmailField.js +57 -0
  79. package/dist/fields/NumberField/NumberField.cjs +110 -0
  80. package/dist/fields/NumberField/NumberField.d.ts +10 -0
  81. package/dist/fields/NumberField/NumberField.d.ts.map +1 -0
  82. package/dist/fields/NumberField/NumberField.js +110 -0
  83. package/dist/fields/PasswordField/PasswordField.cjs +77 -0
  84. package/dist/fields/PasswordField/PasswordField.d.ts +3 -0
  85. package/dist/fields/PasswordField/PasswordField.d.ts.map +1 -0
  86. package/dist/fields/PasswordField/PasswordField.js +77 -0
  87. package/dist/fields/PasswordField/PasswordField.module.css +41 -0
  88. package/dist/fields/PasswordField/PasswordField.module.css.cjs +14 -0
  89. package/dist/fields/PasswordField/PasswordField.module.css.js +14 -0
  90. package/dist/fields/PhoneField/PhoneField.cjs +58 -0
  91. package/dist/fields/PhoneField/PhoneField.d.ts +3 -0
  92. package/dist/fields/PhoneField/PhoneField.d.ts.map +1 -0
  93. package/dist/fields/PhoneField/PhoneField.js +58 -0
  94. package/dist/fields/RadioField/RadioField.cjs +66 -0
  95. package/dist/fields/RadioField/RadioField.d.ts +3 -0
  96. package/dist/fields/RadioField/RadioField.d.ts.map +1 -0
  97. package/dist/fields/RadioField/RadioField.js +66 -0
  98. package/dist/fields/RadioField/RadioField.module.css +34 -0
  99. package/dist/fields/RadioField/RadioField.module.css.cjs +14 -0
  100. package/dist/fields/RadioField/RadioField.module.css.js +14 -0
  101. package/dist/fields/SelectField/SelectField.cjs +58 -0
  102. package/dist/fields/SelectField/SelectField.d.ts +3 -0
  103. package/dist/fields/SelectField/SelectField.d.ts.map +1 -0
  104. package/dist/fields/SelectField/SelectField.js +58 -0
  105. package/dist/fields/SliderField/SliderField.cjs +79 -0
  106. package/dist/fields/SliderField/SliderField.d.ts +7 -0
  107. package/dist/fields/SliderField/SliderField.d.ts.map +1 -0
  108. package/dist/fields/SliderField/SliderField.js +79 -0
  109. package/dist/fields/SliderField/SliderField.module.css +76 -0
  110. package/dist/fields/SliderField/SliderField.module.css.cjs +14 -0
  111. package/dist/fields/SliderField/SliderField.module.css.js +14 -0
  112. package/dist/fields/SwitchField/SwitchField.cjs +65 -0
  113. package/dist/fields/SwitchField/SwitchField.d.ts +3 -0
  114. package/dist/fields/SwitchField/SwitchField.d.ts.map +1 -0
  115. package/dist/fields/SwitchField/SwitchField.js +65 -0
  116. package/dist/fields/SwitchField/SwitchField.module.css +79 -0
  117. package/dist/fields/SwitchField/SwitchField.module.css.cjs +17 -0
  118. package/dist/fields/SwitchField/SwitchField.module.css.js +17 -0
  119. package/dist/fields/TextField/TextField.cjs +56 -0
  120. package/dist/fields/TextField/TextField.d.ts +3 -0
  121. package/dist/fields/TextField/TextField.d.ts.map +1 -0
  122. package/dist/fields/TextField/TextField.js +56 -0
  123. package/dist/fields/TextareaField/TextareaField.cjs +57 -0
  124. package/dist/fields/TextareaField/TextareaField.d.ts +5 -0
  125. package/dist/fields/TextareaField/TextareaField.d.ts.map +1 -0
  126. package/dist/fields/TextareaField/TextareaField.js +57 -0
  127. package/dist/fields/TimeField/TimeField.cjs +67 -0
  128. package/dist/fields/TimeField/TimeField.d.ts +6 -0
  129. package/dist/fields/TimeField/TimeField.d.ts.map +1 -0
  130. package/dist/fields/TimeField/TimeField.js +67 -0
  131. package/dist/fields/defaultComponentMap.cjs +43 -0
  132. package/dist/fields/defaultComponentMap.d.ts +7 -0
  133. package/dist/fields/defaultComponentMap.d.ts.map +1 -0
  134. package/dist/fields/defaultComponentMap.js +43 -0
  135. package/dist/fields/fieldBase.module.css +201 -0
  136. package/dist/fields/fieldBase.module.css.cjs +50 -0
  137. package/dist/fields/fieldBase.module.css.js +50 -0
  138. package/dist/fields/fieldUtils.cjs +26 -0
  139. package/dist/fields/fieldUtils.d.ts +24 -0
  140. package/dist/fields/fieldUtils.d.ts.map +1 -0
  141. package/dist/fields/fieldUtils.js +26 -0
  142. package/dist/index.cjs +99 -0
  143. package/dist/index.d.ts +42 -0
  144. package/dist/index.d.ts.map +1 -0
  145. package/dist/index.js +99 -0
  146. package/dist/layout/Box/Box.cjs +70 -0
  147. package/dist/layout/Box/Box.d.ts +6 -0
  148. package/dist/layout/Box/Box.d.ts.map +1 -0
  149. package/dist/layout/Box/Box.js +70 -0
  150. package/dist/layout/Box/Box.module.css +3 -0
  151. package/dist/layout/Box/Box.module.css.cjs +8 -0
  152. package/dist/layout/Box/Box.module.css.js +8 -0
  153. package/dist/layout/Divider/Divider.cjs +20 -0
  154. package/dist/layout/Divider/Divider.d.ts +6 -0
  155. package/dist/layout/Divider/Divider.d.ts.map +1 -0
  156. package/dist/layout/Divider/Divider.js +20 -0
  157. package/dist/layout/Divider/Divider.module.css +25 -0
  158. package/dist/layout/Divider/Divider.module.css.cjs +14 -0
  159. package/dist/layout/Divider/Divider.module.css.js +14 -0
  160. package/dist/layout/Grid/Grid.cjs +106 -0
  161. package/dist/layout/Grid/Grid.d.ts +7 -0
  162. package/dist/layout/Grid/Grid.d.ts.map +1 -0
  163. package/dist/layout/Grid/Grid.js +106 -0
  164. package/dist/layout/Grid/Grid.module.css +43 -0
  165. package/dist/layout/Grid/Grid.module.css.cjs +23 -0
  166. package/dist/layout/Grid/Grid.module.css.js +23 -0
  167. package/dist/layout/Spacer/Spacer.cjs +30 -0
  168. package/dist/layout/Spacer/Spacer.d.ts +21 -0
  169. package/dist/layout/Spacer/Spacer.d.ts.map +1 -0
  170. package/dist/layout/Spacer/Spacer.js +30 -0
  171. package/dist/layout/Stack/Stack.cjs +52 -0
  172. package/dist/layout/Stack/Stack.d.ts +7 -0
  173. package/dist/layout/Stack/Stack.d.ts.map +1 -0
  174. package/dist/layout/Stack/Stack.js +52 -0
  175. package/dist/layout/Stack/Stack.module.css +3 -0
  176. package/dist/layout/Stack/Stack.module.css.cjs +8 -0
  177. package/dist/layout/Stack/Stack.module.css.js +8 -0
  178. package/dist/layout/index.d.ts +6 -0
  179. package/dist/layout/index.d.ts.map +1 -0
  180. package/dist/react/AxenArrayField.cjs +80 -0
  181. package/dist/react/AxenArrayField.d.ts +15 -0
  182. package/dist/react/AxenArrayField.d.ts.map +1 -0
  183. package/dist/react/AxenArrayField.js +80 -0
  184. package/dist/react/AxenField.cjs +62 -0
  185. package/dist/react/AxenField.d.ts +13 -0
  186. package/dist/react/AxenField.d.ts.map +1 -0
  187. package/dist/react/AxenField.js +62 -0
  188. package/dist/react/AxenForm.cjs +134 -0
  189. package/dist/react/AxenForm.d.ts +7 -0
  190. package/dist/react/AxenForm.d.ts.map +1 -0
  191. package/dist/react/AxenForm.js +134 -0
  192. package/dist/react/FormContext.cjs +13 -0
  193. package/dist/react/FormContext.d.ts +11 -0
  194. package/dist/react/FormContext.d.ts.map +1 -0
  195. package/dist/react/FormContext.js +13 -0
  196. package/dist/react/useAxenForm.cjs +88 -0
  197. package/dist/react/useAxenForm.d.ts +8 -0
  198. package/dist/react/useAxenForm.d.ts.map +1 -0
  199. package/dist/react/useAxenForm.js +88 -0
  200. package/dist/react/useField.cjs +41 -0
  201. package/dist/react/useField.d.ts +13 -0
  202. package/dist/react/useField.d.ts.map +1 -0
  203. package/dist/react/useField.js +41 -0
  204. package/dist/react/useFieldArray.cjs +74 -0
  205. package/dist/react/useFieldArray.d.ts +5 -0
  206. package/dist/react/useFieldArray.d.ts.map +1 -0
  207. package/dist/react/useFieldArray.js +74 -0
  208. package/dist/types.d.ts +226 -0
  209. package/dist/types.d.ts.map +1 -0
  210. package/package.json +87 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formStore.d.ts","sourceRoot":"","sources":["../../src/core/formStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAO/D,MAAM,WAAW,SAAS,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC1F,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAEpC,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACvE,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAED,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrE,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC;oBA4Bb,SAAS,CAAC,OAAO,CAAC;0BAIV,UAAU,KAAG,MAAM,IAAI;2BAKtB,MAAM,YAAY,UAAU,KAAG,MAAM,IAAI;0BAgB1C,MAAM,SAAS,OAAO;4BAcpB,MAAM;0BAaR,MAAM,SAAS,MAAM,GAAG,SAAS;wBAYnC,OAAO;wBAMP,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;6BAKjB,OAAO,CAAC,OAAO,CAAC;wBAgBjB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;0BAQ3B,MAAM,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;4BAiBlC,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;0BAmCjD,MAAM,KAAG,OAAO;0BAIhB,MAAM,KAAG,MAAM,GAAG,SAAS;4BAIzB,MAAM,KAAG,OAAO;EAqBhD;AAED,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACrF,UAAU,CAAC,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC"}
@@ -0,0 +1,184 @@
1
+ import { get, set } from "./pathUtils.js";
2
+ function createFormStore(options) {
3
+ const {
4
+ initialValues,
5
+ validationAdapter,
6
+ validateOnChange = true,
7
+ validateOnBlur = true
8
+ } = options;
9
+ let state = {
10
+ values: structuredClone(initialValues),
11
+ errors: {},
12
+ touched: {},
13
+ dirty: false,
14
+ isSubmitting: false,
15
+ submitCount: 0,
16
+ initialValues: structuredClone(initialValues)
17
+ };
18
+ const subscribers = /* @__PURE__ */ new Set();
19
+ const fieldSubscribers = /* @__PURE__ */ new Map();
20
+ let validationSchema = options.validationSchema;
21
+ if (validationAdapter && options.fields && !validationSchema) {
22
+ validationSchema = validationAdapter.buildSchema(options.fields);
23
+ }
24
+ function getState() {
25
+ return state;
26
+ }
27
+ function subscribe(listener) {
28
+ subscribers.add(listener);
29
+ return () => subscribers.delete(listener);
30
+ }
31
+ function subscribeField(name, listener) {
32
+ var _a;
33
+ if (!fieldSubscribers.has(name)) {
34
+ fieldSubscribers.set(name, /* @__PURE__ */ new Set());
35
+ }
36
+ (_a = fieldSubscribers.get(name)) == null ? void 0 : _a.add(listener);
37
+ return () => {
38
+ var _a2;
39
+ return (_a2 = fieldSubscribers.get(name)) == null ? void 0 : _a2.delete(listener);
40
+ };
41
+ }
42
+ function notify() {
43
+ subscribers.forEach((fn) => fn());
44
+ }
45
+ function notifyField(name) {
46
+ var _a;
47
+ (_a = fieldSubscribers.get(name)) == null ? void 0 : _a.forEach((fn) => fn());
48
+ }
49
+ function setFieldValue(name, value) {
50
+ state = {
51
+ ...state,
52
+ values: set(state.values, name, value),
53
+ dirty: true
54
+ };
55
+ notifyField(name);
56
+ notify();
57
+ if (validateOnChange && validationAdapter && validationSchema) {
58
+ runFieldValidation(name);
59
+ }
60
+ }
61
+ function setFieldTouched(name, touched = true) {
62
+ state = {
63
+ ...state,
64
+ touched: { ...state.touched, [name]: touched }
65
+ };
66
+ notifyField(name);
67
+ notify();
68
+ if (validateOnBlur && touched && validationAdapter && validationSchema) {
69
+ runFieldValidation(name);
70
+ }
71
+ }
72
+ function setFieldError(name, error) {
73
+ const next = { ...state.errors };
74
+ if (error) {
75
+ next[name] = error;
76
+ } else {
77
+ delete next[name];
78
+ }
79
+ state = { ...state, errors: next };
80
+ notifyField(name);
81
+ notify();
82
+ }
83
+ function setValues(values) {
84
+ state = { ...state, values, dirty: true };
85
+ notify();
86
+ subscribers.forEach((fn) => fn());
87
+ }
88
+ function setErrors(errors) {
89
+ state = { ...state, errors };
90
+ notify();
91
+ }
92
+ function resetForm(nextValues) {
93
+ const newValues = nextValues ? { ...state.initialValues, ...nextValues } : structuredClone(state.initialValues);
94
+ state = {
95
+ values: newValues,
96
+ errors: {},
97
+ touched: {},
98
+ dirty: false,
99
+ isSubmitting: false,
100
+ submitCount: state.submitCount,
101
+ initialValues: state.initialValues
102
+ };
103
+ notify();
104
+ }
105
+ async function validateForm() {
106
+ if (!validationAdapter || !validationSchema) return {};
107
+ const errors = await validationAdapter.validate(validationSchema, state.values);
108
+ state = { ...state, errors };
109
+ notify();
110
+ return errors;
111
+ }
112
+ async function validateField(name) {
113
+ if (!(validationAdapter == null ? void 0 : validationAdapter.validateField) || !validationSchema) return void 0;
114
+ const fieldValue = get(state.values, name);
115
+ const error = await validationAdapter.validateField(validationSchema, name, fieldValue);
116
+ setFieldError(name, error);
117
+ return error;
118
+ }
119
+ async function runFieldValidation(name) {
120
+ if (validationAdapter == null ? void 0 : validationAdapter.validateField) {
121
+ await validateField(name);
122
+ } else {
123
+ await validateForm();
124
+ }
125
+ }
126
+ async function submitForm(onSubmit) {
127
+ state = { ...state, isSubmitting: true, submitCount: state.submitCount + 1 };
128
+ notify();
129
+ const allTouched = {};
130
+ if (options.fields) {
131
+ for (const field of options.fields) {
132
+ allTouched[field.name] = true;
133
+ }
134
+ }
135
+ state = { ...state, touched: { ...state.touched, ...allTouched } };
136
+ const errors = await validateForm();
137
+ if (Object.keys(errors).length > 0) {
138
+ state = { ...state, isSubmitting: false };
139
+ notify();
140
+ return;
141
+ }
142
+ const handler = onSubmit ?? options.onSubmit;
143
+ if (handler) {
144
+ try {
145
+ await handler(state.values);
146
+ } finally {
147
+ state = { ...state, isSubmitting: false };
148
+ notify();
149
+ }
150
+ } else {
151
+ state = { ...state, isSubmitting: false };
152
+ notify();
153
+ }
154
+ }
155
+ function getFieldValue(name) {
156
+ return get(state.values, name);
157
+ }
158
+ function getFieldError(name) {
159
+ return state.errors[name];
160
+ }
161
+ function getFieldTouched(name) {
162
+ return state.touched[name] ?? false;
163
+ }
164
+ return {
165
+ getState,
166
+ subscribe,
167
+ subscribeField,
168
+ setFieldValue,
169
+ setFieldTouched,
170
+ setFieldError,
171
+ setValues,
172
+ setErrors,
173
+ resetForm,
174
+ validateForm,
175
+ validateField,
176
+ submitForm,
177
+ getFieldValue,
178
+ getFieldError,
179
+ getFieldTouched
180
+ };
181
+ }
182
+ export {
183
+ createFormStore
184
+ };
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const DEFAULT_LOCALE = "en-US";
4
+ function formatNumber(value, options = {}) {
5
+ const {
6
+ locale = DEFAULT_LOCALE,
7
+ style = "decimal",
8
+ currency,
9
+ minimumFractionDigits = 0,
10
+ maximumFractionDigits = 10
11
+ } = options;
12
+ const formatOpts = {
13
+ style,
14
+ minimumFractionDigits,
15
+ maximumFractionDigits
16
+ };
17
+ if (style === "currency" && currency) {
18
+ formatOpts.currency = currency;
19
+ }
20
+ return new Intl.NumberFormat(locale, formatOpts).format(value);
21
+ }
22
+ function stripNonNumeric(raw, locale = DEFAULT_LOCALE) {
23
+ const decimalSep = getDecimalSeparator(locale);
24
+ const regex = new RegExp(String.raw`[^0-9\-${escapeRegex(decimalSep)}]`, "g");
25
+ const stripped = raw.replace(regex, "");
26
+ return stripped.replace(decimalSep, ".");
27
+ }
28
+ function getDecimalSeparator(locale = DEFAULT_LOCALE) {
29
+ var _a;
30
+ const parts = new Intl.NumberFormat(locale).formatToParts(1.1);
31
+ return ((_a = parts.find((p) => p.type === "decimal")) == null ? void 0 : _a.value) ?? ".";
32
+ }
33
+ function getGroupSeparator(locale = DEFAULT_LOCALE) {
34
+ var _a;
35
+ const parts = new Intl.NumberFormat(locale).formatToParts(1e3);
36
+ return ((_a = parts.find((p) => p.type === "group")) == null ? void 0 : _a.value) ?? ",";
37
+ }
38
+ function calculateCursorPosition(rawValue, formattedValue, cursorPos, locale = DEFAULT_LOCALE) {
39
+ const groupSep = getGroupSeparator(locale);
40
+ let significantBefore = 0;
41
+ for (let i = 0; i < cursorPos && i < rawValue.length; i++) {
42
+ if (rawValue[i] !== groupSep) significantBefore++;
43
+ }
44
+ let newPos = 0;
45
+ let count = 0;
46
+ for (newPos = 0; newPos < formattedValue.length; newPos++) {
47
+ if (count >= significantBefore) break;
48
+ if (formattedValue[newPos] !== groupSep) count++;
49
+ }
50
+ return newPos;
51
+ }
52
+ function escapeRegex(s) {
53
+ return s.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
54
+ }
55
+ exports.calculateCursorPosition = calculateCursorPosition;
56
+ exports.formatNumber = formatNumber;
57
+ exports.getDecimalSeparator = getDecimalSeparator;
58
+ exports.getGroupSeparator = getGroupSeparator;
59
+ exports.stripNonNumeric = stripNonNumeric;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Cursor-preserving number formatting utilities.
3
+ * Used by NumberField and CurrencyField.
4
+ */
5
+ export interface FormatNumberOptions {
6
+ locale?: string;
7
+ minimumFractionDigits?: number;
8
+ maximumFractionDigits?: number;
9
+ currency?: string;
10
+ style?: 'decimal' | 'currency';
11
+ }
12
+ /** Format a number with locale-aware thousand separators */
13
+ export declare function formatNumber(value: number, options?: FormatNumberOptions): string;
14
+ /** Strip non-numeric chars, keeping minus and decimal separator */
15
+ export declare function stripNonNumeric(raw: string, locale?: string): string;
16
+ /** Get the decimal separator for a locale */
17
+ export declare function getDecimalSeparator(locale?: string): string;
18
+ /** Get the group (thousand) separator for a locale */
19
+ export declare function getGroupSeparator(locale?: string): string;
20
+ /**
21
+ * Calculate the new cursor position after formatting.
22
+ * Counts how many non-separator chars are before the cursor in the raw string,
23
+ * then finds the same position in the formatted string.
24
+ */
25
+ export declare function calculateCursorPosition(rawValue: string, formattedValue: string, cursorPos: number, locale?: string): number;
26
+ //# sourceMappingURL=numberUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"numberUtils.d.ts","sourceRoot":"","sources":["../../src/core/numberUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;CAChC;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAoBrF;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAAuB,GAAG,MAAM,CAMpF;AAED,6CAA6C;AAC7C,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,MAAuB,GAAG,MAAM,CAG3E;AAED,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,MAAM,GAAE,MAAuB,GAAG,MAAM,CAGzE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAuB,GAC9B,MAAM,CAkBR"}
@@ -0,0 +1,59 @@
1
+ const DEFAULT_LOCALE = "en-US";
2
+ function formatNumber(value, options = {}) {
3
+ const {
4
+ locale = DEFAULT_LOCALE,
5
+ style = "decimal",
6
+ currency,
7
+ minimumFractionDigits = 0,
8
+ maximumFractionDigits = 10
9
+ } = options;
10
+ const formatOpts = {
11
+ style,
12
+ minimumFractionDigits,
13
+ maximumFractionDigits
14
+ };
15
+ if (style === "currency" && currency) {
16
+ formatOpts.currency = currency;
17
+ }
18
+ return new Intl.NumberFormat(locale, formatOpts).format(value);
19
+ }
20
+ function stripNonNumeric(raw, locale = DEFAULT_LOCALE) {
21
+ const decimalSep = getDecimalSeparator(locale);
22
+ const regex = new RegExp(String.raw`[^0-9\-${escapeRegex(decimalSep)}]`, "g");
23
+ const stripped = raw.replace(regex, "");
24
+ return stripped.replace(decimalSep, ".");
25
+ }
26
+ function getDecimalSeparator(locale = DEFAULT_LOCALE) {
27
+ var _a;
28
+ const parts = new Intl.NumberFormat(locale).formatToParts(1.1);
29
+ return ((_a = parts.find((p) => p.type === "decimal")) == null ? void 0 : _a.value) ?? ".";
30
+ }
31
+ function getGroupSeparator(locale = DEFAULT_LOCALE) {
32
+ var _a;
33
+ const parts = new Intl.NumberFormat(locale).formatToParts(1e3);
34
+ return ((_a = parts.find((p) => p.type === "group")) == null ? void 0 : _a.value) ?? ",";
35
+ }
36
+ function calculateCursorPosition(rawValue, formattedValue, cursorPos, locale = DEFAULT_LOCALE) {
37
+ const groupSep = getGroupSeparator(locale);
38
+ let significantBefore = 0;
39
+ for (let i = 0; i < cursorPos && i < rawValue.length; i++) {
40
+ if (rawValue[i] !== groupSep) significantBefore++;
41
+ }
42
+ let newPos = 0;
43
+ let count = 0;
44
+ for (newPos = 0; newPos < formattedValue.length; newPos++) {
45
+ if (count >= significantBefore) break;
46
+ if (formattedValue[newPos] !== groupSep) count++;
47
+ }
48
+ return newPos;
49
+ }
50
+ function escapeRegex(s) {
51
+ return s.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
52
+ }
53
+ export {
54
+ calculateCursorPosition,
55
+ formatNumber,
56
+ getDecimalSeparator,
57
+ getGroupSeparator,
58
+ stripNonNumeric
59
+ };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function get(obj, path, defaultValue) {
4
+ const segments = toPathArray(path);
5
+ let current = obj;
6
+ for (const segment of segments) {
7
+ if (current == null) return defaultValue;
8
+ current = current[segment];
9
+ }
10
+ return current === void 0 ? defaultValue : current;
11
+ }
12
+ function set(obj, path, value) {
13
+ const segments = toPathArray(path);
14
+ if (segments.length === 0) return obj;
15
+ const root = Array.isArray(obj) ? [...obj] : { ...obj };
16
+ let current = root;
17
+ for (let i = 0; i < segments.length - 1; i++) {
18
+ const key = segments[i];
19
+ const nextKey = segments[i + 1];
20
+ const isNextArray = /^\d+$/.test(nextKey);
21
+ if (current[key] == null) {
22
+ current[key] = isNextArray ? [] : {};
23
+ } else {
24
+ current[key] = Array.isArray(current[key]) ? [...current[key]] : { ...current[key] };
25
+ }
26
+ current = current[key];
27
+ }
28
+ const lastKey = segments.at(-1);
29
+ if (lastKey !== void 0) {
30
+ current[lastKey] = value;
31
+ }
32
+ return root;
33
+ }
34
+ function toPathArray(path) {
35
+ if (!path) return [];
36
+ return path.replaceAll(/\[(\d+)\]/g, ".$1").split(".").filter(Boolean);
37
+ }
38
+ function pathToString(segments) {
39
+ return segments.join(".");
40
+ }
41
+ exports.get = get;
42
+ exports.pathToString = pathToString;
43
+ exports.set = set;
44
+ exports.toPathArray = toPathArray;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Deep get a nested value by dot-path string.
3
+ * Supports: 'a.b.c', 'items.0.name', 'a.b[0].c'
4
+ */
5
+ export declare function get<T = unknown>(obj: unknown, path: string, defaultValue?: T): T;
6
+ /**
7
+ * Immutable set a nested value by dot-path string.
8
+ * Returns a new object with the value set at the path.
9
+ */
10
+ export declare function set<T extends Record<string, unknown>>(obj: T, path: string, value: unknown): T;
11
+ /** Convert dot-path + bracket notation to array of path segments */
12
+ export declare function toPathArray(path: string): string[];
13
+ /** Convert path segments back to dot-path string */
14
+ export declare function pathToString(segments: string[]): string;
15
+ //# sourceMappingURL=pathUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathUtils.d.ts","sourceRoot":"","sources":["../../src/core/pathUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,CAQhF;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CA2B9F;AAED,oEAAoE;AACpE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlD;AAED,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAEvD"}
@@ -0,0 +1,44 @@
1
+ function get(obj, path, defaultValue) {
2
+ const segments = toPathArray(path);
3
+ let current = obj;
4
+ for (const segment of segments) {
5
+ if (current == null) return defaultValue;
6
+ current = current[segment];
7
+ }
8
+ return current === void 0 ? defaultValue : current;
9
+ }
10
+ function set(obj, path, value) {
11
+ const segments = toPathArray(path);
12
+ if (segments.length === 0) return obj;
13
+ const root = Array.isArray(obj) ? [...obj] : { ...obj };
14
+ let current = root;
15
+ for (let i = 0; i < segments.length - 1; i++) {
16
+ const key = segments[i];
17
+ const nextKey = segments[i + 1];
18
+ const isNextArray = /^\d+$/.test(nextKey);
19
+ if (current[key] == null) {
20
+ current[key] = isNextArray ? [] : {};
21
+ } else {
22
+ current[key] = Array.isArray(current[key]) ? [...current[key]] : { ...current[key] };
23
+ }
24
+ current = current[key];
25
+ }
26
+ const lastKey = segments.at(-1);
27
+ if (lastKey !== void 0) {
28
+ current[lastKey] = value;
29
+ }
30
+ return root;
31
+ }
32
+ function toPathArray(path) {
33
+ if (!path) return [];
34
+ return path.replaceAll(/\[(\d+)\]/g, ".$1").split(".").filter(Boolean);
35
+ }
36
+ function pathToString(segments) {
37
+ return segments.join(".");
38
+ }
39
+ export {
40
+ get,
41
+ pathToString,
42
+ set,
43
+ toPathArray
44
+ };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ function mapPayload(values, fieldMap, discriminatorKey) {
4
+ if (Array.isArray(fieldMap)) {
5
+ return pickFields(values, fieldMap);
6
+ }
7
+ if (!discriminatorKey) return values;
8
+ const discriminatorValue = values[discriminatorKey];
9
+ if (typeof discriminatorValue !== "string") return values;
10
+ const allowedFields = fieldMap[discriminatorValue];
11
+ if (!allowedFields) return values;
12
+ return pickFields(values, allowedFields);
13
+ }
14
+ function pickFields(values, fields) {
15
+ return Object.fromEntries(
16
+ fields.filter((key) => key in values).map((key) => [key, values[key]])
17
+ );
18
+ }
19
+ function getStrippedFields(values, fieldMap, discriminatorKey) {
20
+ const payload = mapPayload(values, fieldMap, discriminatorKey);
21
+ const payloadKeys = new Set(Object.keys(payload));
22
+ return Object.keys(values).filter((key) => !payloadKeys.has(key));
23
+ }
24
+ exports.getStrippedFields = getStrippedFields;
25
+ exports.mapPayload = mapPayload;
26
+ exports.pickFields = pickFields;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Whitelist-payload filter utility.
3
+ * Strips fields not in the whitelist before submitting to API.
4
+ */
5
+ /**
6
+ * Filter values to only include fields in the whitelist.
7
+ * Uses a discriminator field to determine which whitelist to use (dynamic mode).
8
+ *
9
+ * @param values - All form values
10
+ * @param fieldMap - Static whitelist (string[]) or dynamic per-discriminator (Record<string, string[]>)
11
+ * @param discriminatorKey - Key of the discriminator field (for dynamic mode)
12
+ * @returns Filtered values containing only whitelisted fields
13
+ */
14
+ export declare function mapPayload<T extends Record<string, unknown>>(values: T, fieldMap: string[] | Record<string, string[]>, discriminatorKey?: string): Partial<T>;
15
+ /** Pick only the specified fields from an object */
16
+ export declare function pickFields<T extends Record<string, unknown>>(values: T, fields: string[]): Partial<T>;
17
+ /**
18
+ * Get the list of fields that were stripped from the payload.
19
+ * Useful for debugging / UI display.
20
+ */
21
+ export declare function getStrippedFields<T extends Record<string, unknown>>(values: T, fieldMap: string[] | Record<string, string[]>, discriminatorKey?: string): string[];
22
+ //# sourceMappingURL=payloadUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payloadUtils.d.ts","sourceRoot":"","sources":["../../src/core/payloadUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,CAAC,CAAC,CAgBZ;AAED,oDAAoD;AACpD,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,CAAC,CAAC,CAIZ;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,MAAM,EAAE,CAAC,EACT,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAC7C,gBAAgB,CAAC,EAAE,MAAM,GACxB,MAAM,EAAE,CAIV"}
@@ -0,0 +1,26 @@
1
+ function mapPayload(values, fieldMap, discriminatorKey) {
2
+ if (Array.isArray(fieldMap)) {
3
+ return pickFields(values, fieldMap);
4
+ }
5
+ if (!discriminatorKey) return values;
6
+ const discriminatorValue = values[discriminatorKey];
7
+ if (typeof discriminatorValue !== "string") return values;
8
+ const allowedFields = fieldMap[discriminatorValue];
9
+ if (!allowedFields) return values;
10
+ return pickFields(values, allowedFields);
11
+ }
12
+ function pickFields(values, fields) {
13
+ return Object.fromEntries(
14
+ fields.filter((key) => key in values).map((key) => [key, values[key]])
15
+ );
16
+ }
17
+ function getStrippedFields(values, fieldMap, discriminatorKey) {
18
+ const payload = mapPayload(values, fieldMap, discriminatorKey);
19
+ const payloadKeys = new Set(Object.keys(payload));
20
+ return Object.keys(values).filter((key) => !payloadKeys.has(key));
21
+ }
22
+ export {
23
+ getStrippedFields,
24
+ mapPayload,
25
+ pickFields
26
+ };
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const simpleValidator = {
4
+ buildSchema(fields) {
5
+ return fields.filter((f) => f.required).map((f) => ({
6
+ name: f.name,
7
+ message: f.requiredMessage ?? `${f.label ?? f.name} is required`,
8
+ type: f.type
9
+ }));
10
+ },
11
+ async validate(schema, values) {
12
+ const rules = schema;
13
+ const errors = {};
14
+ for (const rule of rules) {
15
+ const value = getNestedValue(values, rule.name);
16
+ if (isEmpty(value)) {
17
+ errors[rule.name] = rule.message;
18
+ }
19
+ }
20
+ return errors;
21
+ },
22
+ async validateField(schema, name, value) {
23
+ const rules = schema;
24
+ const rule = rules.find((r) => r.name === name);
25
+ if (!rule) return void 0;
26
+ return isEmpty(value) ? rule.message : void 0;
27
+ }
28
+ };
29
+ function isEmpty(value) {
30
+ if (value == null) return true;
31
+ if (typeof value === "string") return value.trim() === "";
32
+ if (Array.isArray(value)) return value.length === 0;
33
+ return false;
34
+ }
35
+ function getNestedValue(obj, path) {
36
+ return path.split(".").reduce((acc, key) => {
37
+ if (acc == null) return void 0;
38
+ return acc[key];
39
+ }, obj);
40
+ }
41
+ exports.simpleValidator = simpleValidator;
@@ -0,0 +1,7 @@
1
+ import { ValidationAdapter } from '../types';
2
+ /**
3
+ * Built-in simple validator — validates required fields only.
4
+ * No external library dependency.
5
+ */
6
+ export declare const simpleValidator: ValidationAdapter;
7
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/core/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE/D;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,iBA+B7B,CAAC"}
@@ -0,0 +1,41 @@
1
+ const simpleValidator = {
2
+ buildSchema(fields) {
3
+ return fields.filter((f) => f.required).map((f) => ({
4
+ name: f.name,
5
+ message: f.requiredMessage ?? `${f.label ?? f.name} is required`,
6
+ type: f.type
7
+ }));
8
+ },
9
+ async validate(schema, values) {
10
+ const rules = schema;
11
+ const errors = {};
12
+ for (const rule of rules) {
13
+ const value = getNestedValue(values, rule.name);
14
+ if (isEmpty(value)) {
15
+ errors[rule.name] = rule.message;
16
+ }
17
+ }
18
+ return errors;
19
+ },
20
+ async validateField(schema, name, value) {
21
+ const rules = schema;
22
+ const rule = rules.find((r) => r.name === name);
23
+ if (!rule) return void 0;
24
+ return isEmpty(value) ? rule.message : void 0;
25
+ }
26
+ };
27
+ function isEmpty(value) {
28
+ if (value == null) return true;
29
+ if (typeof value === "string") return value.trim() === "";
30
+ if (Array.isArray(value)) return value.length === 0;
31
+ return false;
32
+ }
33
+ function getNestedValue(obj, path) {
34
+ return path.split(".").reduce((acc, key) => {
35
+ if (acc == null) return void 0;
36
+ return acc[key];
37
+ }, obj);
38
+ }
39
+ export {
40
+ simpleValidator
41
+ };