peryl 1.5.2 → 1.5.3

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 (184) hide show
  1. package/README.md +30 -16
  2. package/demo/hsml-app-form-validation_demo.ts +22 -23
  3. package/demo/hsml-app-form_demo.ts +24 -20
  4. package/demo/hsml-app-test_demo.ts +35 -36
  5. package/demo/hsml-app-tictactoe_demo.ts +16 -15
  6. package/demo/hsml-app_demo.ts +20 -12
  7. package/demo/hsml-appel_demo.html +7 -0
  8. package/demo/hsml-appel_demo.ts +33 -25
  9. package/demo/hsml-appi_demo.ts +9 -9
  10. package/demo/hsml_demo.ts +27 -22
  11. package/demo/js/hsml-app-js-happi_demo.html +16 -8
  12. package/demo/js/hsml-app-js_demo.html +15 -15
  13. package/dist/browser-esmodule/encode.js.map +1 -1
  14. package/dist/browser-esmodule/hsml-app.js +67 -73
  15. package/dist/browser-esmodule/hsml-app.js.map +1 -1
  16. package/dist/browser-esmodule/hsml-convert.js.map +1 -1
  17. package/dist/browser-esmodule/hsml-dom.js +3 -3
  18. package/dist/browser-esmodule/hsml-dom.js.map +1 -1
  19. package/dist/browser-esmodule/hsml-h.js.map +1 -1
  20. package/dist/browser-esmodule/hsml-html.js +2 -2
  21. package/dist/browser-esmodule/hsml-html.js.map +1 -1
  22. package/dist/browser-esmodule/hsml-idom.js +5 -5
  23. package/dist/browser-esmodule/hsml-idom.js.map +1 -1
  24. package/dist/browser-esmodule/hsml.js.map +1 -1
  25. package/dist/browser-esmodule/http.js.map +1 -1
  26. package/dist/browser-esmodule/index.js +71 -77
  27. package/dist/browser-esmodule/index.js.map +1 -1
  28. package/dist/browser-esmodule/router.js.map +1 -1
  29. package/dist/browser-umd/encode.js +1 -1
  30. package/dist/browser-umd/encode.js.map +1 -1
  31. package/dist/browser-umd/hsml-app.js +1 -1
  32. package/dist/browser-umd/hsml-app.js.map +1 -1
  33. package/dist/browser-umd/hsml-convert.js.map +1 -1
  34. package/dist/browser-umd/hsml-dom.js +1 -1
  35. package/dist/browser-umd/hsml-dom.js.map +1 -1
  36. package/dist/browser-umd/hsml-h.js.map +1 -1
  37. package/dist/browser-umd/hsml-html.js +1 -1
  38. package/dist/browser-umd/hsml-html.js.map +1 -1
  39. package/dist/browser-umd/hsml-idom.js +1 -1
  40. package/dist/browser-umd/hsml-idom.js.map +1 -1
  41. package/dist/browser-umd/hsml.js.map +1 -1
  42. package/dist/browser-umd/http.js +1 -1
  43. package/dist/browser-umd/http.js.map +1 -1
  44. package/dist/browser-umd/index.js +1 -1
  45. package/dist/browser-umd/index.js.map +1 -1
  46. package/dist/browser-umd/router.js +1 -1
  47. package/dist/browser-umd/router.js.map +1 -1
  48. package/dist/browser-umd/validators-moment.js +1 -1
  49. package/dist/browser-umd/validators-moment.js.map +1 -1
  50. package/dist/browser-umd/validators-numeral.js.map +1 -1
  51. package/dist/demo/encode_demo.ce182166.js.map +1 -1
  52. package/dist/demo/encode_demo.f40a44eb.js.map +1 -1
  53. package/dist/demo/hsml-app-form-validation_demo.a9e2c583.js +2 -0
  54. package/dist/demo/hsml-app-form-validation_demo.a9e2c583.js.map +1 -0
  55. package/dist/demo/hsml-app-form-validation_demo.bb392ab0.js +2 -0
  56. package/dist/demo/hsml-app-form-validation_demo.bb392ab0.js.map +1 -0
  57. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js +2 -0
  58. package/dist/demo/hsml-app-form-validation_demo.c6856b02.js.map +1 -0
  59. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js +2 -0
  60. package/dist/demo/hsml-app-form-validation_demo.fdcc0b2d.js.map +1 -0
  61. package/dist/demo/hsml-app-form-validation_demo.html +1 -1
  62. package/dist/demo/hsml-app-form_demo.e36ef1e9.js +2 -0
  63. package/dist/demo/hsml-app-form_demo.e36ef1e9.js.map +1 -0
  64. package/dist/demo/hsml-app-form_demo.fd22dfcf.js +2 -0
  65. package/dist/demo/hsml-app-form_demo.fd22dfcf.js.map +1 -0
  66. package/dist/demo/hsml-app-form_demo.html +1 -1
  67. package/dist/demo/hsml-app-test_demo.ba5f166c.js +2 -0
  68. package/dist/demo/hsml-app-test_demo.ba5f166c.js.map +1 -0
  69. package/dist/demo/hsml-app-test_demo.e8b5e4b2.js +2 -0
  70. package/dist/demo/hsml-app-test_demo.e8b5e4b2.js.map +1 -0
  71. package/dist/demo/hsml-app-test_demo.html +1 -1
  72. package/dist/demo/hsml-app-tictactoe_demo.03d8363f.js +2 -0
  73. package/dist/demo/hsml-app-tictactoe_demo.03d8363f.js.map +1 -0
  74. package/dist/demo/hsml-app-tictactoe_demo.399f8e69.js +2 -0
  75. package/dist/demo/hsml-app-tictactoe_demo.399f8e69.js.map +1 -0
  76. package/dist/demo/hsml-app-tictactoe_demo.html +1 -1
  77. package/dist/demo/hsml-app_demo.44aa1072.js +2 -0
  78. package/dist/demo/hsml-app_demo.44aa1072.js.map +1 -0
  79. package/dist/demo/hsml-app_demo.70ef3e7a.js +2 -0
  80. package/dist/demo/hsml-app_demo.70ef3e7a.js.map +1 -0
  81. package/dist/demo/hsml-app_demo.html +1 -1
  82. package/dist/demo/hsml-appel_demo.2a9f7f3f.js +2 -0
  83. package/dist/demo/hsml-appel_demo.2a9f7f3f.js.map +1 -0
  84. package/dist/demo/hsml-appel_demo.bea7849a.js +2 -0
  85. package/dist/demo/hsml-appel_demo.bea7849a.js.map +1 -0
  86. package/dist/demo/hsml-appel_demo.html +1 -1
  87. package/dist/demo/hsml-appi_demo.3dc5de90.js +2 -0
  88. package/dist/demo/hsml-appi_demo.3dc5de90.js.map +1 -0
  89. package/dist/demo/hsml-appi_demo.bfc7056a.js +2 -0
  90. package/dist/demo/hsml-appi_demo.bfc7056a.js.map +1 -0
  91. package/dist/demo/hsml-appi_demo.html +1 -1
  92. package/dist/demo/hsml-convert_demo.0ea1fa3b.js.map +1 -1
  93. package/dist/demo/hsml-convert_demo.63e3e7b5.js.map +1 -1
  94. package/dist/demo/{hsml_demo.ff950ba1.js → hsml_demo.a248689a.js} +2 -2
  95. package/dist/demo/hsml_demo.a248689a.js.map +1 -0
  96. package/dist/demo/hsml_demo.eb3b08be.js +2 -0
  97. package/dist/demo/hsml_demo.eb3b08be.js.map +1 -0
  98. package/dist/demo/hsml_demo.html +1 -1
  99. package/dist/demo/http_demo.3e7da3d8.js.map +1 -1
  100. package/dist/demo/http_demo.8e435f23.js.map +1 -1
  101. package/dist/demo/i18n_demo.html +1 -1
  102. package/dist/demo/router_demo.3cfa03aa.js.map +1 -1
  103. package/dist/demo/router_demo.89ab1681.js.map +1 -1
  104. package/dist/demo/{validators_demo.252e13a6.js → validators_demo.90ff6001.js} +2 -2
  105. package/dist/demo/validators_demo.90ff6001.js.map +1 -0
  106. package/dist/demo/{validators_demo.66893723.js → validators_demo.ef5b2dea.js} +2 -2
  107. package/dist/demo/validators_demo.ef5b2dea.js.map +1 -0
  108. package/dist/demo/validators_demo.html +1 -1
  109. package/dist/encode.js +1 -1
  110. package/dist/encode.js.map +1 -1
  111. package/dist/hsml-app.d.ts +38 -37
  112. package/dist/hsml-app.js +60 -62
  113. package/dist/hsml-app.js.map +1 -1
  114. package/dist/hsml-convert.d.ts +3 -3
  115. package/dist/hsml-convert.js.map +1 -1
  116. package/dist/hsml-dom.d.ts +2 -2
  117. package/dist/hsml-dom.js +3 -3
  118. package/dist/hsml-dom.js.map +1 -1
  119. package/dist/hsml-h.d.ts +8 -8
  120. package/dist/hsml-h.js.map +1 -1
  121. package/dist/hsml-html.d.ts +4 -4
  122. package/dist/hsml-html.js +2 -2
  123. package/dist/hsml-html.js.map +1 -1
  124. package/dist/hsml-idom.d.ts +2 -2
  125. package/dist/hsml-idom.js +5 -5
  126. package/dist/hsml-idom.js.map +1 -1
  127. package/dist/hsml.d.ts +26 -27
  128. package/dist/hsml.js.map +1 -1
  129. package/dist/http.js +1 -1
  130. package/dist/http.js.map +1 -1
  131. package/dist/router.js +1 -1
  132. package/dist/router.js.map +1 -1
  133. package/package.json +8 -8
  134. package/src/hsml-app.ts +209 -144
  135. package/src/hsml-convert.ts +8 -8
  136. package/src/hsml-dom.ts +18 -18
  137. package/src/hsml-h.ts +10 -10
  138. package/src/hsml-html.ts +19 -19
  139. package/src/hsml-idom.ts +25 -25
  140. package/src/hsml.ts +46 -143
  141. package/demo/hsml-appc_demo.html +0 -16
  142. package/demo/hsml-appc_demo.ts +0 -49
  143. package/dist/demo/hsml-app-form-validation_demo.0b03b743.js +0 -2
  144. package/dist/demo/hsml-app-form-validation_demo.0b03b743.js.map +0 -1
  145. package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js +0 -2
  146. package/dist/demo/hsml-app-form-validation_demo.b3a5c810.js.map +0 -1
  147. package/dist/demo/hsml-app-form-validation_demo.d3925067.js +0 -2
  148. package/dist/demo/hsml-app-form-validation_demo.d3925067.js.map +0 -1
  149. package/dist/demo/hsml-app-form-validation_demo.f757d763.js +0 -2
  150. package/dist/demo/hsml-app-form-validation_demo.f757d763.js.map +0 -1
  151. package/dist/demo/hsml-app-form_demo.007ffcaa.js +0 -2
  152. package/dist/demo/hsml-app-form_demo.007ffcaa.js.map +0 -1
  153. package/dist/demo/hsml-app-form_demo.a034239d.js +0 -2
  154. package/dist/demo/hsml-app-form_demo.a034239d.js.map +0 -1
  155. package/dist/demo/hsml-app-test_demo.35c14dc9.js +0 -2
  156. package/dist/demo/hsml-app-test_demo.35c14dc9.js.map +0 -1
  157. package/dist/demo/hsml-app-test_demo.3c7e16ae.js +0 -2
  158. package/dist/demo/hsml-app-test_demo.3c7e16ae.js.map +0 -1
  159. package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js +0 -2
  160. package/dist/demo/hsml-app-tictactoe_demo.5f4861c1.js.map +0 -1
  161. package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js +0 -2
  162. package/dist/demo/hsml-app-tictactoe_demo.7deeabad.js.map +0 -1
  163. package/dist/demo/hsml-app_demo.87d83c29.js +0 -2
  164. package/dist/demo/hsml-app_demo.87d83c29.js.map +0 -1
  165. package/dist/demo/hsml-app_demo.941a13a6.js +0 -2
  166. package/dist/demo/hsml-app_demo.941a13a6.js.map +0 -1
  167. package/dist/demo/hsml-appc_demo.0234ff15.js +0 -2
  168. package/dist/demo/hsml-appc_demo.0234ff15.js.map +0 -1
  169. package/dist/demo/hsml-appc_demo.f5783031.js +0 -2
  170. package/dist/demo/hsml-appc_demo.f5783031.js.map +0 -1
  171. package/dist/demo/hsml-appc_demo.html +0 -1
  172. package/dist/demo/hsml-appel_demo.0e8a4d4c.js +0 -2
  173. package/dist/demo/hsml-appel_demo.0e8a4d4c.js.map +0 -1
  174. package/dist/demo/hsml-appel_demo.1a5c2c26.js +0 -2
  175. package/dist/demo/hsml-appel_demo.1a5c2c26.js.map +0 -1
  176. package/dist/demo/hsml-appi_demo.2c3fb511.js +0 -2
  177. package/dist/demo/hsml-appi_demo.2c3fb511.js.map +0 -1
  178. package/dist/demo/hsml-appi_demo.427fdebd.js +0 -2
  179. package/dist/demo/hsml-appi_demo.427fdebd.js.map +0 -1
  180. package/dist/demo/hsml_demo.33f28c29.js +0 -2
  181. package/dist/demo/hsml_demo.33f28c29.js.map +0 -1
  182. package/dist/demo/hsml_demo.ff950ba1.js.map +0 -1
  183. package/dist/demo/validators_demo.252e13a6.js.map +0 -1
  184. package/dist/demo/validators_demo.66893723.js.map +0 -1
package/src/hsml.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  // HSML tag head format "tag#id.class1.class2~handler"
2
2
 
3
- export type HTagHeadName = keyof HTMLElementTagNameMap;
3
+ export type HTagHeadName = keyof HTMLElementTagNameMap | `${string}${"-"}${string}`;
4
4
  export type HTagHeadAttr = "." | "#" | "~";
5
5
 
6
6
  export type HTagHead<T extends string = string> = `${HTagHeadName}` | `${HTagHeadName}${HTagHeadAttr}${T}`;
@@ -22,8 +22,6 @@ export type HAttrData = {
22
22
  | Object;
23
23
  };
24
24
 
25
- export type HAttrOnAction = string;
26
-
27
25
  export type HAttrOnDataFnc = (e: Event) => any;
28
26
 
29
27
  export type HAttrOnData =
@@ -41,25 +39,25 @@ export type HAttrOnData =
41
39
 
42
40
  export type HAttrOnCb = [keyof HTMLElementEventMap, EventListener];
43
41
 
44
- export type HAttrOnAct = [
42
+ export type HAttrOnAct<HAttrOnActType extends string> = [
45
43
  keyof HTMLElementEventMap | string,
46
- HAttrOnAction,
44
+ HAttrOnActType,
47
45
  HAttrOnData?
48
46
  ];
49
47
 
50
- export type HAttrOn = HAttrOnCb | HAttrOnAct | Array<HAttrOnCb | HAttrOnAct>;
48
+ export type HAttrOn<HAttrOnActType extends string> = HAttrOnCb | HAttrOnAct<HAttrOnActType> | Array<HAttrOnCb | HAttrOnAct<HAttrOnActType>>;
51
49
 
52
- export interface HTagAttrs {
50
+ export interface HTagAttrs<HAttrOnActType extends string> {
53
51
  readonly _id?: string;
54
52
  readonly _classes?: string[];
55
53
  readonly _ref?: string;
56
- readonly _key?: string;
57
- readonly _skip?: boolean;
58
- readonly _hObj?: HObj;
54
+ readonly _hObj?: HObj<HAttrOnActType>;
55
+ readonly key?: string;
56
+ readonly skip?: boolean;
59
57
  readonly classes?: HAttrClasses;
60
58
  readonly styles?: HAttrStyles;
61
59
  readonly data?: HAttrData;
62
- readonly on?: HAttrOn;
60
+ readonly on?: HAttrOn<HAttrOnActType>;
63
61
  readonly [key: string]:
64
62
  | string
65
63
  | String
@@ -73,24 +71,24 @@ export interface HTagAttrs {
73
71
  | HAttrClasses
74
72
  | HAttrStyles
75
73
  // | HsmlAttrData
76
- | HAttrOn
74
+ | HAttrOn<HAttrOnActType>
77
75
  | EventListener
78
- | HObj
76
+ | HObj<HAttrOnActType>
79
77
  | undefined;
80
78
  }
81
79
 
82
80
  export type HFnc = (e: Element) => boolean | void;
83
81
 
84
- export interface HObj {
85
- toHsml?(): HElement;
82
+ export interface HObj<HAttrOnActType extends string> {
83
+ toHsml?(): HElement<HAttrOnActType>;
86
84
  }
87
85
 
88
- export interface HElements extends Array<HElement> {}
86
+ export interface HElements<HAttrOnActType extends string> extends Array<HElement<HAttrOnActType>> {}
89
87
 
90
- export type HTagChildren =
91
- | HElements
88
+ export type HTagChildren<HAttrOnActType extends string> =
89
+ | HElements<HAttrOnActType>
92
90
  | HFnc
93
- | HObj
91
+ | HObj<HAttrOnActType>
94
92
  | string
95
93
  | String
96
94
  | boolean
@@ -101,15 +99,15 @@ export type HTagChildren =
101
99
  | undefined
102
100
  | null;
103
101
 
104
- export type HTagNoAttr = [HTagHead, HTagChildren?];
105
- export type HTagWithAttr = [HTagHead, HTagAttrs, HTagChildren?];
102
+ export type HTagNoAttr<HAttrOnActType extends string> = [HTagHead, HTagChildren<HAttrOnActType>?];
103
+ export type HTagWithAttr<HAttrOnActType extends string> = [HTagHead, HTagAttrs<HAttrOnActType>, HTagChildren<HAttrOnActType>?];
106
104
 
107
- export type HTag = HTagNoAttr | HTagWithAttr;
105
+ export type HTag<HAttrOnActType extends string> = HTagNoAttr<HAttrOnActType> | HTagWithAttr<HAttrOnActType>;
108
106
 
109
- export type HElement =
107
+ export type HElement<HAttrOnActType extends string> =
110
108
  | HFnc
111
- | HObj
112
- | HTag
109
+ | HObj<HAttrOnActType>
110
+ | HTag<HAttrOnActType>
113
111
  | string
114
112
  | String
115
113
  | boolean
@@ -120,24 +118,25 @@ export type HElement =
120
118
  | undefined
121
119
  | null;
122
120
 
123
- export interface HHandlerCtx extends HObj {
121
+ export interface HHandlerCtx<HAttrOnActType extends string> extends HObj<HAttrOnActType> {
124
122
  refs: { [name: string]: Element };
125
- actionCb(action: HAttrOnAction, data: HAttrOnData, e: Event): void;
123
+ actionCb(action: HAttrOnActType, data: HAttrOnData, e: Event): void;
126
124
  }
127
125
 
128
- export interface HHandler<C extends HHandlerCtx> {
129
- open(tag: HTagHeadName, attrs: HTagAttrs, children: HElements, ctx?: C): boolean;
130
- close(tag: HTagHeadName, children: HElements, ctx?: C): void;
126
+ export interface HHandler<HAttrOnActType extends string, C extends HHandlerCtx<HAttrOnActType>> {
127
+ open(tag: HTagHeadName, attrs: HTagAttrs<HAttrOnActType>, children: HElements<HAttrOnActType>, ctx?: C): boolean;
128
+ close(tag: HTagHeadName, children: HElements<HAttrOnActType>, ctx?: C): void;
131
129
  text(text: string, ctx?: C): void;
132
130
  fnc(fnc: HFnc, ctx?: C): void;
133
- obj(obj: HObj, ctx?: C): void;
131
+ obj(obj: HObj<HAttrOnActType>, ctx?: C): void;
134
132
  }
135
133
 
136
134
  export const NBSP = "\u00a0 ";
137
135
 
138
- export function hsml<C extends HHandlerCtx>(hml: HElement,
139
- handler: HHandler<C>,
140
- ctx?: C): void {
136
+ export function hsml<HAttrOnActType extends string, C extends HHandlerCtx<HAttrOnActType>>(
137
+ hml: HElement<HAttrOnActType>,
138
+ handler: HHandler<HAttrOnActType, C>,
139
+ ctx?: C): void {
141
140
  // console.log("hsml", hsml);
142
141
  if (hml === undefined || hml === null) {
143
142
  return;
@@ -174,7 +173,7 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
174
173
  // // console.error("hsml parse error:", JSON.stringify(hml, null, 4));
175
174
  // // throw Error(`hsml parse error: ${JSON.stringify(hml)}`);
176
175
  // }
177
- hsmlTag(hml as HTag, handler, ctx);
176
+ hsmlTag(hml as HTag<HAttrOnActType>, handler, ctx);
178
177
  break;
179
178
  case Function:
180
179
  handler.fnc(hml as HFnc, ctx);
@@ -196,10 +195,10 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
196
195
  handler.text(ds, ctx);
197
196
  break;
198
197
  default: // HObj
199
- handler.obj(hml as HObj, ctx);
198
+ handler.obj(hml as HObj<HAttrOnActType>, ctx);
200
199
  }
201
200
 
202
- function hsmlTag(hmlTag: HTag, handler: HHandler<C>, ctx?: C): void {
201
+ function hsmlTag(hmlTag: HTag<HAttrOnActType>, handler: HHandler<HAttrOnActType, C>, ctx?: C): void {
203
202
  // console.log("hsml tag", hmlTag);
204
203
 
205
204
  if (typeof hmlTag[0] !== "string") {
@@ -212,14 +211,14 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
212
211
  const hasAttrs = attrsObj && attrsObj.constructor === Object;
213
212
  const childIdx = hasAttrs ? 2 : 1;
214
213
 
215
- let children: HElements = [];
214
+ let children: HElements<HAttrOnActType> = [];
216
215
  let hFnc: HFnc | undefined;
217
- let hObj: HObj | undefined;
216
+ let hObj: HObj<HAttrOnActType> | undefined;
218
217
 
219
218
  const htc = hmlTag[childIdx];
220
219
  switch (htc != null && htc.constructor) { // switch ((typeof htc !== "undefined" || htc !== null) && htc.constructor) {
221
220
  case Array:
222
- children = htc as HElements;
221
+ children = htc as HElements<HAttrOnActType>;
223
222
  break;
224
223
  case Function:
225
224
  hFnc = htc as HFnc;
@@ -231,7 +230,7 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
231
230
  children = [htc as string | boolean | number | Date];
232
231
  break;
233
232
  default: // HObj
234
- hObj = htc as HObj;
233
+ hObj = htc as HObj<HAttrOnActType>;
235
234
  break;
236
235
  }
237
236
 
@@ -243,11 +242,11 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
243
242
  const id = hashSplit[1];
244
243
  const classes = dotSplit.slice(1);
245
244
 
246
- let attrs: HTagAttrs;
245
+ let attrs: HTagAttrs<HAttrOnActType>;
247
246
  if (hasAttrs) {
248
- attrs = attrsObj as HTagAttrs;
247
+ attrs = attrsObj as HTagAttrs<HAttrOnActType>;
249
248
  } else {
250
- attrs = {} as HTagAttrs;
249
+ attrs = {} as HTagAttrs<HAttrOnActType>;
251
250
  }
252
251
 
253
252
  if (id) {
@@ -277,107 +276,11 @@ export function hsml<C extends HHandlerCtx>(hml: HElement,
277
276
  }
278
277
  }
279
278
 
280
- export function hjoin(hsmls: HElements, sep: string | HElement): HElements {
281
- const r = hsmls.reduce<HElements>(
279
+ export function hjoin<HAttrOnActType extends string>(hsmls: HElements<HAttrOnActType>, sep: string | HElement<HAttrOnActType>): HElements<HAttrOnActType> {
280
+ const r = hsmls.reduce<HElements<HAttrOnActType>>(
282
281
  (p, c) => (p.push(c, sep), p),
283
- [] as HElements
282
+ [] as HElements<HAttrOnActType>
284
283
  );
285
284
  r.splice(-1);
286
285
  return r;
287
286
  }
288
-
289
- // Test
290
-
291
- // const hsmls: Hsmls = [
292
- // "text",
293
- // ["tag", [
294
- // "d",
295
- // [""]
296
- // ]],
297
- // ["taga", { attr: "attr", classes: ["class"] }, [
298
- // "text",
299
- // 123,
300
- // true
301
- // ]]
302
- // ];
303
-
304
- // const hml: Hsml = ["xxx", {}, [
305
- // "types", " ", 1235.456, " ", new Date(), " ",
306
- // ...hsmls,
307
- // ["t", ["t", "a", ""]],
308
- // ["t", {}, ["t", "a", ""]],
309
- // ["t"]
310
- // ]];
311
-
312
- // console.log(hsmls, hml);
313
-
314
- // const hml1: Hsml = ["div", null, [
315
- // ["span", null, [
316
- // ["a",
317
- // {
318
- // href: "https://gitlab.com/peter-rybar/diasheet",
319
- // title: "GitLab",
320
- // target: "_blank"
321
- // },
322
- // [["i.fa.fa-gitlab"]]
323
- // ]
324
- // ]],
325
- // ["span"]
326
- // ]];
327
- // console.log(hml1);
328
-
329
- // const hml2: Hsml = ["div", [
330
- // ["h2", ["title"]],
331
- // ["div.w3-card-12", [
332
- // ["header.w3-container w3-light-grey", [
333
- // ["h3", ["Account: ", "User"]]
334
- // ]],
335
- // ["div.w3-container.w3-light-grey", [
336
- // ["p", ["Balance: 4 DCT"]],
337
- // ["br"]
338
- // ]],
339
- // ["h4", ["Your account spending"]],
340
- // ["div#piechart"],
341
- // ["h4", ["Your account balance"]],
342
- // ["div#linechart"],
343
- // ["button.w3-button.w3-block.w3-dark-grey", ["Refresh"]]
344
- // ]],
345
- // ["br"]
346
- // ]];
347
- // console.log(hml2);
348
-
349
- // TEST
350
-
351
- // import { hsmls2htmls } from "./hsml-html";
352
- // import { HDispatch } from "./hsml-app";
353
-
354
- // const dispatch: HDispatch = (type: string, data?: any, event?: Event): void => {
355
- // console.log("action:", type, data, event);
356
- // };
357
-
358
- // const data = { attr: "action-data" };
359
-
360
- // const hmls: HElements = [
361
- // ["button", { on: ["click", "action", data] }, "send"],
362
- // ["h1", "aaa"],
363
- // ["input",
364
- // {
365
- // type: "text",
366
- // on: [
367
- // ["mouseover", "hover-action", data],
368
- // ["change", "click-action", e => (e.target as HTMLInputElement).value],
369
- // ["click", e => dispatch("action", data, e)],
370
- // ],
371
- // click: e => dispatch("action", data, e)
372
- // }
373
- // ],
374
- // ["button",
375
- // {
376
- // on: ["click", e => dispatch("action", data, e)],
377
- // click: e => dispatch("action", data, e)
378
- // },
379
- // ["Send"]
380
- // ]
381
- // ];
382
-
383
- // console.log(hsmls2htmls(hmls, true).join(""));
@@ -1,16 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <title>PeRyL hsml app demo</title>
7
- </head>
8
-
9
- <body>
10
- <h1>PeRyL hsml app demo</h1>
11
- <div id="app"></div>
12
- <!-- <script src="../incremental-dom/dist/umd/incremental-dom.js"></script> -->
13
- <script type="module" src="hsml-appc_demo.ts"></script>
14
- </body>
15
-
16
- </html>
@@ -1,49 +0,0 @@
1
- import { HElements } from "../src/hsml";
2
- import { controllersDdispatcher, happ, HAppAction, HControllers } from "../src/hsml-app";
3
-
4
- enum Action {
5
- name = "name"
6
- }
7
-
8
- interface State {
9
- name: string;
10
- }
11
-
12
- function state(): State {
13
- return { name: "" };
14
- }
15
-
16
- function view(state: State): HElements {
17
- return [
18
- ["h1", "Hello"],
19
- ["input~focus", {
20
- type: "text",
21
- placeholder: "name",
22
- on: ["input", Action.name]
23
- }],
24
- ["p",
25
- state.name
26
- ? ["Hello ", ["b", state.name], "!"]
27
- : "Greeting"
28
- ]
29
- ];
30
- }
31
-
32
- const controllers: HControllers<State, typeof Action & typeof HAppAction> = {
33
- // _init: function (data) {
34
- // console.log(data);
35
- // },
36
- _mount: function (data) {
37
- this.refs["focus"].focus();
38
- },
39
- name: function (data) {
40
- this.state.name = data;
41
- }
42
- };
43
-
44
- // HApp.debug = true;
45
- // HApp.debug = window.location.hostname === "localhost";
46
-
47
- const app = happ<State>(state, view, controllersDdispatcher<State, typeof Action>(controllers));
48
-
49
- (self as any).app = app;
@@ -1,2 +0,0 @@
1
- !function(){function t(t,e,n,i){Object.defineProperty(t,e,{get:n,set:i,enumerable:!0,configurable:!0})}var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{},n={},i={},r=e.parcelRequirede31;null==r&&((r=function(t){if(t in n)return n[t].exports;if(t in i){var e=i[t];delete i[t];var r={id:t,exports:{}};return n[t]=r,e.call(r.exports,r,r.exports),r.exports}var a=new Error("Cannot find module '"+t+"'");throw a.code="MODULE_NOT_FOUND",a}).register=function(t,e){i[t]=e},e.parcelRequirede31=r);var a=r("g7NCG"),o={};t(o,"HAppAction",(function(){return h}),(function(t){return h=t})),t(o,"happ",(function(){return w}),(function(t){return w=t})),t(o,"HApp",(function(){return O}),(function(t){return O=t})),t(o,"happi",(function(){return j}),(function(t){return j=t})),t(o,"happel",(function(){return x}),(function(t){return x=t})),t(o,"controllersDdispatcher",(function(){return _}),(function(t){return _=t}));var s=r("8IJ2T"),l=function(t,e,n,i){return new(n||(n=Promise))((function(r,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function s(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,s)}l((i=i.apply(t,e||[])).next())}))};const d=console.log,u=console.error,c=console.warn;var h,m;(m=h||(h={}))._init="_init",m._mount="_mount",m._umount="_umount",m._element="_element";const p=window.requestAnimationFrame||function(t){window.setTimeout(t,1e3/60)},v=window.cancelAnimationFrame||function(t){window.clearTimeout(t)},b="HApp action:",f="HApp dispatch:",g="HApp render:";function w(t,e,n,i=document.body){return new O(t,e,n,i)}function j(t,e=document.body){const n=new t;return new O(n.state,n.view,n.dispatcher,e)}function x(t,e,n,i,r){customElements.define(t,class extends HTMLElement{static get observedAttributes(){return e}connectedCallback(){this.attachShadow({mode:"open"}),this._happel.mount(this.shadowRoot)}disconnectedCallback(){this._happel.umount()}adoptedCallback(){this._happel.update()}attributeChangedCallback(t,e,n){this._happel.dispatch(h._element,{attrName:t,oldVal:e,newVal:n})}constructor(){super(),this._happel=new O(n,i,r),this._happel.customElement=this}})}function _(t){return function(e){return l(this,void 0,void 0,(function*(){const n=t[e.type];n?n.apply(this,[e.data,e.event]):c("no controller for action",e)}))}}const y="happ";class O{_dispatch(t,e,n){var i;return l(this,void 0,void 0,(function*(){try{yield this.dispatcher({type:t,data:e,event:n},this.state,this.dispatch),null===(i=this._onDispatch)||void 0===i||i.call(this,{type:t,data:e,event:n},this.state,this.dispatch),this.dom&&D(this.dom,y,{type:t,data:e,event:n}),this.customElement&&D(this.customElement,t,e),!this.customElement&&this.dom&&D(this.dom,t,e),this.update()}catch(t){u(f,t)}}))}windowDispatchOn(){this._windowEventListener?c("windowEventListener olready setted"):(this._windowEventListener=t=>{const e=t.detail;this.dispatch(e.type,e.data,t)},window.addEventListener(y,this._windowEventListener))}windowDispatchOff(){this._windowEventListener&&window.removeEventListener(y,this._windowEventListener)}constructor(t,e,n,i=document.body){this.refs={},this.onDispatch=t=>(this._onDispatch=t,this),this.dispatch=(t,e,n)=>l(this,void 0,void 0,(function*(){if(O.debug){d(b,{type:t,data:e,event:n});const i=performance.now();yield this._dispatch(t,e,n);const r=performance.now();d(f,r-i+" ms",this.state)}else yield this._dispatch(t,e,n)})),this.windowDispatch=(t,e,n)=>l(this,void 0,void 0,(function*(){window.dispatchEvent(new CustomEvent(y,{detail:{type:t,data:e}}))})),this.render=()=>{if(O.debug){const t=performance.now();let e;try{e=this.view(this.state)}catch(t){u(g,t)}const n=performance.now();return d(g,n-t+" ms",e),null!=e?e:[]}{let t;try{t=this.view(this.state)}catch(t){u(g,t)}return null!=t?t:[]}},this.actionCb=(t,e,n)=>{void 0===(e=(null==e?void 0:e.constructor)===Function?e(n):e)&&n&&(e=n instanceof CustomEvent?n.detail:function(t){const e=t.target;if("FORM"===e.nodeName){t.preventDefault();const n=e.elements,i={};for(let t=0;t<n.length;t++){const e=q(n[t]);if("object"==typeof e){const r=Object.keys(e);if(r.length){const a=r[0],o=e[a];void 0===i[a]?i[a]=o:"string"==typeof i[a]||i[a]instanceof String?i[a]=o instanceof Array?[i[a],...o]:[i[a],o]:i[a]instanceof Array?o instanceof Array?i[a]=i[a].concat(o):i[a].push(o):i[a]=o instanceof Array?[i[a],...o]:[i[a],o],i[a]instanceof Array&&(i[a]=i[a].filter((t=>null!==t)),"radio"===n[t].type&&(i[a]=i[a].length?i[a][0]:null))}}}return i}return q(e)}(n)),this.dispatch(t,e,n)},this.mount=(t=document.body)=>{var e;const n="string"==typeof t?null!==(e=document.getElementById(t))&&void 0!==e?e:document.body:null!=t?t:document.body;if(n[y]){n[y].umount()}if(!this.dom){this.dom=n,n[y]=this;S(n,this.render(),this),this.dispatch(h._mount,this.dom)}return this},this.umount=()=>{if(this.dom){this.dispatch(h._umount,this.dom),this.dom.hasAttribute(y)&&this.dom.removeAttribute(y);const t=this.dom.querySelectorAll(`[${y}]`);for(let e=0;e<t.length;e++){const n=t[e].happ;null==n||n.umount()}for(;this.dom.firstChild;)this.dom.removeChild(this.dom.firstChild);delete this.dom.happ,this.dom=void 0}return this},this.update=()=>(this.dom&&!this._updateSched&&(this._updateSched=p((()=>{if(this.dom){const t=this.render();S(this.dom,t,this)}this._updateSched=void 0}))),this),this.toHsml=()=>{if(this.dom){if(!this._updateSched)return["div",{_skip:!0}];v(this._updateSched),this._updateSched=void 0}const t=this.render();return t.push((t=>{this.dom||(this.dom=t,t.happ=this,this.dispatch(h._mount,this.dom))})),["div",t]},this.toHtml=()=>this.dom?this.dom.outerHTML:"",this.state=t(),this.view=e,this.dispatcher=null!=n?n:t=>l(this,void 0,void 0,(function*(){return d(b,t.type,t.data)})),this.dispatch(h._init,this).then((()=>this.mount(i)))}}function S(t,e,n){if(O.debug){const i=performance.now();(0,s.hsmls2idomPatch)(t,e,n);const r=performance.now();d("HApp update:",r-i+" ms",t)}else(0,s.hsmls2idomPatch)(t,e,n)}function D(t,e,n){var i,r;null==t||t.dispatchEvent(new CustomEvent(e,{detail:n})),null===(r=(i=t)[`on${e.toLowerCase()}`])||void 0===r||r.call(i,new CustomEvent(e,{detail:n}))}function q(t){let e=null;switch(t.nodeName){case"INPUT":const n=t;switch(n.type){case"text":case"hidden":case"password":case"email":case"number":case"search":case"url":case"tel":case"color":case"date":case"datetime-local":case"month":case"range":case"time":case"week":case"submit":case"button":e=n.name?{[n.name]:n.value}:n.value;break;case"radio":e=n.name?{[n.name]:n.checked?n.value:null}:n.checked?n.value:null;break;case"checkbox":e="on"===n.value?n.name?{[n.name]:n.checked}:n.checked:n.name?{[n.name]:n.checked?String(n.value):null}:n.checked?String(n.value):null}break;case"SELECT":const i=t;if(i.multiple){const t=Array.from(i.selectedOptions).map((t=>t.value));e=i.name?{[i.name]:t}:t}else e=i.name?{[i.name]:i.value}:i.value;break;case"TEXTAREA":const r=t;e=r.name?{[r.name]:r.value}:r.value;break;case"BUTTON":const a=t;e=a.name?{[a.name]:a.value}:a.value}return e}O.debug=!1;const T="required",k="not_in_range",E="invalid_format";class N{validate(t){if("string"==typeof t||null==t){const e=t;this.str=e;const n=this.strToObj(e);if(this.obj=n.obj,n.err)return this.err=n.err,{str:null!=e?e:"",obj:n.obj,err:n.err};const i=this.objCheck(n.obj);return this.err=i,{str:null!=e?e:"",obj:n.obj,err:i}}{this.str=null==t?null:""+t;const e=this.objCheck(t);return this.err=e,{str:this.str,obj:t,err:e}}}format(t,e){var n;const i=this.objToStr(t,e);return{str:null!==(n=i.str)&&void 0!==n?n:"",err:i.err}}constructor(t,e){this.str=null,this.err=null,this.obj=null,this.opts=null!=t?t:{},this.msgs=null!=e?e:{}}}function C(t,e){return Object.keys(e).map((t=>[t,e[t]])).reduce(((t,e)=>t.replace(new RegExp(`\\{\\{${e[0]}\\}\\}`,"g"),String(e[1]))),t)}class A extends N{strToObj(t){const e=this.opts,n=this.msgs;return"required"in e&&e.required&&!t?{obj:null,err:n.required?C(n.required,Object.assign(Object.assign({},e.data),{options:"options"in e?e.options.join(", "):""})):T}:{obj:void 0===t?null:t,err:""}}objCheck(t){if(null==t)return"";const e=this.opts,n=this.msgs;return"options"in e&&t&&-1===e.options.indexOf(t)?n.invalid_option?C(n.invalid_option,Object.assign(Object.assign({},e.data),{option:null===t?"":t,options:"options"in e?e.options.join(", "):""})):"invalid_option":""}objToStr(t,e){return{str:null!=t?t:"",err:""}}constructor(t,e){super(t,e)}}class L extends N{strToObj(t){var e,n,i,r;const a=this.opts,o=this.msgs;return"required"in a&&a.required&&!t?{obj:null,err:o.required?C(o.required,Object.assign(Object.assign({},a.data),{min:"min"in a?""+(null!==(e=a.min)&&void 0!==e?e:""):"",max:"max"in a?""+(null!==(n=a.max)&&void 0!==n?n:""):"",regexp:"regexp"in a?""+(null!==(i=a.regexp)&&void 0!==i?i:""):""})):T}:t?"regexp"in a&&!a.regexp.test(t)?{obj:null,err:o.invalid_format?C(o.invalid_format,Object.assign(Object.assign({},a.data),{regexp:"regexp"in a?""+(null!==(r=a.regexp)&&void 0!==r?r:""):""})):E}:{obj:t,err:""}:{obj:null,err:""}}objCheck(t){var e,n;if(null==t)return"";const i=this.opts,r=this.msgs;let a=!1;return"max"in i&&t.length>i.max&&(a=!0),"min"in i&&t.length<i.min&&(a=!0),"min"in i&&"max"in i&&t.length>i.max&&t.length<i.min&&(a=!0),a?r.not_in_range?C(r.not_in_range,Object.assign(Object.assign({},i.data),{min:"min"in i?""+(null!==(e=i.min)&&void 0!==e?e:""):"",max:"max"in i?""+(null!==(n=i.max)&&void 0!==n?n:""):""})):k:""}objToStr(t,e){return{str:null!=t?t:"",err:""}}constructor(t,e){super(t,e)}}class F extends N{strToObj(t){var e,n,i;const r=this.opts,a=this.msgs;if("required"in r&&r.required&&!t)return{obj:null,err:a.required?C(a.required,Object.assign(Object.assign({},r.data),{min:"min"in r?""+(null!==(e=r.min)&&void 0!==e?e:""):"",max:"max"in r?""+(null!==(n=r.max)&&void 0!==n?n:""):""})):T};if(t){const e=Number(t);let n=!1;if(isNaN(e)&&(n=!0),r.strict&&t!==this.objToStr(e).str&&(n=!0),n){const t=isNaN(e)?1234.45:e;return{obj:isNaN(e)?null:e,err:a.invalid_format?C(a.invalid_format,Object.assign(Object.assign({},r.data),{num:null!==(i=this.objToStr(t).str)&&void 0!==i?i:""})):E}}return{obj:e,err:""}}return{obj:null,err:""}}objCheck(t){var e,n;if(null==t)return"";const i=this.opts,r=this.msgs;let a=!1;return"max"in i&&t>i.max&&(a=!0),"min"in i&&t<i.min&&(a=!0),a?r.not_in_range?C(r.not_in_range,Object.assign(Object.assign({},i.data),{min:"min"in i?""+(null!==(e=i.min)&&void 0!==e?e:""):"",max:"max"in i?""+(null!==(n=i.max)&&void 0!==n?n:""):""})):k:""}objToStr(t,e){let n;return n=null==t?"":"decimals"in this.opts?t.toFixed(this.opts.decimals):String(t),{str:n,err:""}}constructor(t,e){super(t,e)}}const H=t=>t.toLocaleString(),I=t=>t.toLocaleDateString(),R=t=>t.toISOString(),M=t=>new Date(t.toDateString()).toISOString();class V extends N{strToObj(t){var e;const n=this.opts,i=this.msgs;if("required"in n&&n.required&&!t)return{obj:null,err:i.required?C(i.required,Object.assign(Object.assign({},n.data),{min:"min"in n&&n.min?this.dateToStr(n.min):"",max:"max"in n&&n.max?this.dateToStr(n.max):""})):T};if(t){const r=Date.parse(t);let a=new Date(r);n.dateOnly&&(a=new Date(a.getFullYear(),a.getMonth(),a.getDate()));let o=!1;if(isNaN(r)&&(o=!0),o){const t=isNaN(r)?new Date:a;return{obj:isNaN(r)?null:a,err:i.invalid_format?C(i.invalid_format,Object.assign(Object.assign({},n.data),{date:null!==(e=this.objToStr(t).str)&&void 0!==e?e:""})):E}}return{obj:a,err:""}}return{obj:null,err:""}}objCheck(t){if(null==t)return"";const e=this.opts,n=this.msgs;let i=!1;return"max"in e&&e.max&&t.getTime()>e.max.getTime()&&(i=!0),"min"in e&&e.min&&t<e.min&&(i=!0),i?n.not_in_range?C(n.not_in_range,Object.assign(Object.assign({},e.data),{min:"min"in e&&e.min?this.dateToStr(e.min):"",max:"max"in e&&e.max?this.dateToStr(e.max):""})):k:""}objToStr(t,e){return{str:null==t?"":this.dateToStr(t),err:""}}constructor(t,e){super(t,e),(null==t?void 0:t.iso)?this.dateToStr=(null==t?void 0:t.dateOnly)?M:R:this.dateToStr=(null==t?void 0:t.dateOnly)?I:H,(null==t?void 0:t.dateOnly)&&(null==t?void 0:t.min)&&(t.min=new Date(t.min.getFullYear(),t.min.getMonth(),t.min.getDate())),(null==t?void 0:t.dateOnly)&&(null==t?void 0:t.max)&&(t.max=new Date(t.max.getFullYear(),t.max.getMonth(),t.max.getDate()+1))}}class P extends N{strToObj(t){const e=this.opts,n=this.msgs;if("required"in e&&e.required&&!t)return{obj:null,err:n.required?C(n.required,Object.assign({},e.data)):T};let i;switch(t){case"true":case"1":case"on":case"yes":i=!0;break;default:i=!1}return{obj:i,err:""}}objCheck(t){var e;if(null==t)return"";const n=this.opts,i=this.msgs;let r=!1;return"value"in n&&t!==n.value&&(r=!0),r?i.invalid_value?C(i.invalid_value,Object.assign(Object.assign({},n.data),{value:"value"in n?""+(null!==(e=n.value)&&void 0!==e?e:""):""})):"invalid_value":""}objToStr(t,e){return{str:null==t?"":""+t,err:""}}constructor(t,e){super(t,e)}}class U{addValidator(t,e){return this.validators[t]=e,this}validate(t){const e=Object.keys(this.validators).reduce(((e,n)=>{const i=t[n],r=this.validators[n].validate(i);return e.str[n]=r.str,e.obj[n]=r.obj,e.err[n]=r.err,r.err&&(e.valid=!1),e}),{str:{},obj:{},err:{},valid:!0});return this.str=e.str,this.obj=e.obj,this.err=e.err,this.valid=e.valid,this}format(t){const e=Object.keys(this.validators).reduce(((e,n)=>{const i=t[n],r=this.validators[n].format(i);return e.str[n]=r.str,e.obj[n]=i,e.err[n]=r.err,r.err&&(e.valid=!1),e}),{str:{},obj:{},err:{},valid:!0});return this.str=e.str,this.obj=e.obj,this.err=e.err,this.valid=e.valid,this}data(){return{str:this.str,obj:this.obj,err:this.err,valid:this.valid}}constructor(){this.validators={}}}var Y=function(t,e,n,i){return new(n||(n=Promise))((function(r,a){function o(t){try{l(i.next(t))}catch(t){a(t)}}function s(t){try{l(i.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?r(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(o,s)}l((i=i.apply(t,e||[])).next())}))};var $,B;(B=$||($={})).change="form-validation-change",B.submit="form-validation-submit";let J;function z(t){if(!t)return"";if(0===-t.getTimezoneOffset())return t.toISOString();{const e=function(t,e=2){return String(t).padStart(e,"0")};return t.getFullYear()+"-"+e(t.getMonth()+1)+"-"+e(t.getDate())+"T"+e(t.getHours())+":"+e(t.getMinutes())}}(0,o.happ)((function(){return{title:"Form Validation",data:{name:"Ema",born:new Date,children:0,married:!1,gender:"female",sport:"gymnastics"},genders:[{label:"Male",value:"male"},{label:"Female",value:"female"}],sports:["football","gymnastics"]}}),(function(t){return[["div.w3-content",[["h1",t.title],["form.w3-container",{on:[["change",$.change],["submit",$.submit]]},[["p",[["label",["Name",["input.w3-input",{type:"text",name:"name",value:t.validatorData.str.name,on:["input",$.change]}]]]]],["p.w3-text-red",[t.validatorData.err.name]],["p",[["label",["Born",["input.w3-input",{type:"datetime-local",name:"born",value:z(t.validatorData.obj.born)}]]]]],["p.w3-text-red",[t.validatorData.err.born]],["p",[["label",["Children",["input.w3-input",{type:"number",name:"children",value:t.validatorData.str.children}]]]]],["p.w3-text-red",[t.validatorData.err.children]],["p",[["label",[["input.w3-check",{type:"checkbox",name:"married",checked:t.validatorData.obj.married}]," Married"]]]],["p.w3-text-red",[t.validatorData.err.married]],["p",(0,a.hjoin)(t.genders.map((e=>["label",[["input.w3-radio",{type:"radio",name:"gender",value:e.value,checked:t.validatorData.obj.gender===e.value}]," ",e.label]])),["br"])],["p.w3-text-red",[t.validatorData.err.gender]],["p",[["select.w3-select",{name:"sport"},[["option",{value:"",disabled:!0,selected:!0},"Sport"],...t.sports.map((e=>["option",{value:e,selected:e===t.validatorData.obj.sport},e]))]]]],["p.w3-text-red",t.validatorData.err.sport],["button.w3-btn.w3-blue","Submit"]]]]]]}),(function(t,e){return Y(this,void 0,void 0,(function*(){switch(console.log("action",t),t.type){case o.HAppAction._init:n=e,J=(new U).addValidator("name",new L({required:!0,min:3,max:5},{required:"Required {{min}} - {{max}} {{regexp}}",invalid_format:"Invalid format {{regexp}}",not_in_range:"Not in range {{min}} - {{max}}"})).addValidator("born",new V({required:!0,max:new Date,dateOnly:!1,iso:!0},{required:"Required {{min}} - {{max}}",invalid_format:"Invalid format {{date}}",not_in_range:"Not in range {{min}} - {{max}}"})).addValidator("children",new F({required:!0,min:0,max:10},{required:"Required {{min}} - {{max}}",invalid_format:"Invalid format, use format {{num}}",not_in_range:"Not in range {{min}} - {{max}}"})).addValidator("gender",new A({required:!0,options:n.genders.map((t=>t.value))},{required:"Required {{options}}",invalid_option:"Invalod option {{option}} {{options}}"})).addValidator("married",new P({required:!0},{required:"Required",invalid_value:"Invalid value {{value}}"})).addValidator("sport",new A({required:!0,options:n.sports},{required:"Required {{options}}",invalid_option:"Invalod option {{option}} {{options}}"})).format(n.data),e.validatorData=J.data();break;case $.change:J.validate(Object.assign(Object.assign({},e.validatorData.str),t.data)),e.validatorData=J.data(),console.log("obj:",JSON.stringify(e.validatorData,null,4));break;case $.submit:if(t.event.preventDefault(),J.validate(t.data),e.validatorData=J.data(),e.validatorData=J.data(),J.valid){console.log(J),e.data=J.obj;const t=JSON.stringify(e.data,null,4);console.dir(t),alert(`Form submit: \n${t}`)}}var n}))}))}();
2
- //# sourceMappingURL=hsml-app-form-validation_demo.0b03b743.js.map
@@ -1 +0,0 @@
1
- {"mappings":"iyCAGA,MAAMA,EAAMC,QAAQC,IACdC,EAAQF,QAAQG,MAChBC,EAAOJ,QAAQK,KAqBrB,IAAYC,EAAAC,KAAAD,MAAU,KAClB,cACAC,EAAA,gBACAA,EAAA,kBACAA,EAAA,oBAGJ,MAAMC,EAAWC,OAAOC,uBAKpB,SAAUC,GAAsBF,OAAOG,WAAWD,EAAU,IAAO,GAAK,EAEtEE,EAAaJ,OAAOK,sBAKtB,SAAUC,GAAkBN,OAAOO,aAAaD,EAAS,EAEvDE,EAAY,eACZC,EAAc,iBACdC,EAAY,eAGZ,SAAUC,EAAYC,EACAC,EACAC,EACAC,EAAmCC,SAASC,MACpE,OAAO,IAAIC,EAAYN,EAAOC,EAAMC,EAAYC,EACpD,CAaM,SAAUI,EAAaC,EAA4BC,EAA6BL,SAASC,MAC3F,MAAMK,EAAO,IAAIF,EACjB,OAAO,IAAIF,EAAYI,EAAKV,MAAOU,EAAKT,KAAMS,EAAKR,WAAYO,EACnE,CAIM,SAAUE,EAAcC,EACAC,EACAb,EACAC,EACAC,GAC1BY,eAAeC,OAAOH,EAAa,cAA0BI,YAE9CC,gCACP,OAAOJ,CACX,CAUAK,oBAEIC,KAAKC,aAAa,CAAEC,KAAM,SAC1BF,KAAKG,QAAQC,MAAMJ,KAAKK,WAC5B,CAEAC,uBACIN,KAAKG,QAAQI,QACjB,CAEAC,kBACIR,KAAKG,QAAQM,QACjB,CAEAC,yBAAyBC,EAAkBC,EAAuBC,GAC9Db,KAAKG,QAAQW,SAAShD,EAAWiD,SAAU,C,SAAEJ,E,OAAUC,E,OAAQC,GACnE,CAtBAG,cACIC,QACAjB,KAAKG,QAAU,IAAIhB,EAAYN,EAAOC,EAAMC,GAC3CiB,KAAKG,QAAgBe,cAAgBlB,IAC1C,GAqBR,CAUM,SAAUmB,EAAiDC,GAC7D,OAAO,SAAmCC,G,yCACtC,MAAMC,EAAaF,EAAYC,EAAOE,MAClCD,EACAA,EAAWE,MAAyCxB,KAAM,CAACqB,EAAOI,KAAMJ,EAAOK,QAE/E9D,EAAK,2BAA4ByD,EAEzC,GAAC,CACL,CAEA,MAAMM,EAAO,OAEP,MAAOxC,EA0BKyC,UAAUL,EAAcE,EAAWC,G,+CAC7C,UACU1B,KAAKjB,WAAW,C,KAAEwC,E,KAAME,E,MAAMC,GAAS1B,KAAKnB,MAAOmB,KAAKc,UAC9C,QAAhBe,EAAA7B,KAAK8B,mBAAW,IAAAD,KAAAE,KAAA/B,KAAG,C,KAAEuB,E,KAAME,E,MAAMC,GAAS1B,KAAKnB,MAAOmB,KAAKc,UAC3Dd,KAAKgC,KAAOC,EAA2BjC,KAAKgC,IAAKL,EAAM,C,KAAEJ,E,KAAME,E,MAAMC,IACrE1B,KAAKkB,eAAiBe,EAA2BjC,KAAKkB,cAAeK,EAAME,IAC1EzB,KAAKkB,eAAiBlB,KAAKgC,KAAOC,EAA2BjC,KAAKgC,IAAKT,EAAME,GAC9EzB,KAAKS,QAGR,CAFC,MAAOnB,GACL5B,EAAMgB,EAAaY,EACtB,C,GACJ,CAuBD4C,mBACSlC,KAAKmC,qBAONvE,EAAK,uCANLoC,KAAKmC,qBAAwBT,IACzB,MAAML,EAAUK,EAAsBU,OACtCpC,KAAKc,SAASO,EAAOE,KAAMF,EAAOI,KAAMC,EAAA,EAE5CzD,OAAOoE,iBAAiBV,EAAM3B,KAAKmC,sBAI3C,CAEAG,oBACQtC,KAAKmC,sBACLlE,OAAOsE,oBAAoBZ,EAAM3B,KAAKmC,qBAE9C,CAzDAnB,YAAYnC,EAAsBC,EAAoBC,EAAiCO,EAA6BL,SAASC,MARpHc,KAAAwC,KAAuC,GA4BhDxC,KAAAyC,WAAc1D,IACViB,KAAK8B,YAAc/C,EACZiB,MAGXA,KAAAc,SAAuB,CAAOS,EAAcE,EAAYC,IAAxDgB,EAAA1C,UAAA,sBACI,GAAIb,EAAKwD,MAAO,CACZpF,EAAIkB,EAAW,C,KAAE8C,E,KAAME,E,MAAMC,IAC7B,MAAMkB,EAAKC,YAAYC,YACjB9C,KAAK4B,UAAUL,EAAME,EAAMC,GACjC,MAAMqB,EAAKF,YAAYC,MACvBvF,EAAImB,EAAgBqE,EAAKH,EAAR,MAAiB5C,KAAKnB,MAC1C,YACSmB,KAAK4B,UAAUL,EAAME,EAAMC,EAEzC,IAEA1B,KAAAgD,eAA6B,CAAOzB,EAAcE,EAAYC,IAA9DgB,EAAA1C,UAAA,sBACI/B,OAAOgF,cAAc,IAAIC,YAAYvB,EAAM,CAAES,OAAQ,C,KAAEb,E,KAAME,KACjE,IAoBAzB,KAAAmD,OAAS,KACL,GAAIhE,EAAKwD,MAAO,CACZ,MAAMC,EAAKC,YAAYC,MACvB,IAAIM,EACJ,IACIA,EAAQpD,KAAKlB,KAAKkB,KAAKnB,MAG1B,CAFC,MAAOS,GACL5B,EAAMiB,EAAWW,EACpB,CACD,MAAMyD,EAAKF,YAAYC,MAEvB,OADAvF,EAAIoB,EAAcoE,EAAKH,EAAR,MAAiBQ,GACzBA,UAAS,EACnB,CAAM,CACH,IAAIA,EACJ,IACIA,EAAQpD,KAAKlB,KAAKkB,KAAKnB,MAG1B,CAFC,MAAOS,GACL5B,EAAMiB,EAAWW,EACpB,CACD,OAAO8D,UAAS,EACnB,GAGLpD,KAAAqD,SAAW,CAAChC,EAAgBI,EAAmBC,UAI9B4B,KAHb7B,GAAQA,aAAI,EAAJA,EAAMT,eAAgBuC,SACvB9B,EAAwBC,GACzBD,IACoBC,IAElBD,EADAC,aAAiBwB,YACVxB,EAAMU,OAsG7B,SAAkB9C,GACd,MAAMkE,EAAKlE,EAAEmE,OACb,GACS,SADDD,EAAGE,SACP,CACKpE,EAAYqE,iBACb,MAAMC,EAAOJ,EAAuBK,SAC9BpC,EAAO,GACb,IAAK,IAAIqC,EAAI,EAAGA,EAAIF,EAAIG,OAAQD,IAAK,CACjC,MAAME,EAAIC,EAAcL,EAAIE,IAC5B,GAAiB,iBAANE,EAAgB,CACvB,MAAME,EAAQC,OAAOC,KAAKJ,GAC1B,GAAIE,EAAMH,OAAQ,CACd,MAAMM,EAAOH,EAAM,GACbI,EAASN,EAAUK,QACNf,IAAf7B,EAAK4C,GACL5C,EAAK4C,GAAQC,EACgB,iBAAf7C,EAAK4C,IAAsB5C,EAAK4C,aAAiBE,OAE3D9C,EAAK4C,GADLC,aAAiBE,MACJ,CAAC/C,EAAK4C,MAAoBC,GAE1B,CAAC7C,EAAK4C,GAAiBC,GAEjC7C,EAAK4C,aAAiBG,MACzBF,aAAiBE,MACjB/C,EAAK4C,GAAS5C,EAAK4C,GAA+BI,OAAOH,GAExD7C,EAAK4C,GAA+BK,KAAKJ,GAI1C7C,EAAK4C,GADLC,aAAiBE,MACJ,CAAC/C,EAAK4C,MAAoBC,GAE1B,CAAC7C,EAAK4C,GAAiBC,GAGxC7C,EAAK4C,aAAiBG,QACtB/C,EAAK4C,GAAS5C,EAAK4C,GACdM,QAAOX,GAAW,OAANA,IACyB,UAArCJ,EAAIE,GAAwBvC,OAC7BE,EAAK4C,GAAS5C,EAAK4C,GAA+BN,OAC3CtC,EAAK4C,GAA+B,GACrC,MAGjB,CACJ,CACJ,CACD,OAAO5C,CAAA,CAEP,OAAOwC,EAAcT,EAEjC,CAvJuBoB,CAASlD,IAGxB1B,KAAKc,SAASO,EAAQI,EAAMC,EAAA,EAGhC1B,KAAAI,MAAQ,CAACd,EAA6BL,SAASC,Q,MAC3C,MAAMsE,EAAmB,iBAANlE,EACa,QAA1BuC,EAAA5C,SAAS4F,eAAevF,UAAE,IAAAuC,IAAI5C,SAASC,KACvCI,UAAKL,SAASC,KACpB,GAAKsE,EAAW7B,GAAO,CACR6B,EAAW7B,GACpBpB,QACL,CACD,IAAKP,KAAKgC,IAAK,CACVhC,KAAagC,IAAMwB,EACnBA,EAAW7B,GAAQ3B,KAEpB8E,EAAUtB,EADKxD,KAAamD,SACPnD,MACrBA,KAAKc,SAAShD,EAAWiH,OAAQ/E,KAAKgC,IACzC,CACD,OAAOhC,IAAI,EAGfA,KAAAO,OAAS,KACL,GAAIP,KAAKgC,IAAK,CACVhC,KAAKc,SAAShD,EAAWkH,QAAShF,KAAKgC,KACnChC,KAAKgC,IAAIiD,aAAatD,IACtB3B,KAAKgC,IAAIkD,gBAAgBvD,GAE7B,MAAMwD,EAASnF,KAAKgC,IAAIoD,iBAAiB,IAAIzD,MAC7C,IAAK,IAAImC,EAAI,EAAGA,EAAIqB,EAAOpB,OAAQD,IAAK,CACpC,MAAMuB,EAAKF,EAAOrB,GAAWwB,KAC7BD,WAAG9E,QACN,CACD,KAAOP,KAAKgC,IAAIuD,YACZvF,KAAKgC,IAAIwD,YAAYxF,KAAKgC,IAAIuD,mBAE1BvF,KAAKgC,IAAYsD,KACxBtF,KAAagC,SAAMsB,CACvB,CACD,OAAOtD,IAAI,EAGfA,KAAAS,OAAS,KACDT,KAAKgC,MAAQhC,KAAKyF,eAClBzF,KAAKyF,aAAezH,GAAS,KACzB,GAAIgC,KAAKgC,IAAK,CACV,MAAMoB,EAAQpD,KAAKmD,SACnB2B,EAAU9E,KAAKgC,IAAKoB,EAAOpD,KAC9B,CACDA,KAAKyF,kBAAenC,CAAA,KAGrBtD,MAGXA,KAAA0F,OAAS,KACL,GAAI1F,KAAKgC,IAAK,CACV,IAAIhC,KAAKyF,aAIL,MAAO,CAAC,MAAO,CAAEE,OAAO,IAHxBtH,EAAW2B,KAAKyF,cAChBzF,KAAKyF,kBAAenC,CAI3B,CACD,MAAMF,EAAQpD,KAAKmD,SASnB,OARAC,EAAMsB,MACDpF,IACQU,KAAKgC,MACLhC,KAAagC,IAAM1C,EACnBA,EAAUgG,KAAOtF,KAClBA,KAAKc,SAAShD,EAAWiH,OAAQ/E,KAAKgC,KACzC,IAEF,CAAC,MAAOoB,EAAM,EAGzBpD,KAAA4F,OAAS,IACE5F,KAAKgC,IAAMhC,KAAKgC,IAAI6D,UAAY,GAxKvC7F,KAAKnB,MAAQA,IACbmB,KAAKlB,KAAOA,EACZkB,KAAKjB,WAAaA,UAAsBsG,GAAK3C,EAAA1C,UAAA,sBAAC,OAAAzC,EAAIkB,EAAW4G,EAAE9D,KAAM8D,EAAE5D,KAAK,IAC5EzB,KAAKc,SAAShD,EAAWgI,MAAO9F,MAAM+F,MAAK,IAAM/F,KAAKI,MAAMd,IAChE,EAyKJ,SAASwF,EAAUtB,EAAawC,EAAiBC,GAC7C,GAAI9G,EAAKwD,MAAO,CACZ,MAAMC,EAAKC,YAAYC,OACvB,EAAAoD,EAAAC,iBAAgB3C,EAAIwC,EAAMC,GAC1B,MAAMlD,EAAKF,YAAYC,MACvBvF,EA9RU,eA8RQwF,EAAKH,EAAR,MAAiBY,EACnC,MACG,EAAA0C,EAAAC,iBAAgB3C,EAAIwC,EAAMC,EAElC,CAEA,SAAShE,EAA2BuB,EAAiBjC,EAAcE,G,QAC/D+B,WAAIP,cAAc,IAAIC,YAAY3B,EAAM,CAAEa,OAAQX,KACZ,QAAtC2E,GAAAvE,EAAC2B,GAAW,KAAKjC,EAAK8E,wBAAgB,IAAAD,KAAArE,KAAAF,EAAG,IAAIqB,YAAY3B,EAAM,CAAEa,OAAQX,IAC7E,CAuDA,SAASwC,EAAcT,GACnB,IAAI/B,EAA2I,KAC/I,OAAQ+B,EAAGE,UACP,IAAK,QACD,MAAM4C,EAAM9C,EACZ,OAAQ8C,EAAI/E,MACR,IAAK,OACL,IAAK,SACL,IAAK,WACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,MACL,IAAK,MACL,IAAK,QACL,IAAK,OACL,IAAK,iBACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,SAEGE,EADA6E,EAAIjC,KACG,CAAE,CAACiC,EAAIjC,MAAOiC,EAAIhC,OAElBgC,EAAIhC,MAEf,MACJ,IAAK,QAEG7C,EADA6E,EAAIjC,KACG,CAAE,CAACiC,EAAIjC,MAAOiC,EAAIC,QAAUD,EAAIhC,MAAQ,MAExCgC,EAAIC,QAAUD,EAAIhC,MAAQ,KAErC,MACJ,IAAK,WAGO7C,EAFU,OAAd6E,EAAIhC,MACAgC,EAAIjC,KACG,CAAE,CAACiC,EAAIjC,MAAOiC,EAAIC,SAElBD,EAAIC,QAGXD,EAAIjC,KACG,CAAE,CAACiC,EAAIjC,MAAOiC,EAAIC,QACnBhC,OAAO+B,EAAIhC,OACX,MAECgC,EAAIC,QACLhC,OAAO+B,EAAIhC,OACX,KAKtB,MACJ,IAAK,SACD,MAAMkC,EAAMhD,EACZ,GAAIgD,EAAIC,SAAU,CACd,MAAMC,EAASlC,MAAMmC,KAAKH,EAAII,iBAAiBC,KAAIC,GAAKA,EAAExC,QAEtD7C,EADA+E,EAAInC,KACG,CAAE,CAACmC,EAAInC,MAAOqC,GAEdA,CAEd,MAEOjF,EADA+E,EAAInC,KACG,CAAE,CAACmC,EAAInC,MAAOmC,EAAIlC,OAElBkC,EAAIlC,MAGnB,MACJ,IAAK,WACD,MAAMyC,EAAMvD,EAER/B,EADAsF,EAAI1C,KACG,CAAE,CAAC0C,EAAI1C,MAAO0C,EAAIzC,OAElByC,EAAIzC,MAEf,MACJ,IAAK,SACD,MAAM0C,EAAMxD,EAER/B,EADAuF,EAAI3C,KACG,CAAE,CAAC2C,EAAI3C,MAAO2C,EAAI1C,OAElB0C,EAAI1C,MAIvB,OAAO7C,CACX,CAhWWtC,EAAAwD,OAAQ,EC5InB,MAAMsE,EAAc,WACdC,EAAgB,eAChBC,EAAmB,iBAgBnB,MAAgBC,EAqBlBC,SAAS/C,GACL,GAAqB,iBAAVA,GAAP,MAA6BA,EAAuC,CACpE,MAAMgD,EAAIhD,EACTtE,KAAKuH,IAAcD,EACpB,MAAME,EAAMxH,KAAKyH,SAASH,GAE1B,GADCtH,KAAK0H,IAAcF,EAAIE,IACpBF,EAAIG,IAEJ,OADC3H,KAAK2H,IAAcH,EAAIG,IACjB,CACHJ,IAAKD,UAAK,GACVI,IAAKF,EAAIE,IACTC,IAAKH,EAAIG,KAGjB,MAAMA,EAAM3H,KAAK4H,SAASJ,EAAIE,KAE9B,OADC1H,KAAK2H,IAAcA,EACb,CACHJ,IAAKD,UAAK,GACVI,IAAKF,EAAIE,I,IACTC,EAEP,CAAM,CACF3H,KAAKuH,IAAcjD,QAA0C,KAAQ,GAAKA,EAC3E,MAAMqD,EAAM3H,KAAK4H,SAAStD,GAE1B,OADCtE,KAAK2H,IAAcA,EACb,CACHJ,IAAKvH,KAAKuH,IACVG,IAAKpD,E,IACLqD,EAEP,CACL,CAEAE,OAAOH,EAAmBG,G,MAEtB,MAAMC,EAAM9H,KAAK+H,SAASL,EAAKG,GAC/B,MAAO,CACHN,IAAY,QAAP1F,EAAAiG,EAAIP,WAAG,IAAA1F,IAAI,GAEhB8F,IAAKG,EAAIH,IAEjB,CArDA3G,YAAYgH,EAAaC,GAJhBjI,KAAAuH,IAAqB,KACrBvH,KAAA2H,IAAqB,KACrB3H,KAAA0H,IAAmB,KAGxB1H,KAAKgI,KAAOA,UAAQ,GACpBhI,KAAKiI,KAAOA,UAAQ,EACxB,EAsDE,SAAUC,EAAIC,EAAc1G,GAC9B,OAAO0C,OAAOC,KAAK3C,GACdoF,KAAIuB,GAAK,CAACA,EAAG3G,EAAK2G,MAClBC,QAAO,CAACC,EAAGtE,IACRsE,EAAEC,QAAQ,IAAIC,OAAO,SAASxE,EAAE,WAAY,KAAMO,OAAOP,EAAE,MAAMmE,EAC7E,CAgBM,MAAOM,UACDrB,EAMEK,SAASF,GACf,MAAMS,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,MAAI,aAAcD,GACVA,EAAKU,WAAanB,EACX,CACHG,IAAK,KACLC,IAAKM,EAAKS,SACJR,EAAID,EAAKS,SAAQvE,OAAAwE,OAAAxE,OAAAwE,OAAA,GAERX,EAAKvG,MAAI,CACZmH,QAAS,YAAcZ,EACjBA,EAAKY,QAASC,KAAK,MACnB,MAEZ5B,GAIX,CACHS,SAAapE,IAARiE,EAAoB,KAAOA,EAChCI,IAAK,GAEb,CAEUC,SAASF,GACf,GAAIA,QACA,MAAO,GAEX,MAAMM,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,MAAI,YAAaD,GACTN,IAAsC,IAA/BM,EAAKY,QAASE,QAAQpB,GACtBO,EAAKc,eACNb,EAAID,EAAKc,eAAc5E,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEdX,EAAKvG,MAAI,CACZuH,OAAgB,OAARtB,EAAe,GAAKA,EAC5BkB,QAAS,YAAcZ,EACjBA,EAAKY,QAASC,KAAK,MACnB,MArJT,iBA0JV,EACX,CAEUd,SAASL,EACAG,GACf,MAAO,CAAEN,IAAKG,UAAO,GAAIC,IAAK,GAClC,CAvDA3G,YAAYgH,EAA4BC,GACpChH,MAAM+G,EAAMC,EAChB,EAsEE,MAAOgB,UACD7B,EAMEK,SAASF,G,YACf,MAAMS,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,MAAI,aAAcD,GACVA,EAAKU,WAAanB,EACX,CACHG,IAAK,KACLC,IAAKM,EAAKS,SACJR,EAAID,EAAKS,SAAQvE,OAAAwE,OAAAxE,OAAAwE,OAAA,GAERX,EAAKvG,MAAI,CACZyH,IAAK,QAAUlB,EAAS,IAAc,QAARnG,EAAAmG,EAAKkB,WAAG,IAAArH,IAAI,IAAO,GACjDsH,IAAK,QAAUnB,EAAS,IAAc,QAAR5B,EAAA4B,EAAKmB,WAAG,IAAA/C,IAAI,IAAO,GACjDgD,OAAQ,WAAapB,EACd,IAAiB,QAAXqB,EAAArB,EAAKoB,cAAM,IAAAC,IAAI,IACtB,MAEZpC,GAIdM,EACI,WAAYS,IACPA,EAAKoB,OAAQE,KAAK/B,GACZ,CACHG,IAAK,KACLC,IAAKM,EAAKsB,eACJrB,EAAID,EAAKsB,eAAcpF,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEdX,EAAKvG,MAAI,CACZ2H,OAAQ,WAAapB,EACd,IAAiB,QAAXwB,EAAAxB,EAAKoB,cAAM,IAAAI,IAAI,IACtB,MAEZrC,GAIX,CAAEO,IAAKH,EAAMI,IAAK,IAElB,CAAED,IAAK,KAAMC,IAAK,GAEjC,CAEUC,SAASF,G,QACf,GAAIA,QACA,MAAO,GAEX,MAAMM,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,IAAIN,GAAe,EAgBnB,MAfI,QAASK,GACLN,EAAI3D,OAASiE,EAAKmB,MAClBxB,GAAM,GAGV,QAASK,GACLN,EAAI3D,OAASiE,EAAKkB,MAClBvB,GAAM,GAGV,QAAUK,GAAU,QAASA,GACzBN,EAAI3D,OAASiE,EAAKmB,KAAQzB,EAAI3D,OAASiE,EAAKkB,MAC5CvB,GAAM,GAGVA,EACOM,EAAKwB,aACNvB,EAAID,EAAKwB,aAAYtF,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEZX,EAAKvG,MAAI,CACZyH,IAAK,QAAUlB,EAAS,IAAc,QAARnG,EAAAmG,EAAKkB,WAAG,IAAArH,IAAI,IAAO,GACjDsH,IAAK,QAAUnB,EAAS,IAAc,QAAR5B,EAAA4B,EAAKmB,WAAG,IAAA/C,IAAI,IAAO,MAEvDc,EAEH,EACX,CAEUa,SAASL,EACAG,GACf,MAAO,CAAEN,IAAKG,UAAO,GAAIC,IAAK,GAClC,CAtFA3G,YAAYgH,EAA4BC,GACpChH,MAAM+G,EAAMC,EAChB,EAsGE,MAAOyB,UACDtC,EAMEK,SAASF,G,UACf,MAAMS,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,GAAI,aAAcD,GACVA,EAAKU,WAAanB,EAClB,MAAO,CACHG,IAAK,KACLC,IAAKM,EAAKS,SACJR,EAAID,EAAKS,SAAQvE,OAAAwE,OAAAxE,OAAAwE,OAAA,GAERX,EAAKvG,MAAI,CACZyH,IAAK,QAAUlB,EAAS,IAAc,QAARnG,EAAAmG,EAAKkB,WAAG,IAAArH,IAAI,IAAO,GACjDsH,IAAK,QAAUnB,EAAS,IAAc,QAAR5B,EAAA4B,EAAKmB,WAAG,IAAA/C,IAAI,IAAO,MAEvDa,GAIlB,GAAIM,EAAK,CACL,MAAMoC,EAAIC,OAAOrC,GACjB,IAAII,GAAe,EAOnB,GANIkC,MAAMF,KACNhC,GAAM,GAENK,EAAK8B,QAAWvC,IAAQvH,KAAK+H,SAAS4B,GAAGpC,MACzCI,GAAM,GAENA,EAAK,CACL,MAAMoC,EAAMF,MAAMF,GAAK,QAAUA,EACjC,MAAO,CACHjC,IAAKmC,MAAMF,GAAK,KAAOA,EACvBhC,IAAKM,EAAKsB,eACJrB,EAAID,EAAKsB,eAAcpF,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEdX,EAAKvG,MAAI,CACZsI,IAA2B,QAAtBV,EAAArJ,KAAK+H,SAASgC,GAAKxC,WAAG,IAAA8B,IAAI,MAErClC,EAEb,CACD,MAAO,CAAEO,IAAKiC,EAAGhC,IAAK,GACzB,CACG,MAAO,CAAED,IAAK,KAAMC,IAAK,GAEjC,CAEUC,SAASF,G,QACf,GAAIA,QACA,MAAO,GAEX,MAAMM,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,IAAIN,GAAe,EAWnB,MAVI,QAASK,GACLN,EAAMM,EAAKmB,MACXxB,GAAM,GAGV,QAASK,GACLN,EAAMM,EAAKkB,MACXvB,GAAM,GAGVA,EACOM,EAAKwB,aACNvB,EAAID,EAAKwB,aAAYtF,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEZX,EAAKvG,MAAI,CACZyH,IAAK,QAAUlB,EAAS,IAAc,QAARnG,EAAAmG,EAAKkB,WAAG,IAAArH,IAAI,IAAO,GACjDsH,IAAK,QAAUnB,EAAS,IAAc,QAAR5B,EAAA4B,EAAKmB,WAAG,IAAA/C,IAAI,IAAO,MAEvDc,EAEH,EACX,CAEUa,SAASL,EACAG,GACf,IAAIN,EAUJ,OARIA,EADAG,QACM,GAEF,aAAc1H,KAAKgI,KACbN,EAAIsC,QAAQhK,KAAKgI,KAAKiC,UAEtB1F,OAAOmD,GAGd,C,IACHH,EACAI,IAAK,GAEb,CAhGA3G,YAAYgH,EAA4BC,GACpChH,MAAM+G,EAAMC,EAChB,EAkHJ,MAAMiC,EAAsBC,GAAeA,EAAKC,iBAC1CC,EAA0BF,GAAeA,EAAKG,qBAE9CC,EAAmBJ,GAAeA,EAAKK,cACvCC,EAAuBN,GAAe,IAAIO,KAAKP,EAAKQ,gBAAgBH,cAEpE,MAAOI,UACDxD,EAmBEK,SAASF,G,MACf,MAAMS,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,GAAI,aAAcD,GACVA,EAAKU,WAAanB,EAClB,MAAO,CACHG,IAAK,KACLC,IAAKM,EAAKS,SACJR,EAAID,EAAKS,SAAQvE,OAAAwE,OAAAxE,OAAAwE,OAAA,GAERX,EAAKvG,MAAI,CACZyH,IAAK,QAAUlB,GAAQA,EAAKkB,IAAOlJ,KAAK6K,UAAU7C,EAAKkB,KAAO,GAC9DC,IAAK,QAAUnB,GAAQA,EAAKmB,IAAOnJ,KAAK6K,UAAU7C,EAAKmB,KAAO,MAEpElC,GAIlB,GAAIM,EAAK,CACL,MAAMuD,EAAKJ,KAAKK,MAAMxD,GACtB,IAAIvD,EAAI,IAAI0G,KAAKI,GACb9C,EAAKgD,WACLhH,EAAI,IAAI0G,KAAK1G,EAAEiH,cAAejH,EAAEkH,WAAYlH,EAAEmH,YAElD,IAAIxD,GAAe,EAOnB,GANIkC,MAAMiB,KACNnD,GAAM,GAKNA,EAAK,CACL,MAAMwC,EAAON,MAAMiB,GAAM,IAAIJ,KAAS1G,EACtC,MAAO,CACH0D,IAAKmC,MAAMiB,GAAM,KAAO9G,EACxB2D,IAAKM,EAAKsB,eACJrB,EAAID,EAAKsB,eAAcpF,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEdX,EAAKvG,MAAI,CACZ0I,KAA6B,QAAvBtI,EAAA7B,KAAK+H,SAASoC,GAAM5C,WAAG,IAAA1F,IAAI,MAEvCsF,EAEb,CACD,MAAO,CAAEO,IAAK1D,EAAG2D,IAAK,GACzB,CACG,MAAO,CAAED,IAAK,KAAMC,IAAK,GAEjC,CAEUC,SAASF,GACf,GAAIA,QACA,MAAO,GAEX,MAAMM,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,IAAIN,GAAe,EAWnB,MAVI,QAASK,GACLA,EAAKmB,KAAOzB,EAAI0D,UAAYpD,EAAKmB,IAAIiC,YACrCzD,GAAM,GAGV,QAASK,GACLA,EAAKkB,KAAOxB,EAAMM,EAAKkB,MACvBvB,GAAM,GAGVA,EACOM,EAAKwB,aACNvB,EAAID,EAAKwB,aAAYtF,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEZX,EAAKvG,MAAI,CACZyH,IAAK,QAAUlB,GAAQA,EAAKkB,IAAOlJ,KAAK6K,UAAU7C,EAAKkB,KAAO,GAC9DC,IAAK,QAAUnB,GAAQA,EAAKmB,IAAOnJ,KAAK6K,UAAU7C,EAAKmB,KAAO,MAEpEjC,EAEH,EACX,CAEUa,SAASL,EACAG,GACf,MAAO,CACHN,IAAKG,QAAsC,GAAK1H,KAAK6K,UAAUnD,GAC/DC,IAAK,GAEb,CArGA3G,YAAYgH,EAA0BC,GAClChH,MAAM+G,EAAMC,IACRD,aAAI,EAAJA,EAAMqD,KACNrL,KAAK6K,WAAY7C,aAAI,EAAJA,EAAMgD,UAAWP,EAAsBF,EAExDvK,KAAK6K,WAAY7C,aAAI,EAAJA,EAAMgD,UAAWX,EAAyBH,GAE3DlC,aAAI,EAAJA,EAAMgD,YAAYhD,aAAI,EAAJA,EAAMkB,OACxBlB,EAAKkB,IAAM,IAAIwB,KAAK1C,EAAKkB,IAAI+B,cAAejD,EAAKkB,IAAIgC,WAAYlD,EAAKkB,IAAIiC,aAE1EnD,aAAI,EAAJA,EAAMgD,YAAYhD,aAAI,EAAJA,EAAMmB,OACxBnB,EAAKmB,IAAM,IAAIuB,KAAK1C,EAAKmB,IAAI8B,cAAejD,EAAKmB,IAAI+B,WAAYlD,EAAKmB,IAAIgC,UAAY,GAE9F,EAsGE,MAAOG,UACDlE,EAMEK,SAASF,GACf,MAAMS,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,GAAI,aAAcD,GACVA,EAAKU,WAAanB,EAClB,MAAO,CACHG,IAAK,KACLC,IAAKM,EAAKS,SACJR,EAAID,EAAKS,SAAQvE,OAAAwE,OAAA,GAERX,EAAKvG,OAEdwF,GAIlB,IAAIsE,EACJ,OAAQhE,GACJ,IAAK,OACL,IAAK,IACL,IAAK,KACL,IAAK,MACDgE,GAAI,EACJ,MACJ,QACIA,GAAI,EAEZ,MAAO,CAAE7D,IAAK6D,EAAG5D,IAAK,GAC1B,CAEUC,SAASF,G,MACf,GAAIA,QACA,MAAO,GAEX,MAAMM,EAAOhI,KAAKgI,KACZC,EAAOjI,KAAKiI,KAClB,IAAIN,GAAM,EAMV,MALI,UAAWK,GACPN,IAAQM,EAAK1D,QACbqD,GAAM,GAGVA,EACOM,EAAKuD,cACNtD,EAAID,EAAKuD,cAAarH,OAAAwE,OAAAxE,OAAAwE,OAAA,GAEbX,EAAKvG,MAAI,CACZ6C,MAAO,UAAY0D,EAAS,IAAgB,QAAVnG,EAAAmG,EAAK1D,aAAK,IAAAzC,IAAI,IAAO,MAtkBvD,gBA0kBT,EACX,CAEUkG,SAASL,EACAG,GACf,MAAO,CACHN,IAAKG,QAAsC,GAAM,GAAKA,EACtDC,IAAK,GAEb,CAhEA3G,YAAYgH,EAA6BC,GACrChH,MAAM+G,EAAMC,EAChB,EA+EE,MAAOwD,EAUTC,aAAaC,EAAmBC,GAE5B,OADA5L,KAAK6L,WAAWF,GAASC,EAClB5L,IACX,CAEAqH,SAAS5F,GACL,MAAMqK,EAAM3H,OAAOC,KAAKpE,KAAK6L,YACxBxD,QACG,CAAChD,EAAG+C,KACA,MAAMd,EAAK7F,EAAa2G,GAClB2D,EAAK/L,KAAK6L,WAAmBzD,GAAGf,SAASC,GAK/C,OAJCjC,EAAEkC,IAAYa,GAAK2D,EAAExE,IACrBlC,EAAEqC,IAAYU,GAAK2D,EAAErE,IACrBrC,EAAEsC,IAAYS,GAAK2D,EAAEpE,IACtBoE,EAAEpE,MAAQtC,EAAE2G,OAAQ,GACb3G,CAAA,GAEX,CAAEkC,IAAK,GAAIG,IAAK,GAAIC,IAAK,GAAIqE,OAAO,IAK5C,OAJChM,KAAKuH,IAAcuE,EAAIvE,IACvBvH,KAAK0H,IAAcoE,EAAIpE,IACvB1H,KAAK2H,IAAcmE,EAAInE,IACvB3H,KAAKgM,MAAgBF,EAAIE,MACnBhM,IACX,CAEA6H,OAAOpG,GACH,MAAMqK,EAAM3H,OAAOC,KAAKpE,KAAK6L,YACxBxD,QACG,CAAChD,EAAG+C,KACA,MAAMd,EAAK7F,EAAa2G,GAClB2D,EAAK/L,KAAK6L,WAAmBzD,GAAGP,OAAOP,GAK7C,OAJCjC,EAAEkC,IAAYa,GAAK2D,EAAExE,IACrBlC,EAAEqC,IAAYU,GAAKd,EACnBjC,EAAEsC,IAAYS,GAAK2D,EAAEpE,IACtBoE,EAAEpE,MAAQtC,EAAE2G,OAAQ,GACb3G,CAAA,GAEX,CAAEkC,IAAK,GAAIG,IAAK,GAAIC,IAAK,GAAIqE,OAAO,IAK5C,OAJChM,KAAKuH,IAAcuE,EAAIvE,IACvBvH,KAAK0H,IAAcoE,EAAIpE,IACvB1H,KAAK2H,IAAcmE,EAAInE,IACvB3H,KAAKgM,MAAgBF,EAAIE,MACnBhM,IACX,CAEAyB,OACI,MAAO,CACH8F,IAAKvH,KAAKuH,IACVG,IAAK1H,KAAK0H,IACVC,IAAK3H,KAAK2H,IACVqE,MAAOhM,KAAKgM,MAEpB,CA9DJhL,cAEahB,KAAA6L,WAAmC,EA8DhD,E,0SC5nBA,IAAYI,EAAAC,KAAAD,MAAoB,KAC5B,gCACAC,EAAA,gCAsGJ,IAAIC,EAyGJ,SAASC,EAAcjC,GACnB,IAAKA,EACD,MAAO,GAGX,GAAY,KADEA,EAAKkC,oBAEf,OAAOlC,EAAKK,cACT,CAEH,MAAM8B,EAAM,SAAUvC,EAAawC,EAAS,GACxC,OAAOhI,OAAOwF,GAAKyC,SAASD,EAAQ,IACxC,EACA,OACIpC,EAAKc,cACL,IACAqB,EAAInC,EAAKe,WAAa,GACtB,IACAoB,EAAInC,EAAKgB,WACT,IACAmB,EAAInC,EAAKsC,YACT,IACAH,EAAInC,EAAKuC,aAwBhB,CACL,EAEA,EAAAC,EAAArH,OApRgE,WAC5D,MAAO,CACHsH,MAAO,kBACPnL,KAAM,CACF4C,KAAM,MACNwI,KAAM,IAAInC,KACVoC,SAAU,EACVC,SAAS,EACTC,OAAQ,SACRC,MAAO,cAEXC,QAAS,CACL,CAAEC,MAAO,OAAQ7I,MAAO,QACxB,CAAE6I,MAAO,SAAU7I,MAAO,WAE9B8I,OAAQ,CAAC,WAAY,cAE7B,IAO8D,SAAUvO,GACpE,MAAO,CACH,CAAC,iBAAkB,CACf,CAAC,KAAMA,EAAM+N,OACb,CAAC,oBACG,CACIS,GAAI,CACA,CAAC,SAAUpB,EAAqBqB,QAChC,CAAC,SAAUrB,EAAqBsB,UAGxC,CACI,CAAC,IAAK,CACF,CAAC,QAAS,CAAC,OACP,CAAC,iBAAkB,CACfhM,KAAM,OACN8C,KAAM,OACNC,MAAOzF,EAAM2O,cAAejG,IAAIlD,KAChCgJ,GAAI,CAAC,QAASpB,EAAqBqB,cAI/C,CAAC,gBAAiB,CAACzO,EAAM2O,cAAe7F,IAAItD,OAC5C,CAAC,IAAK,CACF,CAAC,QAAS,CAAC,OACP,CAAC,iBAAkB,CACf9C,KAAM,iBACN8C,KAAM,OAENC,MAAO8H,EAAcvN,EAAM2O,cAAe9F,IAAImF,YAI1D,CAAC,gBAAiB,CAAChO,EAAM2O,cAAe7F,IAAIkF,OAC5C,CAAC,IAAK,CACF,CAAC,QAAS,CAAC,WACP,CAAC,iBAAkB,CACftL,KAAM,SACN8C,KAAM,WACNC,MAAOzF,EAAM2O,cAAejG,IAAIuF,eAI5C,CAAC,gBAAiB,CAACjO,EAAM2O,cAAe7F,IAAImF,WAC5C,CAAC,IAAK,CACF,CAAC,QAAS,CACN,CAAC,iBAAkB,CACfvL,KAAM,WACN8C,KAAM,UACNkC,QAAS1H,EAAM2O,cAAe9F,IAAIqF,UAEtC,eAGR,CAAC,gBAAiB,CAAClO,EAAM2O,cAAe7F,IAAIoF,UAC5C,CAAC,KACG,EAAAU,EAAAC,OACI7O,EAAMqO,QAAQrG,KAAcmG,GACxB,CAAC,QAAS,CACN,CAAC,iBAAkB,CACfzL,KAAM,QACN8C,KAAM,SACNC,MAAO0I,EAAO1I,MACdiC,QAAS1H,EAAM2O,cAAe9F,IAAIsF,SAAWA,EAAO1I,QAExD,IAAK0I,EAAOG,UAGpB,CAAC,QAGT,CAAC,gBAAiB,CAACtO,EAAM2O,cAAe7F,IAAIqF,SAC5C,CAAC,IAAK,CACF,CAAC,mBAAoB,CAAE3I,KAAM,SACzB,CACI,CAAC,SACG,CAAEC,MAAO,GAAIqJ,UAAU,EAAMC,UAAU,GACvC,YAED/O,EAAMuO,OAAOvG,KAAcoG,GAC1B,CAAC,SACG,CACI3I,MAAO2I,EACPW,SAAUX,IAAUpO,EAAM2O,cAAe9F,IAAIuF,OAEjDA,SAMpB,CAAC,gBAAiBpO,EAAM2O,cAAe7F,IAAIsF,OAC3C,CAAC,wBAAyB,cAK9C,IAI0E,SAAgB5L,EAAQxC,G,yCAG9F,OAFArB,QAAQC,IAAI,SAAU4D,GAEdA,EAAOE,MAEX,KAAKoL,EAAA5O,WAAW+H,MAgCE+H,EA/BYhP,EAA1BsN,GAgCD,IAAIV,GACNC,aAAa,OAAQ,IAAIzC,EACtB,CACIP,UAAU,EACVQ,IAAK,EACLC,IAAK,GAET,CACIT,SAAU,wCACVa,eAAgB,4BAChBE,aAAc,oCAErBiC,aAAa,OAAQ,IAAId,EACtB,CACIlC,UAAU,EAEVS,IAAK,IAAIuB,KACTM,UAAU,EACVK,KAAK,GAET,CACI3C,SAAU,6BACVa,eAAgB,0BAChBE,aAAc,oCAErBiC,aAAa,WAAY,IAAIhC,EAC1B,CACIhB,UAAU,EACVQ,IAAK,EACLC,IAAK,IAET,CACIT,SAAU,6BACVa,eAAgB,qCAChBE,aAAc,oCAErBiC,aAAa,SAAU,IAAIjD,EACxB,CACIC,UAAU,EACVE,QAASiF,EAAUX,QAAQrG,KAAIiH,GAAKA,EAAExJ,SAE1C,CACIoE,SAAU,uBACVK,eAAgB,2CAEvB2C,aAAa,UAAW,IAAIJ,EACzB,CACI5C,UAAU,GAEd,CACIA,SAAU,WACV8C,cAAe,6BAEtBE,aAAa,QAAS,IAAIjD,EACvB,CACIC,UAAU,EACVE,QAASiF,EAAUT,QAEvB,CACI1E,SAAU,uBACVK,eAAgB,2CAEvBlB,OAAOgG,EAAUpM,MA7Fd5C,EAAM2O,cAAgBrB,EAAc1K,OACpC,MAEJ,KAAKwK,EAAqBqB,OACtBnB,EAAc9E,SAAQlD,OAAAwE,OAAAxE,OAAAwE,OAAA,GACf9J,EAAM2O,cAAejG,KACrBlG,EAAOI,OAEd5C,EAAM2O,cAAgBrB,EAAc1K,OACpCjE,QAAQC,IAAI,OAAQsQ,KAAKC,UAAUnP,EAAM2O,cAAe,KAAM,IAC9D,MAEJ,KAAKvB,EAAqBsB,OAOtB,GANAlM,EAAOK,MAAOiC,iBAEdwI,EAAc9E,SAAShG,EAAOI,MAC9B5C,EAAM2O,cAAgBrB,EAAc1K,OAEpC5C,EAAM2O,cAAgBrB,EAAc1K,OAChC0K,EAAcH,MAAO,CACrBxO,QAAQC,IAAI0O,GACZtN,EAAM4C,KAAO0K,EAAczE,IAC3B,MAAMuG,EAAWF,KAAKC,UAAUnP,EAAM4C,KAAM,KAAM,GAClDjE,QAAQ0Q,IAAID,GACZE,MAAM,kBAAkBF,IAC3B,EAKP,IAAoBJ,CAF1B,GAAC,G","sources":["src/hsml-app.ts","src/validators.ts","demo/hsml-app-form-validation_demo.ts"],"sourcesContent":["import { HAttrOnData, HAttrOnDataFnc, HElement, HElements, HHandlerCtx } from \"./hsml\";\nimport { hsmls2idomPatch } from \"./hsml-idom\";\n\nconst log = console.log;\nconst error = console.error;\nconst warn = console.warn;\n\nexport type HState<STATE> = () => STATE;\nexport type HView<STATE> = (state: STATE) => HElements;\nexport type HView1<STATE> = (state: STATE) => HElement;\n\nexport interface HAction {\n type: string;\n data?: any;\n event?: Event;\n}\n\nexport type HDispatch = (type: HAction[\"type\"],\n data?: HAction[\"data\"],\n event?: HAction[\"event\"]) => Promise<void>;\n\nexport type HUpdate = () => void;\n\nexport type HDispatcher<STATE> = (action: HAction, state: STATE, dispatch: HDispatch) => Promise<void>;\n// export type HDispatcher<STATE> = (this: HApp<STATE>, action: HAction, state: STATE, dispatch: HDispatch) => Promise<void>;\n\nexport enum HAppAction {\n _init = \"_init\",\n _mount = \"_mount\",\n _umount = \"_umount\",\n _element = \"_element\"\n}\n\nconst schedule = window.requestAnimationFrame ||\n // window.webkitRequestAnimationFrame ||\n // (window as any).mozRequestAnimationFrame ||\n // (window as any).oRequestAnimationFrame ||\n // (window as any).msRequestAnimationFrame ||\n function (callback: Function) { window.setTimeout(callback, 1000 / 60); };\n\nconst unschedule = window.cancelAnimationFrame ||\n // window.webkitCancelAnimationFrame ||\n // (window as any).mozCancelAnimationFrame ||\n // (window as any).oCancelAnimationFrame ||\n // (window as any).msCancelAnimationFrame ||\n function (handle: number) { window.clearTimeout(handle); };\n\nconst msgAction = \"HApp action:\";\nconst msgDispatch = \"HApp dispatch:\";\nconst msgRender = \"HApp render:\";\nconst msgUpdate = \"HApp update:\";\n\nexport function happ<STATE>(state: HState<STATE>,\n view: HView<STATE>,\n dispatcher: HDispatcher<STATE>,\n element: Element | string | null = document.body) {\n return new HApp<STATE>(state, view, dispatcher, element);\n}\n\n// HAppI\n\nexport type Class<T = object> = new (...args: any[]) => T;\n\nexport interface HAppI<STATE> {\n state(): STATE;\n view(state: STATE): HElements;\n dispatcher(action: HAction, state: STATE, dispatch: HDispatch): Promise<void>;\n // dispatcher(this: HApp<STATE>, action: HAction, state: STATE, dispatch: HDispatch): Promise<void>;\n}\n\nexport function happi<STATE>(hAppI: Class<HAppI<STATE>>, e: Element | string | null = document.body) {\n const hapi = new hAppI();\n return new HApp<STATE>(hapi.state, hapi.view, hapi.dispatcher, e);\n}\n\n// HAppEl\n\nexport function happel<STATE>(elementName: string,\n elementAttrs: string[],\n state: HState<STATE>,\n view: HView<STATE>,\n dispatcher: HDispatcher<STATE>): void {\n customElements.define(elementName, class HAppElement extends HTMLElement {\n\n static get observedAttributes() {\n return elementAttrs;\n }\n\n private _happel: HApp<STATE>;\n\n constructor() {\n super();\n this._happel = new HApp<STATE>(state, view, dispatcher);\n (this._happel as any).customElement = this;\n }\n\n connectedCallback() {\n // this._happel.mount(this);\n this.attachShadow({ mode: \"open\" });\n this._happel.mount(this.shadowRoot as any);\n }\n\n disconnectedCallback() {\n this._happel.umount();\n }\n\n adoptedCallback() {\n this._happel.update();\n }\n\n attributeChangedCallback(attrName: string, oldVal: string | null, newVal: string | null) {\n this._happel.dispatch(HAppAction._element, { attrName, oldVal, newVal });\n }\n\n });\n}\n\n// HAppC\n\nexport type HController<State> = (this: HApp<State>,\n data?: HAction[\"data\"],\n event?: HAction[\"event\"]) => void;\n\nexport type HControllers<State, TypeofActionEnum> = { [actionType in keyof TypeofActionEnum]?: HController<State>; };\n\nexport function controllersDdispatcher<State, TyopeofActionEnum>(controllers: HControllers<State, TyopeofActionEnum>): HDispatcher<State> {\n return async function (this: HApp<State>, action) {\n const controller = controllers[action.type as keyof TyopeofActionEnum];\n if (controller) {\n controller.apply<HApp<State>, [any?, Event?], void>(this, [action.data, action.event]);\n } else {\n warn(\"no controller for action\", action);\n }\n };\n}\n\nconst HAPP = \"happ\";\n\nexport class HApp<STATE> implements HHandlerCtx {\n\n static debug = false;\n\n readonly state: STATE;\n readonly view: HView<STATE>;\n readonly dispatcher: HDispatcher<STATE>;\n\n readonly customElement?: HTMLElement; // happ custom html element\n\n readonly dom?: HTMLElement;\n readonly refs: { [key: string]: HTMLElement } = {};\n\n private _updateSched?: number;\n\n private _onDispatch?: HDispatcher<STATE>;\n\n private _windowEventListener?: (event: Event) => void;\n\n constructor(state: HState<STATE>, view: HView<STATE>, dispatcher?: HDispatcher<STATE>, e: Element | string | null = document.body) {\n this.state = state();\n this.view = view;\n this.dispatcher = dispatcher ?? (async (a) => log(msgAction, a.type, a.data));\n this.dispatch(HAppAction._init, this).then(() => this.mount(e));\n }\n\n private async _dispatch(type: string, data: any, event: Event | undefined) {\n try {\n await this.dispatcher({ type, data, event }, this.state, this.dispatch);\n this._onDispatch?.({ type, data, event }, this.state, this.dispatch);\n this.dom && elementDispatchCustomEvent(this.dom, HAPP, { type, data, event });\n this.customElement && elementDispatchCustomEvent(this.customElement, type, data);\n !this.customElement && this.dom && elementDispatchCustomEvent(this.dom, type, data);\n this.update();\n } catch (e) {\n error(msgDispatch, e);\n }\n }\n\n onDispatch = (dispatcher: HDispatcher<STATE>): this => {\n this._onDispatch = dispatcher;\n return this;\n }\n\n dispatch: HDispatch = async (type: string, data?: any, event?: Event): Promise<void> => {\n if (HApp.debug) {\n log(msgAction, { type, data, event });\n const t0 = performance.now();\n await this._dispatch(type, data, event);\n const t1 = performance.now();\n log(msgDispatch, `${t1 - t0} ms`, this.state);\n } else {\n await this._dispatch(type, data, event);\n }\n }\n\n windowDispatch: HDispatch = async (type: string, data?: any, event?: Event): Promise<void> => {\n window.dispatchEvent(new CustomEvent(HAPP, { detail: { type, data } }));\n }\n\n windowDispatchOn() {\n if (!this._windowEventListener) {\n this._windowEventListener = (event: Event) => {\n const action = (event as CustomEvent).detail as HAction;\n this.dispatch(action.type, action.data, event);\n };\n window.addEventListener(HAPP, this._windowEventListener);\n } else {\n warn(\"windowEventListener olready setted\");\n }\n }\n\n windowDispatchOff() {\n if (this._windowEventListener) {\n window.removeEventListener(HAPP, this._windowEventListener);\n }\n }\n\n render = (): HElements => {\n if (HApp.debug) {\n const t0 = performance.now();\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(msgRender, e);\n }\n const t1 = performance.now();\n log(msgRender, `${t1 - t0} ms`, hsmls);\n return hsmls ?? [];\n } else {\n let hsmls;\n try {\n hsmls = this.view(this.state);\n } catch (e) {\n error(msgRender, e);\n }\n return hsmls ?? [];\n }\n }\n\n actionCb = (action: string, data: HAttrOnData, event: Event): void => {\n data = (data?.constructor === Function)\n ? (data as HAttrOnDataFnc)(event)\n : data;\n if (data === undefined && event) {\n if (event instanceof CustomEvent) {\n data = event.detail;\n } else {\n data = formData(event);\n }\n }\n this.dispatch(action, data, event);\n }\n\n mount = (e: Element | string | null = document.body): this => {\n const el = (typeof e === \"string\")\n ? document.getElementById(e) ?? document.body\n : e ?? document.body;\n if ((el as any)[HAPP]) {\n const a = (el as any)[HAPP] as HApp<STATE>;\n a.umount();\n }\n if (!this.dom) {\n (this as any).dom = el;\n (el as any)[HAPP] = this;\n const hsmls = (this as any).render();\n updateDom(el, hsmls, this);\n this.dispatch(HAppAction._mount, this.dom);\n }\n return this;\n }\n\n umount = (): this => {\n if (this.dom) {\n this.dispatch(HAppAction._umount, this.dom);\n if (this.dom.hasAttribute(HAPP)) {\n this.dom.removeAttribute(HAPP);\n }\n const aNodes = this.dom.querySelectorAll(`[${HAPP}]`);\n for (let i = 0; i < aNodes.length; i++) {\n const a = (aNodes[i] as any).happ as HApp<STATE>;\n a?.umount();\n }\n while (this.dom.firstChild /*.hasChildNodes()*/) {\n this.dom.removeChild(this.dom.firstChild);\n }\n delete (this.dom as any).happ;\n (this as any).dom = undefined;\n }\n return this;\n }\n\n update = (): this => {\n if (this.dom && !this._updateSched) {\n this._updateSched = schedule(() => {\n if (this.dom) {\n const hsmls = this.render();\n updateDom(this.dom, hsmls, this);\n }\n this._updateSched = undefined;\n });\n }\n return this;\n }\n\n toHsml = (): HElement => {\n if (this.dom) {\n if (this._updateSched) {\n unschedule(this._updateSched);\n this._updateSched = undefined;\n } else {\n return [\"div\", { _skip: true }];\n }\n }\n const hsmls = this.render();\n hsmls.push(\n (e: Element) => {\n if (!this.dom) {\n (this as any).dom = e;\n (e as any).happ = this;\n this.dispatch(HAppAction._mount, this.dom);\n }\n });\n return [\"div\", hsmls];\n }\n\n toHtml = (): string => {\n return this.dom ? this.dom.outerHTML : \"\";\n }\n\n}\n\nfunction updateDom(el: Element, hsml: HElements, ctx: HHandlerCtx): void {\n if (HApp.debug) {\n const t0 = performance.now();\n hsmls2idomPatch(el, hsml, ctx);\n const t1 = performance.now();\n log(msgUpdate, `${t1 - t0} ms`, el);\n } else {\n hsmls2idomPatch(el, hsml, ctx);\n }\n}\n\nfunction elementDispatchCustomEvent(el: HTMLElement, type: string, data: any) {\n el?.dispatchEvent(new CustomEvent(type, { detail: data }));\n (el as any)[`on${type.toLowerCase()}`]?.(new CustomEvent(type, { detail: data }));\n}\n\nfunction formData(e: Event): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n const el = e.target as HTMLElement;\n switch (el.nodeName) {\n case \"FORM\":\n (e as Event).preventDefault();\n const els = (el as HTMLFormElement).elements;\n const data = {} as { [k: string]: string | null | Array<string | null> };\n for (let i = 0; i < els.length; i++) {\n const d = formInputData(els[i]);\n if (typeof d === \"object\") {\n const names = Object.keys(d as object);\n if (names.length) {\n const name = names[0];\n const value = (d as any)[name];\n if (data[name] === undefined) {\n data[name] = value;\n } else if (typeof data[name] === \"string\" || data[name] instanceof String) {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value as string];\n }\n } else if (data[name] instanceof Array) {\n if (value instanceof Array) {\n data[name] = (data[name] as Array<string | null>).concat(value);\n } else {\n (data[name] as Array<string | null>).push(value);\n }\n } else {\n if (value instanceof Array) {\n data[name] = [data[name] as string, ...value];\n } else {\n data[name] = [data[name] as string, value];\n }\n }\n if (data[name] instanceof Array) {\n data[name] = (data[name] as Array<string | null>)\n .filter(d => d !== null);\n if ((els[i] as HTMLInputElement).type === \"radio\") {\n data[name] = (data[name] as Array<string | null>).length\n ? (data[name] as Array<string | null>)[0]\n : null;\n }\n }\n }\n }\n }\n return data;\n default:\n return formInputData(el);\n }\n}\n\nfunction formInputData(el: Element): { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> {\n let data: { [k: string]: string | number | boolean | null | Array<string | null> } | string | number | boolean | null | Array<string | null> = null;\n switch (el.nodeName) {\n case \"INPUT\":\n const iel = el as HTMLInputElement;\n switch (iel.type) {\n case \"text\":\n case \"hidden\":\n case \"password\":\n case \"email\":\n case \"number\":\n case \"search\":\n case \"url\":\n case \"tel\":\n case \"color\":\n case \"date\":\n case \"datetime-local\":\n case \"month\":\n case \"range\":\n case \"time\":\n case \"week\":\n case \"submit\":\n case \"button\":\n if (iel.name) {\n data = { [iel.name]: iel.value };\n } else {\n data = iel.value;\n }\n break;\n case \"radio\":\n if (iel.name) {\n data = { [iel.name]: iel.checked ? iel.value : null };\n } else {\n data = iel.checked ? iel.value : null;\n }\n break;\n case \"checkbox\":\n if (iel.value === \"on\") { // value not set in element\n if (iel.name) {\n data = { [iel.name]: iel.checked };\n } else {\n data = iel.checked;\n }\n } else {\n if (iel.name) {\n data = { [iel.name]: iel.checked\n ? String(iel.value)\n : null };\n } else {\n data = iel.checked\n ? String(iel.value)\n : null;\n }\n }\n break;\n }\n break;\n case \"SELECT\":\n const sel = el as HTMLSelectElement;\n if (sel.multiple) {\n const values = Array.from(sel.selectedOptions).map(o => o.value);\n if (sel.name) {\n data = { [sel.name]: values };\n } else {\n data = values;\n }\n } else {\n if (sel.name) {\n data = { [sel.name]: sel.value };\n } else {\n data = sel.value;\n }\n }\n break;\n case \"TEXTAREA\":\n const tel = el as HTMLTextAreaElement;\n if (tel.name) {\n data = { [tel.name]: tel.value };\n } else {\n data = tel.value;\n }\n break;\n case \"BUTTON\":\n const bel = el as HTMLButtonElement;\n if (bel.name) {\n data = { [bel.name]: bel.value };\n } else {\n data = bel.value;\n }\n break;\n }\n return data;\n}\n\n// export const formInputData = <STATE>(dispatcher: Actions<STATE>): Actions<STATE> =>\n// (app: App<STATE>, action: string | number, data?: any, event?: Event): void => {\n// if (data === undefined && event) {\n// data = inputEventData(event);\n// }\n// dispatcher(app, action, data, event);\n// };\n\n// // Decorator\n// export function FormInputData() {\n// return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n// const method = descriptor.value;\n// descriptor.value = formInputData(method);\n// return descriptor;\n// };\n// }\n","const requiredMsg = \"required\";\nconst notInRangeMsg = \"not_in_range\";\nconst invalidFormatMsg = \"invalid_format\";\nconst invalidOptionMsg = \"invalid_option\";\nconst invalidValueMsg = \"invalid_value\";\n\n// name@doamin.net\nexport const emailRegex = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;\n\n// +421901123456 or +421 901 123 456 or +421-901-123-456 or 901123456 or 901 123 456 or 901-123-456\nexport const phoneRgex = /^(((00)([- ]?)|\\+)(\\d{1,3})([- ]?))?((\\d{3})([- ]?))((\\d{3})([- ]?))(\\d{3})$/;\n\n// 123 45 or 12345\nexport const pscRgex = /^\\d{3} ?\\d{2}$/;\n\n// 450115/8346\nexport const rodneCisloRgex = /^\\s*(\\d\\d)(\\d\\d)(\\d\\d)[ /]*(\\d\\d\\d)(\\d?)\\s*$/;\n\nexport abstract class Validator<TYPE, OPTS, MSGS> {\n\n readonly opts: OPTS;\n readonly msgs: MSGS;\n\n readonly str: string | null = null;\n readonly err: string | null = null;\n readonly obj: TYPE | null = null;\n\n constructor(opts?: OPTS, msgs?: MSGS) {\n this.opts = opts ?? {} as OPTS;\n this.msgs = msgs ?? {} as MSGS;\n }\n\n protected abstract strToObj(str?: string | null): { obj: TYPE | null, err: string };\n\n protected abstract objCheck(obj?: TYPE | null): string;\n\n protected abstract objToStr(obj?: TYPE | null,\n format?: string): { str: string, err: string };\n\n validate(value?: string | TYPE): { str?: string | null, obj?: TYPE | null, err: string } {\n if (typeof value === \"string\" || value === undefined || value === null) {\n const v = value as string | null | undefined;\n (this.str as any) = v;\n const sto = this.strToObj(v);\n (this.obj as any) = sto.obj;\n if (sto.err) {\n (this.err as any) = sto.err;\n return {\n str: v ?? \"\",\n obj: sto.obj,\n err: sto.err\n };\n }\n const err = this.objCheck(sto.obj);\n (this.err as any) = err;\n return {\n str: v ?? \"\",\n obj: sto.obj,\n err\n };\n } else {\n (this.str as any) = (value === undefined || value === null) ? null : (\"\" + value);\n const err = this.objCheck(value);\n (this.err as any) = err;\n return {\n str: this.str,\n obj: value,\n err\n };\n }\n }\n\n format(obj?: TYPE | null, format?: string): { str: string, err: string } {\n // const err = this.objCheck(obj);\n const ots = this.objToStr(obj, format);\n return {\n str: ots.str ?? \"\",\n // err: ots.err ? ots.err : err\n err: ots.err\n };\n }\n\n}\n\nexport function tpl(tmpl: string, data: { [k: string]: any }): string {\n return Object.keys(data)\n .map(k => [k, data[k]])\n .reduce((t, d) =>\n t.replace(new RegExp(`\\\\{\\\\{${d[0]}\\\\}\\\\}`, \"g\"), String(d[1])), tmpl);\n}\n\nexport interface ValidatorDataOpts {\n data?: { [key: string]: any };\n}\n\nexport interface SelectValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n options?: string[];\n}\n\nexport interface SelectValidatorMsgs {\n required?: string;\n invalid_option?: string;\n}\n\nexport class SelectValidator\n extends Validator<string, SelectValidatorOpts, SelectValidatorMsgs> {\n\n constructor(opts?: SelectValidatorOpts, msgs?: SelectValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n return {\n obj: str === undefined ? null : str,\n err: \"\"\n };\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"options\" in opts) {\n if (obj && opts.options!.indexOf(obj) === -1) {\n return msgs.invalid_option\n ? tpl(msgs.invalid_option,\n {\n ...opts.data,\n option: obj === null ? \"\" : obj,\n options: (\"options\" in opts)\n ? opts.options!.join(\", \")\n : \"\"\n })\n : invalidOptionMsg;\n }\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj ?? \"\", err: \"\" };\n }\n\n}\n\nexport interface StringValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n regexp?: RegExp;\n}\n\nexport interface StringValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class StringValidator\n extends Validator<string, StringValidatorOpts, StringValidatorMsgs> {\n\n constructor(opts?: StringValidatorOpts, msgs?: StringValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: string | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp ?? \"\"))\n : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n if (\"regexp\" in opts) {\n if (!opts.regexp!.test(str)) {\n return {\n obj: null,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n regexp: (\"regexp\" in opts)\n ? (\"\" + (opts.regexp ?? \"\"))\n : \"\"\n })\n : invalidFormatMsg\n };\n }\n }\n return { obj: str , err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: string | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj.length > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj.length < opts.min!) {\n err = true;\n }\n }\n if ((\"min\" in opts) && (\"max\" in opts)) {\n if (obj.length > opts.max! && obj.length < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: string | null,\n format?: string): { str: string, err: string } {\n return { str: obj ?? \"\", err: \"\" };\n }\n\n}\n\nexport interface NumberValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: number;\n max?: number;\n strict?: boolean;\n decimals?: number;\n}\n\nexport interface NumberValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nexport class NumberValidator\n extends Validator<number, NumberValidatorOpts, NumberValidatorMsgs> {\n\n constructor(opts?: NumberValidatorOpts, msgs?: NumberValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: number | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const n = Number(str);\n let err: boolean = false;\n if (isNaN(n)) {\n err = true;\n }\n if (opts.strict && (str !== this.objToStr(n).str)) {\n err = true;\n }\n if (err) {\n const num = isNaN(n) ? 1234.45 : n;\n return {\n obj: isNaN(n) ? null : n,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n num: this.objToStr(num).str ?? \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: n, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: number | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (obj > opts.max!) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (obj < opts.min!) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts) ? (\"\" + (opts.min ?? \"\")) : \"\",\n max: (\"max\" in opts) ? (\"\" + (opts.max ?? \"\")) : \"\",\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: number | null,\n format?: string): { str: string, err: string } {\n let str;\n if (obj === undefined || obj === null) {\n str = \"\";\n } else {\n if (\"decimals\" in this.opts) {\n str = obj.toFixed(this.opts.decimals);\n } else {\n str = String(obj);\n }\n }\n return {\n str,\n err: \"\"\n };\n }\n\n}\n\nexport interface DateValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n min?: Date;\n max?: Date;\n dateOnly?: boolean;\n iso?: boolean;\n // strict?: boolean;\n\n}\n\nexport interface DateValidatorMsgs {\n required?: string;\n invalid_format?: string;\n not_in_range?: string;\n}\n\nconst dateToLocaleString = (date: Date) => date.toLocaleString();\nconst dateToLocaleDateString = (date: Date) => date.toLocaleDateString();\n\nconst dateToIsoString = (date: Date) => date.toISOString();\nconst dateToIsoDateString = (date: Date) => new Date(date.toDateString()).toISOString();\n\nexport class DateValidator\n extends Validator<Date, DateValidatorOpts, DateValidatorMsgs> {\n\n dateToStr: (date: Date) => string;\n\n constructor(opts?: DateValidatorOpts, msgs?: DateValidatorMsgs) {\n super(opts, msgs);\n if (opts?.iso) {\n this.dateToStr = opts?.dateOnly ? dateToIsoDateString : dateToIsoString;\n } else {\n this.dateToStr = opts?.dateOnly ? dateToLocaleDateString : dateToLocaleString;\n }\n if (opts?.dateOnly && opts?.min) {\n opts.min = new Date(opts.min.getFullYear(), opts.min.getMonth(), opts.min.getDate());\n }\n if (opts?.dateOnly && opts?.max) {\n opts.max = new Date(opts.max.getFullYear(), opts.max.getMonth(), opts.max.getDate() + 1);\n }\n }\n\n protected strToObj(str?: string | null): { obj: Date | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : requiredMsg\n };\n }\n }\n if (str) {\n const dt = Date.parse(str);\n let d = new Date(dt);\n if (opts.dateOnly) {\n d = new Date(d.getFullYear(), d.getMonth(), d.getDate());\n }\n let err: boolean = false;\n if (isNaN(dt)) {\n err = true;\n }\n // if (opts.strict && (str !== this.objToStr(d).str)) {\n // err = true;\n // }\n if (err) {\n const date = isNaN(dt) ? new Date() : d;\n return {\n obj: isNaN(dt) ? null : d,\n err: msgs.invalid_format\n ? tpl(msgs.invalid_format,\n {\n ...opts.data,\n date: this.objToStr(date).str ?? \"\"\n })\n : invalidFormatMsg\n };\n }\n return { obj: d, err: \"\" };\n } else {\n return { obj: null, err: \"\" };\n }\n }\n\n protected objCheck(obj?: Date | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err: boolean = false;\n if (\"max\" in opts) {\n if (opts.max && obj.getTime() > opts.max.getTime()) {\n err = true;\n }\n }\n if (\"min\" in opts) {\n if (opts.min && obj < opts.min) {\n err = true;\n }\n }\n if (err) {\n return msgs.not_in_range\n ? tpl(msgs.not_in_range,\n {\n ...opts.data,\n min: (\"min\" in opts && opts.min) ? this.dateToStr(opts.min) : \"\",\n max: (\"max\" in opts && opts.max) ? this.dateToStr(opts.max) : \"\"\n })\n : notInRangeMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: Date | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : this.dateToStr(obj),\n err: \"\"\n };\n }\n\n}\n\nexport interface BooleanValidatorOpts extends ValidatorDataOpts {\n required?: boolean;\n value?: boolean;\n}\n\nexport interface BooleanValidatorMsgs {\n required?: string;\n invalid_value?: string;\n}\n\nexport class BooleanValidator\n extends Validator<boolean, BooleanValidatorOpts, BooleanValidatorMsgs> {\n\n constructor(opts?: BooleanValidatorOpts, msgs?: BooleanValidatorMsgs) {\n super(opts, msgs);\n }\n\n protected strToObj(str?: string | null): { obj: boolean | null, err: string } {\n const opts = this.opts;\n const msgs = this.msgs;\n if (\"required\" in opts) {\n if (opts.required && !str) {\n return {\n obj: null,\n err: msgs.required\n ? tpl(msgs.required,\n {\n ...opts.data\n })\n : requiredMsg\n };\n }\n }\n let b;\n switch (str) {\n case \"true\":\n case \"1\":\n case \"on\":\n case \"yes\":\n b = true;\n break;\n default:\n b = false;\n }\n return { obj: b, err: \"\" };\n }\n\n protected objCheck(obj?: boolean | null): string {\n if (obj === undefined || obj === null) {\n return \"\";\n }\n const opts = this.opts;\n const msgs = this.msgs;\n let err = false;\n if (\"value\" in opts) {\n if (obj !== opts.value) {\n err = true;\n }\n }\n if (err) {\n return msgs.invalid_value\n ? tpl(msgs.invalid_value,\n {\n ...opts.data,\n value: (\"value\" in opts) ? (\"\" + (opts.value ?? \"\")) : \"\",\n })\n : invalidValueMsg;\n }\n return \"\";\n }\n\n protected objToStr(obj?: boolean | null,\n format?: string): { str: string, err: string } {\n return {\n str: (obj === undefined || obj === null) ? \"\" : (\"\" + obj),\n err: \"\"\n };\n }\n\n}\n\ntype FormValidators<TYPE> = { [key in keyof TYPE]: Validator<any, any, any> };\n\nexport type Str<TYPE> = { [key in keyof TYPE]: string };\nexport type Obj<TYPE> = { [key in keyof TYPE]: any };\nexport type Err<TYPE> = { [key in keyof TYPE]: string };\n\nexport interface FormValidatorData<TYPE> {\n str: Str<TYPE>;\n obj: Obj<TYPE>;\n err: Err<TYPE>;\n valid: boolean;\n}\n\nexport class FormValidator<TYPE extends { [key: string]: any }> {\n\n readonly validators: FormValidators<TYPE> = {} as FormValidators<TYPE>;\n\n readonly str?: Str<TYPE>;\n readonly obj?: Obj<TYPE>;\n readonly err?: Err<TYPE>;\n\n readonly valid?: boolean;\n\n addValidator(field: keyof TYPE, validator: Validator<any, any, any>): this {\n this.validators[field] = validator;\n return this;\n }\n\n validate(data: { [key in keyof TYPE]?: string }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].validate(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = r.obj;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n format(data: { [key in keyof TYPE]: any }): this {\n const res = Object.keys(this.validators)\n .reduce(\n (a, k) => {\n const v = (data as any)[k];\n const r = (this.validators as any)[k].format(v);\n (a.str as any)[k] = r.str;\n (a.obj as any)[k] = v;\n (a.err as any)[k] = r.err;\n r.err && (a.valid = false);\n return a;\n },\n { str: {}, obj: {}, err: {}, valid: true });\n (this.str as any) = res.str;\n (this.obj as any) = res.obj;\n (this.err as any) = res.err;\n (this.valid as any) = res.valid;\n return this;\n }\n\n data(): FormValidatorData<TYPE> {\n return {\n str: this.str!,\n obj: this.obj!,\n err: this.err!,\n valid: this.valid!\n };\n }\n\n}\n\n\n// TEST\n\n// const sv = new StringValidator(\n// {\n// required: true,\n// min: 3,\n// max: 5,\n// // regexp: /^[0123]+$/\n// data: {\n// xxx: \"xXx\"\n// }\n// },\n// {\n// required: \"required {{min}} {{max}} {{regexp}}\",\n// invalid_format: \"invalid_format {{regexp}}\",\n// not_in_range: \"not_in_range {{min}} {{max}} | data.xxx={{xxx}}\"\n// });\n\n// [\n// \"x1234\",\n// \"x1234y\",\n// \"xy\"\n// ].forEach(v => {\n// console.log();\n// console.log(v);\n// const r = sv.validate(v);\n// console.log(r);\n// if (r.obj) {\n// const f = sv.format(r.obj);\n// console.log(f);\n// }\n// });\n\n// console.log();\n\n// const nv = new NumberValidator(\n// {\n// required: true,\n// min: 3,\n// max: 500000,\n// decimals: 2,\n// strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{num}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(nv.format(undefined));\n// console.log(nv.format(12345.6789));\n\n// console.log(nv.validate(\"12345.6789\"));\n// console.log(nv.validate(\"12345,6789\"));\n// console.log(nv.validate(\"12,345.6789\"));\n\n// const dv = new DateValidator(\n// {\n// required: false,\n// // min: new Date(),\n// max: new Date(),\n// clearTime: false\n// // strict: true\n// },\n// {\n// required: \"required {{min}} {{max}}\",\n// invalid_format: \"invalid_format {{date}}\",\n// not_in_range: \"not_in_range {{min}} {{max}}\"\n// });\n\n// console.log(dv.opts);\n\n// console.log(dv.format(undefined));\n\n// console.log(dv.format(new Date));\n\n// console.log(dv.validate(\"9/17/2020, 10:46:07 AM\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"9/17/2020\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"2020-09-17T08:46:07.000Z\"));\n// console.log(dv.format(dv.obj).str);\n// console.log(dv.validate(\"\"));\n// console.log(dv.format(dv.obj).str);\n\n// console.log(new Date().toString());\n// console.log(new Date().toDateString());\n// console.log(new Date().toTimeString());\n// console.log(new Date().toLocaleString());\n// console.log(new Date().toLocaleDateString());\n// console.log(new Date().toLocaleTimeString());\n// console.log();\n// console.log(new Date(Date.parse(new Date().toString())));\n// console.log(new Date(Date.parse(new Date().toDateString())));\n// console.log(new Date(Date.parse(new Date().toTimeString())));\n// console.log(new Date(Date.parse(new Date().toLocaleString())));\n// console.log(new Date(Date.parse(new Date().toLocaleDateString())));\n// console.log(new Date(Date.parse(new Date().toLocaleTimeString())));\n\n// const formData = { str: \"123a\", num: \"123456.789\", date: \"9/17/2020, 10:46:07 AM\" };\n// const formData = { str: \"\", num: \"\", date: \"\" };\n// const formData = { str: undefined, num: undefined, date: undefined };\n\n// const fv = new FormValidator<typeof formData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// .addValidator(\"date\", dv)\n// .validate(formData);\n\n// console.log(fv.data());\n\n// fv.format(fv.obj!);\n// console.log(fv);\n\n// const ovData = { str: \"123a\", num: \"123.45\", date: \"02.01.2019 12:12\" };\n\n// const ov = new ObjectValidator<typeof ovData>()\n// .addValidator(\"str\", sv)\n// .addValidator(\"num\", nv)\n// // .addValidator(\"date\", dv)\n// .validate(ovData);\n\n// // console.log(ov);\n\n// ov.format(ov.obj!);\n// console.log(ov);\n\n// console.log();\n\n// interface ReportFormData {\n// spz: string;\n// tachometer: string;\n// dateCreated: string;\n// user: {\n// // name: string[];\n// email: string;\n// };\n// }\n\n// const dov = new ObjectValidator<ReportFormData>()\n// .addValidator(\"spz\", new StringValidator({ required: true }))\n// .addValidator(\"tachometer\", new NumberValidator({ required: true, min: 1 } ))\n// .addValidator(\"dateCreated\", new StringValidator({ required: true }))\n// .addValidator(\"user\", new ObjectValidator<ReportFormData[\"user\"]>()\n// .addValidator(\"email\", new StringValidator({ required: true}))\n// // .addValidator(\"name\", { })\n// // new ArrayValidator({\n// // required: true,\n// // validator: new StringValidator({ required: true })\n// // })\n// );\n\n// dov.validate(\n// {\n// spz: \"dasdas\",\n// tachometer: \"111222\",\n// // dateCreated: \"10.02.2019\",\n// user: {\n// // email: \"dsafasdf\",\n// }\n// },\n// {\n// dateCreated: \"01.03.2011\",\n// spz: \"32ds9f0f\",\n// tachometer: \"3213214214\",\n// user: {\n// email: \"sadmaskdmk2@dsadsamkl.com\"\n// }\n// });\n\n// const avn = new ArrayValidator<number>(new NumberValidator());\n// const rn = avn.validate([345, 123]);\n// console.log(rn);\n\n\n// interface D {\n// a: number;\n// b?: string;\n// }\n\n// const av = new ArrayValidator<T>(new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// );\n\n// const d: D[] = [\n// { a: 123, b: \"text\" },\n// // { a: 5.6, b: \"\" },\n// { a: 5.6 }\n// ];\n\n// const r = av.validate(d);\n// console.log(r);\n\n// const ro = new ObjectValidator<T>()\n// .addValidator(\"a\", new NumberValidator())\n// .addValidator(\"b\", new StringValidator({ required: true }))\n// .validate({\n// a: \"5.6\",\n// b: undefined\n// // b: \"text\"\n// });\n// console.log(\"---\", ro);\n\n// const v = new StringValidator({ required: true });\n// const str = undefined;\n// const sr = v.validate(str!);\n// console.log(sr);\n\n// const v = new StringValidator({ required: true, min: 8 });\n// const str = \"\";\n// const sr = v.format(str);\n// console.log(sr, v);\n","import { HElement, HElements, hjoin } from \"../src/hsml\";\nimport { HAppAction, HDispatcher, HState, HView } from \"../src/hsml-app\";\nimport { BooleanValidator, DateValidator, FormValidator, FormValidatorData, NumberValidator, SelectValidator, StringValidator } from \"../src/validators\";\nimport { happ } from \"../src/hsml-app\";\n\nexport interface FormValidationData {\n name: string;\n born: Date;\n children: number;\n married: boolean;\n gender: string;\n sport: string;\n}\n\nexport interface FormValidationState {\n title: string;\n data: FormValidationData;\n genders: {\n label: string;\n value: string;\n }[];\n sports: string[];\n validatorData?: FormValidatorData<FormValidationData>;\n}\n\nexport const formValidationState: HState<FormValidationState> = function () {\n return {\n title: \"Form Validation\",\n data: {\n name: \"Ema\",\n born: new Date(),\n children: 0,\n married: false,\n gender: \"female\",\n sport: \"gymnastics\"\n },\n genders: [\n { label: \"Male\", value: \"male\" },\n { label: \"Female\", value: \"female\" }\n ],\n sports: [\"football\", \"gymnastics\"]\n }\n};\n\nexport enum FormValidationAction {\n change = \"form-validation-change\",\n submit = \"form-validation-submit\"\n}\n\nexport const formValidationView: HView<FormValidationState> = function (state): HElements {\n return [\n [\"div.w3-content\", [\n [\"h1\", state.title],\n [\"form.w3-container\",\n {\n on: [\n [\"change\", FormValidationAction.change],\n [\"submit\", FormValidationAction.submit]\n ]\n },\n [\n [\"p\", [\n [\"label\", [\"Name\",\n [\"input.w3-input\", {\n type: \"text\",\n name: \"name\",\n value: state.validatorData!.str.name,\n on: [\"input\", FormValidationAction.change]\n }]\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.name]],\n [\"p\", [\n [\"label\", [\"Born\",\n [\"input.w3-input\", {\n type: \"datetime-local\",\n name: \"born\",\n // placeholder: new DateValidator().format(new Date()).str,\n value: datetimeLocal(state.validatorData!.obj.born)\n }]\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.born]],\n [\"p\", [\n [\"label\", [\"Children\",\n [\"input.w3-input\", {\n type: \"number\",\n name: \"children\",\n value: state.validatorData!.str.children\n }]\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.children]],\n [\"p\", [\n [\"label\", [\n [\"input.w3-check\", {\n type: \"checkbox\",\n name: \"married\",\n checked: state.validatorData!.obj.married\n }],\n \" Married\"\n ]]\n ]],\n [\"p.w3-text-red\", [state.validatorData!.err.married]],\n [\"p\",\n hjoin(\n state.genders.map<HElement>(gender => (\n [\"label\", [\n [\"input.w3-radio\", {\n type: \"radio\",\n name: \"gender\",\n value: gender.value,\n checked: state.validatorData!.obj.gender === gender.value\n }],\n \" \", gender.label\n ]]\n )),\n [\"br\"]\n )\n ],\n [\"p.w3-text-red\", [state.validatorData!.err.gender]],\n [\"p\", [\n [\"select.w3-select\", { name: \"sport\" },\n [\n [\"option\",\n { value: \"\", disabled: true, selected: true },\n \"Sport\"\n ],\n ...state.sports.map<HElement>(sport => (\n [\"option\",\n {\n value: sport,\n selected: sport === state.validatorData!.obj.sport\n },\n sport\n ])\n )\n ]\n ]\n ]],\n [\"p.w3-text-red\", state.validatorData!.err.sport],\n [\"button.w3-btn.w3-blue\", \"Submit\"]\n ]\n ]\n ]]\n ];\n};\n\nlet formValidator: FormValidator<FormValidationData>;\n\nexport const formValidationDispatcher: HDispatcher<FormValidationState> = async function (action, state) {\n console.log(\"action\", action);\n\n switch (action.type) {\n\n case HAppAction._init:\n formValidator = validator(state);\n state.validatorData = formValidator.data();\n break;\n\n case FormValidationAction.change:\n formValidator.validate({\n ...state.validatorData!.str,\n ...action.data\n });\n state.validatorData = formValidator.data();\n console.log(\"obj:\", JSON.stringify(state.validatorData, null, 4));\n break;\n\n case FormValidationAction.submit:\n action.event!.preventDefault();\n // console.log(action.data);\n formValidator.validate(action.data);\n state.validatorData = formValidator.data();\n // console.log(state.validatorData);\n state.validatorData = formValidator.data();\n if (formValidator.valid) {\n console.log(formValidator);\n state.data = formValidator.obj!;\n const formData = JSON.stringify(state.data, null, 4);\n console.dir(formData);\n alert(`Form submit: \\n${formData}`);\n }\n break;\n }\n};\n\nexport function validator(formState: FormValidationState): FormValidator<FormValidationData> {\n return new FormValidator<FormValidationData>()\n .addValidator(\"name\", new StringValidator(\n {\n required: true,\n min: 3,\n max: 5\n },\n {\n required: \"Required {{min}} - {{max}} {{regexp}}\",\n invalid_format: \"Invalid format {{regexp}}\",\n not_in_range: \"Not in range {{min}} - {{max}}\"\n }))\n .addValidator(\"born\", new DateValidator(\n {\n required: true,\n // min: new Date(),\n max: new Date(),\n dateOnly: false,\n iso: true\n },\n {\n required: \"Required {{min}} - {{max}}\",\n invalid_format: \"Invalid format {{date}}\",\n not_in_range: \"Not in range {{min}} - {{max}}\"\n }))\n .addValidator(\"children\", new NumberValidator(\n {\n required: true,\n min: 0,\n max: 10\n },\n {\n required: \"Required {{min}} - {{max}}\",\n invalid_format: \"Invalid format, use format {{num}}\",\n not_in_range: \"Not in range {{min}} - {{max}}\"\n }))\n .addValidator(\"gender\", new SelectValidator(\n {\n required: true,\n options: formState.genders.map(g => g.value)\n },\n {\n required: \"Required {{options}}\",\n invalid_option: \"Invalod option {{option}} {{options}}\"\n }))\n .addValidator(\"married\", new BooleanValidator(\n {\n required: true\n },\n {\n required: \"Required\",\n invalid_value: \"Invalid value {{value}}\"\n }))\n .addValidator(\"sport\", new SelectValidator(\n {\n required: true,\n options: formState.sports\n },\n {\n required: \"Required {{options}}\",\n invalid_option: \"Invalod option {{option}} {{options}}\"\n }))\n .format(formState.data);\n}\n\nfunction datetimeLocal(date: Date) {\n if (!date) {\n return \"\";\n }\n const tzo = - date.getTimezoneOffset();\n if (tzo === 0) {\n return date.toISOString();\n } else {\n // let dif = tzo >= 0 ? \"+\" : \"-\";\n const pad = function (num: number, digits = 2) {\n return String(num).padStart(digits, \"0\");\n };\n return (\n date.getFullYear() +\n \"-\" +\n pad(date.getMonth() + 1) +\n \"-\" +\n pad(date.getDate()) +\n \"T\" +\n pad(date.getHours()) +\n \":\" +\n pad(date.getMinutes())\n // pad(tzo >= 0 ? date.getHours() + (tzo / 60) : date.getHours() - (tzo / 60)) +\n // \":\" +\n // pad(tzo >= 0 ? date.getMinutes() + (tzo % 60) : date.getMinutes() - (tzo % 60))\n );\n // return (\n // date.getFullYear() +\n // \"-\" +\n // pad(date.getMonth() + 1) +\n // \"-\" +\n // pad(date.getDate()) +\n // \"T\" +\n // pad(date.getHours()) +\n // \":\" +\n // pad(date.getMinutes()) +\n // \":\" +\n // pad(date.getSeconds()) +\n // dif +\n // pad(tzo / 60) +\n // \":\" +\n // pad(tzo % 60) +\n // \".\" +\n // pad(date.getMilliseconds(), 3)\n // );\n }\n}\n\nhapp<FormValidationState>(formValidationState, formValidationView, formValidationDispatcher);\n"],"names":["$a85519cc1b20a4af$var$log","console","log","$a85519cc1b20a4af$var$error","error","$a85519cc1b20a4af$var$warn","warn","$a85519cc1b20a4af$export$15cfcbba5b21308e","HAppAction","$a85519cc1b20a4af$var$schedule","window","requestAnimationFrame","callback","setTimeout","$a85519cc1b20a4af$var$unschedule","cancelAnimationFrame","handle","clearTimeout","$a85519cc1b20a4af$var$msgAction","$a85519cc1b20a4af$var$msgDispatch","$a85519cc1b20a4af$var$msgRender","$a85519cc1b20a4af$export$eb8950696418f795","state","view","dispatcher","element","document","body","$a85519cc1b20a4af$export$8cfef5dc37c46888","$a85519cc1b20a4af$export$e905700d74a7763f","hAppI","e","hapi","$a85519cc1b20a4af$export$1cfc54b3834d3c50","elementName","elementAttrs","customElements","define","HTMLElement","observedAttributes","connectedCallback","this","attachShadow","mode","_happel","mount","shadowRoot","disconnectedCallback","umount","adoptedCallback","update","attributeChangedCallback","attrName","oldVal","newVal","dispatch","_element","constructor","super","customElement","$a85519cc1b20a4af$export$dd8a94d3c5ec9827","controllers","action","controller","type","apply","data","event","$a85519cc1b20a4af$var$HAPP","_dispatch","_a","_onDispatch","call","dom","$a85519cc1b20a4af$var$elementDispatchCustomEvent","windowDispatchOn","_windowEventListener","detail","addEventListener","windowDispatchOff","removeEventListener","refs","onDispatch","$a85519cc1b20a4af$var$__awaiter","debug","t0","performance","now","t1","windowDispatch","dispatchEvent","CustomEvent","render","hsmls","actionCb","undefined","Function","el","target","nodeName","preventDefault","els","elements","i","length","d","$a85519cc1b20a4af$var$formInputData","names","Object","keys","name","value","String","Array","concat","push","filter","$a85519cc1b20a4af$var$formData","getElementById","$a85519cc1b20a4af$var$updateDom","_mount","_umount","hasAttribute","removeAttribute","aNodes","querySelectorAll","a","happ","firstChild","removeChild","_updateSched","toHsml","_skip","toHtml","outerHTML","_init","then","hsml","ctx","$8IJ2T","hsmls2idomPatch","_b","toLowerCase","iel","checked","sel","multiple","values","from","selectedOptions","map","o","tel","bel","$f8ef79223f7b25f5$var$requiredMsg","$f8ef79223f7b25f5$var$notInRangeMsg","$f8ef79223f7b25f5$var$invalidFormatMsg","$f8ef79223f7b25f5$export$9eeb22c0bba4ed5e","validate","v","str","sto","strToObj","obj","err","objCheck","format","ots","objToStr","opts","msgs","$f8ef79223f7b25f5$export$5dfe2efd653fcea4","tmpl","k","reduce","t","replace","RegExp","$f8ef79223f7b25f5$export$d25426df72e77dd3","required","assign","options","join","indexOf","invalid_option","option","$f8ef79223f7b25f5$export$312ff19fe6f84b5e","min","max","regexp","_c","test","invalid_format","_d","not_in_range","$f8ef79223f7b25f5$export$5464fb7e86e4a9f1","n","Number","isNaN","strict","num","toFixed","decimals","$f8ef79223f7b25f5$var$dateToLocaleString","date","toLocaleString","$f8ef79223f7b25f5$var$dateToLocaleDateString","toLocaleDateString","$f8ef79223f7b25f5$var$dateToIsoString","toISOString","$f8ef79223f7b25f5$var$dateToIsoDateString","Date","toDateString","$f8ef79223f7b25f5$export$73e260ca9e9e4b55","dateToStr","dt","parse","dateOnly","getFullYear","getMonth","getDate","getTime","iso","$f8ef79223f7b25f5$export$d74a5d77bac81ab5","b","invalid_value","$f8ef79223f7b25f5$export$7c385359179c028a","addValidator","field","validator","validators","res","r","valid","$19850c2a6f6be7d2$export$82d15d3be5333d49","FormValidationAction","$19850c2a6f6be7d2$var$formValidator","$19850c2a6f6be7d2$var$datetimeLocal","getTimezoneOffset","pad","digits","padStart","getHours","getMinutes","$a85519cc1b20a4af$exports","title","born","children","married","gender","sport","genders","label","sports","on","change","submit","validatorData","$g7NCG","hjoin","disabled","selected","formState","g","JSON","stringify","formData","dir","alert"],"version":3,"file":"hsml-app-form-validation_demo.0b03b743.js.map"}