@mappoh/nova 0.2.3 → 0.5.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 (327) hide show
  1. package/README.md +180 -30
  2. package/dist/a11y/index.d.ts +40 -0
  3. package/dist/a11y/index.d.ts.map +1 -0
  4. package/dist/a11y/index.js +162 -0
  5. package/dist/a11y/index.js.map +1 -0
  6. package/dist/alert/alert.d.ts +32 -0
  7. package/dist/alert/alert.d.ts.map +1 -0
  8. package/dist/alert/alert.js +307 -0
  9. package/dist/alert/alert.js.map +1 -0
  10. package/dist/alert/index.d.ts +3 -0
  11. package/dist/alert/index.d.ts.map +1 -0
  12. package/dist/alert/index.js +2 -0
  13. package/dist/alert/index.js.map +1 -0
  14. package/dist/animation/flip.d.ts +28 -0
  15. package/dist/animation/flip.d.ts.map +1 -0
  16. package/dist/animation/flip.js +113 -0
  17. package/dist/animation/flip.js.map +1 -0
  18. package/dist/animation/spring.d.ts +34 -0
  19. package/dist/animation/spring.d.ts.map +1 -0
  20. package/dist/animation/spring.js +86 -0
  21. package/dist/animation/spring.js.map +1 -0
  22. package/dist/animation/stagger.d.ts +43 -0
  23. package/dist/animation/stagger.d.ts.map +1 -0
  24. package/dist/animation/stagger.js +150 -0
  25. package/dist/animation/stagger.js.map +1 -0
  26. package/dist/avatar/avatar.d.ts +27 -0
  27. package/dist/avatar/avatar.d.ts.map +1 -0
  28. package/dist/avatar/avatar.js +132 -0
  29. package/dist/avatar/avatar.js.map +1 -0
  30. package/dist/avatar/index.d.ts +3 -0
  31. package/dist/avatar/index.d.ts.map +1 -0
  32. package/dist/avatar/index.js +2 -0
  33. package/dist/avatar/index.js.map +1 -0
  34. package/dist/badge/badge.d.ts +27 -0
  35. package/dist/badge/badge.d.ts.map +1 -0
  36. package/dist/badge/badge.js +118 -0
  37. package/dist/badge/badge.js.map +1 -0
  38. package/dist/badge/index.d.ts +3 -0
  39. package/dist/badge/index.d.ts.map +1 -0
  40. package/dist/badge/index.js +2 -0
  41. package/dist/badge/index.js.map +1 -0
  42. package/dist/cache/cache.d.ts +28 -0
  43. package/dist/cache/cache.d.ts.map +1 -0
  44. package/dist/cache/cache.js +67 -0
  45. package/dist/cache/cache.js.map +1 -0
  46. package/dist/cache/index.d.ts +3 -0
  47. package/dist/cache/index.d.ts.map +1 -0
  48. package/dist/cache/index.js +2 -0
  49. package/dist/cache/index.js.map +1 -0
  50. package/dist/chart/chart.d.ts +31 -0
  51. package/dist/chart/chart.d.ts.map +1 -0
  52. package/dist/chart/chart.js +372 -0
  53. package/dist/chart/chart.js.map +1 -0
  54. package/dist/chart/index.d.ts +3 -0
  55. package/dist/chart/index.d.ts.map +1 -0
  56. package/dist/chart/index.js +2 -0
  57. package/dist/chart/index.js.map +1 -0
  58. package/dist/color-picker/color-picker.d.ts +18 -0
  59. package/dist/color-picker/color-picker.d.ts.map +1 -0
  60. package/dist/color-picker/color-picker.js +243 -0
  61. package/dist/color-picker/color-picker.js.map +1 -0
  62. package/dist/color-picker/index.d.ts +3 -0
  63. package/dist/color-picker/index.d.ts.map +1 -0
  64. package/dist/color-picker/index.js +2 -0
  65. package/dist/color-picker/index.js.map +1 -0
  66. package/dist/combobox/combobox.d.ts +26 -0
  67. package/dist/combobox/combobox.d.ts.map +1 -0
  68. package/dist/combobox/combobox.js +262 -0
  69. package/dist/combobox/combobox.js.map +1 -0
  70. package/dist/combobox/index.d.ts +3 -0
  71. package/dist/combobox/index.d.ts.map +1 -0
  72. package/dist/combobox/index.js +2 -0
  73. package/dist/combobox/index.js.map +1 -0
  74. package/dist/command-palette/command-palette.d.ts +31 -0
  75. package/dist/command-palette/command-palette.d.ts.map +1 -0
  76. package/dist/command-palette/command-palette.js +590 -0
  77. package/dist/command-palette/command-palette.js.map +1 -0
  78. package/dist/command-palette/index.d.ts +3 -0
  79. package/dist/command-palette/index.d.ts.map +1 -0
  80. package/dist/command-palette/index.js +2 -0
  81. package/dist/command-palette/index.js.map +1 -0
  82. package/dist/component/component.d.ts +20 -2
  83. package/dist/component/component.d.ts.map +1 -1
  84. package/dist/component/component.js +115 -5
  85. package/dist/component/component.js.map +1 -1
  86. package/dist/component/connect.d.ts +50 -0
  87. package/dist/component/connect.d.ts.map +1 -1
  88. package/dist/component/connect.js +135 -0
  89. package/dist/component/connect.js.map +1 -1
  90. package/dist/component/directives.d.ts +20 -0
  91. package/dist/component/directives.d.ts.map +1 -0
  92. package/dist/component/directives.js +42 -0
  93. package/dist/component/directives.js.map +1 -0
  94. package/dist/component/html.d.ts +8 -0
  95. package/dist/component/html.d.ts.map +1 -1
  96. package/dist/component/html.js +11 -0
  97. package/dist/component/html.js.map +1 -1
  98. package/dist/component/index.d.ts +9 -3
  99. package/dist/component/index.d.ts.map +1 -1
  100. package/dist/component/index.js +6 -2
  101. package/dist/component/index.js.map +1 -1
  102. package/dist/component/portal.d.ts +32 -0
  103. package/dist/component/portal.d.ts.map +1 -0
  104. package/dist/component/portal.js +59 -0
  105. package/dist/component/portal.js.map +1 -0
  106. package/dist/component/ref.d.ts +18 -0
  107. package/dist/component/ref.d.ts.map +1 -0
  108. package/dist/component/ref.js +17 -0
  109. package/dist/component/ref.js.map +1 -0
  110. package/dist/component/slot-styles.d.ts +18 -0
  111. package/dist/component/slot-styles.d.ts.map +1 -0
  112. package/dist/component/slot-styles.js +47 -0
  113. package/dist/component/slot-styles.js.map +1 -0
  114. package/dist/component/template.d.ts +2 -0
  115. package/dist/component/template.d.ts.map +1 -1
  116. package/dist/component/template.js +122 -4
  117. package/dist/component/template.js.map +1 -1
  118. package/dist/context/context.d.ts +39 -0
  119. package/dist/context/context.d.ts.map +1 -0
  120. package/dist/context/context.js +111 -0
  121. package/dist/context/context.js.map +1 -0
  122. package/dist/context/index.d.ts +3 -0
  123. package/dist/context/index.d.ts.map +1 -0
  124. package/dist/context/index.js +2 -0
  125. package/dist/context/index.js.map +1 -0
  126. package/dist/data-table/data-table.d.ts +34 -0
  127. package/dist/data-table/data-table.d.ts.map +1 -0
  128. package/dist/data-table/data-table.js +256 -0
  129. package/dist/data-table/data-table.js.map +1 -0
  130. package/dist/data-table/index.d.ts +3 -0
  131. package/dist/data-table/index.d.ts.map +1 -0
  132. package/dist/data-table/index.js +2 -0
  133. package/dist/data-table/index.js.map +1 -0
  134. package/dist/date-picker/date-picker.d.ts +22 -0
  135. package/dist/date-picker/date-picker.d.ts.map +1 -0
  136. package/dist/date-picker/date-picker.js +282 -0
  137. package/dist/date-picker/date-picker.js.map +1 -0
  138. package/dist/date-picker/index.d.ts +3 -0
  139. package/dist/date-picker/index.d.ts.map +1 -0
  140. package/dist/date-picker/index.js +2 -0
  141. package/dist/date-picker/index.js.map +1 -0
  142. package/dist/devtools/devtools.d.ts +54 -0
  143. package/dist/devtools/devtools.d.ts.map +1 -1
  144. package/dist/devtools/devtools.js +86 -0
  145. package/dist/devtools/devtools.js.map +1 -1
  146. package/dist/devtools/index.d.ts +2 -2
  147. package/dist/devtools/index.d.ts.map +1 -1
  148. package/dist/devtools/index.js +1 -1
  149. package/dist/devtools/index.js.map +1 -1
  150. package/dist/editor/editor.d.ts +40 -0
  151. package/dist/editor/editor.d.ts.map +1 -0
  152. package/dist/editor/editor.js +955 -0
  153. package/dist/editor/editor.js.map +1 -0
  154. package/dist/editor/index.d.ts +3 -0
  155. package/dist/editor/index.d.ts.map +1 -0
  156. package/dist/editor/index.js +2 -0
  157. package/dist/editor/index.js.map +1 -0
  158. package/dist/event-bus/event-bus.d.ts +20 -0
  159. package/dist/event-bus/event-bus.d.ts.map +1 -0
  160. package/dist/event-bus/event-bus.js +55 -0
  161. package/dist/event-bus/event-bus.js.map +1 -0
  162. package/dist/event-bus/index.d.ts +3 -0
  163. package/dist/event-bus/index.d.ts.map +1 -0
  164. package/dist/event-bus/index.js +2 -0
  165. package/dist/event-bus/index.js.map +1 -0
  166. package/dist/file-upload/file-upload.d.ts +24 -0
  167. package/dist/file-upload/file-upload.d.ts.map +1 -0
  168. package/dist/file-upload/file-upload.js +177 -0
  169. package/dist/file-upload/file-upload.js.map +1 -0
  170. package/dist/file-upload/index.d.ts +3 -0
  171. package/dist/file-upload/index.d.ts.map +1 -0
  172. package/dist/file-upload/index.js +2 -0
  173. package/dist/file-upload/index.js.map +1 -0
  174. package/dist/forms/form-engine.d.ts +19 -6
  175. package/dist/forms/form-engine.d.ts.map +1 -1
  176. package/dist/forms/form-engine.js +97 -11
  177. package/dist/forms/form-engine.js.map +1 -1
  178. package/dist/forms/validators.d.ts +4 -0
  179. package/dist/forms/validators.d.ts.map +1 -1
  180. package/dist/forms/validators.js +6 -0
  181. package/dist/forms/validators.js.map +1 -1
  182. package/dist/forms/wasm-validators.d.ts +19 -11
  183. package/dist/forms/wasm-validators.d.ts.map +1 -1
  184. package/dist/forms/wasm-validators.js +191 -31
  185. package/dist/forms/wasm-validators.js.map +1 -1
  186. package/dist/gesture/gesture.d.ts +2 -0
  187. package/dist/gesture/gesture.d.ts.map +1 -1
  188. package/dist/gesture/gesture.js +81 -0
  189. package/dist/gesture/gesture.js.map +1 -1
  190. package/dist/http/http.d.ts +8 -0
  191. package/dist/http/http.d.ts.map +1 -1
  192. package/dist/http/http.js +18 -4
  193. package/dist/http/http.js.map +1 -1
  194. package/dist/i18n/i18n.d.ts +6 -0
  195. package/dist/i18n/i18n.d.ts.map +1 -1
  196. package/dist/i18n/i18n.js +71 -9
  197. package/dist/i18n/i18n.js.map +1 -1
  198. package/dist/machine/index.d.ts +3 -0
  199. package/dist/machine/index.d.ts.map +1 -0
  200. package/dist/machine/index.js +2 -0
  201. package/dist/machine/index.js.map +1 -0
  202. package/dist/machine/machine.d.ts +26 -0
  203. package/dist/machine/machine.d.ts.map +1 -0
  204. package/dist/machine/machine.js +79 -0
  205. package/dist/machine/machine.js.map +1 -0
  206. package/dist/modal/modal.d.ts.map +1 -1
  207. package/dist/modal/modal.js +13 -29
  208. package/dist/modal/modal.js.map +1 -1
  209. package/dist/notification-center/index.d.ts +3 -0
  210. package/dist/notification-center/index.d.ts.map +1 -0
  211. package/dist/notification-center/index.js +2 -0
  212. package/dist/notification-center/index.js.map +1 -0
  213. package/dist/notification-center/notification-center.d.ts +55 -0
  214. package/dist/notification-center/notification-center.d.ts.map +1 -0
  215. package/dist/notification-center/notification-center.js +941 -0
  216. package/dist/notification-center/notification-center.js.map +1 -0
  217. package/dist/pagination/index.d.ts +3 -0
  218. package/dist/pagination/index.d.ts.map +1 -0
  219. package/dist/pagination/index.js +2 -0
  220. package/dist/pagination/index.js.map +1 -0
  221. package/dist/pagination/pagination.d.ts +31 -0
  222. package/dist/pagination/pagination.d.ts.map +1 -0
  223. package/dist/pagination/pagination.js +213 -0
  224. package/dist/pagination/pagination.js.map +1 -0
  225. package/dist/progress/progress.d.ts.map +1 -1
  226. package/dist/progress/progress.js +5 -7
  227. package/dist/progress/progress.js.map +1 -1
  228. package/dist/query/index.d.ts +3 -0
  229. package/dist/query/index.d.ts.map +1 -0
  230. package/dist/query/index.js +2 -0
  231. package/dist/query/index.js.map +1 -0
  232. package/dist/query/query.d.ts +31 -0
  233. package/dist/query/query.d.ts.map +1 -0
  234. package/dist/query/query.js +150 -0
  235. package/dist/query/query.js.map +1 -0
  236. package/dist/radio-group/index.d.ts +3 -0
  237. package/dist/radio-group/index.d.ts.map +1 -0
  238. package/dist/radio-group/index.js +2 -0
  239. package/dist/radio-group/index.js.map +1 -0
  240. package/dist/radio-group/radio-group.d.ts +37 -0
  241. package/dist/radio-group/radio-group.d.ts.map +1 -0
  242. package/dist/radio-group/radio-group.js +251 -0
  243. package/dist/radio-group/radio-group.js.map +1 -0
  244. package/dist/rating/index.d.ts +3 -0
  245. package/dist/rating/index.d.ts.map +1 -0
  246. package/dist/rating/index.js +2 -0
  247. package/dist/rating/index.js.map +1 -0
  248. package/dist/rating/rating.d.ts +31 -0
  249. package/dist/rating/rating.d.ts.map +1 -0
  250. package/dist/rating/rating.js +187 -0
  251. package/dist/rating/rating.js.map +1 -0
  252. package/dist/router/index.d.ts +1 -1
  253. package/dist/router/index.d.ts.map +1 -1
  254. package/dist/router/index.js +1 -1
  255. package/dist/router/index.js.map +1 -1
  256. package/dist/router/router.d.ts +30 -1
  257. package/dist/router/router.d.ts.map +1 -1
  258. package/dist/router/router.js +131 -16
  259. package/dist/router/router.js.map +1 -1
  260. package/dist/skeleton/index.d.ts +3 -0
  261. package/dist/skeleton/index.d.ts.map +1 -0
  262. package/dist/skeleton/index.js +2 -0
  263. package/dist/skeleton/index.js.map +1 -0
  264. package/dist/skeleton/skeleton.d.ts +24 -0
  265. package/dist/skeleton/skeleton.d.ts.map +1 -0
  266. package/dist/skeleton/skeleton.js +91 -0
  267. package/dist/skeleton/skeleton.js.map +1 -0
  268. package/dist/slider/index.d.ts +3 -0
  269. package/dist/slider/index.d.ts.map +1 -0
  270. package/dist/slider/index.js +2 -0
  271. package/dist/slider/index.js.map +1 -0
  272. package/dist/slider/slider.d.ts +33 -0
  273. package/dist/slider/slider.d.ts.map +1 -0
  274. package/dist/slider/slider.js +248 -0
  275. package/dist/slider/slider.js.map +1 -0
  276. package/dist/spinner/index.d.ts +3 -0
  277. package/dist/spinner/index.d.ts.map +1 -0
  278. package/dist/spinner/index.js +2 -0
  279. package/dist/spinner/index.js.map +1 -0
  280. package/dist/spinner/spinner.d.ts +23 -0
  281. package/dist/spinner/spinner.d.ts.map +1 -0
  282. package/dist/spinner/spinner.js +82 -0
  283. package/dist/spinner/spinner.js.map +1 -0
  284. package/dist/state/store.d.ts +4 -0
  285. package/dist/state/store.d.ts.map +1 -1
  286. package/dist/state/store.js +27 -7
  287. package/dist/state/store.js.map +1 -1
  288. package/dist/sw/sw.d.ts.map +1 -1
  289. package/dist/sw/sw.js +39 -7
  290. package/dist/sw/sw.js.map +1 -1
  291. package/dist/switch/index.d.ts +3 -0
  292. package/dist/switch/index.d.ts.map +1 -0
  293. package/dist/switch/index.js +2 -0
  294. package/dist/switch/index.js.map +1 -0
  295. package/dist/switch/switch.d.ts +27 -0
  296. package/dist/switch/switch.d.ts.map +1 -0
  297. package/dist/switch/switch.js +163 -0
  298. package/dist/switch/switch.js.map +1 -0
  299. package/dist/theme/index.d.ts +2 -0
  300. package/dist/theme/index.d.ts.map +1 -1
  301. package/dist/theme/index.js +1 -0
  302. package/dist/theme/index.js.map +1 -1
  303. package/dist/theme/scale.d.ts +40 -0
  304. package/dist/theme/scale.d.ts.map +1 -0
  305. package/dist/theme/scale.js +62 -0
  306. package/dist/theme/scale.js.map +1 -0
  307. package/dist/tree-view/index.d.ts +3 -0
  308. package/dist/tree-view/index.d.ts.map +1 -0
  309. package/dist/tree-view/index.js +2 -0
  310. package/dist/tree-view/index.js.map +1 -0
  311. package/dist/tree-view/tree-view.d.ts +29 -0
  312. package/dist/tree-view/tree-view.d.ts.map +1 -0
  313. package/dist/tree-view/tree-view.js +273 -0
  314. package/dist/tree-view/tree-view.js.map +1 -0
  315. package/dist/utils/index.d.ts +29 -0
  316. package/dist/utils/index.d.ts.map +1 -0
  317. package/dist/utils/index.js +114 -0
  318. package/dist/utils/index.js.map +1 -0
  319. package/dist/websocket/index.d.ts +3 -0
  320. package/dist/websocket/index.d.ts.map +1 -0
  321. package/dist/websocket/index.js +2 -0
  322. package/dist/websocket/index.js.map +1 -0
  323. package/dist/websocket/websocket.d.ts +31 -0
  324. package/dist/websocket/websocket.d.ts.map +1 -0
  325. package/dist/websocket/websocket.js +164 -0
  326. package/dist/websocket/websocket.js.map +1 -0
  327. package/package.json +135 -2
@@ -11,6 +11,7 @@ export class NovaForm {
11
11
  submitting = false;
12
12
  submitError = null;
13
13
  listeners = new Set();
14
+ asyncTimers = new Map();
14
15
  constructor(schema) {
15
16
  this.schema = schema;
16
17
  this.initFields();
@@ -20,7 +21,7 @@ export class NovaForm {
20
21
  for (const step of this.schema.steps) {
21
22
  for (const [name, field] of Object.entries(step.fields)) {
22
23
  this.fieldStates[name] = {
23
- value: field.defaultValue ?? (field.type === 'checkbox' ? false : ''),
24
+ value: field.defaultValue ?? (field.type === 'checkbox' ? false : field.type === 'array' ? [] : ''),
24
25
  error: null,
25
26
  touched: false,
26
27
  dirty: false,
@@ -63,11 +64,22 @@ export class NovaForm {
63
64
  if (!field)
64
65
  return;
65
66
  field.touched = true;
66
- this.validateField(name);
67
+ // Run sync validation immediately
68
+ const syncError = this.validateFieldSync(name);
67
69
  this.notify();
70
+ // Debounce async validators (300ms) — only if sync passed
71
+ if (!syncError) {
72
+ const schema = this.getFieldSchema(name);
73
+ if (schema?.asyncValidators?.length) {
74
+ clearTimeout(this.asyncTimers.get(name));
75
+ this.asyncTimers.set(name, setTimeout(() => {
76
+ this.runAsyncValidators(name);
77
+ }, 300));
78
+ }
79
+ }
68
80
  }
69
- /** Validate a single field */
70
- validateField(name) {
81
+ /** Run sync validators for a single field */
82
+ validateFieldSync(name) {
71
83
  const field = this.fieldStates[name];
72
84
  if (!field)
73
85
  return null;
@@ -84,6 +96,16 @@ export class NovaForm {
84
96
  // Run validators
85
97
  if (schema.validators) {
86
98
  for (const validator of schema.validators) {
99
+ // Handle cross-field validator
100
+ if ('_crossField' in validator) {
101
+ const crossFn = validator;
102
+ const error = crossFn(this.getData());
103
+ if (error) {
104
+ field.error = error;
105
+ return error;
106
+ }
107
+ continue;
108
+ }
87
109
  // Handle match validator
88
110
  if ('_matchField' in validator) {
89
111
  const matchName = validator._matchField;
@@ -104,12 +126,44 @@ export class NovaForm {
104
126
  field.error = null;
105
127
  return null;
106
128
  }
129
+ /** Run async validators for a field */
130
+ async runAsyncValidators(name) {
131
+ const field = this.fieldStates[name];
132
+ if (!field)
133
+ return null;
134
+ const schema = this.getFieldSchema(name);
135
+ if (!schema?.asyncValidators?.length)
136
+ return null;
137
+ field.validating = true;
138
+ this.notify();
139
+ for (const asyncValidator of schema.asyncValidators) {
140
+ const error = await asyncValidator(field.value);
141
+ if (error) {
142
+ field.error = error;
143
+ field.validating = false;
144
+ this.notify();
145
+ return error;
146
+ }
147
+ }
148
+ field.validating = false;
149
+ this.notify();
150
+ return null;
151
+ }
152
+ /** Validate a single field (sync + async) */
153
+ async validateField(name) {
154
+ // Clear any pending debounce
155
+ clearTimeout(this.asyncTimers.get(name));
156
+ const syncError = this.validateFieldSync(name);
157
+ if (syncError)
158
+ return syncError;
159
+ return this.runAsyncValidators(name);
160
+ }
107
161
  /** Validate all fields in the current step */
108
- validateStep() {
162
+ async validateStep() {
109
163
  const step = this.schema.steps[this.currentStep];
110
164
  let valid = true;
111
165
  for (const name of Object.keys(step.fields)) {
112
- const error = this.validateField(name);
166
+ const error = await this.validateField(name);
113
167
  if (error)
114
168
  valid = false;
115
169
  this.fieldStates[name].touched = true;
@@ -118,11 +172,11 @@ export class NovaForm {
118
172
  return valid;
119
173
  }
120
174
  /** Validate all fields across all steps */
121
- validateAll() {
175
+ async validateAll() {
122
176
  let valid = true;
123
177
  for (const step of this.schema.steps) {
124
178
  for (const name of Object.keys(step.fields)) {
125
- const error = this.validateField(name);
179
+ const error = await this.validateField(name);
126
180
  if (error)
127
181
  valid = false;
128
182
  this.fieldStates[name].touched = true;
@@ -136,8 +190,8 @@ export class NovaForm {
136
190
  return Object.values(this.fieldStates).every((f) => f.error === null);
137
191
  }
138
192
  /** Go to next step (validates current step first) */
139
- nextStep() {
140
- if (!this.validateStep())
193
+ async nextStep() {
194
+ if (!(await this.validateStep()))
141
195
  return false;
142
196
  if (this.currentStep < this.schema.steps.length - 1) {
143
197
  this.currentStep++;
@@ -164,7 +218,7 @@ export class NovaForm {
164
218
  }
165
219
  /** Submit the form */
166
220
  async submit() {
167
- if (!this.validateAll())
221
+ if (!(await this.validateAll()))
168
222
  return false;
169
223
  this.submitting = true;
170
224
  this.submitError = null;
@@ -186,6 +240,38 @@ export class NovaForm {
186
240
  return false;
187
241
  }
188
242
  }
243
+ /** Add an item to a field array */
244
+ addItem(fieldName, defaults) {
245
+ const field = this.fieldStates[fieldName];
246
+ const schema = this.getFieldSchema(fieldName);
247
+ if (!field || schema?.type !== 'array' || !schema.itemSchema)
248
+ return;
249
+ const item = {};
250
+ for (const [key, s] of Object.entries(schema.itemSchema)) {
251
+ item[key] = defaults?.[key] ?? s.defaultValue ?? '';
252
+ }
253
+ const arr = Array.isArray(field.value) ? field.value : [];
254
+ arr.push(item);
255
+ field.value = arr;
256
+ field.dirty = true;
257
+ this.notify();
258
+ }
259
+ /** Remove an item from a field array by index */
260
+ removeItem(fieldName, index) {
261
+ const field = this.fieldStates[fieldName];
262
+ if (!field || !Array.isArray(field.value))
263
+ return;
264
+ if (index < 0 || index >= field.value.length)
265
+ return;
266
+ field.value.splice(index, 1);
267
+ field.dirty = true;
268
+ this.notify();
269
+ }
270
+ /** Get items from a field array */
271
+ getItems(fieldName) {
272
+ const field = this.fieldStates[fieldName];
273
+ return Array.isArray(field?.value) ? field.value : [];
274
+ }
189
275
  /** Get all form data */
190
276
  getData() {
191
277
  const data = {};
@@ -1 +1 @@
1
- {"version":3,"file":"form-engine.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form-engine.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
@@ -15,6 +15,10 @@ export declare function maxValue(max: number, msg?: string): Validator;
15
15
  export declare function match(fieldName: string, _msg?: string): Validator & {
16
16
  _matchField: string;
17
17
  };
18
+ /** Cross-field validator — receives all form values instead of a single field value */
19
+ export declare function crossField(fn: (values: Record<string, unknown>) => string | null): Validator & {
20
+ _crossField: true;
21
+ };
18
22
  /** Run multiple validators in sequence, returning the first error */
19
23
  export declare function compose(...validators: Validator[]): Validator;
20
24
  //# sourceMappingURL=validators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/forms/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAExE,wBAAgB,QAAQ,CAAC,GAAG,SAA2B,GAAG,SAAS,CAOlE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAO9D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAO9D;AAED,wBAAgB,OAAO,CAAC,GAAG,SAAwB,GAAG,SAAS,CAM9D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAmB,GAAG,SAAS,CAKxE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAQ7D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAQ7D;AAED,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAO3F;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,GAAG,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAQ7D"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/forms/validators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAExE,wBAAgB,QAAQ,CAAC,GAAG,SAA2B,GAAG,SAAS,CAOlE;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAO9D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAO9D;AAED,wBAAgB,OAAO,CAAC,GAAG,SAAwB,GAAG,SAAS,CAM9D;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAmB,GAAG,SAAS,CAKxE;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAQ7D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAQ7D;AAED,wBAAgB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAO3F;AAED,uFAAuF;AACvF,wBAAgB,UAAU,CACxB,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,GAAG,IAAI,GACrD,SAAS,GAAG;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,CAInC;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,GAAG,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,CAQ7D"}
@@ -68,6 +68,12 @@ export function match(fieldName, _msg) {
68
68
  validator._matchField = fieldName;
69
69
  return validator;
70
70
  }
71
+ /** Cross-field validator — receives all form values instead of a single field value */
72
+ export function crossField(fn) {
73
+ const validator = ((values) => fn(values));
74
+ validator._crossField = true;
75
+ return validator;
76
+ }
71
77
  /** Run multiple validators in sequence, returning the first error */
72
78
  export function compose(...validators) {
73
79
  return (value) => {
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,UAAU,QAAQ,CAAC,GAAG,GAAG,wBAAwB;IACrD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC1G,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAY;IACjD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACpD,OAAO,GAAG,IAAI,oBAAoB,GAAG,aAAa,CAAC;QACrD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,GAAY;IACjD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACpD,OAAO,GAAG,IAAI,mBAAmB,GAAG,aAAa,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAG,GAAG,qBAAqB;IACjD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QAC1C,MAAM,EAAE,GAAG,4BAA4B,CAAC;QACxC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,GAAG,GAAG,gBAAgB;IAC3D,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACxC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAY;IAChD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YAC5B,OAAO,GAAG,IAAI,oBAAoB,GAAG,EAAE,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,GAAY;IAChD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,EAAE,CAAC;YAC5B,OAAO,GAAG,IAAI,mBAAmB,GAAG,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,SAAiB,EAAE,IAAa;IACpD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAe,EAAE,EAAE;QACrC,yDAAyD;QACzD,OAAO,IAAI,CAAC;IACd,CAAC,CAAwC,CAAC;IAC1C,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU,CACxB,EAAsD;IAEtD,MAAM,SAAS,GAAG,CAAC,CAAC,MAAe,EAAE,EAAE,CAAC,EAAE,CAAC,MAAiC,CAAC,CAAsC,CAAC;IACpH,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,GAAG,UAAuB;IAChD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACvB,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC"}
@@ -5,6 +5,10 @@
5
5
  * Augments the pure-TS validators with high-performance
6
6
  * RFC-compliant email, credit card (Luhn), IBAN, URL, and
7
7
  * phone validation plus password strength scoring.
8
+ *
9
+ * When WASM is not initialized, each validator falls back to
10
+ * a TypeScript regex-based implementation so validation still
11
+ * works without the WASM module.
8
12
  */
9
13
  import type { Validator } from './validators';
10
14
  interface CardResult {
@@ -23,37 +27,41 @@ export declare function initWasm(): Promise<void>;
23
27
  /** Check if the WASM validation module is loaded. */
24
28
  export declare function isReady(): boolean;
25
29
  /**
26
- * RFC 5322 email validator (WASM-accelerated).
27
- * Returns a Validator compatible with the forms module.
30
+ * RFC 5322 email validator.
31
+ * Uses WASM when available, otherwise falls back to TS regex.
28
32
  */
29
33
  export declare function email(msg?: string): Validator;
30
34
  /**
31
- * Credit card validator using Luhn algorithm (WASM-accelerated).
32
- * Returns null if valid, error message if invalid.
35
+ * Credit card validator using Luhn algorithm.
36
+ * Uses WASM when available, otherwise falls back to TS implementation.
33
37
  * Optionally returns issuer info via the result callback.
34
38
  */
35
39
  export declare function creditCard(msg?: string, onResult?: (result: CardResult) => void): Validator;
36
40
  /**
37
- * IBAN validator with mod-97 check (WASM-accelerated).
41
+ * IBAN validator with mod-97 check.
42
+ * Uses WASM when available, otherwise falls back to TS implementation.
38
43
  */
39
44
  export declare function iban(msg?: string): Validator;
40
45
  /**
41
- * URL validator for HTTP/HTTPS URLs (WASM-accelerated).
46
+ * URL validator for HTTP/HTTPS URLs.
47
+ * Uses WASM when available, otherwise falls back to TS URL parser.
42
48
  */
43
49
  export declare function url(msg?: string): Validator;
44
50
  /**
45
- * Phone number validator (WASM-accelerated).
51
+ * Phone number validator.
46
52
  * Validates international format (7-15 digits).
53
+ * Uses WASM when available, otherwise falls back to TS regex.
47
54
  */
48
55
  export declare function phone(msg?: string): Validator;
49
56
  /**
50
- * Password strength scorer (WASM-accelerated).
51
- * Returns null if WASM not loaded.
57
+ * Password strength scorer.
58
+ * Uses WASM when available, otherwise falls back to TS heuristic scorer.
52
59
  */
53
- export declare function checkPasswordStrength(password: string): PasswordStrengthResult | null;
60
+ export declare function checkPasswordStrength(password: string): PasswordStrengthResult;
54
61
  /**
55
- * Password strength validator (WASM-accelerated).
62
+ * Password strength validator.
56
63
  * Fails if score is below the given threshold (0-100).
64
+ * Uses WASM when available, otherwise falls back to TS heuristic scorer.
57
65
  */
58
66
  export declare function passwordStrength(minScore?: number, msg?: string): Validator;
59
67
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-validators.d.ts","sourceRoot":"","sources":["../../src/forms/wasm-validators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,UAAU,UAAU;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAcD;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAW9C;AAED,qDAAqD;AACrD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,SAA0B,GAAG,SAAS,CAM9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,GAAG,SAA+B,EAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GACtC,SAAS,CAQX;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,SAAiB,GAAG,SAAS,CAMpD;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,GAAG,SAAgB,GAAG,SAAS,CAMlD;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,SAAyB,GAAG,SAAS,CAM7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,GAAG,IAAI,CAGrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,SAAK,EACb,GAAG,SAAyB,GAC3B,SAAS,CAOX"}
1
+ {"version":3,"file":"wasm-validators.d.ts","sourceRoot":"","sources":["../../src/forms/wasm-validators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,UAAU,UAAU;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAuKD;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAW9C;AAED,qDAAqD;AACrD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,GAAG,SAA0B,GAAG,SAAS,CAM9D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,GAAG,SAA+B,EAClC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GACtC,SAAS,CAYX;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,GAAG,SAAiB,GAAG,SAAS,CAMpD;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,GAAG,SAAgB,GAAG,SAAS,CAMlD;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,GAAG,SAAyB,GAAG,SAAS,CAM7D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAG9E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,SAAK,EACb,GAAG,SAAyB,GAC3B,SAAS,CAUX"}
@@ -5,9 +5,159 @@
5
5
  * Augments the pure-TS validators with high-performance
6
6
  * RFC-compliant email, credit card (Luhn), IBAN, URL, and
7
7
  * phone validation plus password strength scoring.
8
+ *
9
+ * When WASM is not initialized, each validator falls back to
10
+ * a TypeScript regex-based implementation so validation still
11
+ * works without the WASM module.
8
12
  */
9
13
  let wasm = null;
10
14
  let initPromise = null;
15
+ /* ------------------------------------------------------------------ */
16
+ /* TypeScript fallback helpers */
17
+ /* ------------------------------------------------------------------ */
18
+ /**
19
+ * RFC 5322-ish email check.
20
+ * Intentionally more permissive than a full RFC parser but catches
21
+ * the most common mistakes (missing @, double dots, trailing dots).
22
+ */
23
+ function tsValidateEmail(email) {
24
+ const re = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$/;
25
+ return re.test(email);
26
+ }
27
+ /**
28
+ * Luhn algorithm for credit card numbers.
29
+ * Also identifies the card issuer based on the BIN prefix.
30
+ */
31
+ function tsValidateCreditCard(number) {
32
+ const digits = number.replace(/[\s-]/g, '');
33
+ if (!/^\d{12,19}$/.test(digits)) {
34
+ return { valid: false, issuer: 'unknown' };
35
+ }
36
+ // Luhn check
37
+ let sum = 0;
38
+ let double = false;
39
+ for (let i = digits.length - 1; i >= 0; i--) {
40
+ let digit = parseInt(digits[i], 10);
41
+ if (double) {
42
+ digit *= 2;
43
+ if (digit > 9)
44
+ digit -= 9;
45
+ }
46
+ sum += digit;
47
+ double = !double;
48
+ }
49
+ const valid = sum % 10 === 0;
50
+ // Simple issuer detection
51
+ let issuer = 'unknown';
52
+ if (/^4/.test(digits))
53
+ issuer = 'visa';
54
+ else if (/^5[1-5]/.test(digits) || /^2[2-7]/.test(digits))
55
+ issuer = 'mastercard';
56
+ else if (/^3[47]/.test(digits))
57
+ issuer = 'amex';
58
+ else if (/^6(?:011|5)/.test(digits))
59
+ issuer = 'discover';
60
+ return { valid, issuer };
61
+ }
62
+ /**
63
+ * IBAN validation using mod-97 (ISO 13616).
64
+ */
65
+ function tsValidateIBAN(iban) {
66
+ const cleaned = iban.replace(/\s/g, '').toUpperCase();
67
+ if (!/^[A-Z]{2}\d{2}[A-Z0-9]{4,30}$/.test(cleaned))
68
+ return false;
69
+ // Move first 4 chars to end, convert letters to numbers (A=10 … Z=35)
70
+ const rearranged = cleaned.slice(4) + cleaned.slice(0, 4);
71
+ const numericStr = rearranged
72
+ .split('')
73
+ .map((ch) => {
74
+ const code = ch.charCodeAt(0);
75
+ return code >= 65 && code <= 90 ? (code - 55).toString() : ch;
76
+ })
77
+ .join('');
78
+ // Mod-97 on a potentially very long number string
79
+ let remainder = 0;
80
+ for (const ch of numericStr) {
81
+ remainder = (remainder * 10 + parseInt(ch, 10)) % 97;
82
+ }
83
+ return remainder === 1;
84
+ }
85
+ /**
86
+ * URL validator — accepts http and https URLs.
87
+ */
88
+ function tsValidateUrl(url) {
89
+ try {
90
+ const parsed = new URL(url);
91
+ return parsed.protocol === 'http:' || parsed.protocol === 'https:';
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ /**
98
+ * Phone number validator — international format, 7-15 digits.
99
+ * Allows optional leading +, spaces, dashes, dots, and parens.
100
+ */
101
+ function tsValidatePhone(phone) {
102
+ const digits = phone.replace(/[\s\-().+]/g, '');
103
+ return /^\d{7,15}$/.test(digits);
104
+ }
105
+ /**
106
+ * Password strength scorer (TypeScript fallback).
107
+ * Returns a score 0-100 with feedback strings.
108
+ */
109
+ function tsPasswordStrength(password) {
110
+ let score = 0;
111
+ const feedback = [];
112
+ // Length scoring
113
+ if (password.length >= 8)
114
+ score += 20;
115
+ else
116
+ feedback.push('Use at least 8 characters');
117
+ if (password.length >= 12)
118
+ score += 10;
119
+ if (password.length >= 16)
120
+ score += 10;
121
+ // Character variety
122
+ if (/[a-z]/.test(password))
123
+ score += 10;
124
+ else
125
+ feedback.push('Add lowercase letters');
126
+ if (/[A-Z]/.test(password))
127
+ score += 10;
128
+ else
129
+ feedback.push('Add uppercase letters');
130
+ if (/\d/.test(password))
131
+ score += 10;
132
+ else
133
+ feedback.push('Add numbers');
134
+ if (/[^a-zA-Z0-9]/.test(password))
135
+ score += 15;
136
+ else
137
+ feedback.push('Add special characters');
138
+ // Penalty for repeated chars
139
+ if (/(.)\1{2,}/.test(password)) {
140
+ score -= 10;
141
+ feedback.push('Avoid repeated characters');
142
+ }
143
+ // Penalty for sequential runs (abc, 123)
144
+ if (/(?:abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)/i.test(password)) {
145
+ score -= 10;
146
+ feedback.push('Avoid sequential characters');
147
+ }
148
+ // Bonus for mixing categories
149
+ const categories = (/[a-z]/.test(password) ? 1 : 0) +
150
+ (/[A-Z]/.test(password) ? 1 : 0) +
151
+ (/\d/.test(password) ? 1 : 0) +
152
+ (/[^a-zA-Z0-9]/.test(password) ? 1 : 0);
153
+ if (categories >= 4)
154
+ score += 15;
155
+ score = Math.max(0, Math.min(100, score));
156
+ return { score, feedback };
157
+ }
158
+ /* ------------------------------------------------------------------ */
159
+ /* Public API */
160
+ /* ------------------------------------------------------------------ */
11
161
  /**
12
162
  * Initialize the WASM validation module.
13
163
  * Call once at app startup. Safe to call multiple times.
@@ -29,92 +179,102 @@ export function isReady() {
29
179
  return wasm !== null;
30
180
  }
31
181
  /**
32
- * RFC 5322 email validator (WASM-accelerated).
33
- * Returns a Validator compatible with the forms module.
182
+ * RFC 5322 email validator.
183
+ * Uses WASM when available, otherwise falls back to TS regex.
34
184
  */
35
185
  export function email(msg = 'Invalid email address') {
36
186
  return (value) => {
37
187
  if (typeof value !== 'string' || !value)
38
188
  return null;
39
- if (!wasm)
40
- return null; // fall through — let the TS validator handle it
41
- return wasm.validateEmail(value) ? null : msg;
189
+ if (wasm)
190
+ return wasm.validateEmail(value) ? null : msg;
191
+ return tsValidateEmail(value) ? null : msg;
42
192
  };
43
193
  }
44
194
  /**
45
- * Credit card validator using Luhn algorithm (WASM-accelerated).
46
- * Returns null if valid, error message if invalid.
195
+ * Credit card validator using Luhn algorithm.
196
+ * Uses WASM when available, otherwise falls back to TS implementation.
47
197
  * Optionally returns issuer info via the result callback.
48
198
  */
49
199
  export function creditCard(msg = 'Invalid credit card number', onResult) {
50
200
  return (value) => {
51
201
  if (typeof value !== 'string' || !value)
52
202
  return null;
53
- if (!wasm)
54
- return null;
55
- const result = wasm.validateCreditCard(value);
203
+ if (wasm) {
204
+ const result = wasm.validateCreditCard(value);
205
+ if (onResult)
206
+ onResult(result);
207
+ return result.valid ? null : msg;
208
+ }
209
+ const result = tsValidateCreditCard(value);
56
210
  if (onResult)
57
211
  onResult(result);
58
212
  return result.valid ? null : msg;
59
213
  };
60
214
  }
61
215
  /**
62
- * IBAN validator with mod-97 check (WASM-accelerated).
216
+ * IBAN validator with mod-97 check.
217
+ * Uses WASM when available, otherwise falls back to TS implementation.
63
218
  */
64
219
  export function iban(msg = 'Invalid IBAN') {
65
220
  return (value) => {
66
221
  if (typeof value !== 'string' || !value)
67
222
  return null;
68
- if (!wasm)
69
- return null;
70
- return wasm.validateIBAN(value) ? null : msg;
223
+ if (wasm)
224
+ return wasm.validateIBAN(value) ? null : msg;
225
+ return tsValidateIBAN(value) ? null : msg;
71
226
  };
72
227
  }
73
228
  /**
74
- * URL validator for HTTP/HTTPS URLs (WASM-accelerated).
229
+ * URL validator for HTTP/HTTPS URLs.
230
+ * Uses WASM when available, otherwise falls back to TS URL parser.
75
231
  */
76
232
  export function url(msg = 'Invalid URL') {
77
233
  return (value) => {
78
234
  if (typeof value !== 'string' || !value)
79
235
  return null;
80
- if (!wasm)
81
- return null;
82
- return wasm.validateUrl(value) ? null : msg;
236
+ if (wasm)
237
+ return wasm.validateUrl(value) ? null : msg;
238
+ return tsValidateUrl(value) ? null : msg;
83
239
  };
84
240
  }
85
241
  /**
86
- * Phone number validator (WASM-accelerated).
242
+ * Phone number validator.
87
243
  * Validates international format (7-15 digits).
244
+ * Uses WASM when available, otherwise falls back to TS regex.
88
245
  */
89
246
  export function phone(msg = 'Invalid phone number') {
90
247
  return (value) => {
91
248
  if (typeof value !== 'string' || !value)
92
249
  return null;
93
- if (!wasm)
94
- return null;
95
- return wasm.validatePhone(value) ? null : msg;
250
+ if (wasm)
251
+ return wasm.validatePhone(value) ? null : msg;
252
+ return tsValidatePhone(value) ? null : msg;
96
253
  };
97
254
  }
98
255
  /**
99
- * Password strength scorer (WASM-accelerated).
100
- * Returns null if WASM not loaded.
256
+ * Password strength scorer.
257
+ * Uses WASM when available, otherwise falls back to TS heuristic scorer.
101
258
  */
102
259
  export function checkPasswordStrength(password) {
103
- if (!wasm)
104
- return null;
105
- return wasm.passwordStrength(password);
260
+ if (wasm)
261
+ return wasm.passwordStrength(password);
262
+ return tsPasswordStrength(password);
106
263
  }
107
264
  /**
108
- * Password strength validator (WASM-accelerated).
265
+ * Password strength validator.
109
266
  * Fails if score is below the given threshold (0-100).
267
+ * Uses WASM when available, otherwise falls back to TS heuristic scorer.
110
268
  */
111
269
  export function passwordStrength(minScore = 50, msg = 'Password is too weak') {
112
270
  return (value) => {
113
271
  if (typeof value !== 'string' || !value)
114
272
  return null;
115
- if (!wasm)
116
- return null;
117
- const result = wasm.passwordStrength(value);
273
+ if (wasm) {
274
+ const result = wasm.passwordStrength(value);
275
+ return result.score >= minScore ? null : msg;
276
+ }
277
+ const result = tsPasswordStrength(value);
118
278
  return result.score >= minScore ? null : msg;
119
279
  };
120
280
  }
@@ -1 +1 @@
1
- {"version":3,"file":"wasm-validators.js","sourceRoot":"","sources":[""],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wasm-validators.js","sourceRoot":"","sources":[""],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuBH,IAAI,IAAI,GAAuB,IAAI,CAAC;AACpC,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C,wEAAwE;AACxE,wEAAwE;AACxE,wEAAwE;AAExE;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,EAAE,GACN,sIAAsI,CAAC;IACzI,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,MAAc;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7C,CAAC;IAED,aAAa;IACb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,GAAG,CAAC;gBAAE,KAAK,IAAI,CAAC,CAAC;QAC5B,CAAC;QACD,GAAG,IAAI,KAAK,CAAC;QACb,MAAM,GAAG,CAAC,MAAM,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7B,0BAA0B;IAC1B,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC;SAClC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,YAAY,CAAC;SAC5E,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,MAAM,CAAC;SAC3C,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,MAAM,GAAG,UAAU,CAAC;IAEzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,CAAC,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAEjE,sEAAsE;IACtE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,UAAU;SAC1B,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAChE,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,kDAAkD;IAClD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,SAAS,GAAG,CAAC,SAAS,GAAG,EAAE,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IACvD,CAAC;IACD,OAAO,SAAS,KAAK,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,QAAgB;IAC1C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,iBAAiB;IACjB,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;;QACjC,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEhD,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;IACvC,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE;QAAE,KAAK,IAAI,EAAE,CAAC;IAEvC,oBAAoB;IACpB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;;QACnC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAE5C,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;;QACnC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;;QAChC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAElC,IAAI,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;;QAC1C,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAE7C,6BAA6B;IAC7B,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,KAAK,IAAI,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC;IAED,yCAAyC;IACzC,IAAI,sIAAsI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1J,KAAK,IAAI,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/C,CAAC;IAED,8BAA8B;IAC9B,MAAM,UAAU,GACd,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,UAAU,IAAI,CAAC;QAAE,KAAK,IAAI,EAAE,CAAC;IAEjC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1C,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,wEAAwE;AACxE,wEAAwE;AACxE,wEAAwE;AAExE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,IAAI;QAAE,OAAO;IACjB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,2CAA2C;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;QACzD,IAAI,GAAG,GAA6B,CAAC;IACvC,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,OAAO;IACrB,OAAO,IAAI,KAAK,IAAI,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,GAAG,GAAG,uBAAuB;IACjD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACxD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,GAAG,GAAG,4BAA4B,EAClC,QAAuC;IAEvC,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,QAAQ;gBAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,IAAI,CAAC,GAAG,GAAG,cAAc;IACvC,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACvD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC5C,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,GAAG,CAAC,GAAG,GAAG,aAAa;IACrC,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACtD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3C,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,GAAG,GAAG,sBAAsB;IAChD,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACxD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACjD,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAQ,GAAG,EAAE,EACb,GAAG,GAAG,sBAAsB;IAE5B,OAAO,CAAC,KAAK,EAAE,EAAE;QACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QACrD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/C,CAAC;QACD,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,MAAM,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC"}