@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 { promises as fs } from "fs";
2
- import * as prettier from "prettier";
3
2
  import { relative, resolve, basename } from "path";
4
3
  import _locreq from "locreq";
5
4
  import { walkDir } from "./utils/walk.js";
6
5
  import { importPath } from "./utils/import-path.js";
7
6
  import { assertType, predicates } from "@sealcode/ts-predicates";
8
7
  import { unescape_url_params } from "./utils/escape-url-params.js";
9
- import { getPrettierConfig } from "./utils/prettier.js";
8
+ import { formatWithPrettier } from "./utils/prettier.js";
10
9
  import { Templates } from "./templates/templates.js";
11
10
  const target_locreq = _locreq(process.cwd());
12
11
  async function extractActionName(full_file_path) {
@@ -91,14 +90,13 @@ ${sortRoutes(files).map(
91
90
  }`;
92
91
  const urls_content = `${sortRoutes(files).map(({ actionName, url }) => generateURL(actionName, url)).join("\n")}
93
92
  `;
94
- const prettier_config = await getPrettierConfig();
95
93
  await fs.writeFile(
96
94
  target_locreq.resolve("src/back/routes/routes.ts"),
97
- prettier.format(routes_content, prettier_config)
95
+ await formatWithPrettier(routes_content)
98
96
  );
99
97
  await fs.writeFile(
100
98
  target_locreq.resolve("src/back/routes/urls.ts"),
101
- prettier.format(urls_content, prettier_config)
99
+ await formatWithPrettier(urls_content)
102
100
  );
103
101
  console.log(
104
102
  "Successfuly generated new src/back/routes/routes.ts and src/back/routes/urls.ts"
@@ -1,19 +1,14 @@
1
1
  import { generateURL, sortRoutes } from "./generate-routes.js";
2
- import * as prettier from "prettier";
3
- import { getPrettierConfig } from "./utils/prettier.js";
2
+ import { formatWithPrettier } from "./utils/prettier.js";
4
3
  import assert from "node:assert";
5
4
  describe("generate routes", () => {
6
5
  it("handles a url with params", async () => {
7
6
  assert.strictEqual(
8
- prettier.format(
9
- generateURL("EditUser", "/admin/users/:id/edit/"),
10
- await getPrettierConfig()
11
- ),
12
- prettier.format(
7
+ await formatWithPrettier(generateURL("EditUser", "/admin/users/:id/edit/")),
8
+ await formatWithPrettier(
13
9
  `export const EditUserURL = (id: string) => \`/admin/users/\${id}/edit/\`;
14
10
  EditUserURL.params = ["id"];
15
- EditUserURL.rawURL = "/admin/users/:id/edit/";`,
16
- await getPrettierConfig()
11
+ EditUserURL.rawURL = "/admin/users/:id/edit/";`
17
12
  )
18
13
  );
19
14
  });
@@ -25,15 +20,11 @@ EditUserURL.rawURL = "/admin/users/:id/edit/";`,
25
20
  });
26
21
  it("handles a url with params and diacritics", async () => {
27
22
  assert.strictEqual(
28
- prettier.format(
29
- generateURL("EditUser", "/admin/u\u017Cytkownicy/:id/edit/"),
30
- await getPrettierConfig()
31
- ),
32
- prettier.format(
23
+ await formatWithPrettier(generateURL("EditUser", "/admin/u\u017Cytkownicy/:id/edit/")),
24
+ await formatWithPrettier(
33
25
  `export const EditUserURL = (id: string) => \`/admin/u%C5%BCytkownicy/\${id}/edit/\`;
34
26
  EditUserURL.params = ["id"];
35
- EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/";`,
36
- await getPrettierConfig()
27
+ EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/";`
37
28
  )
38
29
  );
39
30
  });
@@ -1,7 +1,6 @@
1
1
  import _locreq from "locreq";
2
- import * as prettier from "prettier";
3
2
  import { promises as fs } from "fs";
4
- import { getPrettierConfig } from "./utils/prettier.js";
3
+ import { formatWithPrettier } from "./utils/prettier.js";
5
4
  import recursive from "recursive-readdir";
6
5
  import path, { dirname } from "path";
7
6
  import { toKebabCase, toPascalCase } from "js-convert-case";
@@ -12,6 +11,7 @@ async function generateStimulusControllers(controller_dirs) {
12
11
  target_locreq.resolve("src/"),
13
12
  ...controller_dirs
14
13
  ];
14
+ console.info("Looking for controllers in ", stimulus_search_dirs);
15
15
  const controller_names = (await Promise.all(stimulus_search_dirs.map((dir) => recursive(dir)))).flat().filter((c) => c.endsWith(".stimulus.ts")).sort();
16
16
  const controller_data = controller_names.map(
17
17
  (p) => "./" + path.relative(target_locreq.resolve(dirname(output_file)), p).replace(/\.[tj]sx?$/, ".js")
@@ -34,9 +34,9 @@ export { Turbo };
34
34
  `;
35
35
  await fs.writeFile(
36
36
  target_locreq.resolve(output_file),
37
- prettier.format(content, await getPrettierConfig())
37
+ await formatWithPrettier(content)
38
38
  );
39
- console.log(`Successfuly generated new ${output_file} file`);
39
+ console.info(`Successfuly generated new ${output_file} file`);
40
40
  }
41
41
  export {
42
42
  generateStimulusControllers
package/lib/get-fonts.js CHANGED
@@ -27,43 +27,45 @@ async function getFonts(_ = {}) {
27
27
  fontsPath: "/dist/fonts"
28
28
  });
29
29
  await downloader.execute();
30
- console.log("Downloaded new fonts pack from google fonts");
30
+ console.info("Downloaded new fonts pack from google fonts");
31
31
  const squirrel_fonts = fonts_config.fontSquirrel;
32
- if (!is(
32
+ if (is(
33
33
  squirrel_fonts,
34
34
  predicates.record(
35
35
  predicates.string,
36
36
  predicates.array(predicates.string)
37
37
  )
38
38
  )) {
39
- throw new Error("Inocorrect squirrelfonts file");
40
- }
41
- await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
42
- recursive: true
43
- });
44
- const config_file = `{
39
+ await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
40
+ recursive: true
41
+ });
42
+ const config_file = `{
45
43
  "tmpDir": "/tmp/fonts",
46
44
  "fontsDir": "/dist/fontsquirrel/fonts",
47
45
  "cssDir": "/dist/fontsquirrel/css",
48
46
  "cssFile": "fonts.css"
49
47
  }`;
50
- await writeFile("public/fonsta.config.json", config_file);
51
- await Promise.all(
52
- Object.keys(squirrel_fonts).map((font) => {
53
- if (squirrel_fonts[font].length) {
54
- return execPromise(
55
- `node ${path_to_fonsta} install ${font}:${squirrel_fonts[font].join(",")}`,
56
- {
57
- cwd: target_locreq.resolve("public")
58
- }
59
- );
60
- } else {
61
- return execPromise(`node ${path_to_fonsta} install ${font}`, {
62
- cwd: target_locreq.resolve("public")
63
- });
64
- }
65
- })
66
- );
48
+ await writeFile("public/fonsta.config.json", config_file);
49
+ await Promise.all(
50
+ Object.keys(squirrel_fonts).map((font) => {
51
+ if (squirrel_fonts[font].length) {
52
+ return execPromise(
53
+ `node ${path_to_fonsta} install ${font}:${squirrel_fonts[font].join(",")}`,
54
+ {
55
+ cwd: target_locreq.resolve("public")
56
+ }
57
+ );
58
+ } else {
59
+ return execPromise(
60
+ `node ${path_to_fonsta} install ${font}`,
61
+ {
62
+ cwd: target_locreq.resolve("public")
63
+ }
64
+ );
65
+ }
66
+ })
67
+ );
68
+ }
67
69
  const fonts_css_file_path = resolve(
68
70
  target_locreq.resolve("public/dist/fonts"),
69
71
  "fonts.css"
@@ -75,8 +77,8 @@ async function getFonts(_ = {}) {
75
77
  );
76
78
  await unlink("public/fonsta.config.json");
77
79
  await rmdir("public/tmp");
78
- console.log("Downloaded new fonts pack from Font Squirrel");
79
- console.log("Downloaded new fonts pack");
80
+ console.info("Downloaded new fonts pack from Font Squirrel");
81
+ console.info("Downloaded new fonts pack");
80
82
  }
81
83
  export {
82
84
  FONTS_CONFIG_PATH,
package/lib/index.js CHANGED
@@ -16,6 +16,7 @@ export * from "./forms/multiform.js";
16
16
  import * as Components from "./components/components.js";
17
17
  export * from "./mount.js";
18
18
  export * from "./page/default-list-filters.js";
19
+ export * from "./forms/fields/get-field-for-sealious.js";
19
20
  export {
20
21
  Components,
21
22
  Controls,
package/lib/make-env.js CHANGED
@@ -9,7 +9,7 @@ GROUP_ID=${gid}
9
9
  `;
10
10
  const path = target_locreq.resolve(".env");
11
11
  await fs.writeFile(path, content);
12
- console.log("wrote .env");
12
+ console.info("Wrote .env");
13
13
  }
14
14
  export {
15
15
  makeEnv
@@ -3,10 +3,10 @@ import { attribute } from "./sanitize.js";
3
3
  function makeHiddenInputs(ctx, fields, values, fields_to_skip) {
4
4
  return tempstream`${Object.entries(fields).filter(([key]) => !fields_to_skip.includes(key)).map(
5
5
  ([key, field]) => tempstream`<input
6
- type="hidden"
7
- name="${key}"
8
- value="${field.getValue(ctx, values).then((r) => attribute(JSON.stringify(r.raw) || ""))}"
9
- />`
6
+ type="hidden"
7
+ name="${key}"
8
+ value="${field.getParsedValue(ctx, values).then((r) => attribute(JSON.stringify(r.raw) || ""))}"
9
+ />`
10
10
  )}`;
11
11
  }
12
12
  export {
package/lib/mount.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { FileManager } from "@sealcode/file-manager";
2
2
  import { Middlewares as SealiousMiddlewares } from "sealious";
3
+ import { KoaResponsiveImageRouter } from "koa-responsive-image-router";
3
4
  async function handleHtmlPromise(ctx, next) {
4
5
  await next();
5
6
  if (ctx.body instanceof Promise) {
@@ -9,9 +10,19 @@ async function handleHtmlPromise(ctx, next) {
9
10
  }
10
11
  function mount(router, url, mountable, use_dummy_app = false, file_manager = use_dummy_app ? new FileManager("/tmp", "/uploaded_files") : void 0) {
11
12
  const raw_url = typeof url === "string" ? url : url.rawURL;
13
+ const imageRouter = new KoaResponsiveImageRouter({
14
+ staticPath: "/tmp",
15
+ thumbnailSize: 10,
16
+ cacheManagerResolutionThreshold: 10,
17
+ imageStoragePath: "/tmp",
18
+ smartCropStoragePath: "/tmp"
19
+ });
20
+ const fileManager = new FileManager("/tmp", "/uploaded_files");
12
21
  const args = use_dummy_app ? [
13
22
  async (ctx, next) => {
14
23
  ctx.$app = {
24
+ fileManager,
25
+ imageRouter,
15
26
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
16
27
  Logger: new Proxy(
17
28
  {},
@@ -28,7 +39,6 @@ function mount(router, url, mountable, use_dummy_app = false, file_manager = use
28
39
  }
29
40
  ),
30
41
  getString: (x) => x
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
42
  };
33
43
  await next();
34
44
  },
package/lib/notifier.js CHANGED
@@ -13,7 +13,7 @@ async function wait_for_run_id_to_change(app_port) {
13
13
  try {
14
14
  const { started_at } = await get_status(app_port);
15
15
  first_timestamp = started_at;
16
- } catch (e) {
16
+ } catch (_e) {
17
17
  await wait_for_app_to_be_stable(app_port);
18
18
  return;
19
19
  }
@@ -34,7 +34,6 @@ async function wait_for_app_to_be_stable(app_port, n = 3) {
34
34
  console.log("Waiting for app to be stable....");
35
35
  let counter = 0;
36
36
  while (true) {
37
- console.debug("notifier.ts:53");
38
37
  const { status } = await get_status(app_port).catch(() => ({
39
38
  status: "down"
40
39
  }));
@@ -77,8 +76,8 @@ function make_notifier(port, app_port) {
77
76
  sockets = sockets.filter((s) => s !== socket);
78
77
  });
79
78
  });
80
- console.log(
81
- "build notifier listening on websocket at port " + port.toString()
79
+ console.info(
80
+ "\u{1F514} Build notifier listening on websocket at port " + port.toString()
82
81
  );
83
82
  return function notify(message) {
84
83
  sockets.forEach((s) => s.send(message));
package/lib/page/list.js CHANGED
@@ -4,13 +4,13 @@ import { naturalNumbers, UrlWithNewParams } from "../utils/utils.js";
4
4
  import { makeHiddenInputs } from "../make-hidden-inputs.js";
5
5
  import qs from "qs";
6
6
  import { NumberField } from "../forms/fields/number.js";
7
- import { SimpleFormField } from "../forms/fields/simple-form-field.js";
7
+ import { TextBasedSimpleField } from "../forms/fields/simple-form-field.js";
8
8
  const BasePagePropsShape = {};
9
9
  const DEFAULT_ITEMS_PER_PAGE = 12;
10
10
  const BaseListPageFields = {
11
11
  page: new NumberField(false, 1),
12
12
  itemsPerPage: new NumberField(false, DEFAULT_ITEMS_PER_PAGE),
13
- sort: new SimpleFormField(false)
13
+ sort: new TextBasedSimpleField(false)
14
14
  };
15
15
  const SORT_SEPARATOR = ":";
16
16
  function decodeSort(s) {
@@ -40,8 +40,8 @@ class ListPage extends Page {
40
40
  }
41
41
  init() {
42
42
  super.init();
43
- for (const [fieldname, field] of Object.entries(this.filterFields)) {
44
- void field.init(fieldname);
43
+ for (const [, field] of Object.entries(this.filterFields)) {
44
+ void field.init();
45
45
  }
46
46
  }
47
47
  renderListContainer(_, content) {
@@ -49,11 +49,14 @@ class ListPage extends Page {
49
49
  }
50
50
  async getPaginationConfig(ctx) {
51
51
  const values = await this.extractRawValues(ctx);
52
- let { parsed: page } = await this.fields.page.getValue(ctx, values);
52
+ let { parsed: page } = await this.fields.page.getParsedValue(
53
+ ctx,
54
+ values
55
+ );
53
56
  if (!page) {
54
57
  page = 1;
55
58
  }
56
- const { parsed: itemsPerPage } = await this.fields.itemsPerPage.getValue(ctx, values);
59
+ const { parsed: itemsPerPage } = await this.fields.itemsPerPage.getParsedValue(ctx, values);
57
60
  return { page, itemsPerPage };
58
61
  }
59
62
  async renderItems(ctx, values, items) {
@@ -87,17 +90,16 @@ class ListPage extends Page {
87
90
  (n) => (
88
91
  /* HTML */
89
92
  `<option
90
- value="${UrlWithNewParams(
93
+ value="${UrlWithNewParams(
91
94
  ctx,
92
- //eslint-disable-next-line @typescript-eslint/consistent-type-assertions
93
95
  this.propsParser.overwriteProp(ctx, {
94
96
  page: n
95
97
  })
96
98
  )}"
97
- ${page === n ? "selected" : ""}
98
- >
99
- ${n}
100
- </option>`
99
+ ${page === n ? "selected" : ""}
100
+ >
101
+ ${n}
102
+ </option>`
101
103
  )
102
104
  )}
103
105
  </select>
@@ -114,7 +116,6 @@ class ListPage extends Page {
114
116
  `<a
115
117
  href="${UrlWithNewParams(
116
118
  ctx,
117
- //eslint-disable-next-line @typescript-eslint/consistent-type-assertions
118
119
  this.propsParser.overwriteProp(ctx, {
119
120
  page
120
121
  })
@@ -127,7 +128,7 @@ class ListPage extends Page {
127
128
  const filter = {};
128
129
  const raw_values = await this.extractRawValues(ctx);
129
130
  for (const [fieldname, field] of Object.entries(this.filterFields)) {
130
- const { parsed } = await field.getValue(ctx, raw_values);
131
+ const { parsed } = await field.getParsedValue(ctx, raw_values);
131
132
  filter[fieldname] = field.mapToFilter(parsed);
132
133
  }
133
134
  return filter;
@@ -163,7 +164,11 @@ class ListPage extends Page {
163
164
  return control.render(
164
165
  this.makeFormControlContext(
165
166
  ctx,
166
- { raw_values: values, messages: [] },
167
+ {
168
+ raw_values: values,
169
+ messages: [],
170
+ field_messages: {}
171
+ },
167
172
  false
168
173
  )
169
174
  );
@@ -13,14 +13,15 @@ class MountableWithFields extends Mountable {
13
13
  this.fields = {};
14
14
  }
15
15
  init() {
16
- for (const [name, field] of Object.entries(this.fields)) {
17
- void field.init(name);
16
+ for (const [field_name, field] of Object.entries(this.fields)) {
17
+ void field.init();
18
+ field.setName(field_name);
18
19
  }
19
20
  }
20
21
  makeFormControlContext(ctx, data, validate, field_name_prefix = this.field_names_prefix, form_id = this.form_id) {
21
22
  return new FormControlContext(
22
23
  ctx,
23
- data.raw_values,
24
+ data,
24
25
  data.messages,
25
26
  field_name_prefix,
26
27
  form_id,
@@ -44,10 +45,13 @@ class MountableWithFields extends Mountable {
44
45
  await Promise.all(
45
46
  Object.keys(this.fields).map(async (key) => {
46
47
  const field = this.fields[key];
47
- const { valid: fieldvalid, message: fieldmessage } = await field.getValue(ctx, values, true);
48
+ const { valid: fieldvalid, message: fieldmessage } = await field.getParsedValue(ctx, values, true);
48
49
  if (!fieldvalid) {
49
50
  valid = false;
50
- field_errors[field.name] = fieldmessage;
51
+ field_errors[field.name] = {
52
+ type: "error",
53
+ message: fieldmessage
54
+ };
51
55
  }
52
56
  })
53
57
  );
@@ -81,7 +85,11 @@ class MountableWithFields extends Mountable {
81
85
  const result = {};
82
86
  const promises = Object.entries(this.fields).map(
83
87
  async ([key, field]) => {
84
- const { parsed } = await field.getValue(ctx, raw_values, false);
88
+ const { parsed } = await field.getParsedValue(
89
+ ctx,
90
+ raw_values,
91
+ false
92
+ );
85
93
  result[key] = parsed;
86
94
  }
87
95
  );
@@ -17,7 +17,7 @@ describe("mountable-with-fields", () => {
17
17
  const data = await this.getParsedValues(ctx);
18
18
  data.not_required?.trim();
19
19
  data.required.trim();
20
- const { parsed: data2 } = await this.fields.not_required.getValue(
20
+ const { parsed: data2 } = await this.fields.not_required.getParsedValue(
21
21
  ctx,
22
22
  form_values.raw_values
23
23
  );
@@ -1,5 +1,4 @@
1
1
  class Mountable {
2
- // eslint-disable-next-line @typescript-eslint/no-empty-function
3
2
  init() {
4
3
  }
5
4
  }
package/lib/page/page.js CHANGED
@@ -14,7 +14,6 @@ class Page extends MountableWithFields {
14
14
  ctx.body = await this.render(ctx);
15
15
  });
16
16
  }
17
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
17
  async canAccess(_) {
19
18
  return { canAccess: true, message: "" };
20
19
  }
@@ -43,7 +43,7 @@ async function updatePackageJson(projectDir, moduleName, subdirectory, type) {
43
43
  const pathToAdd = `node_modules/${moduleName}/${subdirectory}`;
44
44
  const existingPaths = packageJson.sealgen[type];
45
45
  if (existingPaths.includes(pathToAdd)) {
46
- console.log(`${type} already contains: ${pathToAdd}`);
46
+ console.warn(`${type} already contains: ${pathToAdd}`);
47
47
  return;
48
48
  }
49
49
  existingPaths.push(pathToAdd);
@@ -52,9 +52,9 @@ async function updatePackageJson(projectDir, moduleName, subdirectory, type) {
52
52
  "json"
53
53
  );
54
54
  await fs.writeFile(packageJsonPath, updatedContent);
55
- console.log(`Added ${pathToAdd} to ${type} in ${packageJsonPath}`);
55
+ console.info(`Added ${pathToAdd} to ${type} in ${packageJsonPath}`);
56
56
  }
57
- async function registerExternalControllers(args) {
57
+ async function registerExternalControllers(_args) {
58
58
  const moduleName = process.argv.at(3);
59
59
  const subdirectory = process.argv.at(4);
60
60
  if (!moduleName || !subdirectory) {
@@ -76,7 +76,7 @@ async function registerExternalControllers(args) {
76
76
  process.exit(1);
77
77
  }
78
78
  }
79
- async function registerExternalStyles(args) {
79
+ async function registerExternalStyles(_args) {
80
80
  const moduleName = process.argv.at(3);
81
81
  const subdirectory = process.argv.at(4);
82
82
  if (!moduleName || !subdirectory) {
@@ -1,12 +1,10 @@
1
- import Prettier from "prettier";
2
- import { curryImportPath } from "../utils/import-path.js";
3
- import { getPrettierConfig } from "../utils/prettier.js";
1
+ import { formatWithPrettier } from "../utils/prettier.js";
4
2
  const defaults = {
5
3
  postimport: `
6
4
  import { Fields } from "@sealcode/sealgen";
7
5
  import type {FormDataValue} from "@sealcode/sealgen";`,
8
6
  fields: `
9
- password: new Fields.SimpleFormField(true),`,
7
+ password: new Fields.Password(true),`,
10
8
  controls: `
11
9
  new Controls.SimpleInput(fields.password, {
12
10
  label: "Password:",
@@ -17,8 +15,8 @@ const defaults = {
17
15
  data: Record<string, FormDataValue>
18
16
  ): Promise<{ valid: boolean; error: string }> {
19
17
  // just a silly example, please remove this with better logic
20
- const { parsed: email } = await this.fields.email.getValue(ctx, data);
21
- const { parsed: password } = await this.fields.password.getValue(ctx, data);
18
+ const { parsed: email } = await this.fields.email.getParsedValue(ctx, data);
19
+ const { parsed: password } = await this.fields.password.getParsedValue(ctx, data);
22
20
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
23
21
  if ((password || "").length > ((email as string) || "").length) {
24
22
  return { valid: false, error: "Password cannot be longer than email" };
@@ -41,13 +39,12 @@ const defaults = {
41
39
  other_methods: "",
42
40
  success_message: "Success!"
43
41
  };
44
- async function formTemplate(action_name, newfilefullpath, _params = defaults) {
42
+ async function formTemplate(action_name, _params = defaults) {
45
43
  const params = { ...defaults, ..._params };
46
- const rel = curryImportPath(newfilefullpath);
47
44
  const content = `import type { Context } from "koa";
48
45
  import type { FormData } from "@sealcode/sealgen";
49
46
  import { Form, Controls, fieldsToShape } from "@sealcode/sealgen";
50
- import html from "${rel("src/back/html.js")}";
47
+ import html from "src/back/html.js";
51
48
 
52
49
  ${params.postimport}
53
50
 
@@ -57,6 +54,8 @@ const fields = {
57
54
  ${params.fields}
58
55
  };
59
56
 
57
+ Form.initFieldNames(fields);
58
+
60
59
  export const ${action_name}Shape = fieldsToShape(fields);
61
60
 
62
61
  export default new (class ${action_name}Form extends Form<typeof fields, void> {
@@ -78,7 +77,7 @@ export default new (class ${action_name}Form extends Form<typeof fields, void> {
78
77
  ${params.render}
79
78
  })();
80
79
  `;
81
- return Prettier.format(content, await getPrettierConfig());
80
+ return formatWithPrettier(content);
82
81
  }
83
82
  export {
84
83
  formTemplate
@@ -1,5 +1,5 @@
1
1
  import { toKebabCase, toPascalCase } from "js-convert-case";
2
- function jddComponentTemplate(component_name) {
2
+ async function jddComponentTemplate(component_name) {
3
3
  return `import { TempstreamJSX } from "tempstream";
4
4
  import type { ComponentToHTMLArgs } from "@sealcode/jdd";
5
5
  import { Component, ComponentArguments } from "@sealcode/jdd";
@@ -20,7 +20,7 @@ async function jddEditorTemplate(actionName) {
20
20
  let field_name = "";
21
21
  if (jdd_fields.length == 1) {
22
22
  field_name = jdd_fields[0].name;
23
- console.log(
23
+ console.info(
24
24
  `Only one field of type JDD found: ${field_name}, so skipping the question...`
25
25
  );
26
26
  } else if (jdd_fields.length > 1) {
@@ -9,8 +9,8 @@ import { FlatTemplatable } from "tempstream";
9
9
  export const actionName = "${action_name}";
10
10
 
11
11
  const fields1 = {
12
- email: new Fields.SimpleFormField(true),
13
- password: new Fields.SimpleFormField(true),
12
+ email: new Fields.TextBasedSimpleField(true),
13
+ password: new Fields.TextBasedSimpleField(true),
14
14
  };
15
15
 
16
16
  const form1 = new (class extends Form<typeof fields1, unknown> {
@@ -26,8 +26,8 @@ const form1 = new (class extends Form<typeof fields1, unknown> {
26
26
  })();
27
27
 
28
28
  const fields2 = {
29
- name: new Fields.SimpleFormField(true),
30
- surname: new Fields.SimpleFormField(true),
29
+ name: new Fields.TextBasedSimpleField(true),
30
+ surname: new Fields.TextBasedSimpleField(true),
31
31
  };
32
32
 
33
33
  const form2 = new (class extends Form<typeof fields2, unknown> {
@@ -1,6 +1,4 @@
1
- import { curryImportPath } from "../utils/import-path.js";
2
- async function pageTemplate(action_name, newfilefullpath) {
3
- const rel = curryImportPath(newfilefullpath);
1
+ async function pageTemplate(action_name) {
4
2
  return `import type { Context } from "koa";
5
3
  import { TempstreamJSX } from "tempstream";
6
4
  import { Page } from "@sealcode/sealgen";