@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,70 +1,57 @@
1
1
  import { toKebabCase, toPascalCase } from "js-convert-case";
2
2
  import { formTemplate } from "../form.js";
3
- import { curryImportPath } from "../../utils/import-path.js";
4
3
  import extract_fields_from_collection from "../../utils/extract-fields-from-collection.js";
5
- import { getFieldHandler } from "./shared-crud-form-fields.js";
4
+ import { wrapAttribute } from "../../utils/wrap-attributes.js";
6
5
  async function createItemFormTemplate(create_action_name, newfilefullpath, collection_name, list_action) {
7
- const collection_fields = await extract_fields_from_collection(
8
- collection_name
9
- );
10
- const importPath = curryImportPath(newfilefullpath);
11
- const field_handler_results = await Promise.all(
12
- collection_fields.map(
13
- (field) => getFieldHandler(collection_name, field, importPath)
14
- )
15
- );
16
- const post_create_actions = field_handler_results.map(({ post_create }) => post_create).filter((e) => e != "");
17
- return formTemplate(create_action_name, newfilefullpath, {
6
+ const collection_fields = await extract_fields_from_collection(collection_name);
7
+ const formFieldsVar = `${toPascalCase(collection_name)}FormFields`;
8
+ return formTemplate(create_action_name, {
18
9
  success_message: "Created!",
19
- postimport: `import {${toPascalCase(
20
- collection_name
21
- )}FormFields, ${toPascalCase(
10
+ postimport: `import {${formFieldsVar}, get${toPascalCase(
22
11
  collection_name
23
12
  )}FormControls }from "./shared.js";
24
13
 
25
- import { ${toPascalCase(collection_name)} } from "${importPath(
26
- "src/back/collections/collections.js"
27
- )}";
28
-
29
- import { ${list_action}URL } from "${importPath("src/back/routes/urls.js")}";
14
+ import { ${toPascalCase(
15
+ collection_name
16
+ )} } from "src/back/collections/collections.js";
30
17
 
31
- import {tempstream} from "tempstream";
18
+ import { ${list_action}URL } from "src/back/routes/urls.js";
19
+ import {tempstream} from "tempstream";
32
20
  `,
33
21
  fields: `...${toPascalCase(collection_name)}FormFields`,
34
22
  controls: `
35
23
  new Controls.FormHeader("Create ${toPascalCase(
36
24
  collection_name
37
25
  )}"),
38
- ...${toPascalCase(collection_name)}FormControls`,
26
+ ...get${toPascalCase(collection_name)}FormControls()`,
39
27
  can_access: `canAccess = async (ctx: Context) => {
40
28
  const policy = ${toPascalCase(collection_name)}.getPolicy("create");
41
29
  const response = await policy.check(ctx.$context);
42
30
  return { canAccess: response?.allowed || false, message: response?.reason || "" };
43
31
  };`,
44
- get_initial_values: field_handler_results.filter((r) => !r.hide_initial_value_create).map(({ initial_value_create }) => initial_value_create).filter((e) => e != "").length ? `getInitialValues(ctx: Context){
45
- return {
46
- ${field_handler_results.filter((r) => !r.hide_initial_value_create).map(
47
- ({ initial_value_create }) => initial_value_create
48
- ).join(",\n")}
49
- }
50
- }` : ``,
32
+ get_initial_values: "",
51
33
  onsubmit: `
52
- async onSubmit(ctx: Context) {
53
- const data = await this.getParsedValues(ctx);
54
- if (!data) {
55
- throw new Error("Error when parsing the form values");
56
- }
57
-
58
- ${field_handler_results.map(({ pre_create }) => pre_create).filter((e) => e !== "").join("\n")}
34
+ async onSubmit(ctx: Context, formData: FormData) {
35
+ const fctx = this.makeFormControlContext(ctx, formData, true);
59
36
 
60
- ${post_create_actions.length ? `const created = ` : ""} await ctx.$app.collections["${toKebabCase(collection_name)}"].create(
37
+ const created = await ctx.$app.collections["${toKebabCase(
38
+ collection_name
39
+ )}"].createExtraSafe(
61
40
  ctx.$context,
62
- {
63
- ${field_handler_results.filter((result) => !result.hide_sealious_value).map((result) => result.sealious_value(result)).filter((e) => e != "").join(",\n")}
64
- }
65
- );
66
- ${post_create_actions.length ? `/* ==== POST CREATE ACTIONS ==== */` : ""}
67
- ${post_create_actions.join("\n")}
41
+ {
42
+ ${collection_fields.map(
43
+ (field_info) => field_info.form_field.generateCreateValueGetter(field_info, {
44
+ form_field_types: formFieldsVar,
45
+ sealious_field: `fields${wrapAttribute(field_info.name)}`,
46
+ form_fields: "fields"
47
+ })
48
+ ).join(",\n")}
49
+ });
50
+
51
+ for(const field of Object.values(${formFieldsVar})){
52
+ // eslint-disable-next-line no-await-in-loop
53
+ await field.postSealiousCreate(ctx, created, formData)
54
+ }
68
55
  }
69
56
  `,
70
57
  render: ` async render(ctx: Context, data: FormData, show_field_errors: boolean) {
@@ -1,53 +1,36 @@
1
1
  import { toKebabCase, toPascalCase } from "js-convert-case";
2
2
  import { formTemplate } from "../form.js";
3
- import { curryImportPath } from "../../utils/import-path.js";
4
3
  import extract_fields_from_collection from "../../utils/extract-fields-from-collection.js";
5
- import { getFieldHandler } from "./shared-crud-form-fields.js";
4
+ import { wrapAttribute } from "../../utils/wrap-attributes.js";
6
5
  async function editItemFormTemplate(edit_action_name, newfilefullpath, collection_name, list_action) {
7
- const collection_fields = await extract_fields_from_collection(
8
- collection_name
9
- );
10
- const importPath = curryImportPath(newfilefullpath);
11
- const field_handler_results = await Promise.all(
12
- collection_fields.map(async (field) => {
13
- return getFieldHandler(collection_name, field, importPath);
14
- })
15
- );
16
- return formTemplate(edit_action_name, newfilefullpath, {
6
+ const collection_fields = await extract_fields_from_collection(collection_name);
7
+ const formFieldsVar = `${toPascalCase(collection_name)}FormFields`;
8
+ const collectionVar = `${toPascalCase(collection_name)}`;
9
+ return formTemplate(edit_action_name, {
17
10
  success_message: "Changes saved!",
18
- postimport: `import {${toPascalCase(
19
- collection_name
20
- )}FormFields, ${toPascalCase(
11
+ postimport: `import {${formFieldsVar}, get${toPascalCase(
21
12
  collection_name
22
13
  )}FormControls }from "../shared.js";
23
- import { ${toPascalCase(collection_name)} } from "${importPath(
24
- "src/back/collections/collections.js"
25
- )}";
26
- import { ${list_action}URL, ${edit_action_name}URL } from "${importPath(
27
- "src/back/routes/urls.js"
28
- )}";
29
- import {tempstream} from "tempstream";
30
-
31
- ${Array.from(
32
- new Set(field_handler_results.map(({ imports }) => imports.edit))
33
- ).join("\n")}
34
-
35
- ${collection_fields.filter((e) => !e.is_required).length ? `import {withFallback} from "@sealcode/sealgen";` : ""}
14
+ import { ${collectionVar} } from "src/back/collections/collections.js";
15
+ import { ${list_action}URL } from "src/back/routes/urls.js";
16
+ import {tempstream} from "tempstream";
17
+ import type { FormDataValue } from "@sealcode/sealgen";
18
+ import type { CollectionInputWithAllKeys } from "sealious";
36
19
  `,
37
20
  fields: `...${toPascalCase(collection_name)}FormFields`,
38
21
  controls: `
39
22
  new Controls.FormHeader("Edit ${toPascalCase(
40
23
  collection_name
41
24
  )}"),
42
- ...${toPascalCase(collection_name)}FormControls`,
25
+ ...get${toPascalCase(collection_name)}FormControls()`,
43
26
  can_access: `canAccess = async (ctx: Context) => {
44
27
  const policy = ${toPascalCase(collection_name)}.getPolicy("edit");
45
28
  const response = await policy.check(ctx.$context);
46
29
  return { canAccess: response?.allowed || false, message: response?.reason || "" };
47
30
  };`,
48
31
  onsubmit: `
49
- async onSubmit(ctx: Context) {
50
- const data = await this.getParsedValues(ctx);
32
+ async onSubmit(ctx: Context, formData: FormData) {
33
+ const fctx = this.makeFormControlContext(ctx, formData, true);
51
34
  const id = await this.getID(ctx);
52
35
  const {items: [item]} = await ctx.$app.collections["${toKebabCase(
53
36
  collection_name
@@ -60,33 +43,35 @@ async function editItemFormTemplate(edit_action_name, newfilefullpath, collectio
60
43
  throw new Error("Unknown id: " + id);
61
44
  }
62
45
 
63
- if (!data) {
64
- throw new Error("Error when parsing the form values");
65
- }
66
-
67
- ${field_handler_results.map((result) => result.pre_edit).filter((e) => e !== "").join("\n")}
68
46
 
69
- item.setMultiple(
70
- {
71
- ${field_handler_results.filter((r) => !r.hide_sealious_value).map((result) => result.sealious_value(result)).filter((e) => e != "").join(",\n")}
72
- }
47
+ item.setMultipleExtraSafe(
48
+ {
49
+ ${collection_fields.map(
50
+ (field_info) => field_info.form_field.generateCreateValueGetter(
51
+ field_info,
52
+ {
53
+ form_field_types: "FormFieldTypes",
54
+ sealious_field: `${collectionVar}.fields${wrapAttribute(
55
+ field_info.name
56
+ )}`,
57
+ form_fields: "fields"
58
+ }
59
+ )
60
+ ).join(",\n")}
61
+ } as CollectionInputWithAllKeys<typeof ${collectionVar}>
73
62
  );
63
+
74
64
  await item.save(ctx.$context);
75
65
 
76
-
77
- ${field_handler_results.map((result) => result.post_edit).filter((e) => e != "").length ? `// #### POST-EDIT ACTIONS ############` : ""}
78
- ${field_handler_results.map((result) => result.post_edit).filter((e) => e != "").join("\n")}
66
+ for(const field of Object.values(${formFieldsVar})){
67
+ // eslint-disable-next-line no-await-in-loop
68
+ await field.postSealiousEdit(ctx, item, formData)
69
+ }
79
70
  }
80
71
  `,
81
72
  other_methods: `
82
73
  async getID(ctx: Context): Promise<string>{
83
- // trying to automatically guess which param is the one that represents the ID
84
- // of the resource to edit.
85
- // If sealgen got it wrong, just return the param name that should be used here instead
86
- const param_name =
87
- ${edit_action_name}URL.params
88
- .find(param => param.toLowerCase().includes("id"))
89
- || ${edit_action_name}URL.params[0]
74
+ const param_name = "id";
90
75
  const id = ctx.params[param_name];
91
76
  if (!id) {
92
77
  throw new Error("Missing URL parameter: " + param_name);
@@ -94,7 +79,7 @@ async function editItemFormTemplate(edit_action_name, newfilefullpath, collectio
94
79
  return id
95
80
  }
96
81
  `,
97
- get_initial_values: `async getInitialValues(ctx: Context) {
82
+ get_initial_values: `async getInitialValues(ctx: Context): Promise<{ [key in keyof typeof fields]: FormDataValue | undefined }> {
98
83
  const id = await this.getID(ctx);
99
84
 
100
85
  const {
@@ -110,36 +95,13 @@ async function editItemFormTemplate(edit_action_name, newfilefullpath, collectio
110
95
  }
111
96
 
112
97
  return {
113
- ${field_handler_results.filter((r) => !r.hide_initial_value_edit).map(({ initial_value_edit, is_required, name }) => {
114
- if (typeof initial_value_edit == "string") {
115
- if (initial_value_edit == "") {
116
- return "";
117
- }
118
- return `${name}: ${initial_value_edit}`;
119
- }
120
- const main_value = initial_value_edit.main_value;
121
- if (!main_value) {
122
- throw new Error(
123
- "Missing main_value for initial_value_edit"
124
- );
125
- }
126
- const { parsed_value, fallback_value } = initial_value_edit;
127
- if (is_required) {
128
- return `${name}: ${parsed_value || main_value}`;
129
- }
130
- if (main_value && parsed_value && fallback_value) {
131
- if (main_value == parsed_value) {
132
- return `${name}: withFallback(${main_value}, ${fallback_value})`;
133
- } else {
134
- return `${name}: withFallback(${main_value}, ${parsed_value}, ${fallback_value})`;
135
- }
136
- } else {
137
- console.error(initial_value_edit);
138
- throw new Error(
139
- "Missing field info for generating initial value"
140
- );
141
- }
142
- }).filter((e) => e.trim() !== "").join(",\n")}
98
+
99
+ ${collection_fields.map(
100
+ (field_info) => field_info.form_field.generateInitialValue(field_info, {
101
+ form_field_types: "FieldTypes",
102
+ form_fields: "fields"
103
+ })
104
+ ).join(",\n")}
143
105
  };
144
106
  }
145
107
  `,
@@ -44,12 +44,12 @@ function makeDefaultDisplayFields(collection_fields) {
44
44
  return `{
45
45
  field: "${field.name}",
46
46
  label: "${field.name}",
47
- format: async (value: FilePointer) => {
48
- return imageRouter.image(await value.getPath(), {
47
+ format: async (value: FilePointer|null) => {
48
+ return value ? imageRouter.image(await value.getPath(), {
49
49
  container: { width: 45, height: 45 },
50
50
  crop: { width: 45, height: 45 },
51
51
  alt: "",
52
- });
52
+ }): "";
53
53
  },
54
54
  }`;
55
55
  }
@@ -91,7 +91,7 @@ import type { FlatTemplatable, Templatable } from "tempstream";
91
91
  import { TempstreamJSX, tempstream } from "tempstream";
92
92
  import { ${uppercase_collection} } from "src/back/collections/collections.js";
93
93
  import html from "src/back/html.js";
94
- import type { ListFilterRender } from "@sealcode/sealgen";
94
+ import type { ListFilterRender, FormDisplayInfo } from "@sealcode/sealgen";
95
95
  import {
96
96
  SealiousItemListPage,
97
97
  BaseListPageFields,
@@ -104,26 +104,18 @@ ${field_import_string}
104
104
 
105
105
  export const actionName = "${action_name}";
106
106
 
107
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
108
- const filterFields = [
109
- ${makeDefaultFilterFields(collection_fields)}
110
- ] as {
111
- field: keyof (typeof ${uppercase_collection})["fields"];
107
+ const filterFields:{
108
+ field: keyof (typeof ${uppercase_collection})["fields"];
112
109
  render?: ListFilterRender;
113
- prepareValue?: (filter_value: unknown)=>unknown; // set this function to change what filter value is passed to Sealious
114
- }[];
110
+ prepareValue?: (filter_value: unknown) => unknown; // set this function to change what filter value is passed to Sealious
111
+ }[] = [
112
+ ${makeDefaultFilterFields(collection_fields)}
113
+ ];
115
114
 
116
115
 
117
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
118
- const displayFields = [
116
+ const displayFields: FormDisplayInfo<typeof ${uppercase_collection}>[] = [
119
117
  ${makeDefaultDisplayFields(collection_fields)}
120
- ] as {
121
- field: string;
122
- label: string;
123
- format?: (value: unknown, item: CollectionItem<typeof ${toPascalCase(
124
- collection_name
125
- )}>) => FlatTemplatable;
126
- }[];
118
+ ];
127
119
 
128
120
  export default new (class ${action_name}Page extends SealiousItemListPage<
129
121
  typeof ${uppercase_collection},
@@ -188,7 +180,7 @@ export default new (class ${action_name}Page extends SealiousItemListPage<
188
180
  ctx: Context,
189
181
  fields: { field: string; label?: string }[]
190
182
  ): FlatTemplatable {
191
- return tempstream/* HTML */ \`<thead>
183
+ return tempstream /* HTML */ \`<thead>
192
184
  <tr>
193
185
  \${fields.map(({ label, field }) => this.renderHeading(ctx, field, label))}
194
186
  <th>Actions</th>
@@ -1,114 +1,44 @@
1
1
  import { toPascalCase } from "js-convert-case";
2
- import { extractCollectionClassname } from "../../generate-collections.js";
3
2
  import extract_fields_from_collection from "../../utils/extract-fields-from-collection.js";
4
- import _locreq from "locreq";
5
- import { curryImportPath } from "../../utils/import-path.js";
6
3
  import { formatWithPrettier } from "../../utils/prettier.js";
7
- import { default_handler } from "./handlers/default.js";
8
- import { enum_handler } from "./handlers/enum.js";
9
- import { image_handler } from "./handlers/image.js";
10
- import { file_handler } from "./handlers/file.js";
11
- import { int_handler } from "./handlers/int.js";
12
- import { boolean_handler } from "./handlers/boolean.js";
13
- import { jdd_handler } from "./handlers/jdd.js";
14
- import { date_handler } from "./handlers/date.js";
15
- import { deep_reverse_single_reference_handler } from "./handlers/deep-reverse-single-reference.js";
16
- import { structured_array_handler } from "./handlers/structured-array.js";
17
- import { single_reference_handler } from "./handlers/single-reference.js";
18
- const target_locreq = _locreq(process.cwd());
19
- const field_handlers = {
20
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-explicit-any
21
- default: default_handler,
22
- enum: enum_handler,
23
- image: image_handler,
24
- file: file_handler,
25
- int: int_handler,
26
- boolean: boolean_handler,
27
- jdd: jdd_handler,
28
- date: date_handler,
29
- "deep-reverse-single-reference": deep_reverse_single_reference_handler,
30
- "structured-array": structured_array_handler,
31
- "single-reference": single_reference_handler
32
- };
33
- async function getFieldHandler(collection_name, field, importPath, fields_var) {
34
- const defaults = await field_handlers.default(
35
- collection_name,
36
- field,
37
- importPath,
38
- {},
39
- field_handlers,
40
- fields_var
41
- );
42
- const result = {
43
- ...defaults,
44
- ...await field_handlers[field.type]?.(
45
- collection_name,
46
- field,
47
- importPath,
48
- defaults,
49
- field_handlers,
50
- fields_var
51
- ) || {}
52
- };
53
- const result_initial_value_edit = result.initial_value_edit;
54
- result.initial_value_edit = typeof result_initial_value_edit == "string" ? result_initial_value_edit : {
55
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
- ...defaults.initial_value_edit,
57
- ...result_initial_value_edit
58
- };
59
- return result;
60
- }
61
- async function sharedCrudFormFields(collection_name, newfilefullpath) {
62
- const [uppercase_collection, collection_fields] = await Promise.all([
63
- extractCollectionClassname(
64
- target_locreq.resolve(
65
- "src/back/collections/" + collection_name + ".ts"
66
- )
67
- ),
68
- extract_fields_from_collection(collection_name)
69
- ]);
70
- const importPath = curryImportPath(newfilefullpath);
71
- const field_handler_results = await Promise.all(
72
- collection_fields.map(async (field) => {
73
- return getFieldHandler(collection_name, field, importPath);
74
- })
75
- );
76
- const result = `import { Controls, Fields } from "@sealcode/sealgen";
77
- import { ${uppercase_collection} } from "${importPath(
78
- "src/back/collections/collections.js"
79
- )}";
80
-
4
+ import { wrapAttribute } from "../../utils/wrap-attributes.js";
5
+ async function sharedCrudFormFields(collection_name) {
6
+ const collection_fields = await extract_fields_from_collection(collection_name);
7
+ const uppercase_collection = toPascalCase(collection_name);
8
+ const result = `import { type Controls, Fields } from "@sealcode/sealgen";
9
+ import { ${uppercase_collection} } from "src/back/collections/collections.js";
81
10
  ${Array.from(
82
11
  new Set(
83
- field_handler_results.filter(
84
- ({ hide_field, hide_control }) => !hide_field && !hide_control
85
- ).map(({ imports }) => imports.shared || "")
86
- )
87
- ).join("\n")}
88
-
89
-
12
+ collection_fields.map(
13
+ (field_info) => field_info.form_field.generateImportsForFieldList(field_info)
14
+ ).flat().map(
15
+ ({ what, from, as }) => `import {${what}${as ? ` as ${as}` : ""} } from "${from}"`
16
+ )
17
+ ).values()
18
+ ).join(";\n")}
90
19
 
91
- export const ${toPascalCase(collection_name)}FormFields = <const>
92
- {
93
- ${field_handler_results.filter(({ hide_field }) => !hide_field).map(({ field }) => field).filter((e) => e != "").join(",\n")}
20
+ export const ${toPascalCase(collection_name)}FormFields = <const>{
21
+ ${collection_fields.map((field_info) => {
22
+ return `${field_info.name}: ${field_info.form_field.generateFieldDeclaration(field_info, {
23
+ form_field_types: "Fields",
24
+ sealious_field: `${uppercase_collection}.fields${wrapAttribute(
25
+ field_info.name
26
+ )}`
27
+ })}`;
28
+ }).join(",\n")}
94
29
  };
95
30
 
96
- export const ${toPascalCase(collection_name)}FormControls = [
97
- ${field_handler_results.filter(({ hide_control }) => !hide_control).map(({ controls }) => controls).filter((e) => e != "").join(",\n")}
98
- ];
99
-
100
- ${Array.from(
101
- new Set(
102
- field_handler_results.map(({ top_level_shared }) => top_level_shared)
103
- )
104
- ).join("\n")}
31
+ const fields = ${toPascalCase(collection_name)}FormFields
105
32
 
33
+ export const get${toPascalCase(
34
+ collection_name
35
+ )}FormControls: () => Controls.FormControl[] = () => [
36
+ ${collection_fields.map(({ name }) => `fields${wrapAttribute(name)}.getControl()`).join(",\n")}
37
+ ];
106
38
  `;
107
39
  return formatWithPrettier(result);
108
40
  }
109
41
  export {
110
- field_handlers,
111
- getFieldHandler,
112
42
  sharedCrudFormFields
113
43
  };
114
44
  //# sourceMappingURL=shared-crud-form-fields.js.map
@@ -2,12 +2,12 @@ import { exec } from "child_process";
2
2
  const execAsync = (cmd) => {
3
3
  return new Promise((resolve, reject) => {
4
4
  const process = exec(cmd);
5
- console.log("EXECUTING", cmd);
5
+ console.info("EXECUTING", cmd);
6
6
  process?.stdout?.on("data", (data) => {
7
- console.log(`stdout: ${data}`);
7
+ console.info(`stdout: ${data}`);
8
8
  });
9
9
  process?.stderr?.on("data", (data) => {
10
- console.log(`stdout: ${data}`);
10
+ console.info(`stdout: ${data}`);
11
11
  });
12
12
  process.on("exit", (code) => {
13
13
  if (code == 0) {
@@ -10,7 +10,8 @@ import { module_dirname } from "../utils/module-dirname.js";
10
10
  import EventEmitter from "events";
11
11
  const locreq = _locreq(module_dirname(import.meta.url));
12
12
  const callSealgenBin = () => `node ${locreq.resolve("lib/cli.js")}`;
13
- const sealious_minimal_commit = "833e70c";
13
+ const sealious_minimal_url = "https://hub.sealcode.org/source/sealious-minimal.git";
14
+ const sealious_minimal_commit = "77e3794";
14
15
  class RealAppTest {
15
16
  constructor() {
16
17
  this.emitter = new EventEmitter();
@@ -21,15 +22,15 @@ class RealAppTest {
21
22
  const timestamp = Date.now();
22
23
  test_app.app_path = `/tmp/sealious-minimal-${timestamp}`;
23
24
  test_app.container_name = `sealgen-test-mongo-${timestamp}`;
24
- console.log(" cloning sealious-minimal...");
25
+ console.info(" cloning sealious-minimal...");
25
26
  await execAsync(
26
- `git clone https://hub.sealcode.org/source/sealious-minimal.git ${test_app.app_path} && cd ${test_app.app_path} && git checkout ${sealious_minimal_commit}`
27
+ `git clone ${sealious_minimal_url} ${test_app.app_path} && cd ${test_app.app_path} && git checkout ${sealious_minimal_commit}`
27
28
  );
28
- console.log(" installing dependencies and sealgen...");
29
+ console.info(" installing dependencies and sealgen...");
29
30
  await execAsync(
30
31
  `cd ${test_app.app_path} && npm ci rm -rf node_modules/@sealcode/sealgen && ln -s $OLDPWD node_modules/@sealcode/sealgen && ${callSealgenBin()} make-env`
31
32
  );
32
- console.log(
33
+ console.info(
33
34
  " starting the database...(if timeouts here, run 'docker pull mongo:4.4-bionic' to solve)"
34
35
  );
35
36
  await test_app.runSealgenCommand("build");
@@ -47,7 +48,7 @@ class RealAppTest {
47
48
  SEALIOUS_PORT: this.app_port.toString()
48
49
  };
49
50
  const node_args = [`${this.app_path}/dist/back/index.js`];
50
- console.log(
51
+ console.info(
51
52
  "EXECUTING APP",
52
53
  `${Object.entries(env).map(([key, value]) => `${key}=${value}`).join(" ")} node ${node_args.join(" ")}`
53
54
  );
@@ -56,9 +57,9 @@ class RealAppTest {
56
57
  });
57
58
  app_start.stdout.on(
58
59
  "data",
59
- (data) => console.log("APP OUTPUT:", data.toString())
60
+ (data) => console.info("APP OUTPUT:", data.toString())
60
61
  );
61
- app_start.stderr.on("data", (data) => console.log(data.toString()));
62
+ app_start.stderr.on("data", (data) => console.info(data.toString()));
62
63
  app_start.on("exit", (code) => {
63
64
  this.emitter.emit("exit", code);
64
65
  this.emitter.emit("process_error");
@@ -72,7 +73,7 @@ class RealAppTest {
72
73
  output: "silent",
73
74
  timeout: 6e3
74
75
  });
75
- console.log(
76
+ console.info(
76
77
  chalk.yellow(
77
78
  `App is listening on http://localhost:${this.app_port}`
78
79
  )
@@ -82,7 +83,7 @@ class RealAppTest {
82
83
  try {
83
84
  if (this.node_pid != 0)
84
85
  await execAsync(`kill -9 ${this.node_pid}`);
85
- } catch (error) {
86
+ } catch (_error) {
86
87
  throw new Error(
87
88
  "node process exited unexpectedly, please inspect the output"
88
89
  );
@@ -135,7 +136,6 @@ class RealAppTest {
135
136
  });
136
137
  }
137
138
  async httpPOST(path2, body) {
138
- console.debug("POST", path2, body);
139
139
  return this.throwIfItKillsTheApp(async () => {
140
140
  const ret = await fetch(
141
141
  `http://localhost:${this.app_port}${path2}`,
@@ -147,13 +147,11 @@ class RealAppTest {
147
147
  );
148
148
  const status = ret.status;
149
149
  const response = await ret.text();
150
- console.debug("request done!");
151
- console.debug({ response });
152
150
  return { status, response };
153
151
  });
154
152
  }
155
153
  async addFile(target_path, content) {
156
- console.log(
154
+ console.info(
157
155
  chalk.yellow("Inserting file at path"),
158
156
  chalk.green(target_path),
159
157
  "with content\n",