@sealcode/sealgen 0.18.10 → 0.19.2

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 (444) hide show
  1. package/.xunit +74 -69
  2. package/@types/add-crud.d.sync-conflict-20250918-184311-TFDLWFG.ts +1 -0
  3. package/@types/builders/colors-builder.d.sync-conflict-20250918-184323-TFDLWFG.ts +10 -0
  4. package/@types/builders/colors-builder.d.ts +1 -1
  5. package/@types/builders/fonts-builder.d.sync-conflict-20250918-184322-TFDLWFG.ts +7 -0
  6. package/@types/builders/fonts-builder.d.ts +1 -1
  7. package/@types/controllers/table-add-button.d.ts +6 -0
  8. package/@types/controllers/table-add-button.stimulus.d.ts +6 -0
  9. package/@types/crud-field-snippets.d.sync-conflict-20250918-184323-TFDLWFG.ts +1 -0
  10. package/@types/crud-field-snippets.d.ts +1 -3
  11. package/@types/forms/controls/array.d.sync-conflict-20250918-184306-TFDLWFG.ts +33 -0
  12. package/@types/forms/controls/array.d.ts +1 -3
  13. package/@types/forms/controls/array.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  14. package/@types/forms/controls/autocomplete.d.sync-conflict-20250918-222042-TFDLWFG.ts +22 -0
  15. package/@types/forms/controls/autocomplete.d.ts +1 -1
  16. package/@types/forms/controls/checkbox-group.d.sync-conflict-20250918-184319-TFDLWFG.ts +21 -0
  17. package/@types/forms/controls/checkbox-group.d.ts +3 -3
  18. package/@types/forms/controls/checkboxed-list-input.d.sync-conflict-20250918-184323-TFDLWFG.ts +21 -0
  19. package/@types/forms/controls/checkboxed-list-input.d.ts +3 -3
  20. package/@types/forms/controls/controls.d.ts +2 -2
  21. package/@types/forms/controls/derived-frame.d.sync-conflict-20250918-184314-TFDLWFG.ts +19 -0
  22. package/@types/forms/controls/derived-frame.d.ts +0 -2
  23. package/@types/forms/controls/dropdown.d.sync-conflict-20250918-222044-TFDLWFG.ts +30 -0
  24. package/@types/forms/controls/dropdown.d.ts +1 -1
  25. package/@types/forms/controls/file.d.sync-conflict-20250918-222045-TFDLWFG.ts +13 -0
  26. package/@types/forms/controls/file.d.ts +1 -2
  27. package/@types/forms/controls/form-control.d.sync-conflict-20250918-184322-TFDLWFG.ts +19 -0
  28. package/@types/forms/controls/form-control.d.sync-conflict-20250918-222046-TFDLWFG.ts +19 -0
  29. package/@types/forms/controls/form-control.d.ts +7 -4
  30. package/@types/forms/controls/image.d.ts +19 -0
  31. package/@types/forms/controls/image.test.d.ts +1 -0
  32. package/@types/forms/controls/multiple-files.d.sync-conflict-20250918-184318-TFDLWFG.ts +42 -0
  33. package/@types/forms/controls/multiple-files.d.ts +3 -1
  34. package/@types/forms/controls/multiple-images.d.ts +19 -0
  35. package/@types/forms/controls/number.d.sync-conflict-20250918-222046-TFDLWFG.ts +13 -0
  36. package/@types/forms/controls/number.d.ts +1 -1
  37. package/@types/forms/controls/photo.d.sync-conflict-20250918-184321-TFDLWFG.ts +19 -0
  38. package/@types/forms/controls/photo.d.ts +3 -5
  39. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-184310-TFDLWFG.ts +33 -0
  40. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-222042-TFDLWFG.ts +33 -0
  41. package/@types/forms/controls/simple-input.d.ts +5 -4
  42. package/@types/forms/controls/simple-input.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  43. package/@types/forms/controls/single-reference.d.ts +3 -2
  44. package/@types/forms/controls/table.d.sync-conflict-20250918-184302-TFDLWFG.ts +39 -0
  45. package/@types/forms/controls/table.d.ts +8 -3
  46. package/@types/forms/controls/table.sync-conflict-20250918-222042-TFDLWFG.d.ts +39 -0
  47. package/@types/forms/controls/textarea.d.sync-conflict-20250918-222045-TFDLWFG.ts +25 -0
  48. package/@types/forms/controls/textarea.d.ts +3 -3
  49. package/@types/forms/fields/boolean.d.sync-conflict-20250918-184325-TFDLWFG.ts +22 -0
  50. package/@types/forms/fields/boolean.d.ts +6 -1
  51. package/@types/forms/fields/boolean.sync-conflict-20250918-222042-TFDLWFG.d.ts +22 -0
  52. package/@types/forms/fields/checkboxed-list.d.sync-conflict-20250918-184325-TFDLWFG.ts +23 -0
  53. package/@types/forms/fields/checkboxed-list.d.ts +3 -1
  54. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-184319-TFDLWFG.ts +22 -0
  55. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-222047-TFDLWFG.ts +22 -0
  56. package/@types/forms/fields/collection-field.d.ts +8 -1
  57. package/@types/forms/fields/color.d.ts +4 -0
  58. package/@types/forms/fields/coordinates.d.sync-conflict-20250918-222044-TFDLWFG.ts +14 -0
  59. package/@types/forms/fields/coordinates.d.ts +14 -0
  60. package/@types/forms/fields/date.d.ts +13 -0
  61. package/@types/forms/fields/datetime.d.sync-conflict-20250918-222050-TFDLWFG.ts +4 -0
  62. package/@types/forms/fields/datetime.d.ts +14 -0
  63. package/@types/forms/fields/deep-reverse-single-reference-list.d.ts +20 -0
  64. package/@types/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
  65. package/@types/forms/fields/email.d.sync-conflict-20250918-184303-TFDLWFG.ts +8 -0
  66. package/@types/forms/fields/email.d.ts +3 -0
  67. package/@types/forms/fields/enum-multiple-sealious.d.ts +16 -0
  68. package/@types/forms/fields/enum-multiple-sealious.sync-conflict-20250918-222047-TFDLWFG.d.ts +16 -0
  69. package/@types/forms/fields/field.d.sync-conflict-20250918-184306-TFDLWFG.ts +70 -0
  70. package/@types/forms/fields/field.d.ts +37 -5
  71. package/@types/forms/fields/fields.d.sync-conflict-20250918-184314-TFDLWFG.ts +29 -0
  72. package/@types/forms/fields/fields.d.ts +23 -8
  73. package/@types/forms/fields/file.d.sync-conflict-20250918-184310-TFDLWFG.ts +23 -0
  74. package/@types/forms/fields/file.d.sync-conflict-20250918-222046-TFDLWFG.ts +23 -0
  75. package/@types/forms/fields/file.d.ts +11 -5
  76. package/@types/forms/fields/file.sync-conflict-20250918-222049-TFDLWFG.d.ts +23 -0
  77. package/@types/forms/fields/float.d.ts +4 -0
  78. package/@types/forms/fields/get-field-for-sealious.d.sync-conflict-20250918-222046-TFDLWFG.ts +29 -0
  79. package/@types/forms/fields/get-field-for-sealious.d.ts +31 -0
  80. package/@types/forms/fields/get-field-for-sealious.sync-conflict-20250918-222042-TFDLWFG.d.ts +29 -0
  81. package/@types/forms/fields/html.d.ts +6 -0
  82. package/@types/forms/fields/image.d.sync-conflict-20250918-222042-TFDLWFG.ts +5 -0
  83. package/@types/forms/fields/image.d.ts +5 -0
  84. package/@types/forms/fields/int.d.ts +6 -0
  85. package/@types/forms/fields/json.d.ts +13 -0
  86. package/@types/forms/fields/markdown.d.ts +6 -0
  87. package/@types/forms/fields/multiple-files.d.sync-conflict-20250918-184304-TFDLWFG.ts +16 -0
  88. package/@types/forms/fields/multiple-files.d.ts +3 -1
  89. package/@types/forms/fields/number.d.sync-conflict-20250918-184317-TFDLWFG.ts +25 -0
  90. package/@types/forms/fields/number.d.sync-conflict-20250918-222047-TFDLWFG.ts +25 -0
  91. package/@types/forms/fields/number.d.ts +3 -1
  92. package/@types/forms/fields/password.d.ts +5 -0
  93. package/@types/forms/fields/pick-from-list-sealious.d.ts +11 -0
  94. package/@types/forms/fields/pick-from-list.d.sync-conflict-20250918-184322-TFDLWFG.ts +15 -0
  95. package/@types/forms/fields/pick-from-list.d.ts +4 -3
  96. package/@types/forms/fields/proxy-field.d.sync-conflict-20250918-184307-TFDLWFG.ts +15 -0
  97. package/@types/forms/fields/proxy-field.d.ts +3 -1
  98. package/@types/forms/fields/regexp.d.sync-conflict-20250918-184305-TFDLWFG.ts +21 -0
  99. package/@types/forms/fields/regexp.d.sync-conflict-20250918-222045-TFDLWFG.ts +21 -0
  100. package/@types/forms/fields/regexp.d.ts +6 -1
  101. package/@types/forms/fields/regexp.sync-conflict-20250918-222047-TFDLWFG.d.ts +21 -0
  102. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-184309-TFDLWFG.ts +29 -0
  103. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-222044-TFDLWFG.ts +29 -0
  104. package/@types/forms/fields/simple-form-field.d.ts +23 -3
  105. package/@types/forms/fields/simple-form-field.sync-conflict-20250918-222049-TFDLWFG.d.ts +29 -0
  106. package/@types/forms/fields/single-reference.d.ts +19 -0
  107. package/@types/forms/fields/single-reference.sync-conflict-20250918-222043-TFDLWFG.d.ts +10 -0
  108. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-184302-TFDLWFG.ts +27 -0
  109. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-222049-TFDLWFG.ts +27 -0
  110. package/@types/forms/fields/structured-array.d.ts +19 -10
  111. package/@types/forms/fields/structured-array.sync-conflict-20250918-222047-TFDLWFG.d.ts +27 -0
  112. package/@types/forms/fields/table.d.sync-conflict-20250918-184303-TFDLWFG.ts +16 -0
  113. package/@types/forms/fields/table.d.ts +3 -0
  114. package/@types/forms/fields/text.d.ts +6 -0
  115. package/@types/forms/fields/url.d.ts +6 -0
  116. package/@types/forms/form-types.d.sync-conflict-20250918-222045-TFDLWFG.ts +26 -0
  117. package/@types/forms/form-types.d.ts +2 -0
  118. package/@types/forms/form.d.sync-conflict-20250918-184315-TFDLWFG.ts +32 -0
  119. package/@types/forms/form.d.sync-conflict-20250918-222049-TFDLWFG.ts +32 -0
  120. package/@types/forms/form.d.ts +10 -8
  121. package/@types/forms/form.sync-conflict-20250918-222049-TFDLWFG.d.ts +33 -0
  122. package/@types/forms/form.test.d.sync-conflict-20250918-184318-TFDLWFG.ts +6 -0
  123. package/@types/forms/form.test.d.sync-conflict-20250918-222047-TFDLWFG.ts +6 -0
  124. package/@types/forms/form.test.d.ts +2 -2
  125. package/@types/forms/multiform.d.sync-conflict-20250918-184308-TFDLWFG.ts +23 -0
  126. package/@types/forms/multiform.d.ts +1 -2
  127. package/@types/forms/multiform.sync-conflict-20250918-222044-TFDLWFG.d.ts +23 -0
  128. package/@types/index.d.sync-conflict-20250918-184316-TFDLWFG.ts +46 -0
  129. package/@types/index.d.ts +2 -2
  130. package/@types/mount.d.sync-conflict-20250918-184320-TFDLWFG.ts +6 -0
  131. package/@types/mount.d.ts +0 -1
  132. package/@types/page/list.d.sync-conflict-20250918-184318-TFDLWFG.ts +48 -0
  133. package/@types/page/list.d.sync-conflict-20250918-222046-TFDLWFG.ts +48 -0
  134. package/@types/page/list.d.ts +2 -2
  135. package/@types/page/list.sync-conflict-20250918-222048-TFDLWFG.d.ts +48 -0
  136. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-184321-TFDLWFG.ts +42 -0
  137. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-222046-TFDLWFG.ts +42 -0
  138. package/@types/page/mountable-with-fields.d.ts +3 -3
  139. package/@types/page/mountable-with-fields.sync-conflict-20250918-222044-TFDLWFG.d.ts +42 -0
  140. package/@types/page/mountable.d.sync-conflict-20250918-184306-TFDLWFG.ts +10 -0
  141. package/@types/page/mountable.d.ts +0 -1
  142. package/@types/page/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
  143. package/@types/page/page.d.ts +0 -1
  144. package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
  145. package/@types/page/props-parser.d.ts +0 -1
  146. package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
  147. package/@types/page/stateful-page.d.ts +0 -1
  148. package/@types/register-external.d.ts +2 -2
  149. package/@types/templates/form.d.ts +1 -3
  150. package/@types/templates/jdd-component.d.ts +1 -1
  151. package/@types/templates/page.d.ts +1 -1
  152. package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
  153. package/@types/templates/shared/shared-crud-form-fields.d.ts +1 -68
  154. package/@types/templates/templates.d.ts +1 -21
  155. package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
  156. package/@types/test_utils/test-on-real-app.d.ts +0 -1
  157. package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
  158. package/@types/utils/extract-fields-from-collection.d.ts +5 -1
  159. package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
  160. package/@types/utils/wrap-attributes.d.ts +3 -0
  161. package/README.md +5 -0
  162. package/assets/file-icon.svg +5 -0
  163. package/eslint.config.mjs +56 -0
  164. package/lib/add-crud.js +77 -89
  165. package/lib/add-jdd-component.js +3 -3
  166. package/lib/add-list-route.test.js +1 -1
  167. package/lib/add-route.js +2 -9
  168. package/lib/build.js +6 -4
  169. package/lib/builders/backend-ts-builder.js +0 -1
  170. package/lib/builders/colors-builder.js +11 -8
  171. package/lib/builders/fonts-builder.js +0 -1
  172. package/lib/builders/frontend-ts-builder.js +0 -1
  173. package/lib/cli.js +4 -7
  174. package/lib/components/tabs.js +36 -36
  175. package/lib/controllers/table-add-button.stimulus.js +35 -0
  176. package/lib/esbuild-plugins/rewrite-asset-imports.js +7 -10
  177. package/lib/forms/controls/array.js +25 -22
  178. package/lib/forms/controls/big-radio-group.js +2 -2
  179. package/lib/forms/controls/checkbox-group.js +7 -7
  180. package/lib/forms/controls/checkboxed-list-input.js +7 -1
  181. package/lib/forms/controls/checkboxed-list-input.test.js +6 -6
  182. package/lib/forms/controls/controls.js +2 -2
  183. package/lib/forms/controls/derived-frame.js +8 -4
  184. package/lib/forms/controls/derived.js +1 -1
  185. package/lib/forms/controls/dropdown.js +5 -3
  186. package/lib/forms/controls/editable-collection-subset.js +2 -2
  187. package/lib/forms/controls/file.js +26 -2
  188. package/lib/forms/controls/file.test.js +2 -2
  189. package/lib/forms/controls/form-control.js +1 -1
  190. package/lib/forms/controls/hidden-input.js +4 -1
  191. package/lib/forms/controls/{photo.js → image.js} +6 -7
  192. package/lib/forms/controls/{photo.test.js → image.test.js} +8 -23
  193. package/lib/forms/controls/multiple-files.js +10 -1
  194. package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
  195. package/lib/forms/controls/simple-input.js +13 -12
  196. package/lib/forms/controls/single-reference.js +4 -0
  197. package/lib/forms/controls/single-reference.test.js +1 -1
  198. package/lib/forms/controls/table.js +62 -25
  199. package/lib/forms/controls/textarea.js +5 -3
  200. package/lib/forms/controls/tickable.js +13 -5
  201. package/lib/forms/fields/boolean.js +14 -0
  202. package/lib/forms/fields/checkboxed-list.js +4 -0
  203. package/lib/forms/fields/collection-field.js +9 -0
  204. package/lib/forms/fields/color.js +10 -0
  205. package/lib/forms/fields/coordinates.js +49 -0
  206. package/lib/forms/fields/date.js +34 -0
  207. package/lib/forms/fields/datetime.js +46 -0
  208. package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
  209. package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
  210. package/lib/forms/fields/email.js +7 -0
  211. package/lib/forms/fields/enum-multiple-sealious.js +32 -0
  212. package/lib/forms/fields/field.js +32 -4
  213. package/lib/forms/fields/field.test.js +8 -8
  214. package/lib/forms/fields/fields.js +23 -8
  215. package/lib/forms/fields/file.js +33 -9
  216. package/lib/forms/fields/file.test.js +5 -17
  217. package/lib/forms/fields/float.js +10 -0
  218. package/lib/forms/fields/get-field-for-sealious.js +213 -0
  219. package/lib/forms/fields/html.js +14 -0
  220. package/lib/forms/fields/image.js +13 -0
  221. package/lib/forms/fields/int.js +23 -0
  222. package/lib/forms/fields/json.js +31 -0
  223. package/lib/forms/fields/markdown.js +14 -0
  224. package/lib/forms/fields/multiple-files.js +4 -0
  225. package/lib/forms/fields/number.js +6 -0
  226. package/lib/forms/fields/password.js +13 -0
  227. package/lib/forms/fields/pick-from-list-sealious.js +17 -0
  228. package/lib/forms/fields/pick-from-list.js +6 -2
  229. package/lib/forms/fields/proxy-field.js +3 -0
  230. package/lib/forms/fields/regexp.js +14 -0
  231. package/lib/forms/fields/simple-form-field.js +61 -2
  232. package/lib/forms/fields/single-reference.js +44 -0
  233. package/lib/forms/fields/structured-array.js +61 -12
  234. package/lib/forms/fields/table.js +29 -2
  235. package/lib/forms/fields/text.js +17 -0
  236. package/lib/forms/fields/url.js +17 -0
  237. package/lib/forms/form.js +30 -14
  238. package/lib/forms/form.test.js +5 -7
  239. package/lib/forms/multiform.js +10 -9
  240. package/lib/forms/multiform.test.js +5 -5
  241. package/lib/generate-collections.js +2 -3
  242. package/lib/generate-components.js +2 -3
  243. package/lib/generate-routes.js +3 -5
  244. package/lib/generate-routes.test.js +7 -16
  245. package/lib/generate-stimulus.js +4 -4
  246. package/lib/get-fonts.js +29 -27
  247. package/lib/index.js +1 -0
  248. package/lib/make-env.js +1 -1
  249. package/lib/make-hidden-inputs.js +4 -4
  250. package/lib/mount.js +11 -1
  251. package/lib/notifier.js +3 -4
  252. package/lib/page/list.js +20 -15
  253. package/lib/page/mountable-with-fields.js +14 -6
  254. package/lib/page/mountable-with-fields.test.js +1 -1
  255. package/lib/page/mountable.js +0 -1
  256. package/lib/page/page.js +0 -1
  257. package/lib/register-external.js +4 -4
  258. package/lib/templates/form.js +9 -10
  259. package/lib/templates/jdd-component.js +1 -1
  260. package/lib/templates/jdd-editor.js +1 -1
  261. package/lib/templates/multiform.js +4 -4
  262. package/lib/templates/page.js +1 -3
  263. package/lib/templates/shared/collection-create-form.js +31 -44
  264. package/lib/templates/shared/collection-edit-form.js +43 -81
  265. package/lib/templates/shared/collection-list.js +13 -21
  266. package/lib/templates/shared/shared-crud-form-fields.js +28 -98
  267. package/lib/test_utils/exec_async.js +3 -3
  268. package/lib/test_utils/test-on-real-app.js +12 -14
  269. package/lib/utils/extract-fields-from-collection.js +60 -20
  270. package/lib/utils/make-slug.js +1 -1
  271. package/lib/utils/wrap-attributes.js +20 -0
  272. package/lib/utils/write-file.js +1 -1
  273. package/package.json +11 -9
  274. package/src/add-collection.ts +1 -3
  275. package/src/add-crud.ts +84 -100
  276. package/src/add-jdd-component.ts +4 -5
  277. package/src/add-list-route.test.ts +1 -1
  278. package/src/add-route.ts +3 -13
  279. package/src/build.ts +6 -4
  280. package/src/builders/backend-ts-builder.ts +0 -1
  281. package/src/builders/builder.ts +4 -1
  282. package/src/builders/colors-builder.ts +11 -9
  283. package/src/builders/css-builder.ts +4 -1
  284. package/src/builders/fonts-builder.ts +0 -1
  285. package/src/builders/frontend-ts-builder.ts +0 -1
  286. package/src/cli.ts +5 -7
  287. package/src/components/tabs.ts +38 -37
  288. package/src/components/toggle-modal.ts +1 -1
  289. package/src/controllers/table-add-button.stimulus.ts +35 -0
  290. package/src/esbuild-plugins/rewrite-asset-imports.ts +7 -10
  291. package/src/forms/controls/array.ts +35 -36
  292. package/src/forms/controls/autocomplete.ts +2 -2
  293. package/src/forms/controls/big-radio-group.ts +4 -4
  294. package/src/forms/controls/checkbox-group.ts +10 -10
  295. package/src/forms/controls/checkboxed-list-input.test.ts +6 -6
  296. package/src/forms/controls/checkboxed-list-input.ts +16 -8
  297. package/src/forms/controls/controls.ts +2 -2
  298. package/src/forms/controls/derived-frame.ts +16 -11
  299. package/src/forms/controls/derived.ts +7 -6
  300. package/src/forms/controls/dropdown.ts +13 -13
  301. package/src/forms/controls/editable-collection-subset.ts +4 -3
  302. package/src/forms/controls/field-group.ts +1 -1
  303. package/src/forms/controls/file.test.ts +4 -2
  304. package/src/forms/controls/file.ts +30 -7
  305. package/src/forms/controls/form-control.ts +8 -3
  306. package/src/forms/controls/hidden-input.ts +5 -1
  307. package/src/forms/controls/html.ts +1 -0
  308. package/src/forms/controls/{photo.test.ts → image.test.ts} +7 -24
  309. package/src/forms/controls/{photo.ts → image.ts} +4 -6
  310. package/src/forms/controls/multiple-files.ts +23 -8
  311. package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +2 -2
  312. package/src/forms/controls/number.ts +1 -1
  313. package/src/forms/controls/simple-input.ts +21 -33
  314. package/src/forms/controls/single-reference.test.ts +1 -1
  315. package/src/forms/controls/single-reference.ts +11 -3
  316. package/src/forms/controls/table.ts +87 -33
  317. package/src/forms/controls/textarea.ts +7 -5
  318. package/src/forms/controls/tickable.ts +13 -7
  319. package/src/forms/fields/boolean.ts +27 -2
  320. package/src/forms/fields/checkboxed-list.ts +11 -2
  321. package/src/forms/fields/collection-field.ts +21 -3
  322. package/src/forms/fields/color.ts +9 -0
  323. package/src/forms/fields/coordinates.ts +66 -0
  324. package/src/forms/fields/date.ts +50 -0
  325. package/src/forms/fields/datetime.ts +66 -0
  326. package/src/forms/fields/deep-reverse-single-reference-list.ts +130 -0
  327. package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
  328. package/src/forms/fields/email.ts +10 -1
  329. package/src/forms/fields/enum-multiple-sealious.ts +48 -0
  330. package/src/forms/fields/existing-sealious-value.ts +1 -1
  331. package/src/forms/fields/field.test.ts +8 -8
  332. package/src/forms/fields/field.ts +98 -11
  333. package/src/forms/fields/fields.ts +23 -8
  334. package/src/forms/fields/file.test.ts +5 -17
  335. package/src/forms/fields/file.ts +44 -16
  336. package/src/forms/fields/float.ts +9 -0
  337. package/src/forms/fields/get-field-for-sealious.ts +337 -0
  338. package/src/forms/fields/html.ts +15 -0
  339. package/src/forms/fields/image.ts +12 -0
  340. package/src/forms/fields/int.ts +25 -0
  341. package/src/forms/fields/json.ts +48 -0
  342. package/src/forms/fields/markdown.ts +15 -0
  343. package/src/forms/fields/multiple-files.ts +10 -1
  344. package/src/forms/fields/number.ts +10 -3
  345. package/src/forms/fields/password.ts +13 -0
  346. package/src/forms/fields/pick-from-list-sealious.ts +22 -0
  347. package/src/forms/fields/pick-from-list.ts +8 -4
  348. package/src/forms/fields/proxy-field.ts +7 -1
  349. package/src/forms/fields/regexp.ts +27 -1
  350. package/src/forms/fields/simple-form-field.ts +103 -7
  351. package/src/forms/fields/single-reference.ts +62 -0
  352. package/src/forms/fields/structured-array.ts +111 -18
  353. package/src/forms/fields/table.ts +39 -16
  354. package/src/forms/fields/text.ts +18 -0
  355. package/src/forms/fields/url.ts +20 -0
  356. package/src/forms/form-types.ts +5 -4
  357. package/src/forms/form.test.ts +5 -7
  358. package/src/forms/form.ts +42 -23
  359. package/src/forms/forms.css +0 -85
  360. package/src/forms/multiform.test.ts +9 -9
  361. package/src/forms/multiform.ts +12 -10
  362. package/src/generate-collections.ts +2 -3
  363. package/src/generate-components.ts +2 -3
  364. package/src/generate-routes.test.ts +7 -16
  365. package/src/generate-routes.ts +6 -10
  366. package/src/generate-stimulus.ts +4 -5
  367. package/src/get-fonts.ts +32 -30
  368. package/src/index.ts +2 -1
  369. package/src/make-env.ts +1 -1
  370. package/src/make-hidden-inputs.ts +8 -7
  371. package/src/mount.ts +16 -7
  372. package/src/notifier.ts +4 -7
  373. package/src/page/default-list-filters.ts +1 -0
  374. package/src/page/list.ts +33 -28
  375. package/src/page/mountable-with-fields.test.ts +1 -1
  376. package/src/page/mountable-with-fields.ts +21 -12
  377. package/src/page/mountable.ts +0 -1
  378. package/src/page/page.ts +2 -3
  379. package/src/page/props-parser.ts +1 -1
  380. package/src/page/sealious-list.ts +1 -1
  381. package/src/page/stateful-page.ts +6 -10
  382. package/src/register-external.ts +5 -5
  383. package/src/templates/form.ts +9 -11
  384. package/src/templates/jdd-component.ts +1 -1
  385. package/src/templates/jdd-editor.ts +2 -4
  386. package/src/templates/list.ts +0 -1
  387. package/src/templates/multiform.ts +4 -4
  388. package/src/templates/page.ts +1 -6
  389. package/src/templates/shared/collection-create-form.ts +34 -71
  390. package/src/templates/shared/collection-edit-form.ts +46 -108
  391. package/src/templates/shared/collection-list.ts +13 -21
  392. package/src/templates/shared/item-delete.ts +0 -1
  393. package/src/templates/shared/shared-crud-form-fields.ts +38 -177
  394. package/src/templates/templates.ts +5 -1
  395. package/src/test_utils/exec_async.ts +3 -4
  396. package/src/test_utils/test-on-real-app.ts +13 -14
  397. package/src/utils/browser-creator.js +0 -1
  398. package/src/utils/exec.ts +0 -1
  399. package/src/utils/extract-fields-from-collection.ts +76 -25
  400. package/src/utils/input-wrapper.ts +1 -1
  401. package/src/utils/make-slug.ts +1 -1
  402. package/src/utils/wrap-attributes.ts +17 -0
  403. package/src/utils/write-file.ts +1 -1
  404. package/.eslintrc.cjs +0 -39
  405. package/lib/add-verbose-crud.js +0 -119
  406. package/lib/crud-field-snippets.js +0 -52
  407. package/lib/find-css-includes.js +0 -3
  408. package/lib/forms/controls/reverse-single-reference.js +0 -1
  409. package/lib/forms/fields/enum-multiple.js +0 -47
  410. package/lib/forms/fields/enum-multiple.test.js +0 -27
  411. package/lib/forms/fields/enum.js +0 -41
  412. package/lib/forms/fields/enum.test.js +0 -21
  413. package/lib/forms/fields/reverse-single-reference.js +0 -17
  414. package/lib/templates/shared/handlers/boolean.js +0 -14
  415. package/lib/templates/shared/handlers/date.js +0 -8
  416. package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
  417. package/lib/templates/shared/handlers/default.js +0 -49
  418. package/lib/templates/shared/handlers/enum.js +0 -19
  419. package/lib/templates/shared/handlers/file.js +0 -23
  420. package/lib/templates/shared/handlers/image.js +0 -32
  421. package/lib/templates/shared/handlers/int.js +0 -11
  422. package/lib/templates/shared/handlers/jdd.js +0 -10
  423. package/lib/templates/shared/handlers/single-reference.js +0 -12
  424. package/lib/templates/shared/handlers/structured-array.js +0 -33
  425. package/src/add-verbose-crud.ts +0 -138
  426. package/src/crud-field-snippets.ts +0 -57
  427. package/src/find-css-includes.ts +0 -3
  428. package/src/forms/controls/reverse-single-reference.ts +0 -50
  429. package/src/forms/fields/enum-multiple.test.ts +0 -31
  430. package/src/forms/fields/enum-multiple.ts +0 -62
  431. package/src/forms/fields/enum.test.ts +0 -25
  432. package/src/forms/fields/enum.ts +0 -56
  433. package/src/forms/fields/reverse-single-reference.ts +0 -20
  434. package/src/templates/shared/handlers/boolean.ts +0 -18
  435. package/src/templates/shared/handlers/date.ts +0 -12
  436. package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
  437. package/src/templates/shared/handlers/default.ts +0 -64
  438. package/src/templates/shared/handlers/enum.ts +0 -23
  439. package/src/templates/shared/handlers/file.ts +0 -27
  440. package/src/templates/shared/handlers/image.ts +0 -45
  441. package/src/templates/shared/handlers/int.ts +0 -15
  442. package/src/templates/shared/handlers/jdd.ts +0 -14
  443. package/src/templates/shared/handlers/single-reference.ts +0 -16
  444. package/src/templates/shared/handlers/structured-array.ts +0 -42
@@ -1,12 +1,11 @@
1
1
  import Router from "@koa/router";
2
2
  import { Context } from "koa";
3
- import { FileManager, FilePointer } from "@sealcode/file-manager";
3
+ import { FilePointer } from "@sealcode/file-manager";
4
4
  import getPort from "get-port";
5
5
  import Koa from "koa";
6
6
  import fs from "node:fs/promises";
7
- import { KoaResponsiveImageRouter } from "koa-responsive-image-router";
8
7
  import { mount } from "../../mount.js";
9
- import { Photo } from "../controls/photo.js";
8
+ import { Image } from "../controls/image.js";
10
9
  import { Form } from "../form.js";
11
10
  import { File as FileField } from "./file.js";
12
11
  import { getBrowser } from "../../utils/browser-creator.js";
@@ -28,12 +27,12 @@ describe("file field", () => {
28
27
 
29
28
  it("should handle as imple upload scenario", async () => {
30
29
  const port = await getPort();
31
- console.log(`Using port http://localhost:${port} form file field test`);
30
+ console.info(`Using port http://localhost:${port} form file field test`);
32
31
  const app = new Koa();
33
32
  const router = new Router();
34
33
 
35
34
  const fields = {
36
- file: new FileField(true, new FileManager("/tmp", "/uploaded_files")),
35
+ file: new FileField(true),
37
36
  };
38
37
 
39
38
  let received_values: any;
@@ -43,18 +42,7 @@ describe("file field", () => {
43
42
  "/",
44
43
  new (class extends Form<typeof fields, unknown> {
45
44
  fields = fields;
46
- controls = [
47
- new Photo(
48
- fields.file,
49
- new KoaResponsiveImageRouter({
50
- staticPath: "/tmp",
51
- thumbnailSize: 10,
52
- cacheManagerResolutionThreshold: 10,
53
- imageStoragePath: "/tmp",
54
- smartCropStoragePath: "/tmp",
55
- })
56
- ),
57
- ];
45
+ controls = [new Image(fields.file)];
58
46
 
59
47
  async onSubmit(ctx: Context) {
60
48
  received_values = await this.getParsedValues(ctx);
@@ -1,12 +1,10 @@
1
1
  import { hasFieldOfType, is, predicates } from "@sealcode/ts-predicates";
2
2
  import { Context } from "koa";
3
- import {
4
- FileManager,
5
- FilePointer,
6
- PathFilePointer,
7
- } from "@sealcode/file-manager";
3
+ import { FilePointer, PathFilePointer } from "@sealcode/file-manager";
8
4
  import { FormDataValue } from "../form-types.js";
9
5
  import { FieldParseResult, FormField } from "./field.js";
6
+ import { File as FileControl } from "../controls/file.js";
7
+ import { FormControl, FormControlContext } from "../controls/form-control.js";
10
8
 
11
9
  export type FileContainer = {
12
10
  old: FilePointer | null;
@@ -15,22 +13,20 @@ export type FileContainer = {
15
13
 
16
14
  export class File<Required extends boolean> extends FormField<
17
15
  Required,
18
- FileContainer
16
+ FileContainer,
17
+ FormControl
19
18
  > {
20
- constructor(
21
- public readonly required: Required,
22
- public file_manager: FileManager
23
- ) {
19
+ constructor(public readonly required: Required) {
24
20
  super(required);
25
21
  }
26
22
 
27
23
  async parse(
28
- _ctx: Context,
24
+ ctx: Context,
29
25
  raw_value: FormDataValue
30
26
  ): Promise<FieldParseResult<FileContainer>> {
31
27
  let result;
32
28
  if (is(raw_value, predicates.string)) {
33
- const file = await this.file_manager.fromToken(raw_value);
29
+ const file = await ctx.$app.fileManager.fromToken(raw_value);
34
30
  result = {
35
31
  parsed_value: { old: file, new: null },
36
32
  error: null,
@@ -48,9 +44,9 @@ export class File<Required extends boolean> extends FormField<
48
44
  "old",
49
45
  predicates.instanceOf(PathFilePointer)
50
46
  )
51
- ? await this.file_manager.toPointer(
47
+ ? await ctx.$app.fileManager.toPointer(
52
48
  raw_value.old as string | FilePointer
53
- )
49
+ )
54
50
  : null;
55
51
  const new_file = hasFieldOfType(
56
52
  raw_value,
@@ -70,16 +66,48 @@ export class File<Required extends boolean> extends FormField<
70
66
  parsed_value: { old: old_file, new: new_file },
71
67
  };
72
68
  }
73
-
74
69
  return result;
75
70
  }
76
71
 
77
72
  async getDatabaseValue(ctx: Context, data: Record<string, FormDataValue>) {
78
- const { parsed } = await this.getValue(ctx, data);
73
+ const { parsed } = await this.getParsedValue(ctx, data);
79
74
  return parsed?.new || undefined;
80
75
  }
81
76
 
82
77
  getEmptyValue() {
83
78
  return { old: null, new: null };
84
79
  }
80
+
81
+ getControl(): FileControl {
82
+ return new FileControl(this, { label: this.name, autocomplete: false });
83
+ }
84
+
85
+ async getSealiousCreateValue(
86
+ fctx: FormControlContext
87
+ ): Promise<FilePointer | undefined> {
88
+ const { parsed: value } = await this.getParsedValue(
89
+ fctx.ctx,
90
+ fctx.data.raw_values
91
+ );
92
+ const pointer = value?.new || value?.old || undefined;
93
+ if (this.required && !pointer) {
94
+ throw new Error("File is required, but no value is provided");
95
+ }
96
+ return pointer;
97
+ }
98
+
99
+ async sealiousValueToForm(
100
+ ctx: Context,
101
+ sealiousValue: FilePointer | string | null
102
+ ): Promise<{ old: FilePointer | undefined } | Record<string, never>> {
103
+ if (!sealiousValue) {
104
+ return {};
105
+ }
106
+ if (typeof sealiousValue == "string") {
107
+ sealiousValue = await ctx.$app.fileManager.fromToken(sealiousValue);
108
+ }
109
+ return {
110
+ old: sealiousValue, // FilePointer
111
+ };
112
+ }
85
113
  }
@@ -0,0 +1,9 @@
1
+ import { NumberBasedSimpleField } from "./simple-form-field.js";
2
+
3
+ export class Float<
4
+ Required extends boolean,
5
+ > extends NumberBasedSimpleField<Required> {
6
+ constructor(required: Required) {
7
+ super(required, "number");
8
+ }
9
+ }
@@ -0,0 +1,337 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
4
+ import {
5
+ Collection,
6
+ Field as SealiousField,
7
+ FieldTypes as SealiousFieldTypes,
8
+ RequiredField as SealiousRequiredField,
9
+ } from "sealious";
10
+ import { Boolean as BooleanField } from "./boolean.js";
11
+ import { SimpleFormField, TextBasedSimpleField } from "./simple-form-field.js";
12
+ import { File } from "./file.js";
13
+ import { CollectionField } from "./collection-field.js";
14
+ import { StructuredArray as StructuredArrayField } from "./structured-array.js";
15
+ import { Color } from "./color.js";
16
+ import { DateField } from "./date.js";
17
+ import { DateTime } from "./datetime.js";
18
+ import { EmailField } from "./email.js";
19
+ import { Float } from "./float.js";
20
+ import { HTML } from "./html.js";
21
+ import { Int } from "./int.js";
22
+ import { JSONField } from "./json.js";
23
+ import { Password } from "./password.js";
24
+ import { Text } from "./text.js";
25
+ import { Markdown } from "./markdown.js";
26
+ import { DeepReverseSingleReferenceTable } from "./deep-reverse-single-reference-table.js";
27
+ import { DeepReverseSingleReferenceList } from "./deep-reverse-single-reference-list.js";
28
+ import { Coordinates } from "./coordinates.js";
29
+ import { SimpleInput } from "../controls/simple-input.js";
30
+
31
+ import { FormField } from "./field.js";
32
+ import { PickFromListSealious } from "./pick-from-list-sealious.js";
33
+ import { SingleReference } from "./single-reference.js";
34
+ import extract_fields_from_collection, {
35
+ ExtractedFieldInfo,
36
+ } from "../../utils/extract-fields-from-collection.js";
37
+ import { EnumMultipleSealious } from "./enum-multiple-sealious.js";
38
+ import { URLField } from "./url.js";
39
+ import { Image } from "./image.js";
40
+
41
+ export type SealiousToFormField<T> = T extends SealiousFieldTypes.Boolean
42
+ ? BooleanField<false>
43
+ : T extends SealiousFieldTypes.Color
44
+ ? Color<false>
45
+ : T extends SealiousFieldTypes.ControlAccess<infer R>
46
+ ? SealiousToFormField<R>
47
+ : T extends SealiousFieldTypes.Date
48
+ ? DateField<false>
49
+ : T extends SealiousFieldTypes.DateTime
50
+ ? DateTime<false>
51
+ : T extends SealiousFieldTypes.DeepReverseSingleReference
52
+ ?
53
+ | DeepReverseSingleReferenceList
54
+ | DeepReverseSingleReferenceTable
55
+ : T extends SealiousFieldTypes.DisallowUpdate<
56
+ any,
57
+ any,
58
+ any,
59
+ infer R
60
+ >
61
+ ? SealiousToFormField<R>
62
+ : T extends SealiousFieldTypes.Email
63
+ ? EmailField<false>
64
+ : T extends SealiousFieldTypes.Enum<any>
65
+ ? PickFromListSealious<false>
66
+ : T extends SealiousFieldTypes.EnumMultiple<
67
+ infer R
68
+ >
69
+ ? R extends string[]
70
+ ? EnumMultipleSealious<R>
71
+ : TextBasedSimpleField<false>
72
+ : T extends SealiousFieldTypes.File
73
+ ? File<false>
74
+ : T extends SealiousFieldTypes.Float
75
+ ? Float<false>
76
+ : T extends SealiousFieldTypes.HTML
77
+ ? HTML<false>
78
+ : T extends SealiousFieldTypes.Image
79
+ ? Image<false>
80
+ : T extends SealiousFieldTypes.Int
81
+ ? Int<false>
82
+ : T extends SealiousFieldTypes.JsonObject
83
+ ? JSONField<false>
84
+ : T extends SealiousFieldTypes.JDD
85
+ ? TextBasedSimpleField<
86
+ false,
87
+ SimpleInput
88
+ >
89
+ : T extends SealiousFieldTypes.Password
90
+ ? Password<false>
91
+ : T extends SealiousFieldTypes.ReverseSingleReference
92
+ ? TextBasedSimpleField<
93
+ false,
94
+ SimpleInput
95
+ >
96
+ : T extends SealiousFieldTypes.SecretToken
97
+ ? TextBasedSimpleField<
98
+ false,
99
+ SimpleInput
100
+ >
101
+ : T extends SealiousFieldTypes.SettableBy<
102
+ infer R
103
+ >
104
+ ? SealiousToFormField<R>
105
+ : T extends SealiousFieldTypes.SingleReference
106
+ ? SingleReference<
107
+ Collection,
108
+ boolean,
109
+ T
110
+ >
111
+ : T extends SealiousFieldTypes.Text
112
+ ? Text<false>
113
+ : T extends SealiousFieldTypes.Username
114
+ ? CollectionField<
115
+ SealiousFieldTypes.Username,
116
+ false
117
+ >
118
+ : T extends SealiousFieldTypes.ValueExistingInCollection
119
+ ? SimpleFormField<false>
120
+ : T extends SealiousFieldTypes.ValueNotExistingInCollection
121
+ ? SimpleFormField<false>
122
+ : T extends SealiousRequiredField<
123
+ any,
124
+ any,
125
+ any
126
+ >
127
+ ? SimpleFormField<false>
128
+ : T extends SealiousFieldTypes.Url
129
+ ? URLField<false>
130
+ : T extends SealiousFieldTypes.Money
131
+ ? SimpleFormField<false>
132
+ : T extends SealiousFieldTypes.Markdown
133
+ ? Markdown<false>
134
+ : T extends SealiousFieldTypes.Coordinates
135
+ ? Coordinates<false>
136
+ : T extends SealiousFieldTypes.StructuredArray<
137
+ infer R
138
+ >
139
+ ? StructuredArrayField<R>
140
+ : TextBasedSimpleField<any>;
141
+
142
+ export function sealiousToFormField<SF extends SealiousField<any>>(
143
+ sealious_field: SF
144
+ ): SealiousToFormField<SF> {
145
+ if (sealious_field instanceof SealiousFieldTypes.Boolean) {
146
+ return new BooleanField(
147
+ sealious_field.required
148
+ ) as SealiousToFormField<SF>;
149
+ }
150
+ if (sealious_field instanceof SealiousFieldTypes.Color) {
151
+ return new Color(sealious_field.required) as SealiousToFormField<SF>;
152
+ }
153
+ if (sealious_field instanceof SealiousFieldTypes.ControlAccess) {
154
+ const target_field = sealious_field.virtual_field;
155
+ return sealiousToFormField(target_field) as SealiousToFormField<SF>;
156
+ }
157
+ if (sealious_field instanceof SealiousFieldTypes.Date) {
158
+ return new DateField(
159
+ sealious_field.required
160
+ ) as SealiousToFormField<SF>;
161
+ }
162
+ if (sealious_field instanceof SealiousFieldTypes.DateTime) {
163
+ return new DateTime(sealious_field.required) as SealiousToFormField<SF>;
164
+ }
165
+ if (
166
+ sealious_field instanceof SealiousFieldTypes.DeepReverseSingleReference
167
+ ) {
168
+ const referencing_collection =
169
+ sealious_field.collection.app.collections[
170
+ sealious_field.referencing_collection
171
+ ];
172
+ if (!referencing_collection) {
173
+ throw new Error(
174
+ "Unknown collection: " + sealious_field.referencing_collection
175
+ );
176
+ }
177
+ if (Object.keys(referencing_collection.fields).length == 2) {
178
+ return new DeepReverseSingleReferenceList(
179
+ sealious_field
180
+ ) as SealiousToFormField<SF>;
181
+ } else {
182
+ return new DeepReverseSingleReferenceTable(
183
+ sealious_field
184
+ ) as SealiousToFormField<SF>;
185
+ }
186
+ }
187
+ if (sealious_field instanceof SealiousFieldTypes.DisallowUpdate) {
188
+ return sealiousToFormField(
189
+ sealious_field.virtual_field
190
+ ) as SealiousToFormField<SF>;
191
+ }
192
+ if (sealious_field instanceof SealiousFieldTypes.Email) {
193
+ return new EmailField(
194
+ sealious_field.required
195
+ ) as SealiousToFormField<SF>;
196
+ }
197
+ if (sealious_field instanceof SealiousFieldTypes.Enum) {
198
+ return new PickFromListSealious(
199
+ sealious_field
200
+ ) as SealiousToFormField<SF>;
201
+ }
202
+ if (sealious_field instanceof SealiousFieldTypes.EnumMultiple) {
203
+ return new EnumMultipleSealious(
204
+ sealious_field
205
+ ) as SealiousToFormField<SF>;
206
+ }
207
+ if (sealious_field instanceof SealiousFieldTypes.File) {
208
+ return new File(sealious_field.required) as SealiousToFormField<SF>;
209
+ }
210
+ if (sealious_field instanceof SealiousFieldTypes.Float) {
211
+ return new Float(sealious_field.required) as SealiousToFormField<SF>;
212
+ }
213
+ if (sealious_field instanceof SealiousFieldTypes.HTML) {
214
+ return new HTML(sealious_field.required) as SealiousToFormField<SF>;
215
+ }
216
+ if (sealious_field instanceof SealiousFieldTypes.Image) {
217
+ return new Image(sealious_field.required) as SealiousToFormField<SF>;
218
+ }
219
+ if (sealious_field instanceof SealiousFieldTypes.Int) {
220
+ return new Int(sealious_field.required) as SealiousToFormField<SF>;
221
+ }
222
+ if (sealious_field instanceof SealiousFieldTypes.JsonObject) {
223
+ return new JSONField(
224
+ sealious_field.required
225
+ ) as SealiousToFormField<SF>;
226
+ }
227
+ if (sealious_field instanceof SealiousFieldTypes.Password) {
228
+ return new Password(sealious_field.required) as SealiousToFormField<SF>;
229
+ }
230
+ if (sealious_field instanceof SealiousFieldTypes.SettableBy) {
231
+ return sealiousToFormField(
232
+ sealious_field.virtual_field
233
+ ) as SealiousToFormField<SF>;
234
+ }
235
+ if (sealious_field instanceof SealiousFieldTypes.SingleReference) {
236
+ return new SingleReference(
237
+ false,
238
+ sealious_field
239
+ ) as unknown as SealiousToFormField<SF>;
240
+ }
241
+ if (sealious_field instanceof SealiousFieldTypes.Text) {
242
+ return new Text(sealious_field.required) as SealiousToFormField<SF>;
243
+ }
244
+ if (sealious_field instanceof SealiousFieldTypes.Username) {
245
+ return new Text(sealious_field.required) as SealiousToFormField<SF>;
246
+ }
247
+ if (sealious_field instanceof SealiousFieldTypes.Url) {
248
+ return new URLField(sealious_field.required) as SealiousToFormField<SF>;
249
+ }
250
+ if (sealious_field instanceof SealiousFieldTypes.Money) {
251
+ return new Float(sealious_field.required) as SealiousToFormField<SF>;
252
+ }
253
+ if (sealious_field instanceof SealiousFieldTypes.Markdown) {
254
+ return new Markdown(sealious_field.required) as SealiousToFormField<SF>;
255
+ }
256
+ if (sealious_field instanceof SealiousFieldTypes.Coordinates) {
257
+ return new Coordinates(
258
+ sealious_field.required
259
+ ) as SealiousToFormField<SF>;
260
+ }
261
+ if (sealious_field instanceof SealiousFieldTypes.StructuredArray) {
262
+ return new StructuredArrayField(
263
+ sealious_field
264
+ ) as SealiousToFormField<SF>;
265
+ }
266
+ return new TextBasedSimpleField(false) as SealiousToFormField<SF>;
267
+ }
268
+
269
+ export async function sealiousFieldInfoToFormField(
270
+ field_info: ExtractedFieldInfo
271
+ ): Promise<FormField> {
272
+ switch (field_info.type) {
273
+ case "boolean":
274
+ return new BooleanField(field_info.is_required);
275
+ case "color":
276
+ return new Color(field_info.is_required);
277
+ case "date":
278
+ return new DateField(field_info.is_required);
279
+ case "datetime":
280
+ return new DateTime(field_info.is_required);
281
+ case "deep-reverse-single-reference": {
282
+ const referencing_fields = await extract_fields_from_collection(
283
+ field_info.referencing_collection as string
284
+ );
285
+ if (referencing_fields.length == 2) {
286
+ return new DeepReverseSingleReferenceList({} as any);
287
+ } else {
288
+ return new DeepReverseSingleReferenceTable({} as any);
289
+ }
290
+ }
291
+ case "email":
292
+ return new EmailField(field_info.is_required);
293
+ case "enum":
294
+ return new PickFromListSealious({} as any);
295
+ case "enum-multiple":
296
+ return new EnumMultipleSealious({} as any);
297
+ case "file":
298
+ return new File(field_info.is_required);
299
+ case "float":
300
+ return new Float(field_info.is_required);
301
+ case "html":
302
+ return new HTML(field_info.is_required);
303
+ case "image":
304
+ return new Image(field_info.is_required);
305
+ case "int":
306
+ return new Int(field_info.is_required);
307
+ case "json-object":
308
+ return new JSONField(field_info.is_required);
309
+ case "password":
310
+ return new Password(field_info.is_required);
311
+ case "single-reference":
312
+ return new SingleReference(false, {} as any);
313
+ case "text":
314
+ return new Text(field_info.is_required);
315
+
316
+ case "username":
317
+ return new Text(field_info.is_required);
318
+
319
+ case "url":
320
+ return new URLField(field_info.is_required);
321
+ case "money":
322
+ return new Float(field_info.is_required);
323
+
324
+ case "markdown":
325
+ return new Markdown(field_info.is_required);
326
+ case "coordinates":
327
+ return new Coordinates(field_info.is_required);
328
+ case "structured-array":
329
+ // we don't need the full thing at this point, so we don't fill in the subfields
330
+ return new StructuredArrayField(
331
+ new SealiousFieldTypes.StructuredArray({})
332
+ );
333
+
334
+ default:
335
+ return new TextBasedSimpleField(false);
336
+ }
337
+ }
@@ -0,0 +1,15 @@
1
+ import { Textarea } from "../controls/textarea.js";
2
+ import { TextBasedSimpleField } from "./simple-form-field.js";
3
+
4
+ export class HTML<Required extends boolean> extends TextBasedSimpleField<
5
+ Required,
6
+ Textarea
7
+ > {
8
+ constructor(required: Required) {
9
+ super(required, "text");
10
+ }
11
+
12
+ getControl(): Textarea {
13
+ return new Textarea(this);
14
+ }
15
+ }
@@ -0,0 +1,12 @@
1
+ import { Image as ImageControl } from "../controls/image.js";
2
+ import { File as FileField } from "./file.js";
3
+ import { FileContainer } from "../fields/file.js";
4
+ import { FormField } from "./field.js";
5
+
6
+ export class Image<Required extends boolean> extends FileField<Required> {
7
+ getControl(): ImageControl {
8
+ return new ImageControl(
9
+ this as unknown as FormField<boolean, FileContainer>
10
+ );
11
+ }
12
+ }
@@ -0,0 +1,25 @@
1
+ import { FormControlContext } from "../controls/form-control.js";
2
+ import { NumberBasedSimpleField } from "./simple-form-field.js";
3
+
4
+ export class Int<
5
+ Required extends boolean,
6
+ > extends NumberBasedSimpleField<Required> {
7
+ constructor(required: Required) {
8
+ super(required, "number");
9
+ }
10
+
11
+ async getSealiousCreateValue(
12
+ fctx: FormControlContext
13
+ ): Promise<number | undefined> {
14
+ const { parsed } = await this.getParsedValue(
15
+ fctx.ctx,
16
+ fctx.data.raw_values
17
+ );
18
+ if (parsed == null) {
19
+ return undefined;
20
+ }
21
+ if (isNaN(parsed)) {
22
+ return undefined;
23
+ } else return parsed;
24
+ }
25
+ }
@@ -0,0 +1,48 @@
1
+ import { Context } from "koa";
2
+ import { FormControlContext } from "../controls/form-control.js";
3
+ import { Textarea } from "../controls/textarea.js";
4
+ import { FormDataValue } from "../form-types.js";
5
+ import { FieldParseResult } from "./field.js";
6
+ import { SimpleFormField } from "./simple-form-field.js";
7
+
8
+ export class JSONField<Required extends boolean> extends SimpleFormField<
9
+ Required,
10
+ Textarea,
11
+ Record<string, unknown>
12
+ > {
13
+ constructor(required: Required) {
14
+ super(required, "text");
15
+ }
16
+
17
+ getControl(): Textarea {
18
+ return new Textarea(this);
19
+ }
20
+
21
+ public getEmptyValue(): Record<string, unknown> {
22
+ return {};
23
+ }
24
+
25
+ async parse(
26
+ ctx: Context,
27
+ raw_value: FormDataValue
28
+ ): Promise<FieldParseResult<Record<string, unknown>>> {
29
+ return {
30
+ parsable: true,
31
+ error: null,
32
+ parsed_value: JSON.parse(raw_value as string) as Record<
33
+ string,
34
+ unknown
35
+ >,
36
+ };
37
+ }
38
+
39
+ async getSealiousCreateValue(
40
+ fctx: FormControlContext
41
+ ): Promise<Record<string, unknown> | null> {
42
+ const { parsed } = await this.getParsedValue(
43
+ fctx.ctx,
44
+ fctx.data.raw_values
45
+ );
46
+ return parsed;
47
+ }
48
+ }
@@ -0,0 +1,15 @@
1
+ import { Textarea } from "../controls/textarea.js";
2
+ import { TextBasedSimpleField } from "./simple-form-field.js";
3
+
4
+ export class Markdown<Required extends boolean> extends TextBasedSimpleField<
5
+ Required,
6
+ Textarea
7
+ > {
8
+ constructor(required: Required) {
9
+ super(required, "text");
10
+ }
11
+
12
+ getControl(): Textarea {
13
+ return new Textarea(this);
14
+ }
15
+ }
@@ -1,8 +1,13 @@
1
1
  import { Context } from "koa";
2
2
  import { FieldTypes as SealiousFieldTypes } from "sealious";
3
3
  import { FormField } from "./field.js";
4
+ import { MultipleFiles as MultipleFilesControl } from "../controls/multiple-files.js";
4
5
 
5
- export class MultipleFiles extends FormField<false> {
6
+ export class MultipleFiles extends FormField<
7
+ false,
8
+ undefined,
9
+ MultipleFilesControl
10
+ > {
6
11
  constructor(
7
12
  public collection_field: SealiousFieldTypes.ReverseSingleReference,
8
13
  public getItemId: (ctx: Context) => Promise<string> | string
@@ -17,4 +22,8 @@ export class MultipleFiles extends FormField<false> {
17
22
  async parse() {
18
23
  return <const>{ parsed_value: undefined, parsable: true, error: null }; // the control is supposed to do the heavy lifting here
19
24
  }
25
+
26
+ getControl() {
27
+ return new MultipleFilesControl(this);
28
+ }
20
29
  }
@@ -1,12 +1,13 @@
1
1
  import { is, predicates } from "@sealcode/ts-predicates";
2
2
  import { Context } from "koa";
3
+ import { SimpleInput } from "../controls/simple-input.js";
3
4
  import { FormDataValue } from "../form-types.js";
4
5
  import { FieldParseResult, FormField } from "./field.js";
5
6
 
6
7
  export class NumberField<
7
8
  DefaultValue extends number | null = number,
8
- Required extends boolean = boolean
9
- > extends FormField<Required, number | DefaultValue> {
9
+ Required extends boolean = boolean,
10
+ > extends FormField<Required, number | DefaultValue, SimpleInput> {
10
11
  constructor(
11
12
  required: Required,
12
13
  public default_value: DefaultValue,
@@ -51,7 +52,7 @@ export class NumberField<
51
52
  parseFloat(value.toString()).toFixed(
52
53
  this.options.decimalDigits
53
54
  )
54
- )
55
+ )
55
56
  : parseFloat(value.toString()),
56
57
  error: null,
57
58
  };
@@ -67,4 +68,10 @@ export class NumberField<
67
68
  public getEmptyValue(): DefaultValue {
68
69
  return this.default_value;
69
70
  }
71
+
72
+ getControl(): SimpleInput {
73
+ return new SimpleInput(this as FormField<boolean, number>, {
74
+ type: "number",
75
+ });
76
+ }
70
77
  }