@sealcode/sealgen 0.18.8 → 0.19.0

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 (374) hide show
  1. package/.eslintrc.cjs +7 -2
  2. package/.xunit +75 -0
  3. package/@types/add-crud.d.sync-conflict-20250918-184311-TFDLWFG.ts +1 -0
  4. package/@types/builders/colors-builder.d.sync-conflict-20250918-184323-TFDLWFG.ts +10 -0
  5. package/@types/builders/colors-builder.d.ts +1 -1
  6. package/@types/builders/fonts-builder.d.sync-conflict-20250918-184322-TFDLWFG.ts +7 -0
  7. package/@types/builders/fonts-builder.d.ts +1 -1
  8. package/@types/controllers/table-add-button.d.ts +6 -0
  9. package/@types/controllers/table-add-button.stimulus.d.ts +6 -0
  10. package/@types/crud-field-snippets.d.sync-conflict-20250918-184323-TFDLWFG.ts +1 -0
  11. package/@types/crud-field-snippets.d.ts +1 -3
  12. package/@types/forms/controls/array.d.sync-conflict-20250918-184306-TFDLWFG.ts +33 -0
  13. package/@types/forms/controls/array.d.ts +1 -2
  14. package/@types/forms/controls/array.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  15. package/@types/forms/controls/autocomplete.d.sync-conflict-20250918-222042-TFDLWFG.ts +22 -0
  16. package/@types/forms/controls/autocomplete.d.ts +1 -1
  17. package/@types/forms/controls/checkbox-group.d.sync-conflict-20250918-184319-TFDLWFG.ts +21 -0
  18. package/@types/forms/controls/checkbox-group.d.ts +3 -3
  19. package/@types/forms/controls/checkboxed-list-input.d.sync-conflict-20250918-184323-TFDLWFG.ts +21 -0
  20. package/@types/forms/controls/checkboxed-list-input.d.ts +3 -3
  21. package/@types/forms/controls/controls.d.ts +2 -2
  22. package/@types/forms/controls/derived-frame.d.sync-conflict-20250918-184314-TFDLWFG.ts +19 -0
  23. package/@types/forms/controls/derived-frame.d.ts +0 -1
  24. package/@types/forms/controls/dropdown.d.sync-conflict-20250918-222044-TFDLWFG.ts +30 -0
  25. package/@types/forms/controls/dropdown.d.ts +1 -1
  26. package/@types/forms/controls/file.d.sync-conflict-20250918-222045-TFDLWFG.ts +13 -0
  27. package/@types/forms/controls/file.d.ts +1 -2
  28. package/@types/forms/controls/form-control.d.sync-conflict-20250918-184322-TFDLWFG.ts +19 -0
  29. package/@types/forms/controls/form-control.d.sync-conflict-20250918-222046-TFDLWFG.ts +19 -0
  30. package/@types/forms/controls/form-control.d.ts +7 -3
  31. package/@types/forms/controls/image.d.ts +19 -0
  32. package/@types/forms/controls/image.test.d.ts +1 -0
  33. package/@types/forms/controls/multiple-files.d.sync-conflict-20250918-184318-TFDLWFG.ts +42 -0
  34. package/@types/forms/controls/multiple-files.d.ts +3 -0
  35. package/@types/forms/controls/multiple-images.d.ts +19 -0
  36. package/@types/forms/controls/number.d.sync-conflict-20250918-222046-TFDLWFG.ts +13 -0
  37. package/@types/forms/controls/number.d.ts +1 -1
  38. package/@types/forms/controls/photo.d.sync-conflict-20250918-184321-TFDLWFG.ts +19 -0
  39. package/@types/forms/controls/photo.d.ts +3 -5
  40. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-184310-TFDLWFG.ts +33 -0
  41. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-222042-TFDLWFG.ts +33 -0
  42. package/@types/forms/controls/simple-input.d.ts +5 -4
  43. package/@types/forms/controls/simple-input.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  44. package/@types/forms/controls/single-reference.d.ts +3 -2
  45. package/@types/forms/controls/table.d.sync-conflict-20250918-184302-TFDLWFG.ts +39 -0
  46. package/@types/forms/controls/table.d.ts +8 -2
  47. package/@types/forms/controls/table.sync-conflict-20250918-222042-TFDLWFG.d.ts +39 -0
  48. package/@types/forms/controls/textarea.d.sync-conflict-20250918-222045-TFDLWFG.ts +25 -0
  49. package/@types/forms/controls/textarea.d.ts +3 -3
  50. package/@types/forms/fields/boolean.d.sync-conflict-20250918-184325-TFDLWFG.ts +22 -0
  51. package/@types/forms/fields/boolean.d.ts +6 -1
  52. package/@types/forms/fields/boolean.sync-conflict-20250918-222042-TFDLWFG.d.ts +22 -0
  53. package/@types/forms/fields/checkboxed-list.d.sync-conflict-20250918-184325-TFDLWFG.ts +23 -0
  54. package/@types/forms/fields/checkboxed-list.d.ts +3 -1
  55. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-184319-TFDLWFG.ts +22 -0
  56. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-222047-TFDLWFG.ts +22 -0
  57. package/@types/forms/fields/collection-field.d.ts +8 -1
  58. package/@types/forms/fields/color.d.ts +4 -0
  59. package/@types/forms/fields/coordinates.d.sync-conflict-20250918-222044-TFDLWFG.ts +14 -0
  60. package/@types/forms/fields/coordinates.d.ts +14 -0
  61. package/@types/forms/fields/date.d.ts +13 -0
  62. package/@types/forms/fields/datetime.d.sync-conflict-20250918-222050-TFDLWFG.ts +4 -0
  63. package/@types/forms/fields/datetime.d.ts +14 -0
  64. package/@types/forms/fields/deep-reverse-single-reference-list.d.ts +24 -0
  65. package/@types/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
  66. package/@types/forms/fields/email.d.sync-conflict-20250918-184303-TFDLWFG.ts +8 -0
  67. package/@types/forms/fields/email.d.ts +3 -0
  68. package/@types/forms/fields/enum-multiple-sealious.d.ts +16 -0
  69. package/@types/forms/fields/enum-multiple-sealious.sync-conflict-20250918-222047-TFDLWFG.d.ts +16 -0
  70. package/@types/forms/fields/field.d.sync-conflict-20250918-184306-TFDLWFG.ts +70 -0
  71. package/@types/forms/fields/field.d.ts +37 -5
  72. package/@types/forms/fields/fields.d.sync-conflict-20250918-184314-TFDLWFG.ts +29 -0
  73. package/@types/forms/fields/fields.d.ts +23 -8
  74. package/@types/forms/fields/file.d.sync-conflict-20250918-184310-TFDLWFG.ts +23 -0
  75. package/@types/forms/fields/file.d.sync-conflict-20250918-222046-TFDLWFG.ts +23 -0
  76. package/@types/forms/fields/file.d.ts +11 -5
  77. package/@types/forms/fields/file.sync-conflict-20250918-222049-TFDLWFG.d.ts +23 -0
  78. package/@types/forms/fields/float.d.ts +4 -0
  79. package/@types/forms/fields/get-field-for-sealious.d.sync-conflict-20250918-222046-TFDLWFG.ts +29 -0
  80. package/@types/forms/fields/get-field-for-sealious.d.ts +31 -0
  81. package/@types/forms/fields/get-field-for-sealious.sync-conflict-20250918-222042-TFDLWFG.d.ts +29 -0
  82. package/@types/forms/fields/html.d.ts +6 -0
  83. package/@types/forms/fields/image.d.sync-conflict-20250918-222042-TFDLWFG.ts +5 -0
  84. package/@types/forms/fields/image.d.ts +5 -0
  85. package/@types/forms/fields/int.d.ts +6 -0
  86. package/@types/forms/fields/json.d.ts +13 -0
  87. package/@types/forms/fields/markdown.d.ts +6 -0
  88. package/@types/forms/fields/multiple-files.d.sync-conflict-20250918-184304-TFDLWFG.ts +16 -0
  89. package/@types/forms/fields/multiple-files.d.ts +3 -1
  90. package/@types/forms/fields/number.d.sync-conflict-20250918-184317-TFDLWFG.ts +25 -0
  91. package/@types/forms/fields/number.d.sync-conflict-20250918-222047-TFDLWFG.ts +25 -0
  92. package/@types/forms/fields/number.d.ts +3 -1
  93. package/@types/forms/fields/password.d.ts +6 -0
  94. package/@types/forms/fields/pick-from-list-sealious.d.ts +11 -0
  95. package/@types/forms/fields/pick-from-list.d.sync-conflict-20250918-184322-TFDLWFG.ts +15 -0
  96. package/@types/forms/fields/pick-from-list.d.ts +4 -3
  97. package/@types/forms/fields/proxy-field.d.sync-conflict-20250918-184307-TFDLWFG.ts +15 -0
  98. package/@types/forms/fields/proxy-field.d.ts +3 -1
  99. package/@types/forms/fields/regexp.d.sync-conflict-20250918-184305-TFDLWFG.ts +21 -0
  100. package/@types/forms/fields/regexp.d.sync-conflict-20250918-222045-TFDLWFG.ts +21 -0
  101. package/@types/forms/fields/regexp.d.ts +6 -1
  102. package/@types/forms/fields/regexp.sync-conflict-20250918-222047-TFDLWFG.d.ts +21 -0
  103. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-184309-TFDLWFG.ts +29 -0
  104. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-222044-TFDLWFG.ts +29 -0
  105. package/@types/forms/fields/simple-form-field.d.ts +23 -3
  106. package/@types/forms/fields/simple-form-field.sync-conflict-20250918-222049-TFDLWFG.d.ts +29 -0
  107. package/@types/forms/fields/single-reference.d.ts +19 -0
  108. package/@types/forms/fields/single-reference.sync-conflict-20250918-222043-TFDLWFG.d.ts +10 -0
  109. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-184302-TFDLWFG.ts +27 -0
  110. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-222049-TFDLWFG.ts +27 -0
  111. package/@types/forms/fields/structured-array.d.ts +19 -10
  112. package/@types/forms/fields/structured-array.sync-conflict-20250918-222047-TFDLWFG.d.ts +27 -0
  113. package/@types/forms/fields/table.d.sync-conflict-20250918-184303-TFDLWFG.ts +16 -0
  114. package/@types/forms/fields/table.d.ts +3 -0
  115. package/@types/forms/fields/text.d.ts +6 -0
  116. package/@types/forms/fields/url.d.ts +6 -0
  117. package/@types/forms/form-types.d.sync-conflict-20250918-222045-TFDLWFG.ts +26 -0
  118. package/@types/forms/form-types.d.ts +2 -0
  119. package/@types/forms/form.d.sync-conflict-20250918-184315-TFDLWFG.ts +32 -0
  120. package/@types/forms/form.d.sync-conflict-20250918-222049-TFDLWFG.ts +32 -0
  121. package/@types/forms/form.d.ts +10 -7
  122. package/@types/forms/form.sync-conflict-20250918-222049-TFDLWFG.d.ts +33 -0
  123. package/@types/forms/form.test.d.sync-conflict-20250918-184318-TFDLWFG.ts +6 -0
  124. package/@types/forms/form.test.d.sync-conflict-20250918-222047-TFDLWFG.ts +6 -0
  125. package/@types/forms/form.test.d.ts +2 -2
  126. package/@types/forms/multiform.d.sync-conflict-20250918-184308-TFDLWFG.ts +23 -0
  127. package/@types/forms/multiform.d.ts +1 -1
  128. package/@types/forms/multiform.sync-conflict-20250918-222044-TFDLWFG.d.ts +23 -0
  129. package/@types/index.d.sync-conflict-20250918-184316-TFDLWFG.ts +46 -0
  130. package/@types/index.d.ts +2 -2
  131. package/@types/mount.d.sync-conflict-20250918-184320-TFDLWFG.ts +6 -0
  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/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
  142. package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
  143. package/@types/page/props-parser.d.ts +0 -1
  144. package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
  145. package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
  146. package/@types/templates/shared/shared-crud-form-fields.d.ts +0 -67
  147. package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
  148. package/@types/test_utils/test-on-real-app.d.ts +0 -1
  149. package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
  150. package/@types/utils/extract-fields-from-collection.d.ts +5 -1
  151. package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
  152. package/@types/utils/wrap-attributes.d.ts +3 -0
  153. package/README.md +5 -0
  154. package/assets/file-icon.svg +5 -0
  155. package/lib/add-crud.js +80 -89
  156. package/lib/add-list-route.test.js +1 -1
  157. package/lib/add-route.js +0 -7
  158. package/lib/build.js +3 -1
  159. package/lib/cli.js +2 -5
  160. package/lib/controllers/table-add-button.stimulus.js +35 -0
  161. package/lib/forms/controls/array.js +20 -16
  162. package/lib/forms/controls/big-radio-group.js +2 -2
  163. package/lib/forms/controls/checkbox-group.js +7 -7
  164. package/lib/forms/controls/checkboxed-list-input.js +9 -2
  165. package/lib/forms/controls/controls.js +2 -2
  166. package/lib/forms/controls/derived-frame.js +5 -1
  167. package/lib/forms/controls/derived.js +1 -1
  168. package/lib/forms/controls/dropdown.js +4 -1
  169. package/lib/forms/controls/editable-collection-subset.js +2 -2
  170. package/lib/forms/controls/file.js +26 -2
  171. package/lib/forms/controls/file.test.js +2 -2
  172. package/lib/forms/controls/hidden-input.js +4 -1
  173. package/lib/forms/controls/{photo.js → image.js} +6 -7
  174. package/lib/forms/controls/{photo.test.js → image.test.js} +6 -21
  175. package/lib/forms/controls/multiple-files.js +10 -1
  176. package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
  177. package/lib/forms/controls/simple-input.js +13 -12
  178. package/lib/forms/controls/single-reference.js +4 -0
  179. package/lib/forms/controls/table.js +66 -24
  180. package/lib/forms/controls/textarea.js +4 -2
  181. package/lib/forms/controls/tickable.js +13 -5
  182. package/lib/forms/fields/boolean.js +14 -0
  183. package/lib/forms/fields/checkboxed-list.js +4 -0
  184. package/lib/forms/fields/collection-field.js +9 -0
  185. package/lib/forms/fields/color.js +10 -0
  186. package/lib/forms/fields/coordinates.js +49 -0
  187. package/lib/forms/fields/date.js +34 -0
  188. package/lib/forms/fields/datetime.js +46 -0
  189. package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
  190. package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
  191. package/lib/forms/fields/email.js +7 -0
  192. package/lib/forms/fields/enum-multiple-sealious.js +32 -0
  193. package/lib/forms/fields/field.js +32 -4
  194. package/lib/forms/fields/field.test.js +5 -5
  195. package/lib/forms/fields/fields.js +23 -8
  196. package/lib/forms/fields/file.js +33 -9
  197. package/lib/forms/fields/file.test.js +4 -16
  198. package/lib/forms/fields/float.js +10 -0
  199. package/lib/forms/fields/get-field-for-sealious.js +213 -0
  200. package/lib/forms/fields/html.js +14 -0
  201. package/lib/forms/fields/image.js +13 -0
  202. package/lib/forms/fields/int.js +23 -0
  203. package/lib/forms/fields/json.js +31 -0
  204. package/lib/forms/fields/markdown.js +14 -0
  205. package/lib/forms/fields/multiple-files.js +4 -0
  206. package/lib/forms/fields/number.js +6 -0
  207. package/lib/forms/fields/password.js +13 -0
  208. package/lib/forms/fields/pick-from-list-sealious.js +17 -0
  209. package/lib/forms/fields/pick-from-list.js +6 -2
  210. package/lib/forms/fields/proxy-field.js +3 -0
  211. package/lib/forms/fields/regexp.js +14 -0
  212. package/lib/forms/fields/simple-form-field.js +60 -2
  213. package/lib/forms/fields/single-reference.js +44 -0
  214. package/lib/forms/fields/structured-array.js +63 -12
  215. package/lib/forms/fields/table.js +28 -1
  216. package/lib/forms/fields/text.js +17 -0
  217. package/lib/forms/fields/url.js +17 -0
  218. package/lib/forms/form.js +30 -13
  219. package/lib/forms/form.test.js +3 -4
  220. package/lib/forms/multiform.js +4 -2
  221. package/lib/forms/multiform.test.js +3 -3
  222. package/lib/generate-stimulus.js +1 -0
  223. package/lib/index.js +1 -0
  224. package/lib/make-hidden-inputs.js +1 -1
  225. package/lib/mount.js +11 -0
  226. package/lib/notifier.js +0 -1
  227. package/lib/page/list.js +15 -8
  228. package/lib/page/mountable-with-fields.js +14 -6
  229. package/lib/page/mountable-with-fields.test.js +1 -1
  230. package/lib/templates/form.js +8 -9
  231. package/lib/templates/multiform.js +4 -4
  232. package/lib/templates/page.js +0 -2
  233. package/lib/templates/shared/collection-create-form.js +28 -40
  234. package/lib/templates/shared/collection-edit-form.js +40 -77
  235. package/lib/templates/shared/collection-list.js +12 -20
  236. package/lib/templates/shared/shared-crud-form-fields.js +27 -95
  237. package/lib/test_utils/test-on-real-app.js +3 -3
  238. package/lib/utils/extract-fields-from-collection.js +60 -20
  239. package/lib/utils/make-slug.js +1 -1
  240. package/lib/utils/wrap-attributes.js +20 -0
  241. package/package.json +5 -4
  242. package/src/add-crud.ts +86 -97
  243. package/src/add-list-route.test.ts +1 -1
  244. package/src/add-route.ts +0 -7
  245. package/src/build.ts +3 -1
  246. package/src/cli.ts +3 -5
  247. package/src/controllers/table-add-button.stimulus.ts +35 -0
  248. package/src/forms/controls/array.ts +23 -20
  249. package/src/forms/controls/autocomplete.ts +1 -1
  250. package/src/forms/controls/big-radio-group.ts +2 -2
  251. package/src/forms/controls/checkbox-group.ts +9 -9
  252. package/src/forms/controls/checkboxed-list-input.ts +27 -15
  253. package/src/forms/controls/controls.ts +2 -2
  254. package/src/forms/controls/derived-frame.ts +5 -1
  255. package/src/forms/controls/derived.ts +1 -1
  256. package/src/forms/controls/dropdown.ts +5 -2
  257. package/src/forms/controls/editable-collection-subset.ts +2 -2
  258. package/src/forms/controls/file.test.ts +4 -2
  259. package/src/forms/controls/file.ts +31 -5
  260. package/src/forms/controls/form-control.ts +7 -2
  261. package/src/forms/controls/hidden-input.ts +4 -1
  262. package/src/forms/controls/{photo.test.ts → image.test.ts} +5 -22
  263. package/src/forms/controls/{photo.ts → image.ts} +3 -5
  264. package/src/forms/controls/multiple-files.ts +18 -1
  265. package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +1 -1
  266. package/src/forms/controls/number.ts +1 -1
  267. package/src/forms/controls/simple-input.ts +18 -34
  268. package/src/forms/controls/single-reference.ts +10 -2
  269. package/src/forms/controls/table.ts +90 -31
  270. package/src/forms/controls/textarea.ts +6 -4
  271. package/src/forms/controls/tickable.ts +13 -5
  272. package/src/forms/fields/boolean.ts +23 -1
  273. package/src/forms/fields/checkboxed-list.ts +11 -2
  274. package/src/forms/fields/collection-field.ts +16 -1
  275. package/src/forms/fields/color.ts +9 -0
  276. package/src/forms/fields/coordinates.ts +66 -0
  277. package/src/forms/fields/date.ts +50 -0
  278. package/src/forms/fields/datetime.ts +66 -0
  279. package/src/forms/fields/deep-reverse-single-reference-list.ts +136 -0
  280. package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
  281. package/src/forms/fields/email.ts +9 -0
  282. package/src/forms/fields/enum-multiple-sealious.ts +48 -0
  283. package/src/forms/fields/field.test.ts +5 -5
  284. package/src/forms/fields/field.ts +94 -8
  285. package/src/forms/fields/fields.ts +23 -8
  286. package/src/forms/fields/file.test.ts +4 -16
  287. package/src/forms/fields/file.ts +43 -15
  288. package/src/forms/fields/float.ts +9 -0
  289. package/src/forms/fields/get-field-for-sealious.ts +304 -0
  290. package/src/forms/fields/html.ts +15 -0
  291. package/src/forms/fields/image.ts +12 -0
  292. package/src/forms/fields/int.ts +25 -0
  293. package/src/forms/fields/json.ts +48 -0
  294. package/src/forms/fields/markdown.ts +15 -0
  295. package/src/forms/fields/multiple-files.ts +10 -1
  296. package/src/forms/fields/number.ts +8 -1
  297. package/src/forms/fields/password.ts +17 -0
  298. package/src/forms/fields/pick-from-list-sealious.ts +22 -0
  299. package/src/forms/fields/pick-from-list.ts +7 -3
  300. package/src/forms/fields/proxy-field.ts +6 -1
  301. package/src/forms/fields/regexp.ts +27 -1
  302. package/src/forms/fields/simple-form-field.ts +95 -7
  303. package/src/forms/fields/single-reference.ts +62 -0
  304. package/src/forms/fields/structured-array.ts +115 -18
  305. package/src/forms/fields/table.ts +32 -1
  306. package/src/forms/fields/text.ts +18 -0
  307. package/src/forms/fields/url.ts +20 -0
  308. package/src/forms/form-types.ts +2 -0
  309. package/src/forms/form.test.ts +3 -4
  310. package/src/forms/form.ts +37 -16
  311. package/src/forms/forms.css +0 -85
  312. package/src/forms/multiform.test.ts +3 -3
  313. package/src/forms/multiform.ts +2 -0
  314. package/src/generate-stimulus.ts +1 -0
  315. package/src/index.ts +2 -1
  316. package/src/make-hidden-inputs.ts +1 -1
  317. package/src/mount.ts +14 -0
  318. package/src/notifier.ts +0 -1
  319. package/src/page/list.ts +15 -8
  320. package/src/page/mountable-with-fields.test.ts +1 -1
  321. package/src/page/mountable-with-fields.ts +18 -9
  322. package/src/register-external.ts +1 -1
  323. package/src/templates/form.ts +8 -9
  324. package/src/templates/multiform.ts +4 -4
  325. package/src/templates/page.ts +0 -2
  326. package/src/templates/shared/collection-create-form.ts +30 -66
  327. package/src/templates/shared/collection-edit-form.ts +41 -102
  328. package/src/templates/shared/collection-list.ts +12 -20
  329. package/src/templates/shared/item-delete.ts +0 -1
  330. package/src/templates/shared/shared-crud-form-fields.ts +37 -171
  331. package/src/test_utils/test-on-real-app.ts +4 -3
  332. package/src/utils/extract-fields-from-collection.ts +76 -25
  333. package/src/utils/make-slug.ts +1 -1
  334. package/src/utils/wrap-attributes.ts +17 -0
  335. package/lib/add-verbose-crud.js +0 -119
  336. package/lib/crud-field-snippets.js +0 -52
  337. package/lib/find-css-includes.js +0 -3
  338. package/lib/forms/controls/reverse-single-reference.js +0 -1
  339. package/lib/forms/fields/enum-multiple.js +0 -47
  340. package/lib/forms/fields/enum-multiple.test.js +0 -27
  341. package/lib/forms/fields/enum.js +0 -41
  342. package/lib/forms/fields/enum.test.js +0 -21
  343. package/lib/forms/fields/reverse-single-reference.js +0 -17
  344. package/lib/templates/shared/handlers/boolean.js +0 -14
  345. package/lib/templates/shared/handlers/date.js +0 -8
  346. package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
  347. package/lib/templates/shared/handlers/default.js +0 -49
  348. package/lib/templates/shared/handlers/enum.js +0 -19
  349. package/lib/templates/shared/handlers/file.js +0 -23
  350. package/lib/templates/shared/handlers/image.js +0 -32
  351. package/lib/templates/shared/handlers/int.js +0 -11
  352. package/lib/templates/shared/handlers/jdd.js +0 -10
  353. package/lib/templates/shared/handlers/single-reference.js +0 -12
  354. package/lib/templates/shared/handlers/structured-array.js +0 -33
  355. package/src/add-verbose-crud.ts +0 -138
  356. package/src/crud-field-snippets.ts +0 -57
  357. package/src/find-css-includes.ts +0 -3
  358. package/src/forms/controls/reverse-single-reference.ts +0 -50
  359. package/src/forms/fields/enum-multiple.test.ts +0 -31
  360. package/src/forms/fields/enum-multiple.ts +0 -62
  361. package/src/forms/fields/enum.test.ts +0 -25
  362. package/src/forms/fields/enum.ts +0 -56
  363. package/src/forms/fields/reverse-single-reference.ts +0 -20
  364. package/src/templates/shared/handlers/boolean.ts +0 -18
  365. package/src/templates/shared/handlers/date.ts +0 -12
  366. package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
  367. package/src/templates/shared/handlers/default.ts +0 -64
  368. package/src/templates/shared/handlers/enum.ts +0 -23
  369. package/src/templates/shared/handlers/file.ts +0 -27
  370. package/src/templates/shared/handlers/image.ts +0 -45
  371. package/src/templates/shared/handlers/int.ts +0 -15
  372. package/src/templates/shared/handlers/jdd.ts +0 -14
  373. package/src/templates/shared/handlers/single-reference.ts +0 -16
  374. package/src/templates/shared/handlers/structured-array.ts +0 -42
@@ -0,0 +1,17 @@
1
+ export function needsQuotes(str: string) {
2
+ try {
3
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
4
+ new Function(`var obj = { ${str}: 1 };`);
5
+ return false;
6
+ } catch {
7
+ return true;
8
+ }
9
+ }
10
+
11
+ export function wrapAttribute(name: string) {
12
+ return needsQuotes(name) ? `["${name}"]` : `.${name}`;
13
+ }
14
+
15
+ export function wrapKeyName(name: string) {
16
+ return needsQuotes(name) ? `["${name}"]` : `${name}`;
17
+ }
@@ -1,119 +0,0 @@
1
- import _locreq from "locreq";
2
- import { escape_url_params } from "./utils/escape-url-params.js";
3
- import prompts from "prompts";
4
- import { toKebabCase, toPascalCase } from "js-convert-case";
5
- import { listCollections } from "./utils/list-collections.js";
6
- import { collectionListTemplate } from "./templates/shared/collection-list.js";
7
- import { writeFile } from "./utils/write-file.js";
8
- import { curryImportPath, importPath } from "./utils/import-path.js";
9
- import { sharedCrudFormFields } from "./templates/shared/shared-crud-form-fields.js";
10
- import { generateRoutes } from "./generate-routes.js";
11
- import { createItemFormTemplate } from "./templates/shared/collection-create-form.js";
12
- import { editItemFormTemplate } from "./templates/shared/collection-edit-form.js";
13
- import { itemDeleteTemplate } from "./templates/shared/item-delete.js";
14
- async function addVerboseCRUD(params, app_directory = process.cwd()) {
15
- const target_locreq = _locreq(app_directory);
16
- prompts.override(params);
17
- const response = await prompts([
18
- {
19
- type: "autocomplete",
20
- name: "collection",
21
- message: "Which sealious collection do you like to add CRUD forms for?",
22
- choices: (await listCollections()).map((collection) => ({
23
- title: collection,
24
- value: collection
25
- }))
26
- },
27
- {
28
- type: "text",
29
- name: "url",
30
- message: "Enter a full absolute path for the new route (for example: /admin/users/:id/edit): ",
31
- validate: (s) => s.trim()[0] == "/" ? true : "Should start with a '/'",
32
- initial: function(_, { collection }) {
33
- return "/" + toKebabCase(collection);
34
- }
35
- }
36
- ]);
37
- const collection_name = response.collection;
38
- const url = response.url;
39
- const list_action_name = toPascalCase(collection_name) + "CRUDList";
40
- const create_action_name = toPascalCase(collection_name) + "CRUDCreate";
41
- const edit_action_name = toPascalCase(collection_name) + "CRUDEdit";
42
- const delete_action_name = toPascalCase(collection_name) + "CRUDDelete";
43
- const list_path = target_locreq.resolve(
44
- `src/back/routes/${escape_url_params(url)}/index.list.tsx`
45
- );
46
- const list_content = await collectionListTemplate(
47
- collection_name,
48
- list_action_name,
49
- list_path,
50
- {
51
- post_import_js: `import { ${create_action_name}URL, ${edit_action_name}URL, ${delete_action_name}URL } from "${importPath(
52
- list_path,
53
- "src/back/routes/urls.ts"
54
- )}";`,
55
- post_header_html: `<a href={${create_action_name}URL}> Create </a>`,
56
- render_item: (collection_name2) => ` async renderItem(ctx: Context, item: CollectionItem<typeof ${toPascalCase(
57
- collection_name2
58
- )}>) {
59
- return <tr>
60
- {displayFields.map(({ field, format }) => {
61
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/consistent-type-assertions, @typescript-eslint/no-explicit-any
62
- const value = item.get(field as any);
63
- return <td>{format ? format(value, item) : value}</td>;
64
- })}
65
- <td><div class="sealious-list__actions">
66
- <a href={${edit_action_name}URL(item.id)}>Edit</a>
67
- <a data-turbo-method="POST" data-turbo-confirm="Delete item?" href={${delete_action_name}URL(item.id)}>Delete</a>
68
- </div>
69
- </td>
70
- </tr>;
71
- }`
72
- }
73
- );
74
- await writeFile(list_path, list_content);
75
- const fields_path = target_locreq.resolve(
76
- `src/back/routes/${escape_url_params(url)}/shared.ts`
77
- );
78
- const fields_content = await sharedCrudFormFields(
79
- collection_name,
80
- fields_path
81
- );
82
- await writeFile(fields_path, fields_content);
83
- const create_path = target_locreq.resolve(
84
- `src/back/routes/${escape_url_params(url)}/create.form.ts`
85
- );
86
- const create_content = await createItemFormTemplate(
87
- create_action_name,
88
- create_path,
89
- collection_name,
90
- list_action_name
91
- );
92
- await writeFile(create_path, create_content);
93
- const edit_path = target_locreq.resolve(
94
- `src/back/routes/${escape_url_params(url)}/[id]/edit.form.ts`
95
- );
96
- const edit_content = await editItemFormTemplate(
97
- edit_action_name,
98
- edit_path,
99
- collection_name,
100
- list_action_name
101
- );
102
- await writeFile(edit_path, edit_content);
103
- const delete_path = target_locreq.resolve(
104
- `src/back/routes/${escape_url_params(url)}/[id]/delete.page.tsx`
105
- );
106
- const base_import_path = curryImportPath(delete_path);
107
- const delete_content = await itemDeleteTemplate(
108
- delete_action_name,
109
- collection_name,
110
- list_action_name,
111
- base_import_path
112
- );
113
- await writeFile(delete_path, delete_content);
114
- await generateRoutes();
115
- }
116
- export {
117
- addVerboseCRUD
118
- };
119
- //# sourceMappingURL=add-verbose-crud.js.map
@@ -1,52 +0,0 @@
1
- import _locreq from "locreq";
2
- import prompts from "prompts";
3
- import { getFieldHandler } from "./templates/shared/shared-crud-form-fields.js";
4
- import extract_fields_from_collection from "./utils/extract-fields-from-collection.js";
5
- import { listCollections } from "./utils/list-collections.js";
6
- import { formatWithPrettier } from "./utils/prettier.js";
7
- async function crudFieldSnippets(params, app_directory = process.cwd()) {
8
- const target_locreq = _locreq(app_directory);
9
- prompts.override(params);
10
- const { collection_name } = await prompts([
11
- {
12
- type: "autocomplete",
13
- name: "collection_name",
14
- message: "Which sealious collection do you like to show a CRUD field config for?",
15
- choices: (await listCollections()).map((collection) => ({
16
- title: collection,
17
- value: collection
18
- }))
19
- }
20
- ]);
21
- const all_fields = await extract_fields_from_collection(collection_name);
22
- const { field_name } = await prompts([
23
- {
24
- type: "autocomplete",
25
- name: "field_name",
26
- message: `Which field do you want to show CRUD config for??`,
27
- choices: all_fields.map((field) => ({
28
- title: field.name,
29
- value: field.name
30
- }))
31
- }
32
- ]);
33
- const handler = await getFieldHandler(
34
- collection_name,
35
- all_fields.find((e) => e.name == field_name),
36
- (p) => p
37
- );
38
- console.log(`
39
-
40
- ### Field in shared.ts
41
-
42
- ${handler.field}
43
-
44
- ### Control in shared.ts
45
-
46
- ${await formatWithPrettier(handler.controls)}
47
- `);
48
- }
49
- export {
50
- crudFieldSnippets
51
- };
52
- //# sourceMappingURL=crud-field-snippets.js.map
@@ -1,3 +0,0 @@
1
- import _locreq from "locreq";
2
- const target_locreq = _locreq(process.cwd());
3
- //# sourceMappingURL=find-css-includes.js.map
@@ -1 +0,0 @@
1
- //# sourceMappingURL=reverse-single-reference.js.map
@@ -1,47 +0,0 @@
1
- import { is, predicates } from "@sealcode/ts-predicates";
2
- import { FormField } from "./field.js";
3
- class EnumMultipleField extends FormField {
4
- constructor(required, options, error_message = (options2) => options2.join(", ")) {
5
- super(required);
6
- this.options = options;
7
- this.error_message = error_message;
8
- this.predicate = predicates.enum(this.options);
9
- }
10
- async isValueValid(_, values) {
11
- for (const value of values) {
12
- if (!is(value, predicates.string)) {
13
- return { valid: false, message: "expected a string" };
14
- }
15
- if (!this.options.includes(value)) {
16
- return { valid: false, message: "invalid value" };
17
- }
18
- }
19
- return { valid: true, message: "" };
20
- }
21
- async parse(_, value) {
22
- if (is(value, predicates.string)) {
23
- return { parsable: true, parsed_value: [value], error: null };
24
- } else if (is(value, predicates.array(predicates.string))) {
25
- return {
26
- parsable: true,
27
- parsed_value: value,
28
- error: null
29
- };
30
- } else if (value == null) {
31
- return { parsable: true, parsed_value: [], error: null };
32
- } else {
33
- return {
34
- parsable: false,
35
- parsed_value: null,
36
- error: "Please enter a list of strings"
37
- };
38
- }
39
- }
40
- getEmptyValue() {
41
- return [];
42
- }
43
- }
44
- export {
45
- EnumMultipleField
46
- };
47
- //# sourceMappingURL=enum-multiple.js.map
@@ -1,27 +0,0 @@
1
- import assert from "assert";
2
- import { Fields } from "../../index.js";
3
- describe("enum-multiple field", () => {
4
- const ctx = {};
5
- it("validation logic", async () => {
6
- const field = new Fields.EnumMultipleField(true, ["sa", "mp", "le"]);
7
- assert.strictEqual((await field.isValueValid(ctx, ["sa", "le"])).valid, true);
8
- assert.strictEqual((await field.isValueValid(ctx, ["notvalid"])).valid, false);
9
- assert.strictEqual((await field.isValueValid(ctx, [42])).valid, false);
10
- });
11
- it("parse function", async () => {
12
- const field = new Fields.EnumMultipleField(true, []);
13
- const string_array_response = await field.parse(ctx, ["42"]);
14
- const number_response = await field.parse(ctx, 42);
15
- const string_response = await field.parse(ctx, "sample");
16
- const null_response = await field.parse(ctx, null);
17
- assert.strictEqual(string_array_response.parsable, true);
18
- assert.deepEqual(string_array_response.parsed_value, ["42"]);
19
- assert.strictEqual(number_response.parsable, false);
20
- assert.strictEqual(number_response.error, "Please enter a list of strings");
21
- assert.strictEqual(string_response.parsable, true);
22
- assert.deepEqual(string_response.parsed_value, ["sample"]);
23
- assert.strictEqual(null_response.parsable, true);
24
- assert.deepEqual(null_response.parsed_value, []);
25
- });
26
- });
27
- //# sourceMappingURL=enum-multiple.test.js.map
@@ -1,41 +0,0 @@
1
- import { is, predicates } from "@sealcode/ts-predicates";
2
- import { FormField } from "./field.js";
3
- class EnumField extends FormField {
4
- constructor(required, options, error_message = (options2) => options2.join(", ")) {
5
- super(required);
6
- this.options = options;
7
- this.error_message = error_message;
8
- this.predicate = predicates.enum(this.options);
9
- }
10
- async isValueValid(_, value) {
11
- if (!is(value, predicates.string)) {
12
- return { valid: false, message: "expected a string" };
13
- }
14
- if (this.options.includes(value)) {
15
- return { valid: true, message: "" };
16
- }
17
- return { valid: false, message: this.error_message(this.options) };
18
- }
19
- async parse(_, value) {
20
- if (is(value, predicates.string)) {
21
- return {
22
- parsable: true,
23
- parsed_value: value,
24
- error: null
25
- };
26
- } else {
27
- return {
28
- parsable: false,
29
- parsed_value: null,
30
- error: "Please enter a string"
31
- };
32
- }
33
- }
34
- getEmptyValue() {
35
- return "";
36
- }
37
- }
38
- export {
39
- EnumField
40
- };
41
- //# sourceMappingURL=enum.js.map
@@ -1,21 +0,0 @@
1
- import assert from "assert";
2
- import { Fields } from "../../index.js";
3
- describe("enum field", () => {
4
- const ctx = {};
5
- it("validation logic", async () => {
6
- const field = new Fields.EnumField(true, ["sa", "mp", "le"]);
7
- assert.strictEqual((await field.isValueValid(ctx, 42)).valid, false);
8
- assert.strictEqual((await field.isValueValid(ctx, "mp")).valid, true);
9
- assert.strictEqual((await field.isValueValid(ctx, "notvalid")).valid, false);
10
- });
11
- it("parse function", async () => {
12
- const field = new Fields.EnumField(true, []);
13
- const string_response = await field.parse(ctx, "42");
14
- const number_response = await field.parse(ctx, 42);
15
- assert.strictEqual(string_response.parsable, true);
16
- assert.strictEqual(string_response.parsed_value, "42");
17
- assert.strictEqual(number_response.parsable, false);
18
- assert.strictEqual(number_response.error, "Please enter a string");
19
- });
20
- });
21
- //# sourceMappingURL=enum.test.js.map
@@ -1,17 +0,0 @@
1
- import { FormField } from "./field.js";
2
- class ReverseSingleReference extends FormField {
3
- constructor(required, sealious_field) {
4
- super(required);
5
- this.sealious_field = sealious_field;
6
- }
7
- async parse(ctx, raw_value) {
8
- return { parsable: true, error: null, parsed_value: raw_value };
9
- }
10
- getEmptyValue() {
11
- return [];
12
- }
13
- }
14
- export {
15
- ReverseSingleReference
16
- };
17
- //# sourceMappingURL=reverse-single-reference.js.map
@@ -1,14 +0,0 @@
1
- const boolean_handler = async (_, { name }, ___, { is_required_expr, fields_var }) => ({
2
- field: `${name}: new Fields.Boolean(${is_required_expr})`,
3
- controls: `new Controls.Checkbox(${fields_var}.${name}, { label: "${name}" })`,
4
- initial_value_edit: {
5
- fallback_value: `"false"`,
6
- parsed_value: `String(item.get("${name}"))`
7
- },
8
- main_value_sealious: `!!data.${name}`,
9
- fallback_value_sealious: "false"
10
- });
11
- export {
12
- boolean_handler
13
- };
14
- //# sourceMappingURL=boolean.js.map
@@ -1,8 +0,0 @@
1
- const date_handler = async (_, { name }, ___, { fields_var }) => ({
2
- controls: `new Controls.SimpleInput(${fields_var}.${name}, { label: "${name}", type: "date"})`,
3
- fallback_value_sealious: `undefined`
4
- });
5
- export {
6
- date_handler
7
- };
8
- //# sourceMappingURL=date.js.map
@@ -1,209 +0,0 @@
1
- import { toKebabCase, toPascalCase } from "js-convert-case";
2
- import extract_fields_from_collection from "../../../utils/extract-fields-from-collection.js";
3
- const deep_reverse_single_reference_handler = async (collection_name, {
4
- name,
5
- target,
6
- referencing_collection,
7
- intermediary_field_that_points_there,
8
- referencing_field
9
- }, ___, { is_required_expr, fields_var }) => {
10
- if (!referencing_collection || !target || !intermediary_field_that_points_there || !referencing_field) {
11
- console.warn(
12
- "missing referencing_collection, target, intermediary_field_that_points_there, or referencing_field member in extracted field info"
13
- );
14
- return { field: "" };
15
- }
16
- const referencing_fields = await extract_fields_from_collection(
17
- referencing_collection
18
- );
19
- if (referencing_fields.length == 2) {
20
- const post_create = (get_id) => `{
21
- const item_id = ${get_id};
22
- // First, we remove links refering to current item
23
- const {items: existing_links } = (await ctx.$app.collections["${referencing_collection}"]
24
- .list(ctx.$context)
25
- .filter({"${referencing_field}": item_id})
26
- .fetch()
27
- )
28
- const should_exist_ids = Object.entries(
29
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
30
- (data["${name}"] as unknown as Record<string, string>) || {}
31
- )
32
- .filter(([, value]) => value === "on")
33
- .map(([key]) => key);
34
- const to_delete = existing_links.filter(
35
- (link) => !should_exist_ids.includes(link.get("${intermediary_field_that_points_there}"))
36
- );
37
- const to_create_ids = should_exist_ids.filter(
38
- (id) => !existing_links.map((link) => link.get("${intermediary_field_that_points_there}")).includes(id)
39
- );
40
- await Promise.all(to_delete.map((item) => item.remove(ctx.$context)));
41
- // Then, we iterate over all selected values and insert appropriate missing links
42
- const promises = to_create_ids.map(async (id) => {
43
- await ctx.$app.collections["${toKebabCase(referencing_collection)}"].create(
44
- ctx.$context,
45
- {
46
- "${referencing_field}": item_id,
47
- "${intermediary_field_that_points_there}": id,
48
- }
49
- );
50
- });
51
- await Promise.all(promises);
52
- }`;
53
- return {
54
- field: `${name}: new Fields.CheckboxedListField(${is_required_expr}, async (ctx) => {
55
- const { items } = await ctx.$app.collections["${target}"]
56
- .list(ctx.$context)
57
- .fetch();
58
-
59
- return items.map((s) => ({
60
- label: s.get("name"),
61
- value: s.id,
62
- }));
63
- })`,
64
- controls: `new Controls.CheckboxedListInput(${fields_var}.${name}, {
65
- label: "${name}",
66
- })`,
67
- post_edit: post_create(`await this.getID(ctx)`),
68
- post_create: post_create(`created.id`),
69
- initial_value_edit: `Object.fromEntries((item.get("${name}") || []).map(id=>[id, "on"]))`,
70
- sealious_value: () => ""
71
- };
72
- } else {
73
- const initial_value_function_name = `get${toPascalCase(
74
- name
75
- )}TableInitialValues`;
76
- const post_create = (get_id) => `{
77
- const item_id = ${get_id};
78
- // First, we remove links refering to current item
79
- const { items: to_delete } = await ctx.$app.collections[
80
- "${toKebabCase(referencing_collection)}"
81
- ]
82
- .list(ctx.$context)
83
- .filter({ "${referencing_field}": item_id })
84
- .fetch();
85
- await Promise.all(to_delete.map((item) => item.remove(ctx.$context)));
86
-
87
- // Then, we iterate over all selected values and insert appropriate entries for the subcategories relation
88
-
89
- const promises = (data["${name}"] || [])
90
- .filter((s) => s.selected == true)
91
- .map(async (link_info) => {
92
- await ctx.$app.collections["${toKebabCase(referencing_collection)}"].create(
93
- ctx.$context,
94
- {
95
- "${referencing_field}": item_id,
96
- "${intermediary_field_that_points_there}": String(link_info["${intermediary_field_that_points_there}"]),
97
- ${referencing_fields.filter(
98
- ({ type }) => type !== "single-reference"
99
- ).map(
100
- (field) => `"${field.name}": link_info["${field.name}"]`
101
- ).join(",\n")}
102
- }
103
- );
104
- });
105
-
106
- await Promise.all(promises);
107
- }`;
108
- const initial_value = `(await ${initial_value_function_name}(ctx,item)) as unknown as FormDataValue`;
109
- return {
110
- imports: {
111
- shared: `import type { CollectionItem } from "sealious"; import type { Context } from "koa";`,
112
- edit: `import {${initial_value_function_name}} from "../shared.js"; import type { FormDataValue } from "@sealcode/sealgen";`
113
- },
114
- field: `
115
- ${name}: new Fields.Table({
116
- selected: new Fields.Boolean(false),
117
- "${referencing_field}": new Fields.SimpleFormField(true),
118
- "${intermediary_field_that_points_there}": new Fields.SimpleFormField(true),
119
- ${referencing_fields.filter(({ type }) => type !== "single-reference").map(
120
- (field) => `${field.name}: new Fields.SimpleFormField(true)`
121
- ).join(",\n")}
122
- })`,
123
- controls: `
124
- new Controls.Table(${fields_var}.${name}, {
125
- render_fields: {
126
- selected: (fctx, name, value) => /* HTML */ \`<input
127
- type="checkbox"
128
- name=\${name}
129
- \${value?.toString() == "true" ? "checked" : ""}
130
- form="\${fctx.form_id}"
131
- autocomplete="off"
132
- />\`,
133
- "${referencing_field}": (fctx, name, value) => /* HTML */ \`<input
134
- type="hidden"
135
- name=\${name}
136
- value="\${value}"
137
- form="\${fctx.form_id}"
138
- />\`,
139
- "${intermediary_field_that_points_there}": (fctx, name, value) => /* HTML */ \`<input
140
- type="hidden"
141
- name=\${name}
142
- value="\${value}"
143
- form="\${fctx.form_id}"
144
- />\`,
145
- ${referencing_fields.filter(
146
- ({ type }) => type !== "single-reference"
147
- ).map(
148
- (field) => `${field.name}: (fctx, name, value) => /* HTML */ \`<input
149
- name=\${name}
150
- value="\${value}"
151
- form="\${fctx.form_id}"
152
- autocomplete="off"
153
- />\``
154
- ).join(",\n")}
155
- },
156
- allow_adding: false,
157
- })`,
158
- top_level_shared: `export async function ${initial_value_function_name}(
159
- ctx: Context,
160
- item: CollectionItem<typeof ${toPascalCase(
161
- collection_name
162
- )}>
163
- ) {
164
- // convert from an array to array-like object
165
- return Object.fromEntries(
166
- await Promise.all([
167
- ctx.$app.collections["${toKebabCase(target)}"].list(ctx.$context).fetch(),
168
- ctx.$app.collections["${toKebabCase(
169
- referencing_collection
170
- )}"].list(ctx.$context).fetch(),
171
- ]).then(([{ items: targets }, { items: links }]) =>
172
- targets
173
- .map((target) => {
174
- return {
175
- selected: (item.get("${name}") || []).includes(
176
- target.id
177
- )
178
- ? "on"
179
- : "off",
180
- "${referencing_field}": item.id,
181
- "${intermediary_field_that_points_there}": target.id,
182
- ${referencing_fields.filter(
183
- ({ type }) => type !== "single-reference"
184
- ).map(
185
- (field) => `"${field.name}": links
186
- .find(
187
- (e) =>
188
- e.get("${intermediary_field_that_points_there}") == target.id &&
189
- e.get("${referencing_field}") == item.id
190
- )
191
- ?.get("rank") || 0,`
192
- ).join(",\n")}
193
- };
194
- })
195
- .entries()
196
- )
197
- );
198
- }`,
199
- initial_value_edit: initial_value,
200
- initial_value_create: initial_value,
201
- post_edit: post_create(`await this.getID(ctx)`),
202
- post_create: post_create(`created.id`)
203
- };
204
- }
205
- };
206
- export {
207
- deep_reverse_single_reference_handler
208
- };
209
- //# sourceMappingURL=deep-reverse-single-reference.js.map
@@ -1,49 +0,0 @@
1
- import { toPascalCase } from "js-convert-case";
2
- const default_handler = async (collection_name, { name, is_readonly, is_required }, _, __, ___, fields_var = `${toPascalCase(collection_name)}FormFields`) => {
3
- const required_s = `${toPascalCase(
4
- collection_name
5
- )}.fields.${name}.required`;
6
- const fallback_value_initial = `""`;
7
- const fallback_value_sealious = `""`;
8
- const main_value_initial = `item.get("${name}")`;
9
- const main_value_sealious = `data["${name}"]`;
10
- const parsed_value = main_value_initial;
11
- return {
12
- is_required,
13
- name,
14
- post_create: "",
15
- imports: { shared: "", edit: "" },
16
- hide_field: is_readonly,
17
- field: `${name}: new Fields.CollectionField(${required_s}, ${toPascalCase(
18
- collection_name
19
- )}.fields.${name})`,
20
- hide_control: is_readonly,
21
- controls: `new Controls.SimpleInput(${fields_var}.${name}, { label: "${name}"})`,
22
- is_required_expr: `${toPascalCase(
23
- collection_name
24
- )}.fields.${name}.required`,
25
- fields_var,
26
- top_level_shared: "",
27
- hide_initial_value_edit: is_readonly,
28
- initial_value_edit: {
29
- fallback_value: fallback_value_initial,
30
- main_value: main_value_initial,
31
- parsed_value
32
- },
33
- hide_initial_value_create: is_readonly,
34
- initial_value_create: "",
35
- pre_edit: "",
36
- post_edit: "",
37
- pre_create: "",
38
- main_value_sealious,
39
- fallback_value_sealious,
40
- sealious_value: (result) => {
41
- return result.is_required ? `${result.name}: ${result.main_value_sealious}` : `${result.name}: ${result.main_value_sealious} != null ? ${result.main_value_sealious} : ${result.fallback_value_sealious}`;
42
- },
43
- hide_sealious_value: is_readonly
44
- };
45
- };
46
- export {
47
- default_handler
48
- };
49
- //# sourceMappingURL=default.js.map
@@ -1,19 +0,0 @@
1
- import { toPascalCase } from "js-convert-case";
2
- const enum_handler = async (collection_name, { name }, _, { fields_var }) => ({
3
- // this assertion and import is only necessary because required fields
4
- // in Sealious lose the type information. Once this is fixed, we can remove this import here
5
- imports: { shared: `import type { FieldTypes } from "sealious";` },
6
- field: `${name}: new Fields.PickFromListField(
7
- ${toPascalCase(collection_name)}.fields["${name}"].required,
8
- async (ctx) =>
9
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
10
- (${toPascalCase(collection_name)}.fields["${name}"])
11
- .getAllowedValues(ctx.$app)
12
- .map((value) => ({ value, label: value }))
13
- )`,
14
- controls: `new Controls.Dropdown(${fields_var}.${name}, { label: "${name}"})`
15
- });
16
- export {
17
- enum_handler
18
- };
19
- //# sourceMappingURL=enum.js.map