@sealcode/sealgen 0.8.44 → 0.8.48

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 (423) hide show
  1. package/@types/index.d.ts +1 -0
  2. package/@types/page/stateful-page.d.ts +34 -0
  3. package/@types/templates/stateful-page.d.ts +1 -0
  4. package/@types/utils/base64.d.ts +2 -0
  5. package/@types/utils/utils.d.ts +3 -0
  6. package/lib/add-route.js +3 -0
  7. package/lib/generate-routes.js +2 -1
  8. package/lib/index.js +1 -0
  9. package/lib/make-env.js +1 -1
  10. package/lib/mount.js +1 -1
  11. package/lib/page/stateful-page.js +117 -0
  12. package/lib/templates/stateful-page.js +66 -0
  13. package/lib/utils/base64.js +12 -0
  14. package/lib/utils/utils.js +6 -1
  15. package/package.json +2 -1
  16. package/tsconfig.json +0 -1
  17. package/.arcconfig +0 -12
  18. package/.arclint +0 -18
  19. package/.eslintrc.js +0 -38
  20. package/.mocharc.js +0 -10
  21. package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +0 -1
  22. package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +0 -1
  23. package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +0 -1
  24. package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +0 -1
  25. package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +0 -1
  26. package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +0 -1
  27. package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +0 -1
  28. package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +0 -1
  29. package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +0 -1
  30. package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +0 -1
  31. package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +0 -1
  32. package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +0 -1
  33. package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +0 -1
  34. package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +0 -1
  35. package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +0 -1
  36. package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +0 -1
  37. package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +0 -1
  38. package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +0 -1
  39. package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +0 -1
  40. package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +0 -1
  41. package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +0 -1
  42. package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +0 -1
  43. package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +0 -1
  44. package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +0 -1
  45. package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +0 -1
  46. package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +0 -1
  47. package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +0 -1
  48. package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +0 -1
  49. package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +0 -1
  50. package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +0 -1
  51. package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +0 -1
  52. package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +0 -1
  53. package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +0 -1
  54. package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +0 -1
  55. package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +0 -1
  56. package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +0 -1
  57. package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +0 -1
  58. package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +0 -1
  59. package/.nyc_output/processinfo/index.json +0 -1
  60. package/.nycrc +0 -6
  61. package/.prettierrc +0 -21
  62. package/.xunit +0 -47
  63. package/@types/forms/fields/files-multiple.d.ts +0 -12
  64. package/@types/sealgen-url.d.ts +0 -0
  65. package/@types/tests/manual/multiform.d.ts +0 -1
  66. package/coverage/clover.xml +0 -2240
  67. package/coverage/lcov-report/base.css +0 -224
  68. package/coverage/lcov-report/block-navigation.js +0 -79
  69. package/coverage/lcov-report/favicon.png +0 -0
  70. package/coverage/lcov-report/index.html +0 -231
  71. package/coverage/lcov-report/prettify.css +0 -1
  72. package/coverage/lcov-report/prettify.js +0 -2
  73. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  74. package/coverage/lcov-report/sorter.js +0 -170
  75. package/coverage/lcov-report/src/add-collection.ts.html +0 -173
  76. package/coverage/lcov-report/src/add-route.test.ts.html +0 -254
  77. package/coverage/lcov-report/src/add-route.ts.html +0 -338
  78. package/coverage/lcov-report/src/build.ts.html +0 -359
  79. package/coverage/lcov-report/src/cli.ts.html +0 -188
  80. package/coverage/lcov-report/src/components/components.ts.html +0 -86
  81. package/coverage/lcov-report/src/components/index.html +0 -141
  82. package/coverage/lcov-report/src/components/tabs.ts.html +0 -365
  83. package/coverage/lcov-report/src/components/toggle-modal.ts.html +0 -236
  84. package/coverage/lcov-report/src/example.test.ts.html +0 -89
  85. package/coverage/lcov-report/src/find-scss-includes.ts.html +0 -176
  86. package/coverage/lcov-report/src/forms/controls/array.ts.html +0 -758
  87. package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +0 -179
  88. package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +0 -224
  89. package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +0 -293
  90. package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +0 -182
  91. package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +0 -230
  92. package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +0 -164
  93. package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +0 -362
  94. package/coverage/lcov-report/src/forms/controls/controls.ts.html +0 -170
  95. package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +0 -353
  96. package/coverage/lcov-report/src/forms/controls/derived.ts.html +0 -404
  97. package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +0 -341
  98. package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +0 -371
  99. package/coverage/lcov-report/src/forms/controls/field-group.ts.html +0 -287
  100. package/coverage/lcov-report/src/forms/controls/file.ts.html +0 -221
  101. package/coverage/lcov-report/src/forms/controls/form-control.ts.html +0 -152
  102. package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +0 -146
  103. package/coverage/lcov-report/src/forms/controls/form-header.ts.html +0 -137
  104. package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +0 -113
  105. package/coverage/lcov-report/src/forms/controls/frame.ts.html +0 -158
  106. package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +0 -146
  107. package/coverage/lcov-report/src/forms/controls/html.ts.html +0 -194
  108. package/coverage/lcov-report/src/forms/controls/index.html +0 -561
  109. package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +0 -848
  110. package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +0 -212
  111. package/coverage/lcov-report/src/forms/controls/number.ts.html +0 -194
  112. package/coverage/lcov-report/src/forms/controls/photo.ts.html +0 -302
  113. package/coverage/lcov-report/src/forms/controls/radio.ts.html +0 -209
  114. package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +0 -230
  115. package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +0 -524
  116. package/coverage/lcov-report/src/forms/controls/textarea.ts.html +0 -260
  117. package/coverage/lcov-report/src/forms/controls/tickable.ts.html +0 -461
  118. package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +0 -188
  119. package/coverage/lcov-report/src/forms/fields/boolean.ts.html +0 -269
  120. package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +0 -278
  121. package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +0 -266
  122. package/coverage/lcov-report/src/forms/fields/email.test.ts.html +0 -152
  123. package/coverage/lcov-report/src/forms/fields/email.ts.html +0 -140
  124. package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +0 -173
  125. package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +0 -266
  126. package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +0 -155
  127. package/coverage/lcov-report/src/forms/fields/enum.ts.html +0 -248
  128. package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +0 -146
  129. package/coverage/lcov-report/src/forms/fields/field.ts.html +0 -596
  130. package/coverage/lcov-report/src/forms/fields/file.ts.html +0 -347
  131. package/coverage/lcov-report/src/forms/fields/index.html +0 -456
  132. package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +0 -140
  133. package/coverage/lcov-report/src/forms/fields/number.test.ts.html +0 -182
  134. package/coverage/lcov-report/src/forms/fields/number.ts.html +0 -290
  135. package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +0 -137
  136. package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +0 -236
  137. package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +0 -152
  138. package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +0 -155
  139. package/coverage/lcov-report/src/forms/fields/regexp.ts.html +0 -239
  140. package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +0 -140
  141. package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +0 -170
  142. package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +0 -161
  143. package/coverage/lcov-report/src/forms/form.test.ts.html +0 -1133
  144. package/coverage/lcov-report/src/forms/form.ts.html +0 -962
  145. package/coverage/lcov-report/src/forms/index.html +0 -156
  146. package/coverage/lcov-report/src/forms/multiform.test.ts.html +0 -1700
  147. package/coverage/lcov-report/src/forms/multiform.ts.html +0 -788
  148. package/coverage/lcov-report/src/generate-collections.ts.html +0 -311
  149. package/coverage/lcov-report/src/generate-routes.ts.html +0 -440
  150. package/coverage/lcov-report/src/index.html +0 -321
  151. package/coverage/lcov-report/src/index.ts.html +0 -152
  152. package/coverage/lcov-report/src/make-env.ts.html +0 -125
  153. package/coverage/lcov-report/src/make-hidden-inputs.ts.html +0 -152
  154. package/coverage/lcov-report/src/mount.ts.html +0 -335
  155. package/coverage/lcov-report/src/page/access-control.ts.html +0 -134
  156. package/coverage/lcov-report/src/page/index.html +0 -186
  157. package/coverage/lcov-report/src/page/list.ts.html +0 -800
  158. package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +0 -554
  159. package/coverage/lcov-report/src/page/mountable.ts.html +0 -119
  160. package/coverage/lcov-report/src/page/page.ts.html +0 -218
  161. package/coverage/lcov-report/src/page/props-parser.ts.html +0 -194
  162. package/coverage/lcov-report/src/run.ts.html +0 -80
  163. package/coverage/lcov-report/src/sanitize.ts.html +0 -107
  164. package/coverage/lcov-report/src/templates/collection.ts.html +0 -113
  165. package/coverage/lcov-report/src/templates/form.ts.html +0 -260
  166. package/coverage/lcov-report/src/templates/index.html +0 -216
  167. package/coverage/lcov-report/src/templates/list.ts.html +0 -305
  168. package/coverage/lcov-report/src/templates/multiform.ts.html +0 -254
  169. package/coverage/lcov-report/src/templates/page.ts.html +0 -155
  170. package/coverage/lcov-report/src/templates/post.ts.html +0 -143
  171. package/coverage/lcov-report/src/templates/redirect.ts.html +0 -146
  172. package/coverage/lcov-report/src/templates/route-test.ts.html +0 -161
  173. package/coverage/lcov-report/src/test_utils/index.html +0 -111
  174. package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +0 -131
  175. package/coverage/lcov-report/src/utils/assert-throws.ts.html +0 -134
  176. package/coverage/lcov-report/src/utils/browser-creator.js.html +0 -110
  177. package/coverage/lcov-report/src/utils/escape-url-params.ts.html +0 -122
  178. package/coverage/lcov-report/src/utils/exec.ts.html +0 -170
  179. package/coverage/lcov-report/src/utils/format-external-url.ts.html +0 -119
  180. package/coverage/lcov-report/src/utils/import-path.ts.html +0 -155
  181. package/coverage/lcov-report/src/utils/index.html +0 -366
  182. package/coverage/lcov-report/src/utils/input-wrapper.ts.html +0 -143
  183. package/coverage/lcov-report/src/utils/list-collections.ts.html +0 -128
  184. package/coverage/lcov-report/src/utils/make-slug.ts.html +0 -95
  185. package/coverage/lcov-report/src/utils/natural-numbers.ts.html +0 -95
  186. package/coverage/lcov-report/src/utils/prettier.ts.html +0 -119
  187. package/coverage/lcov-report/src/utils/question.ts.html +0 -149
  188. package/coverage/lcov-report/src/utils/render-attributes.ts.html +0 -131
  189. package/coverage/lcov-report/src/utils/sleep.ts.html +0 -89
  190. package/coverage/lcov-report/src/utils/translate.ts.html +0 -119
  191. package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +0 -107
  192. package/coverage/lcov-report/src/utils/utils.ts.html +0 -122
  193. package/coverage/lcov-report/src/utils/walk.ts.html +0 -140
  194. package/coverage/lcov.info +0 -4697
  195. package/jenkins.sanity.sh +0 -3
  196. package/lib/add-collection.js.map +0 -1
  197. package/lib/add-route.js.map +0 -1
  198. package/lib/add-route.test.js.map +0 -1
  199. package/lib/build.js.map +0 -1
  200. package/lib/cli.js.map +0 -1
  201. package/lib/components/components.js.map +0 -1
  202. package/lib/components/tabs.js.map +0 -1
  203. package/lib/components/toggle-modal.js.map +0 -1
  204. package/lib/example.test.js.map +0 -1
  205. package/lib/find-scss-includes.js.map +0 -1
  206. package/lib/forms/controls/array.js.map +0 -1
  207. package/lib/forms/controls/autocomplete.js.map +0 -1
  208. package/lib/forms/controls/big-radio-group.js.map +0 -1
  209. package/lib/forms/controls/checkbox-group.js.map +0 -1
  210. package/lib/forms/controls/checkbox.js.map +0 -1
  211. package/lib/forms/controls/checkboxed-list-input.js.map +0 -1
  212. package/lib/forms/controls/collapsible-checkbox-group.js.map +0 -1
  213. package/lib/forms/controls/collapsible-field-group.js.map +0 -1
  214. package/lib/forms/controls/controls.js.map +0 -1
  215. package/lib/forms/controls/derived-frame.js.map +0 -1
  216. package/lib/forms/controls/derived.js.map +0 -1
  217. package/lib/forms/controls/dropdown.js.map +0 -1
  218. package/lib/forms/controls/editable-collection-subset.js.map +0 -1
  219. package/lib/forms/controls/field-group.js.map +0 -1
  220. package/lib/forms/controls/file.js.map +0 -1
  221. package/lib/forms/controls/form-control.js.map +0 -1
  222. package/lib/forms/controls/form-field-control.js.map +0 -1
  223. package/lib/forms/controls/form-header.js.map +0 -1
  224. package/lib/forms/controls/form-paragraph.js.map +0 -1
  225. package/lib/forms/controls/frame.js.map +0 -1
  226. package/lib/forms/controls/hidden-input.js.map +0 -1
  227. package/lib/forms/controls/html.js.map +0 -1
  228. package/lib/forms/controls/multiple-files.js.map +0 -1
  229. package/lib/forms/controls/multiple-photos.js.map +0 -1
  230. package/lib/forms/controls/number.js.map +0 -1
  231. package/lib/forms/controls/photo.js.map +0 -1
  232. package/lib/forms/controls/radio.js.map +0 -1
  233. package/lib/forms/controls/reverse-single-reference.js.map +0 -1
  234. package/lib/forms/controls/simple-input.js.map +0 -1
  235. package/lib/forms/controls/textarea.js.map +0 -1
  236. package/lib/forms/controls/tickable.js.map +0 -1
  237. package/lib/forms/fields/boolean.js.map +0 -1
  238. package/lib/forms/fields/boolean.test.js.map +0 -1
  239. package/lib/forms/fields/checkboxed-list.js.map +0 -1
  240. package/lib/forms/fields/collection-field.js.map +0 -1
  241. package/lib/forms/fields/email.js.map +0 -1
  242. package/lib/forms/fields/email.test.js.map +0 -1
  243. package/lib/forms/fields/enum-multiple.js.map +0 -1
  244. package/lib/forms/fields/enum-multiple.test.js.map +0 -1
  245. package/lib/forms/fields/enum.js.map +0 -1
  246. package/lib/forms/fields/enum.test.js.map +0 -1
  247. package/lib/forms/fields/existing-sealious-value.js.map +0 -1
  248. package/lib/forms/fields/field.js.map +0 -1
  249. package/lib/forms/fields/file.js.map +0 -1
  250. package/lib/forms/fields/files-multiple.js +0 -18
  251. package/lib/forms/fields/files-multiple.js.map +0 -1
  252. package/lib/forms/fields/multiple-files.js.map +0 -1
  253. package/lib/forms/fields/number.js.map +0 -1
  254. package/lib/forms/fields/number.test.js.map +0 -1
  255. package/lib/forms/fields/pick-from-list.js.map +0 -1
  256. package/lib/forms/fields/pick-from-list.test.js.map +0 -1
  257. package/lib/forms/fields/proxy-field.js.map +0 -1
  258. package/lib/forms/fields/regexp.js.map +0 -1
  259. package/lib/forms/fields/regexp.test.js.map +0 -1
  260. package/lib/forms/fields/reverse-single-reference.js.map +0 -1
  261. package/lib/forms/fields/simple-form-field.js.map +0 -1
  262. package/lib/forms/fields/structured-array.js.map +0 -1
  263. package/lib/forms/form.js.map +0 -1
  264. package/lib/forms/form.test.js.map +0 -1
  265. package/lib/forms/multiform.js.map +0 -1
  266. package/lib/forms/multiform.test.js.map +0 -1
  267. package/lib/generate-collections.js.map +0 -1
  268. package/lib/generate-routes.js.map +0 -1
  269. package/lib/index.js.map +0 -1
  270. package/lib/make-env.js.map +0 -1
  271. package/lib/make-hidden-inputs.js.map +0 -1
  272. package/lib/mount.js.map +0 -1
  273. package/lib/page/access-control.js.map +0 -1
  274. package/lib/page/list.js.map +0 -1
  275. package/lib/page/mountable-with-fields.js.map +0 -1
  276. package/lib/page/mountable.js.map +0 -1
  277. package/lib/page/page.js.map +0 -1
  278. package/lib/page/props-parser.js.map +0 -1
  279. package/lib/run.js.map +0 -1
  280. package/lib/sanitize.js.map +0 -1
  281. package/lib/sealgen-url.js +0 -1
  282. package/lib/sealgen-url.js.map +0 -1
  283. package/lib/templates/collection.js.map +0 -1
  284. package/lib/templates/form.js.map +0 -1
  285. package/lib/templates/list.js.map +0 -1
  286. package/lib/templates/multiform.js.map +0 -1
  287. package/lib/templates/page.js.map +0 -1
  288. package/lib/templates/post.js.map +0 -1
  289. package/lib/templates/redirect.js.map +0 -1
  290. package/lib/templates/route-test.js.map +0 -1
  291. package/lib/test_utils/locator_is_visible.js.map +0 -1
  292. package/lib/tests/manual/multiform.js +0 -95
  293. package/lib/tests/manual/multiform.js.map +0 -1
  294. package/lib/utils/assert-throws.js.map +0 -1
  295. package/lib/utils/browser-creator.js.map +0 -1
  296. package/lib/utils/escape-url-params.js.map +0 -1
  297. package/lib/utils/exec.js.map +0 -1
  298. package/lib/utils/format-external-url.js.map +0 -1
  299. package/lib/utils/import-path.js.map +0 -1
  300. package/lib/utils/input-wrapper.js.map +0 -1
  301. package/lib/utils/list-collections.js.map +0 -1
  302. package/lib/utils/make-slug.js.map +0 -1
  303. package/lib/utils/natural-numbers.js.map +0 -1
  304. package/lib/utils/prettier.js.map +0 -1
  305. package/lib/utils/question.js.map +0 -1
  306. package/lib/utils/render-attributes.js.map +0 -1
  307. package/lib/utils/sleep.js.map +0 -1
  308. package/lib/utils/translate.js.map +0 -1
  309. package/lib/utils/url-with-new-params.js.map +0 -1
  310. package/lib/utils/utils.js.map +0 -1
  311. package/lib/utils/walk.js.map +0 -1
  312. package/mocha_root_hooks.js +0 -6
  313. package/src/add-collection.ts +0 -31
  314. package/src/add-route.test.ts +0 -58
  315. package/src/add-route.ts +0 -86
  316. package/src/build.ts +0 -94
  317. package/src/cli.ts +0 -36
  318. package/src/components/components.ts +0 -2
  319. package/src/components/tabs.ts +0 -95
  320. package/src/components/toggle-modal.ts +0 -52
  321. package/src/example.test.ts +0 -3
  322. package/src/find-scss-includes.ts +0 -32
  323. package/src/forms/controls/array.ts +0 -226
  324. package/src/forms/controls/autocomplete.ts +0 -33
  325. package/src/forms/controls/big-radio-group.ts +0 -48
  326. package/src/forms/controls/checkbox-group.ts +0 -71
  327. package/src/forms/controls/checkbox.ts +0 -34
  328. package/src/forms/controls/checkboxed-list-input.ts +0 -50
  329. package/src/forms/controls/collapsible-checkbox-group.ts +0 -28
  330. package/src/forms/controls/collapsible-field-group.ts +0 -94
  331. package/src/forms/controls/controls.ts +0 -30
  332. package/src/forms/controls/derived-frame.ts +0 -91
  333. package/src/forms/controls/derived.ts +0 -108
  334. package/src/forms/controls/dropdown.ts +0 -87
  335. package/src/forms/controls/editable-collection-subset.ts +0 -97
  336. package/src/forms/controls/field-group.ts +0 -69
  337. package/src/forms/controls/file.ts +0 -47
  338. package/src/forms/controls/form-control.ts +0 -24
  339. package/src/forms/controls/form-field-control.ts +0 -22
  340. package/src/forms/controls/form-header.ts +0 -19
  341. package/src/forms/controls/form-paragraph.ts +0 -11
  342. package/src/forms/controls/frame.ts +0 -26
  343. package/src/forms/controls/hidden-input.ts +0 -22
  344. package/src/forms/controls/html.ts +0 -38
  345. package/src/forms/controls/multiple-files.ts +0 -256
  346. package/src/forms/controls/multiple-photos.ts +0 -44
  347. package/src/forms/controls/number.ts +0 -38
  348. package/src/forms/controls/photo.ts +0 -74
  349. package/src/forms/controls/radio.ts +0 -43
  350. package/src/forms/controls/reverse-single-reference.ts +0 -50
  351. package/src/forms/controls/simple-input.ts +0 -148
  352. package/src/forms/controls/textarea.ts +0 -60
  353. package/src/forms/controls/tickable.ts +0 -127
  354. package/src/forms/fields/boolean.test.ts +0 -36
  355. package/src/forms/fields/boolean.ts +0 -63
  356. package/src/forms/fields/checkboxed-list.ts +0 -66
  357. package/src/forms/fields/collection-field.ts +0 -62
  358. package/src/forms/fields/email.test.ts +0 -24
  359. package/src/forms/fields/email.ts +0 -20
  360. package/src/forms/fields/enum-multiple.test.ts +0 -31
  361. package/src/forms/fields/enum-multiple.ts +0 -62
  362. package/src/forms/fields/enum.test.ts +0 -25
  363. package/src/forms/fields/enum.ts +0 -56
  364. package/src/forms/fields/existing-sealious-value.ts +0 -22
  365. package/src/forms/fields/field.ts +0 -172
  366. package/src/forms/fields/file.ts +0 -89
  367. package/src/forms/fields/multiple-files.ts +0 -20
  368. package/src/forms/fields/number.test.ts +0 -34
  369. package/src/forms/fields/number.ts +0 -70
  370. package/src/forms/fields/pick-from-list.test.ts +0 -19
  371. package/src/forms/fields/pick-from-list.ts +0 -52
  372. package/src/forms/fields/proxy-field.ts +0 -24
  373. package/src/forms/fields/regexp.test.ts +0 -25
  374. package/src/forms/fields/regexp.ts +0 -53
  375. package/src/forms/fields/reverse-single-reference.ts +0 -20
  376. package/src/forms/fields/simple-form-field.ts +0 -30
  377. package/src/forms/fields/structured-array.ts +0 -27
  378. package/src/forms/form.test.ts +0 -351
  379. package/src/forms/form.ts +0 -294
  380. package/src/forms/forms.scss +0 -85
  381. package/src/forms/multiform.test.ts +0 -540
  382. package/src/forms/multiform.ts +0 -236
  383. package/src/generate-collections.ts +0 -77
  384. package/src/generate-routes.ts +0 -120
  385. package/src/index.ts +0 -24
  386. package/src/make-env.ts +0 -15
  387. package/src/make-hidden-inputs.ts +0 -24
  388. package/src/mount.ts +0 -85
  389. package/src/page/access-control.ts +0 -18
  390. package/src/page/list.ts +0 -240
  391. package/src/page/mountable-with-fields.ts +0 -158
  392. package/src/page/mountable.ts +0 -13
  393. package/src/page/page.ts +0 -46
  394. package/src/page/props-parser.ts +0 -38
  395. package/src/run.ts +0 -0
  396. package/src/sanitize.ts +0 -9
  397. package/src/templates/collection.ts +0 -11
  398. package/src/templates/form.ts +0 -60
  399. package/src/templates/list.ts +0 -75
  400. package/src/templates/multiform.ts +0 -58
  401. package/src/templates/page.ts +0 -25
  402. package/src/templates/post.ts +0 -21
  403. package/src/templates/redirect.ts +0 -22
  404. package/src/templates/route-test.ts +0 -27
  405. package/src/test_utils/locator_is_visible.ts +0 -17
  406. package/src/utils/assert-throws.ts +0 -18
  407. package/src/utils/browser-creator.js +0 -10
  408. package/src/utils/escape-url-params.ts +0 -14
  409. package/src/utils/exec.ts +0 -30
  410. package/src/utils/format-external-url.ts +0 -13
  411. package/src/utils/import-path.ts +0 -25
  412. package/src/utils/input-wrapper.ts +0 -21
  413. package/src/utils/list-collections.ts +0 -16
  414. package/src/utils/make-slug.ts +0 -5
  415. package/src/utils/natural-numbers.ts +0 -5
  416. package/src/utils/prettier.ts +0 -13
  417. package/src/utils/question.ts +0 -23
  418. package/src/utils/render-attributes.ts +0 -17
  419. package/src/utils/sleep.ts +0 -3
  420. package/src/utils/translate.ts +0 -13
  421. package/src/utils/url-with-new-params.ts +0 -9
  422. package/src/utils/utils.ts +0 -14
  423. package/src/utils/walk.ts +0 -20
@@ -1,62 +0,0 @@
1
- import { is, predicates } from "@sealcode/ts-predicates";
2
- import { Context } from "koa";
3
- import { FormDataValue } from "../form";
4
- import { FieldParseResult, FormField } from "./field";
5
-
6
- export class EnumMultipleField<
7
- Options extends readonly string[],
8
- Required extends boolean
9
- > extends FormField<Required, string[]> {
10
- constructor(
11
- required: Required,
12
- public options: Options,
13
- public error_message: (options: Options) => string = (options) =>
14
- options.join(", ")
15
- ) {
16
- super(required);
17
- }
18
-
19
- predicate = predicates.enum<Options>(this.options);
20
-
21
- public async isValueValid(
22
- _: Context,
23
- values: string[]
24
- ): Promise<{ valid: boolean; message: string }> {
25
- for (const value of values) {
26
- if (!is(value, predicates.string)) {
27
- return { valid: false, message: "expected a string" };
28
- }
29
- if (!this.options.includes(value)) {
30
- return { valid: false, message: "invalid value" };
31
- }
32
- }
33
- return { valid: true, message: "" };
34
- }
35
-
36
- async parse(
37
- _: Context,
38
- value: FormDataValue
39
- ): Promise<FieldParseResult<string[]>> {
40
- if (is(value, predicates.string)) {
41
- return { parsable: true, parsed_value: [value], error: null };
42
- } else if (is(value, predicates.array(predicates.string))) {
43
- return {
44
- parsable: true,
45
- parsed_value: value,
46
- error: null,
47
- };
48
- } else if (value == null) {
49
- return { parsable: true, parsed_value: [], error: null };
50
- } else {
51
- return {
52
- parsable: false,
53
- parsed_value: null,
54
- error: "Please enter a list of strings",
55
- };
56
- }
57
- }
58
-
59
- public getEmptyValue(): string[] {
60
- return [];
61
- }
62
- }
@@ -1,25 +0,0 @@
1
- import assert from "assert";
2
- import { Fields } from "../../index";
3
-
4
- describe("enum field", () => {
5
- const ctx = {} as any;
6
-
7
- it("validation logic", async () => {
8
- const field = new Fields.EnumField(true, ["sa", "mp", "le"]);
9
-
10
- assert.strictEqual((await field.isValueValid(ctx, 42)).valid, false);
11
- assert.strictEqual((await field.isValueValid(ctx, "mp")).valid, true);
12
- assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
13
- });
14
-
15
- it("parse function", async () => {
16
- const field = new Fields.EnumField(true, []);
17
- const string_response = await field.parse(ctx, "42");
18
- const number_response = await field.parse(ctx, 42);
19
-
20
- assert.strictEqual(string_response.parsable, true);
21
- assert.strictEqual(string_response.parsed_value, "42");
22
- assert.strictEqual(number_response.parsable, false);
23
- assert.strictEqual(number_response.error, "Please enter a string");
24
- });
25
- });
@@ -1,56 +0,0 @@
1
- import { is, predicates } from "@sealcode/ts-predicates";
2
- import { Context } from "koa";
3
- import { FormDataValue } from "../form";
4
- import { FieldParseResult, FormField } from "./field";
5
-
6
- export class EnumField<
7
- Options extends readonly string[],
8
- Required extends boolean
9
- > extends FormField<Required, string> {
10
- constructor(
11
- required: Required,
12
- public options: Options,
13
- public error_message: (options: Options) => string = (options) =>
14
- options.join(", ")
15
- ) {
16
- super(required);
17
- }
18
-
19
- predicate = predicates.enum<Options>(this.options);
20
-
21
- public async isValueValid(
22
- _: Context,
23
- value: unknown
24
- ): Promise<{ valid: boolean; message: string }> {
25
- if (!is(value, predicates.string)) {
26
- return { valid: false, message: "expected a string" };
27
- }
28
- if (this.options.includes(value)) {
29
- return { valid: true, message: "" };
30
- }
31
- return { valid: false, message: this.error_message(this.options) };
32
- }
33
-
34
- async parse(
35
- _: Context,
36
- value: FormDataValue
37
- ): Promise<FieldParseResult<string>> {
38
- if (is(value, predicates.string)) {
39
- return {
40
- parsable: true,
41
- parsed_value: value,
42
- error: null,
43
- };
44
- } else {
45
- return {
46
- parsable: false,
47
- parsed_value: null,
48
- error: "Please enter a string",
49
- };
50
- }
51
- }
52
-
53
- public getEmptyValue(): string {
54
- return "";
55
- }
56
- }
@@ -1,22 +0,0 @@
1
- import { Field } from "sealious";
2
- import { PickFromListField } from "./pick-from-list";
3
-
4
- export class ExistingSealiousValue<
5
- Required extends boolean
6
- > extends PickFromListField<Required> {
7
- constructor(required: Required, field: Field) {
8
- super(required, async (ctx) => {
9
- const { items } = await field.collection.list(ctx.$context).fetch();
10
- return Object.fromEntries(
11
- items.map((item) => {
12
- const value = item.get(field.name);
13
- return [value, value];
14
- })
15
- );
16
- });
17
- }
18
-
19
- getEmptyValue() {
20
- return "";
21
- }
22
- }
@@ -1,172 +0,0 @@
1
- import { Predicate, predicates } from "@sealcode/ts-predicates";
2
- import { Context } from "koa";
3
- import { t } from "../../utils/translate";
4
- import { FormDataValue } from "../form";
5
-
6
- export type FormFieldValidationResponse = { valid: boolean; message: string };
7
-
8
- export type FormFieldValidationFn<ValueType> = (
9
- ctx: Context,
10
- value: ValueType,
11
- field: FormField<boolean, ValueType>
12
- ) => Promise<FormFieldValidationResponse>;
13
-
14
- export type FieldParsedValue<T> = T extends FormField<infer R> ? R : never;
15
-
16
- export type GetPredicate<F extends FormField> = F extends FormField<true>
17
- ? F["predicate"]
18
- : F["predicate"] | typeof predicates.undefined;
19
-
20
- // for quickly testing GetPredicate conditonally applying the undefined predicate:
21
- // const f = new SimpleFormField(true);
22
- // type p = GetPredicate<typeof f>;
23
- // const f2 = new SimpleFormField(false);
24
- // type p2 = GetPredicate<typeof f2>;
25
-
26
- export type FieldsToShape<T extends Record<string, FormField>> = {
27
- [property in keyof T]: GetPredicate<T[property]>;
28
- };
29
-
30
- export function fieldsToShape<Fields extends Record<string, FormField>>(
31
- obj: Fields
32
- ): FieldsToShape<Fields> {
33
- return Object.fromEntries(
34
- Object.entries(obj).map(([key, value]) => [key, value.predicate])
35
- ) as FieldsToShape<Fields>;
36
- }
37
-
38
- export type FieldParseResult<T> =
39
- | {
40
- parsable: true;
41
- error: null;
42
- parsed_value: T;
43
- }
44
- | {
45
- parsable: false;
46
- error: string;
47
- parsed_value: null;
48
- };
49
-
50
- export abstract class FormField<
51
- Required extends boolean = boolean,
52
- ParsedValue extends unknown = unknown
53
- > {
54
- name: string;
55
- constructor(public readonly required: Required) {}
56
- predicate: Predicate = predicates.unknown;
57
- mapToFilter: (parsed: ParsedValue) => unknown = (value) => value;
58
-
59
- async init(fieldname: string): Promise<void> {
60
- this.name = fieldname;
61
- }
62
-
63
- public async _validate(
64
- ctx: Context,
65
- value: ParsedValue
66
- ): Promise<FormFieldValidationResponse> {
67
- if (
68
- this.required &&
69
- (value === "" || value === null || value === undefined)
70
- ) {
71
- return {
72
- valid: false,
73
-
74
- message: t(
75
- ctx,
76
- "field_is_required",
77
- [],
78
- "This field is required"
79
- ),
80
- };
81
- }
82
- return this.isValueValid(ctx, value);
83
- }
84
-
85
- public abstract getEmptyValue(): ParsedValue;
86
-
87
- public async isValueValid(
88
- ctx: Context,
89
- value: ParsedValue
90
- ): Promise<FormFieldValidationResponse> {
91
- return { valid: true, message: "" };
92
- }
93
-
94
- abstract parse(
95
- ctx: Context,
96
- raw_value: FormDataValue
97
- ): Promise<FieldParseResult<ParsedValue>>;
98
-
99
- async getValue(
100
- ctx: Context,
101
- all_form_values: Record<string, FormDataValue>
102
- ): Promise<{
103
- valid: boolean;
104
- message: string;
105
- parsed: ParsedValue;
106
- raw: FormDataValue;
107
- }> {
108
- if (Object.keys(all_form_values || {}).length === 0) {
109
- // don't validate on virgin form
110
- return {
111
- parsed: this.getEmptyValue(),
112
- valid: true,
113
- message: "",
114
- raw: "",
115
- };
116
- }
117
- const raw = all_form_values[this.name];
118
- const {
119
- parsable,
120
- parsed_value,
121
- error: parse_error,
122
- } = await this.parse(ctx, raw);
123
- if (!parsable) {
124
- return {
125
- valid: false,
126
- parsed: this.getEmptyValue(),
127
- raw,
128
- message: parse_error || "Error",
129
- };
130
- }
131
- const { valid, message } = await this._validate(
132
- ctx,
133
- parsed_value as ParsedValue
134
- );
135
- return {
136
- parsed: parsed_value as ParsedValue,
137
- valid,
138
- message,
139
- raw: all_form_values[this.name],
140
- };
141
- }
142
-
143
- setMapToFilter(fn: (parsed: ParsedValue) => unknown) {
144
- this.mapToFilter = fn;
145
- return this;
146
- }
147
-
148
- //return undefined here to delete a value
149
- async getDatabaseValue(
150
- ctx: Context,
151
- data: Record<string, FormDataValue>
152
- ): Promise<unknown> {
153
- const { parsed } = await this.getValue(ctx, data);
154
- return parsed;
155
- }
156
- }
157
-
158
- export * from "./simple-form-field";
159
- export * from "./checkboxed-list";
160
- export * from "./collection-field";
161
- export * from "./number";
162
- export * from "./pick-from-list";
163
- export * from "./regexp";
164
- export * from "./email";
165
- export * from "./enum";
166
- export * from "./boolean";
167
- export * from "./enum-multiple";
168
- export * from "./existing-sealious-value";
169
- export * from "./file";
170
- export * from "./multiple-files";
171
- export * from "./reverse-single-reference";
172
- export * from "./structured-array";
@@ -1,89 +0,0 @@
1
- import {
2
- hasField,
3
- hasFieldOfType,
4
- hasShape,
5
- is,
6
- predicates,
7
- } from "@sealcode/ts-predicates";
8
- import { Context } from "koa";
9
- import { File as SealiousFile } from "sealious";
10
- import { FormDataValue } from "../form";
11
- import { FieldParseResult, FormField } from "./field";
12
-
13
- export type FileContainer = {
14
- old: SealiousFile | null;
15
- new: SealiousFile | null;
16
- };
17
-
18
- export class File<Required extends boolean> extends FormField<
19
- Required,
20
- FileContainer
21
- > {
22
- async parse(
23
- ctx: Context,
24
- raw_value: FormDataValue
25
- ): Promise<FieldParseResult<FileContainer>> {
26
- let result;
27
- if (
28
- raw_value instanceof SealiousFile ||
29
- (is(raw_value, predicates.object) &&
30
- hasShape(
31
- {
32
- filename: predicates.string,
33
- id: predicates.string,
34
- },
35
- raw_value
36
- ) &&
37
- raw_value.id)
38
- ) {
39
- const file = await SealiousFile.fromID(
40
- ctx.$app,
41
- raw_value.id as string
42
- );
43
- result = {
44
- parsed_value: { old: file, new: null },
45
- error: null,
46
- parsable: true as true,
47
- };
48
- } else if (!is(raw_value, predicates.object)) {
49
- result = {
50
- parsed_value: null,
51
- error: "Expected a field with old.id:string, old.filename:string and new?:File",
52
- parsable: false as false,
53
- };
54
- } else {
55
- const old_file =
56
- hasFieldOfType(raw_value, "old", predicates.object) &&
57
- hasShape(
58
- { id: predicates.string, filename: predicates.string },
59
- raw_value.old
60
- ) &&
61
- raw_value.old.id
62
- ? await SealiousFile.fromID(ctx.$app, raw_value.old.id)
63
- : null;
64
- const new_file =
65
- hasFieldOfType(
66
- raw_value,
67
- "new",
68
- predicates.array(predicates.object)
69
- ) && raw_value.new[0] instanceof SealiousFile
70
- ? raw_value.new[0]
71
- : null;
72
- result = {
73
- parsable: true as true,
74
- error: null,
75
- parsed_value: { old: old_file, new: new_file },
76
- };
77
- }
78
- return result;
79
- }
80
-
81
- async getDatabaseValue(ctx: Context, data: Record<string, FormDataValue>) {
82
- const { parsed } = await this.getValue(ctx, data);
83
- return parsed.new || undefined;
84
- }
85
-
86
- getEmptyValue() {
87
- return { old: null, new: null };
88
- }
89
- }
@@ -1,20 +0,0 @@
1
- import { Context } from "koa";
2
- import { FieldTypes as SealiousFieldTypes } from "sealious";
3
- import { FormField } from "./field";
4
-
5
- export class MultipleFiles extends FormField<false> {
6
- constructor(
7
- public collection_field: SealiousFieldTypes.ReverseSingleReference,
8
- public getItemId: (ctx: Context) => Promise<string> | string
9
- ) {
10
- super(false);
11
- }
12
-
13
- getEmptyValue() {
14
- return undefined;
15
- }
16
-
17
- async parse() {
18
- return <const>{ parsed_value: undefined, parsable: true, error: null }; // the control is supposed to do the heavy lifting here
19
- }
20
- }
@@ -1,34 +0,0 @@
1
- import assert from "assert";
2
- import { Fields } from "../../index";
3
-
4
- describe("number field", () => {
5
- const ctx = {} as any;
6
-
7
- it("validation logic", async () => {
8
- const required = new Fields.NumberField(true, 0);
9
- const not_required = new Fields.NumberField(false, 0);
10
-
11
- assert.strictEqual((await required.isValueValid(ctx, 42)).valid, true);
12
- assert.strictEqual((await required.isValueValid(ctx, "42")).valid, true);
13
- assert.strictEqual((await required.isValueValid(ctx, "notvalid")).valid, false);
14
- assert.strictEqual((await not_required.isValueValid(ctx, "")).valid, true);
15
- });
16
-
17
- it("parse function", async () => {
18
- const required = new Fields.NumberField(true, 0);
19
- const decimal_digits = new Fields.NumberField(true, 0, { decimalDigits: 1 });
20
- const number_as_string_response = await required.parse(ctx, "42");
21
- const number_response = await required.parse(ctx, 42);
22
- const not_a_number_response = await required.parse(ctx, "notanumber");
23
- const decimal_number_response = await decimal_digits.parse(ctx, 42.42);
24
-
25
- assert.strictEqual(number_as_string_response.parsable, true);
26
- assert.strictEqual(number_as_string_response.parsed_value, 42);
27
- assert.strictEqual(number_response.parsable, true);
28
- assert.strictEqual(number_response.parsed_value, 42);
29
- assert.strictEqual(not_a_number_response.parsable, false);
30
- assert.strictEqual(not_a_number_response.error, "Please enter a number");
31
- assert.strictEqual(decimal_number_response.parsable, true);
32
- assert.strictEqual(decimal_number_response.parsed_value, 42.4);
33
- });
34
- });
@@ -1,70 +0,0 @@
1
- import { is, predicates } from "@sealcode/ts-predicates";
2
- import { Context } from "koa";
3
- import { FormDataValue } from "../form";
4
- import { FieldParseResult, FormField } from "./field";
5
-
6
- export class NumberField<
7
- DefaultValue extends number | null = number,
8
- Required extends boolean = boolean
9
- > extends FormField<Required, number | DefaultValue> {
10
- constructor(
11
- required: Required,
12
- public default_value: DefaultValue,
13
- public options: Partial<{
14
- max: number;
15
- min: number;
16
- decimalDigits: number;
17
- }> = {}
18
- ) {
19
- super(required);
20
- }
21
-
22
- predicate = predicates.number;
23
-
24
- public async isValueValid(_: Context, value: unknown) {
25
- if (
26
- (is(value, predicates.string) &&
27
- !isNaN(parseFloat(value)) &&
28
- parseFloat(value).toString() == value.trim()) ||
29
- is(value, predicates.number) ||
30
- ((is(value, predicates.undefined) || value == "") && !this.required)
31
- ) {
32
- return { valid: true, message: "" };
33
- }
34
- return { valid: false, message: "Proszę wprowadzić liczbę" };
35
- }
36
-
37
- async parse(
38
- _: Context,
39
- value: FormDataValue
40
- ): Promise<FieldParseResult<number>> {
41
- if (
42
- (is(value, predicates.string) &&
43
- !isNaN(parseFloat(value)) &&
44
- parseFloat(value).toString() == value.trim()) ||
45
- is(value, predicates.number)
46
- ) {
47
- return {
48
- parsable: true,
49
- parsed_value: this.options.decimalDigits
50
- ? parseFloat(
51
- parseFloat(value.toString()).toFixed(
52
- this.options.decimalDigits
53
- )
54
- )
55
- : parseFloat(value.toString()),
56
- error: null,
57
- };
58
- } else {
59
- return {
60
- parsable: false,
61
- parsed_value: null,
62
- error: "Please enter a number",
63
- };
64
- }
65
- }
66
-
67
- public getEmptyValue(): DefaultValue {
68
- return this.default_value;
69
- }
70
- }
@@ -1,19 +0,0 @@
1
- import assert from "assert";
2
- import { Fields } from "../../index";
3
-
4
- describe("pick-from-list field", () => {
5
- const ctx = {} as any;
6
-
7
- it("validation logic", async () => {
8
- const field = new Fields.PickFromListField(true, async () => {
9
- return [
10
- { value: "samplev", label: "samplel" },
11
- { value: "samplevv", label: "samplell" },
12
- ];
13
- });
14
-
15
- assert.strictEqual((await field.isValueValid(ctx, 42 as any)).valid, false);
16
- assert.strictEqual((await field.isValueValid(ctx, "samplevv")).valid, true);
17
- assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
18
- });
19
- });
@@ -1,52 +0,0 @@
1
- import { is, predicates } from "@sealcode/ts-predicates";
2
- import { Context } from "koa";
3
- import { DropdownOption } from "../controls/dropdown";
4
- import { FormFieldValidationResponse } from "./field";
5
- import { SimpleFormField } from "./simple-form-field";
6
-
7
- export class PickFromListField<
8
- Required extends boolean
9
- > extends SimpleFormField<Required> {
10
- constructor(
11
- public required: Required,
12
- public generateOptions: (ctx: Context) => Promise<DropdownOption[]>,
13
- public customValidation: (
14
- ctx: Context,
15
- value: unknown,
16
- instance: PickFromListField<Required>
17
- ) => Promise<FormFieldValidationResponse> = (ctx, value, instance) =>
18
- instance.valueInList(ctx, value)
19
- ) {
20
- super(required);
21
- }
22
-
23
- predicate = predicates.string;
24
-
25
- public isValueValid(
26
- ctx: Context,
27
- value: string
28
- ): Promise<FormFieldValidationResponse> {
29
- return this.customValidation(ctx, value, this);
30
- }
31
-
32
- async valueInList(
33
- ctx: Context,
34
- value: unknown
35
- ): Promise<FormFieldValidationResponse> {
36
- const options = await this.generateOptions(ctx);
37
- if (!is(value, predicates.string)) {
38
- return { valid: false, message: "not a string" };
39
- }
40
- if (this.required && !options.map((o) => o.value).includes(value)) {
41
- return {
42
- valid: false,
43
- message: `"${value}" is not one of the options`,
44
- };
45
- }
46
- return { valid: true, message: "" };
47
- }
48
-
49
- public getEmptyValue(): string {
50
- return "";
51
- }
52
- }
@@ -1,24 +0,0 @@
1
- import { FormField } from "./field";
2
-
3
- export class ProxyFormField<T> extends FormField<boolean, T> {
4
- constructor(
5
- required: boolean,
6
- public name: string,
7
- public empty_value: T,
8
- public parsed_value: T
9
- ) {
10
- super(required);
11
- }
12
-
13
- getEmptyValue() {
14
- return this.empty_value;
15
- }
16
-
17
- async parse() {
18
- return <const>{
19
- parsable: true,
20
- error: null,
21
- parsed_value: this.parsed_value,
22
- };
23
- }
24
- }
@@ -1,25 +0,0 @@
1
- import assert from "assert";
2
- import { Fields } from "../../index";
3
-
4
- describe("regexp field", () => {
5
- const ctx = {} as any;
6
-
7
- it("validation logic", async () => {
8
- const field = new Fields.RegExpField(true, /^4/, "error");
9
-
10
- assert.strictEqual((await field.isValueValid(ctx, "42")).valid, true);
11
- assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
12
- assert.strictEqual((await field.isValueValid(ctx, 42)).valid, false);
13
- });
14
-
15
- it("parse function", async () => {
16
- const field = new Fields.RegExpField(true, /^4/, "error");
17
- const string_response = await field.parse(ctx, "42");
18
- const number_response = await field.parse(ctx, 42);
19
-
20
- assert.strictEqual(string_response.parsable, true);
21
- assert.strictEqual(string_response.parsed_value, "42");
22
- assert.strictEqual(number_response.parsable, false);
23
- assert.strictEqual(number_response.error, "Please enter a string");
24
- });
25
- });