@sealcode/sealgen 0.8.42 → 0.8.44

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 (268) hide show
  1. package/.eslintrc.js +1 -1
  2. package/.mocharc.js +10 -0
  3. package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
  4. package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
  5. package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
  6. package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
  7. package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
  8. package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
  9. package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
  10. package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
  11. package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
  12. package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
  13. package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
  14. package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
  15. package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
  16. package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
  17. package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
  18. package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
  19. package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
  20. package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
  21. package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
  22. package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +1 -0
  23. package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +1 -0
  24. package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +1 -0
  25. package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +1 -0
  26. package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +1 -0
  27. package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +1 -0
  28. package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +1 -0
  29. package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +1 -0
  30. package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +1 -0
  31. package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +1 -0
  32. package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +1 -0
  33. package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +1 -0
  34. package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +1 -0
  35. package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +1 -0
  36. package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +1 -0
  37. package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +1 -0
  38. package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +1 -0
  39. package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +1 -0
  40. package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +1 -0
  41. package/.nyc_output/processinfo/index.json +1 -1
  42. package/.nycrc +6 -0
  43. package/.prettierrc +20 -13
  44. package/.xunit +45 -1
  45. package/@types/add-route.d.ts +3 -1
  46. package/@types/add-route.test.d.ts +1 -0
  47. package/@types/build.d.ts +3 -1
  48. package/@types/example.test.d.ts +0 -0
  49. package/@types/forms/fields/boolean.test.d.ts +1 -0
  50. package/@types/forms/fields/email.test.d.ts +1 -0
  51. package/@types/forms/fields/enum-multiple.test.d.ts +1 -0
  52. package/@types/forms/fields/enum.test.d.ts +1 -0
  53. package/@types/forms/fields/number.test.d.ts +1 -0
  54. package/@types/forms/fields/pick-from-list.test.d.ts +1 -0
  55. package/@types/forms/fields/regexp.test.d.ts +1 -0
  56. package/@types/forms/form.test.d.ts +6 -0
  57. package/@types/forms/multiform.test.d.ts +1 -0
  58. package/@types/mount.d.ts +1 -1
  59. package/@types/page/mountable-with-fields.d.ts +1 -1
  60. package/@types/test_utils/locator_is_visible.d.ts +2 -0
  61. package/@types/utils/assert-throws.d.ts +1 -0
  62. package/@types/utils/browser-creator.d.ts +1 -0
  63. package/@types/utils/utils.d.ts +1 -0
  64. package/coverage/clover.xml +2208 -47
  65. package/coverage/lcov-report/base.css +224 -0
  66. package/coverage/lcov-report/block-navigation.js +79 -0
  67. package/coverage/lcov-report/favicon.png +0 -0
  68. package/coverage/lcov-report/index.html +231 -0
  69. package/coverage/lcov-report/prettify.css +1 -0
  70. package/coverage/lcov-report/prettify.js +2 -0
  71. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  72. package/coverage/lcov-report/sorter.js +170 -0
  73. package/coverage/lcov-report/src/add-collection.ts.html +173 -0
  74. package/coverage/lcov-report/src/add-route.test.ts.html +254 -0
  75. package/coverage/lcov-report/src/add-route.ts.html +338 -0
  76. package/coverage/lcov-report/src/build.ts.html +359 -0
  77. package/coverage/lcov-report/src/cli.ts.html +188 -0
  78. package/coverage/lcov-report/src/components/components.ts.html +86 -0
  79. package/coverage/lcov-report/src/components/index.html +141 -0
  80. package/coverage/lcov-report/src/components/tabs.ts.html +365 -0
  81. package/coverage/lcov-report/src/components/toggle-modal.ts.html +236 -0
  82. package/coverage/lcov-report/src/example.test.ts.html +89 -0
  83. package/coverage/lcov-report/src/find-scss-includes.ts.html +176 -0
  84. package/coverage/lcov-report/src/forms/controls/array.ts.html +758 -0
  85. package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +179 -0
  86. package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +224 -0
  87. package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +293 -0
  88. package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +182 -0
  89. package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +230 -0
  90. package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +164 -0
  91. package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +362 -0
  92. package/coverage/lcov-report/src/forms/controls/controls.ts.html +170 -0
  93. package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +353 -0
  94. package/coverage/lcov-report/src/forms/controls/derived.ts.html +404 -0
  95. package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +341 -0
  96. package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +371 -0
  97. package/coverage/lcov-report/src/forms/controls/field-group.ts.html +287 -0
  98. package/coverage/lcov-report/src/forms/controls/file.ts.html +221 -0
  99. package/coverage/lcov-report/src/forms/controls/form-control.ts.html +152 -0
  100. package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +146 -0
  101. package/coverage/lcov-report/src/forms/controls/form-header.ts.html +137 -0
  102. package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +113 -0
  103. package/coverage/lcov-report/src/forms/controls/frame.ts.html +158 -0
  104. package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +146 -0
  105. package/coverage/lcov-report/src/forms/controls/html.ts.html +194 -0
  106. package/coverage/lcov-report/src/forms/controls/index.html +561 -0
  107. package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +848 -0
  108. package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +212 -0
  109. package/coverage/lcov-report/src/forms/controls/number.ts.html +194 -0
  110. package/coverage/lcov-report/src/forms/controls/photo.ts.html +302 -0
  111. package/coverage/lcov-report/src/forms/controls/radio.ts.html +209 -0
  112. package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +230 -0
  113. package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +524 -0
  114. package/coverage/lcov-report/src/forms/controls/textarea.ts.html +260 -0
  115. package/coverage/lcov-report/src/forms/controls/tickable.ts.html +461 -0
  116. package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +188 -0
  117. package/coverage/lcov-report/src/forms/fields/boolean.ts.html +269 -0
  118. package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +278 -0
  119. package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +266 -0
  120. package/coverage/lcov-report/src/forms/fields/email.test.ts.html +152 -0
  121. package/coverage/lcov-report/src/forms/fields/email.ts.html +140 -0
  122. package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +173 -0
  123. package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +266 -0
  124. package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +155 -0
  125. package/coverage/lcov-report/src/forms/fields/enum.ts.html +248 -0
  126. package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +146 -0
  127. package/coverage/lcov-report/src/forms/fields/field.ts.html +596 -0
  128. package/coverage/lcov-report/src/forms/fields/file.ts.html +347 -0
  129. package/coverage/lcov-report/src/forms/fields/index.html +456 -0
  130. package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +140 -0
  131. package/coverage/lcov-report/src/forms/fields/number.test.ts.html +182 -0
  132. package/coverage/lcov-report/src/forms/fields/number.ts.html +290 -0
  133. package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +137 -0
  134. package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +236 -0
  135. package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +152 -0
  136. package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +155 -0
  137. package/coverage/lcov-report/src/forms/fields/regexp.ts.html +239 -0
  138. package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +140 -0
  139. package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +170 -0
  140. package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +161 -0
  141. package/coverage/lcov-report/src/forms/form.test.ts.html +1133 -0
  142. package/coverage/lcov-report/src/forms/form.ts.html +962 -0
  143. package/coverage/lcov-report/src/forms/index.html +156 -0
  144. package/coverage/lcov-report/src/forms/multiform.test.ts.html +1700 -0
  145. package/coverage/lcov-report/src/forms/multiform.ts.html +788 -0
  146. package/coverage/lcov-report/src/generate-collections.ts.html +311 -0
  147. package/coverage/lcov-report/src/generate-routes.ts.html +440 -0
  148. package/coverage/lcov-report/src/index.html +321 -0
  149. package/coverage/lcov-report/src/index.ts.html +152 -0
  150. package/coverage/lcov-report/src/make-env.ts.html +125 -0
  151. package/coverage/lcov-report/src/make-hidden-inputs.ts.html +152 -0
  152. package/coverage/lcov-report/src/mount.ts.html +335 -0
  153. package/coverage/lcov-report/src/page/access-control.ts.html +134 -0
  154. package/coverage/lcov-report/src/page/index.html +186 -0
  155. package/coverage/lcov-report/src/page/list.ts.html +800 -0
  156. package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +554 -0
  157. package/coverage/lcov-report/src/page/mountable.ts.html +119 -0
  158. package/coverage/lcov-report/src/page/page.ts.html +218 -0
  159. package/coverage/lcov-report/src/page/props-parser.ts.html +194 -0
  160. package/coverage/lcov-report/src/run.ts.html +80 -0
  161. package/coverage/lcov-report/src/sanitize.ts.html +107 -0
  162. package/coverage/lcov-report/src/templates/collection.ts.html +113 -0
  163. package/coverage/lcov-report/src/templates/form.ts.html +260 -0
  164. package/coverage/lcov-report/src/templates/index.html +216 -0
  165. package/coverage/lcov-report/src/templates/list.ts.html +305 -0
  166. package/coverage/lcov-report/src/templates/multiform.ts.html +254 -0
  167. package/coverage/lcov-report/src/templates/page.ts.html +155 -0
  168. package/coverage/lcov-report/src/templates/post.ts.html +143 -0
  169. package/coverage/lcov-report/src/templates/redirect.ts.html +146 -0
  170. package/coverage/lcov-report/src/templates/route-test.ts.html +161 -0
  171. package/coverage/lcov-report/src/test_utils/index.html +111 -0
  172. package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +131 -0
  173. package/coverage/lcov-report/src/utils/assert-throws.ts.html +134 -0
  174. package/coverage/lcov-report/src/utils/browser-creator.js.html +110 -0
  175. package/coverage/lcov-report/src/utils/escape-url-params.ts.html +122 -0
  176. package/coverage/lcov-report/src/utils/exec.ts.html +170 -0
  177. package/coverage/lcov-report/src/utils/format-external-url.ts.html +119 -0
  178. package/coverage/lcov-report/src/utils/import-path.ts.html +155 -0
  179. package/coverage/lcov-report/src/utils/index.html +366 -0
  180. package/coverage/lcov-report/src/utils/input-wrapper.ts.html +143 -0
  181. package/coverage/lcov-report/src/utils/list-collections.ts.html +128 -0
  182. package/coverage/lcov-report/src/utils/make-slug.ts.html +95 -0
  183. package/coverage/lcov-report/src/utils/natural-numbers.ts.html +95 -0
  184. package/coverage/lcov-report/src/utils/prettier.ts.html +119 -0
  185. package/coverage/lcov-report/src/utils/question.ts.html +149 -0
  186. package/coverage/lcov-report/src/utils/render-attributes.ts.html +131 -0
  187. package/coverage/lcov-report/src/utils/sleep.ts.html +89 -0
  188. package/coverage/lcov-report/src/utils/translate.ts.html +119 -0
  189. package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +107 -0
  190. package/coverage/lcov-report/src/utils/utils.ts.html +122 -0
  191. package/coverage/lcov-report/src/utils/walk.ts.html +140 -0
  192. package/coverage/lcov.info +4697 -0
  193. package/lib/add-route.js +31 -19
  194. package/lib/add-route.js.map +1 -1
  195. package/lib/add-route.test.js +55 -0
  196. package/lib/add-route.test.js.map +1 -0
  197. package/lib/build.js +3 -2
  198. package/lib/build.js.map +1 -1
  199. package/lib/cli.js +1 -1
  200. package/lib/cli.js.map +1 -1
  201. package/lib/example.test.js +4 -0
  202. package/lib/example.test.js.map +1 -0
  203. package/lib/forms/fields/boolean.test.js +37 -0
  204. package/lib/forms/fields/boolean.test.js.map +1 -0
  205. package/lib/forms/fields/email.test.js +25 -0
  206. package/lib/forms/fields/email.test.js.map +1 -0
  207. package/lib/forms/fields/enum-multiple.test.js +32 -0
  208. package/lib/forms/fields/enum-multiple.test.js.map +1 -0
  209. package/lib/forms/fields/enum.test.js +26 -0
  210. package/lib/forms/fields/enum.test.js.map +1 -0
  211. package/lib/forms/fields/number.js +0 -1
  212. package/lib/forms/fields/number.js.map +1 -1
  213. package/lib/forms/fields/number.test.js +35 -0
  214. package/lib/forms/fields/number.test.js.map +1 -0
  215. package/lib/forms/fields/pick-from-list.test.js +22 -0
  216. package/lib/forms/fields/pick-from-list.test.js.map +1 -0
  217. package/lib/forms/fields/regexp.test.js +26 -0
  218. package/lib/forms/fields/regexp.test.js.map +1 -0
  219. package/lib/forms/form.test.js +275 -0
  220. package/lib/forms/form.test.js.map +1 -0
  221. package/lib/forms/multiform.js +11 -2
  222. package/lib/forms/multiform.js.map +1 -1
  223. package/lib/forms/multiform.test.js +431 -0
  224. package/lib/forms/multiform.test.js.map +1 -0
  225. package/lib/mount.js +37 -2
  226. package/lib/mount.js.map +1 -1
  227. package/lib/test_utils/locator_is_visible.js +15 -0
  228. package/lib/test_utils/locator_is_visible.js.map +1 -0
  229. package/lib/utils/assert-throws.js +24 -0
  230. package/lib/utils/assert-throws.js.map +1 -0
  231. package/lib/utils/browser-creator.js +14 -0
  232. package/lib/utils/browser-creator.js.map +1 -0
  233. package/lib/utils/exec.js.map +1 -1
  234. package/lib/utils/question.js.map +1 -1
  235. package/lib/utils/utils.js +3 -1
  236. package/lib/utils/utils.js.map +1 -1
  237. package/mocha_root_hooks.js +6 -0
  238. package/package.json +18 -9
  239. package/src/add-route.test.ts +58 -0
  240. package/src/add-route.ts +37 -27
  241. package/src/build.ts +6 -3
  242. package/src/cli.ts +2 -2
  243. package/src/forms/fields/boolean.test.ts +36 -0
  244. package/src/forms/fields/email.test.ts +24 -0
  245. package/src/forms/fields/enum-multiple.test.ts +31 -0
  246. package/src/forms/fields/enum.test.ts +25 -0
  247. package/src/forms/fields/number.test.ts +34 -0
  248. package/src/forms/fields/number.ts +0 -1
  249. package/src/forms/fields/pick-from-list.test.ts +19 -0
  250. package/src/forms/fields/regexp.test.ts +25 -0
  251. package/src/forms/form.test.ts +351 -0
  252. package/src/forms/multiform.test.ts +540 -0
  253. package/src/forms/multiform.ts +12 -2
  254. package/src/mount.ts +42 -8
  255. package/src/page/mountable-with-fields.ts +1 -1
  256. package/src/test_utils/locator_is_visible.ts +17 -0
  257. package/src/utils/assert-throws.ts +18 -0
  258. package/src/utils/browser-creator.js +10 -0
  259. package/src/utils/exec.ts +8 -2
  260. package/src/utils/question.ts +4 -1
  261. package/src/utils/utils.ts +1 -0
  262. package/tsconfig.json +2 -2
  263. package/.nyc_output/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
  264. package/.nyc_output/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
  265. package/.nyc_output/processinfo/1c5dff80-7861-427a-b1bb-d0686211f098.json +0 -1
  266. package/.nyc_output/processinfo/a38a0d08-1f1f-4973-b5e2-efc434c1593d.json +0 -1
  267. package/src/tests/manual/multiform.ts +0 -112
  268. package/test.js +0 -68
@@ -0,0 +1,554 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/page/mountable-with-fields.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../prettify.css" />
9
+ <link rel="stylesheet" href="../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../index.html">All files</a> / <a href="index.html">src/page</a> mountable-with-fields.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">68.75% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>33/48</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">70% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>7/10</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">75% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>12/16</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">68.09% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>32/47</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ </div>
58
+ <div class='status-line medium'></div>
59
+ <pre><table class="coverage">
60
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
+ <a name='L2'></a><a href='#L2'>2</a>
62
+ <a name='L3'></a><a href='#L3'>3</a>
63
+ <a name='L4'></a><a href='#L4'>4</a>
64
+ <a name='L5'></a><a href='#L5'>5</a>
65
+ <a name='L6'></a><a href='#L6'>6</a>
66
+ <a name='L7'></a><a href='#L7'>7</a>
67
+ <a name='L8'></a><a href='#L8'>8</a>
68
+ <a name='L9'></a><a href='#L9'>9</a>
69
+ <a name='L10'></a><a href='#L10'>10</a>
70
+ <a name='L11'></a><a href='#L11'>11</a>
71
+ <a name='L12'></a><a href='#L12'>12</a>
72
+ <a name='L13'></a><a href='#L13'>13</a>
73
+ <a name='L14'></a><a href='#L14'>14</a>
74
+ <a name='L15'></a><a href='#L15'>15</a>
75
+ <a name='L16'></a><a href='#L16'>16</a>
76
+ <a name='L17'></a><a href='#L17'>17</a>
77
+ <a name='L18'></a><a href='#L18'>18</a>
78
+ <a name='L19'></a><a href='#L19'>19</a>
79
+ <a name='L20'></a><a href='#L20'>20</a>
80
+ <a name='L21'></a><a href='#L21'>21</a>
81
+ <a name='L22'></a><a href='#L22'>22</a>
82
+ <a name='L23'></a><a href='#L23'>23</a>
83
+ <a name='L24'></a><a href='#L24'>24</a>
84
+ <a name='L25'></a><a href='#L25'>25</a>
85
+ <a name='L26'></a><a href='#L26'>26</a>
86
+ <a name='L27'></a><a href='#L27'>27</a>
87
+ <a name='L28'></a><a href='#L28'>28</a>
88
+ <a name='L29'></a><a href='#L29'>29</a>
89
+ <a name='L30'></a><a href='#L30'>30</a>
90
+ <a name='L31'></a><a href='#L31'>31</a>
91
+ <a name='L32'></a><a href='#L32'>32</a>
92
+ <a name='L33'></a><a href='#L33'>33</a>
93
+ <a name='L34'></a><a href='#L34'>34</a>
94
+ <a name='L35'></a><a href='#L35'>35</a>
95
+ <a name='L36'></a><a href='#L36'>36</a>
96
+ <a name='L37'></a><a href='#L37'>37</a>
97
+ <a name='L38'></a><a href='#L38'>38</a>
98
+ <a name='L39'></a><a href='#L39'>39</a>
99
+ <a name='L40'></a><a href='#L40'>40</a>
100
+ <a name='L41'></a><a href='#L41'>41</a>
101
+ <a name='L42'></a><a href='#L42'>42</a>
102
+ <a name='L43'></a><a href='#L43'>43</a>
103
+ <a name='L44'></a><a href='#L44'>44</a>
104
+ <a name='L45'></a><a href='#L45'>45</a>
105
+ <a name='L46'></a><a href='#L46'>46</a>
106
+ <a name='L47'></a><a href='#L47'>47</a>
107
+ <a name='L48'></a><a href='#L48'>48</a>
108
+ <a name='L49'></a><a href='#L49'>49</a>
109
+ <a name='L50'></a><a href='#L50'>50</a>
110
+ <a name='L51'></a><a href='#L51'>51</a>
111
+ <a name='L52'></a><a href='#L52'>52</a>
112
+ <a name='L53'></a><a href='#L53'>53</a>
113
+ <a name='L54'></a><a href='#L54'>54</a>
114
+ <a name='L55'></a><a href='#L55'>55</a>
115
+ <a name='L56'></a><a href='#L56'>56</a>
116
+ <a name='L57'></a><a href='#L57'>57</a>
117
+ <a name='L58'></a><a href='#L58'>58</a>
118
+ <a name='L59'></a><a href='#L59'>59</a>
119
+ <a name='L60'></a><a href='#L60'>60</a>
120
+ <a name='L61'></a><a href='#L61'>61</a>
121
+ <a name='L62'></a><a href='#L62'>62</a>
122
+ <a name='L63'></a><a href='#L63'>63</a>
123
+ <a name='L64'></a><a href='#L64'>64</a>
124
+ <a name='L65'></a><a href='#L65'>65</a>
125
+ <a name='L66'></a><a href='#L66'>66</a>
126
+ <a name='L67'></a><a href='#L67'>67</a>
127
+ <a name='L68'></a><a href='#L68'>68</a>
128
+ <a name='L69'></a><a href='#L69'>69</a>
129
+ <a name='L70'></a><a href='#L70'>70</a>
130
+ <a name='L71'></a><a href='#L71'>71</a>
131
+ <a name='L72'></a><a href='#L72'>72</a>
132
+ <a name='L73'></a><a href='#L73'>73</a>
133
+ <a name='L74'></a><a href='#L74'>74</a>
134
+ <a name='L75'></a><a href='#L75'>75</a>
135
+ <a name='L76'></a><a href='#L76'>76</a>
136
+ <a name='L77'></a><a href='#L77'>77</a>
137
+ <a name='L78'></a><a href='#L78'>78</a>
138
+ <a name='L79'></a><a href='#L79'>79</a>
139
+ <a name='L80'></a><a href='#L80'>80</a>
140
+ <a name='L81'></a><a href='#L81'>81</a>
141
+ <a name='L82'></a><a href='#L82'>82</a>
142
+ <a name='L83'></a><a href='#L83'>83</a>
143
+ <a name='L84'></a><a href='#L84'>84</a>
144
+ <a name='L85'></a><a href='#L85'>85</a>
145
+ <a name='L86'></a><a href='#L86'>86</a>
146
+ <a name='L87'></a><a href='#L87'>87</a>
147
+ <a name='L88'></a><a href='#L88'>88</a>
148
+ <a name='L89'></a><a href='#L89'>89</a>
149
+ <a name='L90'></a><a href='#L90'>90</a>
150
+ <a name='L91'></a><a href='#L91'>91</a>
151
+ <a name='L92'></a><a href='#L92'>92</a>
152
+ <a name='L93'></a><a href='#L93'>93</a>
153
+ <a name='L94'></a><a href='#L94'>94</a>
154
+ <a name='L95'></a><a href='#L95'>95</a>
155
+ <a name='L96'></a><a href='#L96'>96</a>
156
+ <a name='L97'></a><a href='#L97'>97</a>
157
+ <a name='L98'></a><a href='#L98'>98</a>
158
+ <a name='L99'></a><a href='#L99'>99</a>
159
+ <a name='L100'></a><a href='#L100'>100</a>
160
+ <a name='L101'></a><a href='#L101'>101</a>
161
+ <a name='L102'></a><a href='#L102'>102</a>
162
+ <a name='L103'></a><a href='#L103'>103</a>
163
+ <a name='L104'></a><a href='#L104'>104</a>
164
+ <a name='L105'></a><a href='#L105'>105</a>
165
+ <a name='L106'></a><a href='#L106'>106</a>
166
+ <a name='L107'></a><a href='#L107'>107</a>
167
+ <a name='L108'></a><a href='#L108'>108</a>
168
+ <a name='L109'></a><a href='#L109'>109</a>
169
+ <a name='L110'></a><a href='#L110'>110</a>
170
+ <a name='L111'></a><a href='#L111'>111</a>
171
+ <a name='L112'></a><a href='#L112'>112</a>
172
+ <a name='L113'></a><a href='#L113'>113</a>
173
+ <a name='L114'></a><a href='#L114'>114</a>
174
+ <a name='L115'></a><a href='#L115'>115</a>
175
+ <a name='L116'></a><a href='#L116'>116</a>
176
+ <a name='L117'></a><a href='#L117'>117</a>
177
+ <a name='L118'></a><a href='#L118'>118</a>
178
+ <a name='L119'></a><a href='#L119'>119</a>
179
+ <a name='L120'></a><a href='#L120'>120</a>
180
+ <a name='L121'></a><a href='#L121'>121</a>
181
+ <a name='L122'></a><a href='#L122'>122</a>
182
+ <a name='L123'></a><a href='#L123'>123</a>
183
+ <a name='L124'></a><a href='#L124'>124</a>
184
+ <a name='L125'></a><a href='#L125'>125</a>
185
+ <a name='L126'></a><a href='#L126'>126</a>
186
+ <a name='L127'></a><a href='#L127'>127</a>
187
+ <a name='L128'></a><a href='#L128'>128</a>
188
+ <a name='L129'></a><a href='#L129'>129</a>
189
+ <a name='L130'></a><a href='#L130'>130</a>
190
+ <a name='L131'></a><a href='#L131'>131</a>
191
+ <a name='L132'></a><a href='#L132'>132</a>
192
+ <a name='L133'></a><a href='#L133'>133</a>
193
+ <a name='L134'></a><a href='#L134'>134</a>
194
+ <a name='L135'></a><a href='#L135'>135</a>
195
+ <a name='L136'></a><a href='#L136'>136</a>
196
+ <a name='L137'></a><a href='#L137'>137</a>
197
+ <a name='L138'></a><a href='#L138'>138</a>
198
+ <a name='L139'></a><a href='#L139'>139</a>
199
+ <a name='L140'></a><a href='#L140'>140</a>
200
+ <a name='L141'></a><a href='#L141'>141</a>
201
+ <a name='L142'></a><a href='#L142'>142</a>
202
+ <a name='L143'></a><a href='#L143'>143</a>
203
+ <a name='L144'></a><a href='#L144'>144</a>
204
+ <a name='L145'></a><a href='#L145'>145</a>
205
+ <a name='L146'></a><a href='#L146'>146</a>
206
+ <a name='L147'></a><a href='#L147'>147</a>
207
+ <a name='L148'></a><a href='#L148'>148</a>
208
+ <a name='L149'></a><a href='#L149'>149</a>
209
+ <a name='L150'></a><a href='#L150'>150</a>
210
+ <a name='L151'></a><a href='#L151'>151</a>
211
+ <a name='L152'></a><a href='#L152'>152</a>
212
+ <a name='L153'></a><a href='#L153'>153</a>
213
+ <a name='L154'></a><a href='#L154'>154</a>
214
+ <a name='L155'></a><a href='#L155'>155</a>
215
+ <a name='L156'></a><a href='#L156'>156</a>
216
+ <a name='L157'></a><a href='#L157'>157</a>
217
+ <a name='L158'></a><a href='#L158'>158</a>
218
+ <a name='L159'></a><a href='#L159'>159</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
219
+ <span class="cline-any cline-neutral">&nbsp;</span>
220
+ <span class="cline-any cline-yes">1x</span>
221
+ <span class="cline-any cline-yes">1x</span>
222
+ <span class="cline-any cline-neutral">&nbsp;</span>
223
+ <span class="cline-any cline-neutral">&nbsp;</span>
224
+ <span class="cline-any cline-neutral">&nbsp;</span>
225
+ <span class="cline-any cline-neutral">&nbsp;</span>
226
+ <span class="cline-any cline-neutral">&nbsp;</span>
227
+ <span class="cline-any cline-yes">1x</span>
228
+ <span class="cline-any cline-neutral">&nbsp;</span>
229
+ <span class="cline-any cline-neutral">&nbsp;</span>
230
+ <span class="cline-any cline-neutral">&nbsp;</span>
231
+ <span class="cline-any cline-neutral">&nbsp;</span>
232
+ <span class="cline-any cline-neutral">&nbsp;</span>
233
+ <span class="cline-any cline-yes">1x</span>
234
+ <span class="cline-any cline-neutral">&nbsp;</span>
235
+ <span class="cline-any cline-neutral">&nbsp;</span>
236
+ <span class="cline-any cline-neutral">&nbsp;</span>
237
+ <span class="cline-any cline-yes">25x</span>
238
+ <span class="cline-any cline-yes">25x</span>
239
+ <span class="cline-any cline-neutral">&nbsp;</span>
240
+ <span class="cline-any cline-neutral">&nbsp;</span>
241
+ <span class="cline-any cline-neutral">&nbsp;</span>
242
+ <span class="cline-any cline-yes">25x</span>
243
+ <span class="cline-any cline-yes">25x</span>
244
+ <span class="cline-any cline-neutral">&nbsp;</span>
245
+ <span class="cline-any cline-neutral">&nbsp;</span>
246
+ <span class="cline-any cline-neutral">&nbsp;</span>
247
+ <span class="cline-any cline-yes">25x</span>
248
+ <span class="cline-any cline-yes">19x</span>
249
+ <span class="cline-any cline-neutral">&nbsp;</span>
250
+ <span class="cline-any cline-neutral">&nbsp;</span>
251
+ <span class="cline-any cline-neutral">&nbsp;</span>
252
+ <span class="cline-any cline-neutral">&nbsp;</span>
253
+ <span class="cline-any cline-neutral">&nbsp;</span>
254
+ <span class="cline-any cline-neutral">&nbsp;</span>
255
+ <span class="cline-any cline-neutral">&nbsp;</span>
256
+ <span class="cline-any cline-neutral">&nbsp;</span>
257
+ <span class="cline-any cline-neutral">&nbsp;</span>
258
+ <span class="cline-any cline-neutral">&nbsp;</span>
259
+ <span class="cline-any cline-yes">42x</span>
260
+ <span class="cline-any cline-neutral">&nbsp;</span>
261
+ <span class="cline-any cline-neutral">&nbsp;</span>
262
+ <span class="cline-any cline-neutral">&nbsp;</span>
263
+ <span class="cline-any cline-neutral">&nbsp;</span>
264
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
+ <span class="cline-any cline-neutral">&nbsp;</span>
266
+ <span class="cline-any cline-neutral">&nbsp;</span>
267
+ <span class="cline-any cline-neutral">&nbsp;</span>
268
+ <span class="cline-any cline-neutral">&nbsp;</span>
269
+ <span class="cline-any cline-neutral">&nbsp;</span>
270
+ <span class="cline-any cline-neutral">&nbsp;</span>
271
+ <span class="cline-any cline-neutral">&nbsp;</span>
272
+ <span class="cline-any cline-neutral">&nbsp;</span>
273
+ <span class="cline-any cline-neutral">&nbsp;</span>
274
+ <span class="cline-any cline-yes">14x</span>
275
+ <span class="cline-any cline-neutral">&nbsp;</span>
276
+ <span class="cline-any cline-neutral">&nbsp;</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-neutral">&nbsp;</span>
288
+ <span class="cline-any cline-yes">16x</span>
289
+ <span class="cline-any cline-yes">16x</span>
290
+ <span class="cline-any cline-yes">16x</span>
291
+ <span class="cline-any cline-yes">16x</span>
292
+ <span class="cline-any cline-neutral">&nbsp;</span>
293
+ <span class="cline-any cline-yes">14x</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-yes">14x</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-yes">14x</span>
298
+ <span class="cline-any cline-yes">14x</span>
299
+ <span class="cline-any cline-yes">4x</span>
300
+ <span class="cline-any cline-yes">4x</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-yes">16x</span>
305
+ <span class="cline-any cline-yes">16x</span>
306
+ <span class="cline-any cline-yes">1x</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-yes">1x</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-yes">16x</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-yes">42x</span>
317
+ <span class="cline-any cline-yes">49x</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-yes">2x</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-yes">62x</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-yes">16x</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-no">&nbsp;</span>
348
+ <span class="cline-any cline-no">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-no">&nbsp;</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-no">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-no">&nbsp;</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { ShapeToType } from "@sealcode/ts-predicates";
377
+ import { Context } from "koa";
378
+ import { FlatTemplatable, tempstream } from "tempstream";
379
+ import {
380
+ FormControl,
381
+ FormControlContext,
382
+ } from "../forms/controls/form-control";
383
+ import { FieldsToShape, FormField } from "../forms/fields/field";
384
+ import { FormData, FormDataValue, FormMessage } from "../forms/form";
385
+ import { Mountable } from "./mountable";
386
+ &nbsp;
387
+ export type PageErrorMessage = { type: "access" | "internal"; message: string };
388
+ &nbsp;
389
+ export type Fields = Record&lt;string, FormField&lt;boolean, any&gt;&gt;;
390
+ &nbsp;
391
+ export abstract class MountableWithFields&lt;
392
+ F extends Fields = Fields
393
+ &gt; extends Mountable {
394
+ fields: F;
395
+ field_names_prefix = ""; // useful for multiform, where many forms are merged into one and field assignment is made using the prefix
396
+ form_id = ""; // all fields within this mountable will be tied to form of this id
397
+ abstract controls: FormControl[];
398
+ &nbsp;
399
+ constructor() {
400
+ super();
401
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!this.fields) this.fields = {} as F;
402
+ }
403
+ &nbsp;
404
+ init(): void {
405
+ for (const [name, field] of Object.entries(this.fields)) {
406
+ field.init(name);
407
+ }
408
+ }
409
+ &nbsp;
410
+ makeFormControlContext(
411
+ ctx: Context,
412
+ data: FormData,
413
+ validate: boolean,
414
+ field_name_prefix = this.field_names_prefix,
415
+ form_id = this.form_id
416
+ ) {
417
+ return new FormControlContext(
418
+ ctx,
419
+ data.raw_values,
420
+ data.messages,
421
+ field_name_prefix,
422
+ form_id,
423
+ validate
424
+ );
425
+ }
426
+ &nbsp;
427
+ // this one is meant to be overwritten
428
+ async validateValues(
429
+ ctx: Context,
430
+ data: Record&lt;string, FormDataValue&gt;
431
+ ): Promise&lt;{ valid: boolean; error: string }&gt; {
432
+ return {
433
+ valid: true,
434
+ error: "",
435
+ };
436
+ }
437
+ &nbsp;
438
+ async validate(
439
+ ctx: Context,
440
+ values: Record&lt;string, FormDataValue&gt;
441
+ ): Promise&lt;{
442
+ valid: boolean;
443
+ field_errors: Partial&lt;Record&lt;keyof Fields, string&gt;&gt;;
444
+ form_messages: FormMessage[];
445
+ }&gt; {
446
+ const field_errors = {} as Record&lt;keyof Fields, string&gt;;
447
+ let valid = true;
448
+ const form_messages = [] as FormMessage[];
449
+ await Promise.all(
450
+ Object.entries(values)
451
+ .filter(([fieldname]) =&gt; fieldname in this.fields)
452
+ .map(async ([key]: [keyof F, FormDataValue]) =&gt; {
453
+ const field = this.fields[key];
454
+ const { valid: fieldvalid, message: fieldmessage } =
455
+ await field.getValue(ctx, values);
456
+ if (!fieldvalid) {
457
+ valid = false;
458
+ field_errors[field.name] = fieldmessage;
459
+ }
460
+ })
461
+ );
462
+ const formValidationResult = await this.validateValues(ctx, values);
463
+ if (!formValidationResult.valid) {
464
+ form_messages.push({
465
+ type: "error",
466
+ text: formValidationResult.error,
467
+ });
468
+ valid = false;
469
+ }
470
+ return { valid, field_errors, form_messages };
471
+ }
472
+ &nbsp;
473
+ public renderControls(fctx: FormControlContext): FlatTemplatable {
474
+ return tempstream/* HTML */ `${this.controls.map((control) =&gt;
475
+ control.render(fctx)
476
+ )}`;
477
+ }
478
+ &nbsp;
479
+ async renderError(
480
+ _: Context,
481
+ error: PageErrorMessage
482
+ ): Promise&lt;FlatTemplatable&gt; {
483
+ return error.message;
484
+ }
485
+ &nbsp;
486
+ public renderMessages(
487
+ _: Context,
488
+ data: FormData&lt;keyof Fields&gt;
489
+ ): FlatTemplatable {
490
+ return tempstream/* HTML */ `&lt;div class="form-messages"&gt;
491
+ ${data.messages.map(
492
+ (message) =&gt;
493
+ `&lt;div class="form-message form-message--${message.type}"&gt;${message.text}&lt;/div&gt;`
494
+ )}
495
+ &lt;/div&gt;`;
496
+ }
497
+ &nbsp;
498
+ abstract extractRawValues(
499
+ ctx: Context
500
+ ): Promise&lt;Record&lt;string, FormDataValue&gt;&gt;;
501
+ &nbsp;
502
+ <span class="fstat-no" title="function not covered" > async </span>getParsedValues(
503
+ ctx: Context
504
+ ): Promise&lt;ShapeToType&lt;FieldsToShape&lt;F&gt;&gt;&gt; {
505
+ const raw_values = <span class="cstat-no" title="statement not covered" >await this.extractRawValues(ctx);</span>
506
+ const result: Record&lt;string, unknown&gt; = <span class="cstat-no" title="statement not covered" >{};</span>
507
+ const promises = <span class="cstat-no" title="statement not covered" >Object.entries(this.fields).map(</span>
508
+ <span class="fstat-no" title="function not covered" > async </span>([key, field]) =&gt; {
509
+ const { parsed } = <span class="cstat-no" title="statement not covered" >await field.getValue(ctx, raw_values);</span>
510
+ <span class="cstat-no" title="statement not covered" > result[key] = parsed;</span>
511
+ }
512
+ );
513
+ <span class="cstat-no" title="statement not covered" > await Promise.all(promises);</span>
514
+ <span class="cstat-no" title="statement not covered" > return result as ShapeToType&lt;FieldsToShape&lt;F&gt;&gt;;</span>
515
+ }
516
+ &nbsp;
517
+ <span class="fstat-no" title="function not covered" > async </span>getDatabaseValues(
518
+ ctx: Context
519
+ ): Promise&lt;ShapeToType&lt;FieldsToShape&lt;F&gt;&gt;&gt; {
520
+ const raw_values = <span class="cstat-no" title="statement not covered" >await this.extractRawValues(ctx);</span>
521
+ const result: Record&lt;string, unknown&gt; = <span class="cstat-no" title="statement not covered" >{};</span>
522
+ const promises = <span class="cstat-no" title="statement not covered" >Object.entries(this.fields).map(</span>
523
+ <span class="fstat-no" title="function not covered" > async </span>([key, field]) =&gt; {
524
+ const db_value = <span class="cstat-no" title="statement not covered" >await field.getDatabaseValue(ctx, raw_values);</span>
525
+ <span class="cstat-no" title="statement not covered" > if (db_value !== undefined) {</span>
526
+ <span class="cstat-no" title="statement not covered" > result[key] = db_value;</span>
527
+ }
528
+ }
529
+ );
530
+ <span class="cstat-no" title="statement not covered" > await Promise.all(promises);</span>
531
+ <span class="cstat-no" title="statement not covered" > return result as ShapeToType&lt;FieldsToShape&lt;F&gt;&gt;;</span>
532
+ }
533
+ }
534
+ &nbsp;</pre></td></tr></table></pre>
535
+
536
+ <div class='push'></div><!-- for sticky footer -->
537
+ </div><!-- /wrapper -->
538
+ <div class='footer quiet pad2 space-top1 center small'>
539
+ Code coverage generated by
540
+ <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
541
+ at Thu Apr 20 2023 20:03:31 GMT+0200 (Central European Summer Time)
542
+ </div>
543
+ </div>
544
+ <script src="../../prettify.js"></script>
545
+ <script>
546
+ window.onload = function () {
547
+ prettyPrint();
548
+ };
549
+ </script>
550
+ <script src="../../sorter.js"></script>
551
+ <script src="../../block-navigation.js"></script>
552
+ </body>
553
+ </html>
554
+