@sealcode/sealgen 0.18.10 → 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 (378) hide show
  1. package/.eslintrc.cjs +7 -2
  2. package/.xunit +74 -69
  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 -3
  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 -2
  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 -4
  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 -1
  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 -3
  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 -8
  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 -2
  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/mount.d.ts +0 -1
  133. package/@types/page/list.d.sync-conflict-20250918-184318-TFDLWFG.ts +48 -0
  134. package/@types/page/list.d.sync-conflict-20250918-222046-TFDLWFG.ts +48 -0
  135. package/@types/page/list.d.ts +2 -2
  136. package/@types/page/list.sync-conflict-20250918-222048-TFDLWFG.d.ts +48 -0
  137. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-184321-TFDLWFG.ts +42 -0
  138. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-222046-TFDLWFG.ts +42 -0
  139. package/@types/page/mountable-with-fields.d.ts +3 -3
  140. package/@types/page/mountable-with-fields.sync-conflict-20250918-222044-TFDLWFG.d.ts +42 -0
  141. package/@types/page/mountable.d.sync-conflict-20250918-184306-TFDLWFG.ts +10 -0
  142. package/@types/page/mountable.d.ts +0 -1
  143. package/@types/page/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
  144. package/@types/page/page.d.ts +0 -1
  145. package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
  146. package/@types/page/props-parser.d.ts +0 -1
  147. package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
  148. package/@types/page/stateful-page.d.ts +0 -1
  149. package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
  150. package/@types/templates/shared/shared-crud-form-fields.d.ts +0 -67
  151. package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
  152. package/@types/test_utils/test-on-real-app.d.ts +0 -1
  153. package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
  154. package/@types/utils/extract-fields-from-collection.d.ts +5 -1
  155. package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
  156. package/@types/utils/wrap-attributes.d.ts +3 -0
  157. package/README.md +5 -0
  158. package/assets/file-icon.svg +5 -0
  159. package/lib/add-crud.js +80 -89
  160. package/lib/add-list-route.test.js +1 -1
  161. package/lib/add-route.js +0 -7
  162. package/lib/build.js +3 -1
  163. package/lib/cli.js +2 -5
  164. package/lib/controllers/table-add-button.stimulus.js +35 -0
  165. package/lib/forms/controls/array.js +20 -16
  166. package/lib/forms/controls/big-radio-group.js +2 -2
  167. package/lib/forms/controls/checkbox-group.js +7 -7
  168. package/lib/forms/controls/checkboxed-list-input.js +9 -2
  169. package/lib/forms/controls/controls.js +2 -2
  170. package/lib/forms/controls/derived-frame.js +5 -1
  171. package/lib/forms/controls/derived.js +1 -1
  172. package/lib/forms/controls/dropdown.js +4 -1
  173. package/lib/forms/controls/editable-collection-subset.js +2 -2
  174. package/lib/forms/controls/file.js +26 -2
  175. package/lib/forms/controls/file.test.js +2 -2
  176. package/lib/forms/controls/hidden-input.js +4 -1
  177. package/lib/forms/controls/{photo.js → image.js} +6 -7
  178. package/lib/forms/controls/{photo.test.js → image.test.js} +6 -21
  179. package/lib/forms/controls/multiple-files.js +10 -1
  180. package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
  181. package/lib/forms/controls/simple-input.js +13 -12
  182. package/lib/forms/controls/single-reference.js +4 -0
  183. package/lib/forms/controls/table.js +66 -24
  184. package/lib/forms/controls/textarea.js +4 -2
  185. package/lib/forms/controls/tickable.js +13 -5
  186. package/lib/forms/fields/boolean.js +14 -0
  187. package/lib/forms/fields/checkboxed-list.js +4 -0
  188. package/lib/forms/fields/collection-field.js +9 -0
  189. package/lib/forms/fields/color.js +10 -0
  190. package/lib/forms/fields/coordinates.js +49 -0
  191. package/lib/forms/fields/date.js +34 -0
  192. package/lib/forms/fields/datetime.js +46 -0
  193. package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
  194. package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
  195. package/lib/forms/fields/email.js +7 -0
  196. package/lib/forms/fields/enum-multiple-sealious.js +32 -0
  197. package/lib/forms/fields/field.js +32 -4
  198. package/lib/forms/fields/field.test.js +5 -5
  199. package/lib/forms/fields/fields.js +23 -8
  200. package/lib/forms/fields/file.js +33 -9
  201. package/lib/forms/fields/file.test.js +4 -16
  202. package/lib/forms/fields/float.js +10 -0
  203. package/lib/forms/fields/get-field-for-sealious.js +213 -0
  204. package/lib/forms/fields/html.js +14 -0
  205. package/lib/forms/fields/image.js +13 -0
  206. package/lib/forms/fields/int.js +23 -0
  207. package/lib/forms/fields/json.js +31 -0
  208. package/lib/forms/fields/markdown.js +14 -0
  209. package/lib/forms/fields/multiple-files.js +4 -0
  210. package/lib/forms/fields/number.js +6 -0
  211. package/lib/forms/fields/password.js +13 -0
  212. package/lib/forms/fields/pick-from-list-sealious.js +17 -0
  213. package/lib/forms/fields/pick-from-list.js +6 -2
  214. package/lib/forms/fields/proxy-field.js +3 -0
  215. package/lib/forms/fields/regexp.js +14 -0
  216. package/lib/forms/fields/simple-form-field.js +60 -2
  217. package/lib/forms/fields/single-reference.js +44 -0
  218. package/lib/forms/fields/structured-array.js +63 -12
  219. package/lib/forms/fields/table.js +28 -1
  220. package/lib/forms/fields/text.js +17 -0
  221. package/lib/forms/fields/url.js +17 -0
  222. package/lib/forms/form.js +30 -13
  223. package/lib/forms/form.test.js +3 -4
  224. package/lib/forms/multiform.js +4 -2
  225. package/lib/forms/multiform.test.js +3 -3
  226. package/lib/generate-stimulus.js +1 -0
  227. package/lib/index.js +1 -0
  228. package/lib/make-hidden-inputs.js +1 -1
  229. package/lib/mount.js +11 -0
  230. package/lib/notifier.js +0 -1
  231. package/lib/page/list.js +15 -8
  232. package/lib/page/mountable-with-fields.js +14 -6
  233. package/lib/page/mountable-with-fields.test.js +1 -1
  234. package/lib/templates/form.js +8 -9
  235. package/lib/templates/multiform.js +4 -4
  236. package/lib/templates/page.js +0 -2
  237. package/lib/templates/shared/collection-create-form.js +28 -40
  238. package/lib/templates/shared/collection-edit-form.js +40 -77
  239. package/lib/templates/shared/collection-list.js +12 -20
  240. package/lib/templates/shared/shared-crud-form-fields.js +27 -95
  241. package/lib/test_utils/test-on-real-app.js +3 -3
  242. package/lib/utils/extract-fields-from-collection.js +60 -20
  243. package/lib/utils/make-slug.js +1 -1
  244. package/lib/utils/wrap-attributes.js +20 -0
  245. package/package.json +4 -3
  246. package/src/add-crud.ts +86 -97
  247. package/src/add-list-route.test.ts +1 -1
  248. package/src/add-route.ts +0 -7
  249. package/src/build.ts +3 -1
  250. package/src/cli.ts +3 -5
  251. package/src/controllers/table-add-button.stimulus.ts +35 -0
  252. package/src/forms/controls/array.ts +23 -20
  253. package/src/forms/controls/autocomplete.ts +1 -1
  254. package/src/forms/controls/big-radio-group.ts +2 -2
  255. package/src/forms/controls/checkbox-group.ts +9 -9
  256. package/src/forms/controls/checkboxed-list-input.ts +27 -15
  257. package/src/forms/controls/controls.ts +2 -2
  258. package/src/forms/controls/derived-frame.ts +5 -1
  259. package/src/forms/controls/derived.ts +1 -1
  260. package/src/forms/controls/dropdown.ts +5 -2
  261. package/src/forms/controls/editable-collection-subset.ts +2 -2
  262. package/src/forms/controls/file.test.ts +4 -2
  263. package/src/forms/controls/file.ts +31 -5
  264. package/src/forms/controls/form-control.ts +7 -2
  265. package/src/forms/controls/hidden-input.ts +4 -1
  266. package/src/forms/controls/{photo.test.ts → image.test.ts} +5 -22
  267. package/src/forms/controls/{photo.ts → image.ts} +3 -5
  268. package/src/forms/controls/multiple-files.ts +18 -1
  269. package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +1 -1
  270. package/src/forms/controls/number.ts +1 -1
  271. package/src/forms/controls/simple-input.ts +18 -34
  272. package/src/forms/controls/single-reference.ts +10 -2
  273. package/src/forms/controls/table.ts +90 -31
  274. package/src/forms/controls/textarea.ts +6 -4
  275. package/src/forms/controls/tickable.ts +13 -5
  276. package/src/forms/fields/boolean.ts +23 -1
  277. package/src/forms/fields/checkboxed-list.ts +11 -2
  278. package/src/forms/fields/collection-field.ts +16 -1
  279. package/src/forms/fields/color.ts +9 -0
  280. package/src/forms/fields/coordinates.ts +66 -0
  281. package/src/forms/fields/date.ts +50 -0
  282. package/src/forms/fields/datetime.ts +66 -0
  283. package/src/forms/fields/deep-reverse-single-reference-list.ts +136 -0
  284. package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
  285. package/src/forms/fields/email.ts +9 -0
  286. package/src/forms/fields/enum-multiple-sealious.ts +48 -0
  287. package/src/forms/fields/field.test.ts +5 -5
  288. package/src/forms/fields/field.ts +94 -8
  289. package/src/forms/fields/fields.ts +23 -8
  290. package/src/forms/fields/file.test.ts +4 -16
  291. package/src/forms/fields/file.ts +43 -15
  292. package/src/forms/fields/float.ts +9 -0
  293. package/src/forms/fields/get-field-for-sealious.ts +304 -0
  294. package/src/forms/fields/html.ts +15 -0
  295. package/src/forms/fields/image.ts +12 -0
  296. package/src/forms/fields/int.ts +25 -0
  297. package/src/forms/fields/json.ts +48 -0
  298. package/src/forms/fields/markdown.ts +15 -0
  299. package/src/forms/fields/multiple-files.ts +10 -1
  300. package/src/forms/fields/number.ts +8 -1
  301. package/src/forms/fields/password.ts +17 -0
  302. package/src/forms/fields/pick-from-list-sealious.ts +22 -0
  303. package/src/forms/fields/pick-from-list.ts +7 -3
  304. package/src/forms/fields/proxy-field.ts +6 -1
  305. package/src/forms/fields/regexp.ts +27 -1
  306. package/src/forms/fields/simple-form-field.ts +95 -7
  307. package/src/forms/fields/single-reference.ts +62 -0
  308. package/src/forms/fields/structured-array.ts +115 -18
  309. package/src/forms/fields/table.ts +32 -1
  310. package/src/forms/fields/text.ts +18 -0
  311. package/src/forms/fields/url.ts +20 -0
  312. package/src/forms/form-types.ts +2 -0
  313. package/src/forms/form.test.ts +3 -4
  314. package/src/forms/form.ts +37 -16
  315. package/src/forms/forms.css +0 -85
  316. package/src/forms/multiform.test.ts +3 -3
  317. package/src/forms/multiform.ts +2 -0
  318. package/src/generate-stimulus.ts +1 -0
  319. package/src/index.ts +2 -1
  320. package/src/make-hidden-inputs.ts +1 -1
  321. package/src/mount.ts +14 -0
  322. package/src/notifier.ts +0 -1
  323. package/src/page/list.ts +15 -8
  324. package/src/page/mountable-with-fields.test.ts +1 -1
  325. package/src/page/mountable-with-fields.ts +18 -9
  326. package/src/register-external.ts +1 -1
  327. package/src/templates/form.ts +8 -9
  328. package/src/templates/multiform.ts +4 -4
  329. package/src/templates/page.ts +0 -2
  330. package/src/templates/shared/collection-create-form.ts +30 -66
  331. package/src/templates/shared/collection-edit-form.ts +41 -102
  332. package/src/templates/shared/collection-list.ts +12 -20
  333. package/src/templates/shared/item-delete.ts +0 -1
  334. package/src/templates/shared/shared-crud-form-fields.ts +37 -171
  335. package/src/test_utils/test-on-real-app.ts +4 -3
  336. package/src/utils/extract-fields-from-collection.ts +76 -25
  337. package/src/utils/make-slug.ts +1 -1
  338. package/src/utils/wrap-attributes.ts +17 -0
  339. package/lib/add-verbose-crud.js +0 -119
  340. package/lib/crud-field-snippets.js +0 -52
  341. package/lib/find-css-includes.js +0 -3
  342. package/lib/forms/controls/reverse-single-reference.js +0 -1
  343. package/lib/forms/fields/enum-multiple.js +0 -47
  344. package/lib/forms/fields/enum-multiple.test.js +0 -27
  345. package/lib/forms/fields/enum.js +0 -41
  346. package/lib/forms/fields/enum.test.js +0 -21
  347. package/lib/forms/fields/reverse-single-reference.js +0 -17
  348. package/lib/templates/shared/handlers/boolean.js +0 -14
  349. package/lib/templates/shared/handlers/date.js +0 -8
  350. package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
  351. package/lib/templates/shared/handlers/default.js +0 -49
  352. package/lib/templates/shared/handlers/enum.js +0 -19
  353. package/lib/templates/shared/handlers/file.js +0 -23
  354. package/lib/templates/shared/handlers/image.js +0 -32
  355. package/lib/templates/shared/handlers/int.js +0 -11
  356. package/lib/templates/shared/handlers/jdd.js +0 -10
  357. package/lib/templates/shared/handlers/single-reference.js +0 -12
  358. package/lib/templates/shared/handlers/structured-array.js +0 -33
  359. package/src/add-verbose-crud.ts +0 -138
  360. package/src/crud-field-snippets.ts +0 -57
  361. package/src/find-css-includes.ts +0 -3
  362. package/src/forms/controls/reverse-single-reference.ts +0 -50
  363. package/src/forms/fields/enum-multiple.test.ts +0 -31
  364. package/src/forms/fields/enum-multiple.ts +0 -62
  365. package/src/forms/fields/enum.test.ts +0 -25
  366. package/src/forms/fields/enum.ts +0 -56
  367. package/src/forms/fields/reverse-single-reference.ts +0 -20
  368. package/src/templates/shared/handlers/boolean.ts +0 -18
  369. package/src/templates/shared/handlers/date.ts +0 -12
  370. package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
  371. package/src/templates/shared/handlers/default.ts +0 -64
  372. package/src/templates/shared/handlers/enum.ts +0 -23
  373. package/src/templates/shared/handlers/file.ts +0 -27
  374. package/src/templates/shared/handlers/image.ts +0 -45
  375. package/src/templates/shared/handlers/int.ts +0 -15
  376. package/src/templates/shared/handlers/jdd.ts +0 -14
  377. package/src/templates/shared/handlers/single-reference.ts +0 -16
  378. package/src/templates/shared/handlers/structured-array.ts +0 -42
@@ -1,53 +1,38 @@
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
6
  const collection_fields = await extract_fields_from_collection(
8
7
  collection_name
9
8
  );
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
- );
9
+ const formFieldsVar = `${toPascalCase(collection_name)}FormFields`;
10
+ const collectionVar = `${toPascalCase(collection_name)}`;
16
11
  return formTemplate(edit_action_name, newfilefullpath, {
17
12
  success_message: "Changes saved!",
18
- postimport: `import {${toPascalCase(
19
- collection_name
20
- )}FormFields, ${toPascalCase(
13
+ postimport: `import {${formFieldsVar}, get${toPascalCase(
21
14
  collection_name
22
15
  )}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";` : ""}
16
+ import { ${collectionVar} } from "src/back/collections/collections.js";
17
+ import { ${list_action}URL } from "src/back/routes/urls.js";
18
+ import {tempstream} from "tempstream";
19
+ import type { FormDataValue } from "@sealcode/sealgen";
20
+ import type { CollectionInputWithAllKeys } from "sealious";
36
21
  `,
37
22
  fields: `...${toPascalCase(collection_name)}FormFields`,
38
23
  controls: `
39
24
  new Controls.FormHeader("Edit ${toPascalCase(
40
25
  collection_name
41
26
  )}"),
42
- ...${toPascalCase(collection_name)}FormControls`,
27
+ ...get${toPascalCase(collection_name)}FormControls()`,
43
28
  can_access: `canAccess = async (ctx: Context) => {
44
29
  const policy = ${toPascalCase(collection_name)}.getPolicy("edit");
45
30
  const response = await policy.check(ctx.$context);
46
31
  return { canAccess: response?.allowed || false, message: response?.reason || "" };
47
32
  };`,
48
33
  onsubmit: `
49
- async onSubmit(ctx: Context) {
50
- const data = await this.getParsedValues(ctx);
34
+ async onSubmit(ctx: Context, formData: FormData) {
35
+ const fctx = this.makeFormControlContext(ctx, formData, true);
51
36
  const id = await this.getID(ctx);
52
37
  const {items: [item]} = await ctx.$app.collections["${toKebabCase(
53
38
  collection_name
@@ -60,33 +45,34 @@ async function editItemFormTemplate(edit_action_name, newfilefullpath, collectio
60
45
  throw new Error("Unknown id: " + id);
61
46
  }
62
47
 
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
48
 
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
- }
49
+ item.setMultipleExtraSafe(
50
+ {
51
+ ${collection_fields.map(
52
+ (field_info) => field_info.form_field.generateCreateValueGetter(
53
+ field_info,
54
+ {
55
+ form_field_types: "FormFieldTypes",
56
+ sealious_field: `${collectionVar}.fields${wrapAttribute(
57
+ field_info.name
58
+ )}`,
59
+ form_fields: "fields"
60
+ }
61
+ )
62
+ ).join(",\n")}
63
+ } as CollectionInputWithAllKeys<typeof ${collectionVar}>
73
64
  );
65
+
74
66
  await item.save(ctx.$context);
75
67
 
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")}
68
+ for(const field of Object.values(${formFieldsVar})){
69
+ await field.postSealiousEdit(ctx, item, formData)
70
+ }
79
71
  }
80
72
  `,
81
73
  other_methods: `
82
74
  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]
75
+ const param_name = "id";
90
76
  const id = ctx.params[param_name];
91
77
  if (!id) {
92
78
  throw new Error("Missing URL parameter: " + param_name);
@@ -94,7 +80,7 @@ async function editItemFormTemplate(edit_action_name, newfilefullpath, collectio
94
80
  return id
95
81
  }
96
82
  `,
97
- get_initial_values: `async getInitialValues(ctx: Context) {
83
+ get_initial_values: `async getInitialValues(ctx: Context): Promise<{ [key in keyof typeof fields]: FormDataValue | undefined }> {
98
84
  const id = await this.getID(ctx);
99
85
 
100
86
  const {
@@ -110,36 +96,13 @@ async function editItemFormTemplate(edit_action_name, newfilefullpath, collectio
110
96
  }
111
97
 
112
98
  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")}
99
+
100
+ ${collection_fields.map(
101
+ (field_info) => field_info.form_field.generateInitialValue(field_info, {
102
+ form_field_types: "FieldTypes",
103
+ form_fields: "fields"
104
+ })
105
+ ).join(",\n")}
143
106
  };
144
107
  }
145
108
  `,
@@ -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 HasAllFields)["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},
@@ -1,114 +1,46 @@
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
- }
4
+ import { wrapAttribute } from "../../utils/wrap-attributes.js";
61
5
  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
- })
6
+ const collection_fields = await extract_fields_from_collection(
7
+ collection_name
75
8
  );
9
+ const uppercase_collection = toPascalCase(collection_name);
76
10
  const result = `import { Controls, Fields } from "@sealcode/sealgen";
77
- import { ${uppercase_collection} } from "${importPath(
78
- "src/back/collections/collections.js"
79
- )}";
80
-
11
+ import { ${uppercase_collection} } from "src/back/collections/collections.js";
81
12
  ${Array.from(
82
13
  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
-
14
+ collection_fields.map(
15
+ (field_info) => field_info.form_field.generateImportsForFieldList(field_info)
16
+ ).flat().map(
17
+ ({ what, from, as }) => `import {${what}${as ? ` as ${as}` : ""} } from "${from}"`
18
+ )
19
+ ).values()
20
+ ).join(";\n")}
90
21
 
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")}
22
+ export const ${toPascalCase(collection_name)}FormFields = <const>{
23
+ ${collection_fields.map((field_info) => {
24
+ return `${field_info.name}: ${field_info.form_field.generateFieldDeclaration(field_info, {
25
+ form_field_types: "Fields",
26
+ sealious_field: `${uppercase_collection}.fields${wrapAttribute(
27
+ field_info.name
28
+ )}`
29
+ })}`;
30
+ }).join(",\n")}
94
31
  };
95
32
 
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")}
33
+ const fields = ${toPascalCase(collection_name)}FormFields
105
34
 
35
+ export const get${toPascalCase(
36
+ collection_name
37
+ )}FormControls: () => Controls.FormControl[] = () => [
38
+ ${collection_fields.map(({ name }) => `fields${wrapAttribute(name)}.getControl()`).join(",\n")}
39
+ ];
106
40
  `;
107
41
  return formatWithPrettier(result);
108
42
  }
109
43
  export {
110
- field_handlers,
111
- getFieldHandler,
112
44
  sharedCrudFormFields
113
45
  };
114
46
  //# sourceMappingURL=shared-crud-form-fields.js.map
@@ -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();
@@ -23,7 +24,7 @@ class RealAppTest {
23
24
  test_app.container_name = `sealgen-test-mongo-${timestamp}`;
24
25
  console.log(" 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
29
  console.log(" installing dependencies and sealgen...");
29
30
  await execAsync(
@@ -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}`,
@@ -3,15 +3,20 @@ import { exec } from "./utils.js";
3
3
  const target_locreq = _locreq(process.cwd());
4
4
  import { promises as fs } from "fs";
5
5
  import { is, predicates } from "@sealcode/ts-predicates";
6
+ import { sealiousFieldInfoToFormField } from "../forms/fields/get-field-for-sealious.js";
6
7
  const counter = function* () {
7
8
  let i = 0;
8
9
  while (true) {
9
10
  yield i++;
10
11
  }
11
12
  }();
13
+ const cache = {};
12
14
  async function extract_fields_from_collection(collection_name) {
15
+ if (cache[collection_name]) {
16
+ return cache[collection_name];
17
+ }
13
18
  const extractor_code = `import {default as the_app} from "./app.js";
14
- const c = new the_app().collections["${collection_name}"];
19
+ const c = new the_app({}).collections["${collection_name}"];
15
20
  const fields = [];
16
21
  for (const field_name in c.fields){
17
22
  let field = c.fields[field_name];
@@ -21,14 +26,17 @@ for (const field_name in c.fields){
21
26
  let referencing_field = null;
22
27
  let intermediary_field_that_points_there = null;
23
28
  let is_readonly = false;
24
- let is_required = field.required;
29
+ let is_required = field.required || false;
25
30
  let subfields = [];
26
- if(["derived-value", "cached-value", "settable-by"].includes(type)){
31
+ if(["derived-value", "cached-value", "settable-by", "control-access"].includes(type)){
27
32
  type = field.virtual_field.typeName;
28
33
  }
29
34
  if(["derived-value", "cached-value", "reverse-single-reference"].includes(field.typeName)){
30
35
  is_readonly = true;
31
36
  }
37
+ if(type == "single-reference"){
38
+ target = field.target_collection;
39
+ }
32
40
  if(type == "deep-reverse-single-reference" || type =="reverse-single-reference"){
33
41
  target = field.target_collection;
34
42
  referencing_collection = field.referencing_collection;
@@ -46,24 +54,56 @@ for (const field_name in c.fields){
46
54
  `dist/back/___extract_fields--${counter.next().value || 0}.js`
47
55
  );
48
56
  await fs.writeFile(extractor_code_path, extractor_code);
49
- const { stdout } = await exec("node", [extractor_code_path]);
50
- await fs.unlink(extractor_code_path);
51
- const ret = JSON.parse(stdout);
52
- if (!is(
53
- ret,
54
- predicates.array(
55
- predicates.shape({
56
- name: predicates.string,
57
- type: predicates.string,
58
- is_readonly: predicates.boolean
59
- })
60
- )
61
- )) {
62
- throw new Error(
63
- "Encountered a problem while extracting the names of fields from collection. Got: " + stdout
57
+ const result = exec("node", [extractor_code_path]).then(async ({ stdout }) => {
58
+ await fs.unlink(extractor_code_path);
59
+ const ret = JSON.parse(stdout);
60
+ if (!is(
61
+ ret,
62
+ predicates.array(
63
+ predicates.shape({
64
+ name: predicates.string,
65
+ type: predicates.string,
66
+ is_readonly: predicates.boolean,
67
+ target: predicates.or(
68
+ predicates.string,
69
+ predicates.null
70
+ ),
71
+ referencing_collection: predicates.or(
72
+ predicates.string,
73
+ predicates.null
74
+ ),
75
+ referencing_field: predicates.or(
76
+ predicates.string,
77
+ predicates.null
78
+ ),
79
+ is_required: predicates.boolean,
80
+ intermediary_field_that_points_there: predicates.or(
81
+ predicates.string,
82
+ predicates.null
83
+ ),
84
+ subfields: predicates.array(
85
+ predicates.shape({ name: predicates.string })
86
+ )
87
+ })
88
+ )
89
+ )) {
90
+ throw new Error(
91
+ "Encountered a problem while extracting the names of fields from collection. Got: " + stdout
92
+ );
93
+ }
94
+ const result2 = await Promise.all(
95
+ ret.map(async (field_info) => ({
96
+ ...field_info,
97
+ form_field: await sealiousFieldInfoToFormField(field_info)
98
+ }))
64
99
  );
65
- }
66
- return ret;
100
+ return result2;
101
+ }).catch((e) => {
102
+ console.error("ERROR", e);
103
+ process.exit(1);
104
+ });
105
+ cache[collection_name] = result;
106
+ return result;
67
107
  }
68
108
  export {
69
109
  extract_fields_from_collection as default
@@ -1,5 +1,5 @@
1
1
  function makeSlug(t) {
2
- return t.replaceAll(/\P{General_Category=Letter}/g, "-").replaceAll(/-+/g, "-");
2
+ return t.replaceAll(/\P{General_Category=Letter}/gu, "-").replaceAll(/-+/g, "-");
3
3
  }
4
4
  export {
5
5
  makeSlug
@@ -0,0 +1,20 @@
1
+ function needsQuotes(str) {
2
+ try {
3
+ new Function(`var obj = { ${str}: 1 };`);
4
+ return false;
5
+ } catch {
6
+ return true;
7
+ }
8
+ }
9
+ function wrapAttribute(name) {
10
+ return needsQuotes(name) ? `["${name}"]` : `.${name}`;
11
+ }
12
+ function wrapKeyName(name) {
13
+ return needsQuotes(name) ? `["${name}"]` : `${name}`;
14
+ }
15
+ export {
16
+ needsQuotes,
17
+ wrapAttribute,
18
+ wrapKeyName
19
+ };
20
+ //# sourceMappingURL=wrap-attributes.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sealcode/sealgen",
3
- "version": "0.18.10",
3
+ "version": "0.19.0",
4
4
  "description": "Module to automate adding routes and collections to a sealious application",
5
5
  "main": "lib/index.js",
6
6
  "type": "module",
@@ -55,7 +55,7 @@
55
55
  "playwright": "^1.29.2",
56
56
  "source-map-support": "^0.5.21",
57
57
  "ts-node": "^10.9.1",
58
- "typescript": "^4.7",
58
+ "typescript": "5.9",
59
59
  "wait-port": "^1.0.4"
60
60
  },
61
61
  "types": "./@types/index.d.ts",
@@ -90,6 +90,7 @@
90
90
  "peerDependencies": {
91
91
  "koa": "^2.13.0",
92
92
  "koa-responsive-image-router": "^0.2.24",
93
- "sealious": "^0.21"
93
+ "sealious": "^0.21",
94
+ "stimulus": "^3.2.2"
94
95
  }
95
96
  }