@sealcode/sealgen 0.18.10 → 0.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/.xunit +74 -69
  2. package/@types/add-crud.d.sync-conflict-20250918-184311-TFDLWFG.ts +1 -0
  3. package/@types/builders/colors-builder.d.sync-conflict-20250918-184323-TFDLWFG.ts +10 -0
  4. package/@types/builders/colors-builder.d.ts +1 -1
  5. package/@types/builders/fonts-builder.d.sync-conflict-20250918-184322-TFDLWFG.ts +7 -0
  6. package/@types/builders/fonts-builder.d.ts +1 -1
  7. package/@types/controllers/table-add-button.d.ts +6 -0
  8. package/@types/controllers/table-add-button.stimulus.d.ts +6 -0
  9. package/@types/crud-field-snippets.d.sync-conflict-20250918-184323-TFDLWFG.ts +1 -0
  10. package/@types/crud-field-snippets.d.ts +1 -3
  11. package/@types/forms/controls/array.d.sync-conflict-20250918-184306-TFDLWFG.ts +33 -0
  12. package/@types/forms/controls/array.d.ts +1 -3
  13. package/@types/forms/controls/array.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  14. package/@types/forms/controls/autocomplete.d.sync-conflict-20250918-222042-TFDLWFG.ts +22 -0
  15. package/@types/forms/controls/autocomplete.d.ts +1 -1
  16. package/@types/forms/controls/checkbox-group.d.sync-conflict-20250918-184319-TFDLWFG.ts +21 -0
  17. package/@types/forms/controls/checkbox-group.d.ts +3 -3
  18. package/@types/forms/controls/checkboxed-list-input.d.sync-conflict-20250918-184323-TFDLWFG.ts +21 -0
  19. package/@types/forms/controls/checkboxed-list-input.d.ts +3 -3
  20. package/@types/forms/controls/controls.d.ts +2 -2
  21. package/@types/forms/controls/derived-frame.d.sync-conflict-20250918-184314-TFDLWFG.ts +19 -0
  22. package/@types/forms/controls/derived-frame.d.ts +0 -2
  23. package/@types/forms/controls/dropdown.d.sync-conflict-20250918-222044-TFDLWFG.ts +30 -0
  24. package/@types/forms/controls/dropdown.d.ts +1 -1
  25. package/@types/forms/controls/file.d.sync-conflict-20250918-222045-TFDLWFG.ts +13 -0
  26. package/@types/forms/controls/file.d.ts +1 -2
  27. package/@types/forms/controls/form-control.d.sync-conflict-20250918-184322-TFDLWFG.ts +19 -0
  28. package/@types/forms/controls/form-control.d.sync-conflict-20250918-222046-TFDLWFG.ts +19 -0
  29. package/@types/forms/controls/form-control.d.ts +7 -4
  30. package/@types/forms/controls/image.d.ts +19 -0
  31. package/@types/forms/controls/image.test.d.ts +1 -0
  32. package/@types/forms/controls/multiple-files.d.sync-conflict-20250918-184318-TFDLWFG.ts +42 -0
  33. package/@types/forms/controls/multiple-files.d.ts +3 -1
  34. package/@types/forms/controls/multiple-images.d.ts +19 -0
  35. package/@types/forms/controls/number.d.sync-conflict-20250918-222046-TFDLWFG.ts +13 -0
  36. package/@types/forms/controls/number.d.ts +1 -1
  37. package/@types/forms/controls/photo.d.sync-conflict-20250918-184321-TFDLWFG.ts +19 -0
  38. package/@types/forms/controls/photo.d.ts +3 -5
  39. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-184310-TFDLWFG.ts +33 -0
  40. package/@types/forms/controls/simple-input.d.sync-conflict-20250918-222042-TFDLWFG.ts +33 -0
  41. package/@types/forms/controls/simple-input.d.ts +5 -4
  42. package/@types/forms/controls/simple-input.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
  43. package/@types/forms/controls/single-reference.d.ts +3 -2
  44. package/@types/forms/controls/table.d.sync-conflict-20250918-184302-TFDLWFG.ts +39 -0
  45. package/@types/forms/controls/table.d.ts +8 -3
  46. package/@types/forms/controls/table.sync-conflict-20250918-222042-TFDLWFG.d.ts +39 -0
  47. package/@types/forms/controls/textarea.d.sync-conflict-20250918-222045-TFDLWFG.ts +25 -0
  48. package/@types/forms/controls/textarea.d.ts +3 -3
  49. package/@types/forms/fields/boolean.d.sync-conflict-20250918-184325-TFDLWFG.ts +22 -0
  50. package/@types/forms/fields/boolean.d.ts +6 -1
  51. package/@types/forms/fields/boolean.sync-conflict-20250918-222042-TFDLWFG.d.ts +22 -0
  52. package/@types/forms/fields/checkboxed-list.d.sync-conflict-20250918-184325-TFDLWFG.ts +23 -0
  53. package/@types/forms/fields/checkboxed-list.d.ts +3 -1
  54. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-184319-TFDLWFG.ts +22 -0
  55. package/@types/forms/fields/collection-field.d.sync-conflict-20250918-222047-TFDLWFG.ts +22 -0
  56. package/@types/forms/fields/collection-field.d.ts +8 -1
  57. package/@types/forms/fields/color.d.ts +4 -0
  58. package/@types/forms/fields/coordinates.d.sync-conflict-20250918-222044-TFDLWFG.ts +14 -0
  59. package/@types/forms/fields/coordinates.d.ts +14 -0
  60. package/@types/forms/fields/date.d.ts +13 -0
  61. package/@types/forms/fields/datetime.d.sync-conflict-20250918-222050-TFDLWFG.ts +4 -0
  62. package/@types/forms/fields/datetime.d.ts +14 -0
  63. package/@types/forms/fields/deep-reverse-single-reference-list.d.ts +20 -0
  64. package/@types/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
  65. package/@types/forms/fields/email.d.sync-conflict-20250918-184303-TFDLWFG.ts +8 -0
  66. package/@types/forms/fields/email.d.ts +3 -0
  67. package/@types/forms/fields/enum-multiple-sealious.d.ts +16 -0
  68. package/@types/forms/fields/enum-multiple-sealious.sync-conflict-20250918-222047-TFDLWFG.d.ts +16 -0
  69. package/@types/forms/fields/field.d.sync-conflict-20250918-184306-TFDLWFG.ts +70 -0
  70. package/@types/forms/fields/field.d.ts +37 -5
  71. package/@types/forms/fields/fields.d.sync-conflict-20250918-184314-TFDLWFG.ts +29 -0
  72. package/@types/forms/fields/fields.d.ts +23 -8
  73. package/@types/forms/fields/file.d.sync-conflict-20250918-184310-TFDLWFG.ts +23 -0
  74. package/@types/forms/fields/file.d.sync-conflict-20250918-222046-TFDLWFG.ts +23 -0
  75. package/@types/forms/fields/file.d.ts +11 -5
  76. package/@types/forms/fields/file.sync-conflict-20250918-222049-TFDLWFG.d.ts +23 -0
  77. package/@types/forms/fields/float.d.ts +4 -0
  78. package/@types/forms/fields/get-field-for-sealious.d.sync-conflict-20250918-222046-TFDLWFG.ts +29 -0
  79. package/@types/forms/fields/get-field-for-sealious.d.ts +31 -0
  80. package/@types/forms/fields/get-field-for-sealious.sync-conflict-20250918-222042-TFDLWFG.d.ts +29 -0
  81. package/@types/forms/fields/html.d.ts +6 -0
  82. package/@types/forms/fields/image.d.sync-conflict-20250918-222042-TFDLWFG.ts +5 -0
  83. package/@types/forms/fields/image.d.ts +5 -0
  84. package/@types/forms/fields/int.d.ts +6 -0
  85. package/@types/forms/fields/json.d.ts +13 -0
  86. package/@types/forms/fields/markdown.d.ts +6 -0
  87. package/@types/forms/fields/multiple-files.d.sync-conflict-20250918-184304-TFDLWFG.ts +16 -0
  88. package/@types/forms/fields/multiple-files.d.ts +3 -1
  89. package/@types/forms/fields/number.d.sync-conflict-20250918-184317-TFDLWFG.ts +25 -0
  90. package/@types/forms/fields/number.d.sync-conflict-20250918-222047-TFDLWFG.ts +25 -0
  91. package/@types/forms/fields/number.d.ts +3 -1
  92. package/@types/forms/fields/password.d.ts +5 -0
  93. package/@types/forms/fields/pick-from-list-sealious.d.ts +11 -0
  94. package/@types/forms/fields/pick-from-list.d.sync-conflict-20250918-184322-TFDLWFG.ts +15 -0
  95. package/@types/forms/fields/pick-from-list.d.ts +4 -3
  96. package/@types/forms/fields/proxy-field.d.sync-conflict-20250918-184307-TFDLWFG.ts +15 -0
  97. package/@types/forms/fields/proxy-field.d.ts +3 -1
  98. package/@types/forms/fields/regexp.d.sync-conflict-20250918-184305-TFDLWFG.ts +21 -0
  99. package/@types/forms/fields/regexp.d.sync-conflict-20250918-222045-TFDLWFG.ts +21 -0
  100. package/@types/forms/fields/regexp.d.ts +6 -1
  101. package/@types/forms/fields/regexp.sync-conflict-20250918-222047-TFDLWFG.d.ts +21 -0
  102. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-184309-TFDLWFG.ts +29 -0
  103. package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-222044-TFDLWFG.ts +29 -0
  104. package/@types/forms/fields/simple-form-field.d.ts +23 -3
  105. package/@types/forms/fields/simple-form-field.sync-conflict-20250918-222049-TFDLWFG.d.ts +29 -0
  106. package/@types/forms/fields/single-reference.d.ts +19 -0
  107. package/@types/forms/fields/single-reference.sync-conflict-20250918-222043-TFDLWFG.d.ts +10 -0
  108. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-184302-TFDLWFG.ts +27 -0
  109. package/@types/forms/fields/structured-array.d.sync-conflict-20250918-222049-TFDLWFG.ts +27 -0
  110. package/@types/forms/fields/structured-array.d.ts +19 -10
  111. package/@types/forms/fields/structured-array.sync-conflict-20250918-222047-TFDLWFG.d.ts +27 -0
  112. package/@types/forms/fields/table.d.sync-conflict-20250918-184303-TFDLWFG.ts +16 -0
  113. package/@types/forms/fields/table.d.ts +3 -0
  114. package/@types/forms/fields/text.d.ts +6 -0
  115. package/@types/forms/fields/url.d.ts +6 -0
  116. package/@types/forms/form-types.d.sync-conflict-20250918-222045-TFDLWFG.ts +26 -0
  117. package/@types/forms/form-types.d.ts +2 -0
  118. package/@types/forms/form.d.sync-conflict-20250918-184315-TFDLWFG.ts +32 -0
  119. package/@types/forms/form.d.sync-conflict-20250918-222049-TFDLWFG.ts +32 -0
  120. package/@types/forms/form.d.ts +10 -8
  121. package/@types/forms/form.sync-conflict-20250918-222049-TFDLWFG.d.ts +33 -0
  122. package/@types/forms/form.test.d.sync-conflict-20250918-184318-TFDLWFG.ts +6 -0
  123. package/@types/forms/form.test.d.sync-conflict-20250918-222047-TFDLWFG.ts +6 -0
  124. package/@types/forms/form.test.d.ts +2 -2
  125. package/@types/forms/multiform.d.sync-conflict-20250918-184308-TFDLWFG.ts +23 -0
  126. package/@types/forms/multiform.d.ts +1 -2
  127. package/@types/forms/multiform.sync-conflict-20250918-222044-TFDLWFG.d.ts +23 -0
  128. package/@types/index.d.sync-conflict-20250918-184316-TFDLWFG.ts +46 -0
  129. package/@types/index.d.ts +2 -2
  130. package/@types/mount.d.sync-conflict-20250918-184320-TFDLWFG.ts +6 -0
  131. package/@types/mount.d.ts +0 -1
  132. package/@types/page/list.d.sync-conflict-20250918-184318-TFDLWFG.ts +48 -0
  133. package/@types/page/list.d.sync-conflict-20250918-222046-TFDLWFG.ts +48 -0
  134. package/@types/page/list.d.ts +2 -2
  135. package/@types/page/list.sync-conflict-20250918-222048-TFDLWFG.d.ts +48 -0
  136. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-184321-TFDLWFG.ts +42 -0
  137. package/@types/page/mountable-with-fields.d.sync-conflict-20250918-222046-TFDLWFG.ts +42 -0
  138. package/@types/page/mountable-with-fields.d.ts +3 -3
  139. package/@types/page/mountable-with-fields.sync-conflict-20250918-222044-TFDLWFG.d.ts +42 -0
  140. package/@types/page/mountable.d.sync-conflict-20250918-184306-TFDLWFG.ts +10 -0
  141. package/@types/page/mountable.d.ts +0 -1
  142. package/@types/page/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
  143. package/@types/page/page.d.ts +0 -1
  144. package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
  145. package/@types/page/props-parser.d.ts +0 -1
  146. package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
  147. package/@types/page/stateful-page.d.ts +0 -1
  148. package/@types/register-external.d.ts +2 -2
  149. package/@types/templates/form.d.ts +1 -3
  150. package/@types/templates/jdd-component.d.ts +1 -1
  151. package/@types/templates/page.d.ts +1 -1
  152. package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
  153. package/@types/templates/shared/shared-crud-form-fields.d.ts +1 -68
  154. package/@types/templates/templates.d.ts +1 -21
  155. package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
  156. package/@types/test_utils/test-on-real-app.d.ts +0 -1
  157. package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
  158. package/@types/utils/extract-fields-from-collection.d.ts +5 -1
  159. package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
  160. package/@types/utils/wrap-attributes.d.ts +3 -0
  161. package/README.md +5 -0
  162. package/assets/file-icon.svg +5 -0
  163. package/eslint.config.mjs +56 -0
  164. package/lib/add-crud.js +77 -89
  165. package/lib/add-jdd-component.js +3 -3
  166. package/lib/add-list-route.test.js +1 -1
  167. package/lib/add-route.js +2 -9
  168. package/lib/build.js +6 -4
  169. package/lib/builders/backend-ts-builder.js +0 -1
  170. package/lib/builders/colors-builder.js +11 -8
  171. package/lib/builders/fonts-builder.js +0 -1
  172. package/lib/builders/frontend-ts-builder.js +0 -1
  173. package/lib/cli.js +4 -7
  174. package/lib/components/tabs.js +36 -36
  175. package/lib/controllers/table-add-button.stimulus.js +35 -0
  176. package/lib/esbuild-plugins/rewrite-asset-imports.js +7 -10
  177. package/lib/forms/controls/array.js +25 -22
  178. package/lib/forms/controls/big-radio-group.js +2 -2
  179. package/lib/forms/controls/checkbox-group.js +7 -7
  180. package/lib/forms/controls/checkboxed-list-input.js +7 -1
  181. package/lib/forms/controls/checkboxed-list-input.test.js +6 -6
  182. package/lib/forms/controls/controls.js +2 -2
  183. package/lib/forms/controls/derived-frame.js +8 -4
  184. package/lib/forms/controls/derived.js +1 -1
  185. package/lib/forms/controls/dropdown.js +5 -3
  186. package/lib/forms/controls/editable-collection-subset.js +2 -2
  187. package/lib/forms/controls/file.js +26 -2
  188. package/lib/forms/controls/file.test.js +2 -2
  189. package/lib/forms/controls/form-control.js +1 -1
  190. package/lib/forms/controls/hidden-input.js +4 -1
  191. package/lib/forms/controls/{photo.js → image.js} +6 -7
  192. package/lib/forms/controls/{photo.test.js → image.test.js} +8 -23
  193. package/lib/forms/controls/multiple-files.js +10 -1
  194. package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
  195. package/lib/forms/controls/simple-input.js +13 -12
  196. package/lib/forms/controls/single-reference.js +4 -0
  197. package/lib/forms/controls/single-reference.test.js +1 -1
  198. package/lib/forms/controls/table.js +62 -25
  199. package/lib/forms/controls/textarea.js +5 -3
  200. package/lib/forms/controls/tickable.js +13 -5
  201. package/lib/forms/fields/boolean.js +14 -0
  202. package/lib/forms/fields/checkboxed-list.js +4 -0
  203. package/lib/forms/fields/collection-field.js +9 -0
  204. package/lib/forms/fields/color.js +10 -0
  205. package/lib/forms/fields/coordinates.js +49 -0
  206. package/lib/forms/fields/date.js +34 -0
  207. package/lib/forms/fields/datetime.js +46 -0
  208. package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
  209. package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
  210. package/lib/forms/fields/email.js +7 -0
  211. package/lib/forms/fields/enum-multiple-sealious.js +32 -0
  212. package/lib/forms/fields/field.js +32 -4
  213. package/lib/forms/fields/field.test.js +8 -8
  214. package/lib/forms/fields/fields.js +23 -8
  215. package/lib/forms/fields/file.js +33 -9
  216. package/lib/forms/fields/file.test.js +5 -17
  217. package/lib/forms/fields/float.js +10 -0
  218. package/lib/forms/fields/get-field-for-sealious.js +213 -0
  219. package/lib/forms/fields/html.js +14 -0
  220. package/lib/forms/fields/image.js +13 -0
  221. package/lib/forms/fields/int.js +23 -0
  222. package/lib/forms/fields/json.js +31 -0
  223. package/lib/forms/fields/markdown.js +14 -0
  224. package/lib/forms/fields/multiple-files.js +4 -0
  225. package/lib/forms/fields/number.js +6 -0
  226. package/lib/forms/fields/password.js +13 -0
  227. package/lib/forms/fields/pick-from-list-sealious.js +17 -0
  228. package/lib/forms/fields/pick-from-list.js +6 -2
  229. package/lib/forms/fields/proxy-field.js +3 -0
  230. package/lib/forms/fields/regexp.js +14 -0
  231. package/lib/forms/fields/simple-form-field.js +61 -2
  232. package/lib/forms/fields/single-reference.js +44 -0
  233. package/lib/forms/fields/structured-array.js +61 -12
  234. package/lib/forms/fields/table.js +29 -2
  235. package/lib/forms/fields/text.js +17 -0
  236. package/lib/forms/fields/url.js +17 -0
  237. package/lib/forms/form.js +30 -14
  238. package/lib/forms/form.test.js +5 -7
  239. package/lib/forms/multiform.js +10 -9
  240. package/lib/forms/multiform.test.js +5 -5
  241. package/lib/generate-collections.js +2 -3
  242. package/lib/generate-components.js +2 -3
  243. package/lib/generate-routes.js +3 -5
  244. package/lib/generate-routes.test.js +7 -16
  245. package/lib/generate-stimulus.js +4 -4
  246. package/lib/get-fonts.js +29 -27
  247. package/lib/index.js +1 -0
  248. package/lib/make-env.js +1 -1
  249. package/lib/make-hidden-inputs.js +4 -4
  250. package/lib/mount.js +11 -1
  251. package/lib/notifier.js +3 -4
  252. package/lib/page/list.js +20 -15
  253. package/lib/page/mountable-with-fields.js +14 -6
  254. package/lib/page/mountable-with-fields.test.js +1 -1
  255. package/lib/page/mountable.js +0 -1
  256. package/lib/page/page.js +0 -1
  257. package/lib/register-external.js +4 -4
  258. package/lib/templates/form.js +9 -10
  259. package/lib/templates/jdd-component.js +1 -1
  260. package/lib/templates/jdd-editor.js +1 -1
  261. package/lib/templates/multiform.js +4 -4
  262. package/lib/templates/page.js +1 -3
  263. package/lib/templates/shared/collection-create-form.js +31 -44
  264. package/lib/templates/shared/collection-edit-form.js +43 -81
  265. package/lib/templates/shared/collection-list.js +13 -21
  266. package/lib/templates/shared/shared-crud-form-fields.js +28 -98
  267. package/lib/test_utils/exec_async.js +3 -3
  268. package/lib/test_utils/test-on-real-app.js +12 -14
  269. package/lib/utils/extract-fields-from-collection.js +60 -20
  270. package/lib/utils/make-slug.js +1 -1
  271. package/lib/utils/wrap-attributes.js +20 -0
  272. package/lib/utils/write-file.js +1 -1
  273. package/package.json +11 -9
  274. package/src/add-collection.ts +1 -3
  275. package/src/add-crud.ts +84 -100
  276. package/src/add-jdd-component.ts +4 -5
  277. package/src/add-list-route.test.ts +1 -1
  278. package/src/add-route.ts +3 -13
  279. package/src/build.ts +6 -4
  280. package/src/builders/backend-ts-builder.ts +0 -1
  281. package/src/builders/builder.ts +4 -1
  282. package/src/builders/colors-builder.ts +11 -9
  283. package/src/builders/css-builder.ts +4 -1
  284. package/src/builders/fonts-builder.ts +0 -1
  285. package/src/builders/frontend-ts-builder.ts +0 -1
  286. package/src/cli.ts +5 -7
  287. package/src/components/tabs.ts +38 -37
  288. package/src/components/toggle-modal.ts +1 -1
  289. package/src/controllers/table-add-button.stimulus.ts +35 -0
  290. package/src/esbuild-plugins/rewrite-asset-imports.ts +7 -10
  291. package/src/forms/controls/array.ts +35 -36
  292. package/src/forms/controls/autocomplete.ts +2 -2
  293. package/src/forms/controls/big-radio-group.ts +4 -4
  294. package/src/forms/controls/checkbox-group.ts +10 -10
  295. package/src/forms/controls/checkboxed-list-input.test.ts +6 -6
  296. package/src/forms/controls/checkboxed-list-input.ts +16 -8
  297. package/src/forms/controls/controls.ts +2 -2
  298. package/src/forms/controls/derived-frame.ts +16 -11
  299. package/src/forms/controls/derived.ts +7 -6
  300. package/src/forms/controls/dropdown.ts +13 -13
  301. package/src/forms/controls/editable-collection-subset.ts +4 -3
  302. package/src/forms/controls/field-group.ts +1 -1
  303. package/src/forms/controls/file.test.ts +4 -2
  304. package/src/forms/controls/file.ts +30 -7
  305. package/src/forms/controls/form-control.ts +8 -3
  306. package/src/forms/controls/hidden-input.ts +5 -1
  307. package/src/forms/controls/html.ts +1 -0
  308. package/src/forms/controls/{photo.test.ts → image.test.ts} +7 -24
  309. package/src/forms/controls/{photo.ts → image.ts} +4 -6
  310. package/src/forms/controls/multiple-files.ts +23 -8
  311. package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +2 -2
  312. package/src/forms/controls/number.ts +1 -1
  313. package/src/forms/controls/simple-input.ts +21 -33
  314. package/src/forms/controls/single-reference.test.ts +1 -1
  315. package/src/forms/controls/single-reference.ts +11 -3
  316. package/src/forms/controls/table.ts +87 -33
  317. package/src/forms/controls/textarea.ts +7 -5
  318. package/src/forms/controls/tickable.ts +13 -7
  319. package/src/forms/fields/boolean.ts +27 -2
  320. package/src/forms/fields/checkboxed-list.ts +11 -2
  321. package/src/forms/fields/collection-field.ts +21 -3
  322. package/src/forms/fields/color.ts +9 -0
  323. package/src/forms/fields/coordinates.ts +66 -0
  324. package/src/forms/fields/date.ts +50 -0
  325. package/src/forms/fields/datetime.ts +66 -0
  326. package/src/forms/fields/deep-reverse-single-reference-list.ts +130 -0
  327. package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
  328. package/src/forms/fields/email.ts +10 -1
  329. package/src/forms/fields/enum-multiple-sealious.ts +48 -0
  330. package/src/forms/fields/existing-sealious-value.ts +1 -1
  331. package/src/forms/fields/field.test.ts +8 -8
  332. package/src/forms/fields/field.ts +98 -11
  333. package/src/forms/fields/fields.ts +23 -8
  334. package/src/forms/fields/file.test.ts +5 -17
  335. package/src/forms/fields/file.ts +44 -16
  336. package/src/forms/fields/float.ts +9 -0
  337. package/src/forms/fields/get-field-for-sealious.ts +337 -0
  338. package/src/forms/fields/html.ts +15 -0
  339. package/src/forms/fields/image.ts +12 -0
  340. package/src/forms/fields/int.ts +25 -0
  341. package/src/forms/fields/json.ts +48 -0
  342. package/src/forms/fields/markdown.ts +15 -0
  343. package/src/forms/fields/multiple-files.ts +10 -1
  344. package/src/forms/fields/number.ts +10 -3
  345. package/src/forms/fields/password.ts +13 -0
  346. package/src/forms/fields/pick-from-list-sealious.ts +22 -0
  347. package/src/forms/fields/pick-from-list.ts +8 -4
  348. package/src/forms/fields/proxy-field.ts +7 -1
  349. package/src/forms/fields/regexp.ts +27 -1
  350. package/src/forms/fields/simple-form-field.ts +103 -7
  351. package/src/forms/fields/single-reference.ts +62 -0
  352. package/src/forms/fields/structured-array.ts +111 -18
  353. package/src/forms/fields/table.ts +39 -16
  354. package/src/forms/fields/text.ts +18 -0
  355. package/src/forms/fields/url.ts +20 -0
  356. package/src/forms/form-types.ts +5 -4
  357. package/src/forms/form.test.ts +5 -7
  358. package/src/forms/form.ts +42 -23
  359. package/src/forms/forms.css +0 -85
  360. package/src/forms/multiform.test.ts +9 -9
  361. package/src/forms/multiform.ts +12 -10
  362. package/src/generate-collections.ts +2 -3
  363. package/src/generate-components.ts +2 -3
  364. package/src/generate-routes.test.ts +7 -16
  365. package/src/generate-routes.ts +6 -10
  366. package/src/generate-stimulus.ts +4 -5
  367. package/src/get-fonts.ts +32 -30
  368. package/src/index.ts +2 -1
  369. package/src/make-env.ts +1 -1
  370. package/src/make-hidden-inputs.ts +8 -7
  371. package/src/mount.ts +16 -7
  372. package/src/notifier.ts +4 -7
  373. package/src/page/default-list-filters.ts +1 -0
  374. package/src/page/list.ts +33 -28
  375. package/src/page/mountable-with-fields.test.ts +1 -1
  376. package/src/page/mountable-with-fields.ts +21 -12
  377. package/src/page/mountable.ts +0 -1
  378. package/src/page/page.ts +2 -3
  379. package/src/page/props-parser.ts +1 -1
  380. package/src/page/sealious-list.ts +1 -1
  381. package/src/page/stateful-page.ts +6 -10
  382. package/src/register-external.ts +5 -5
  383. package/src/templates/form.ts +9 -11
  384. package/src/templates/jdd-component.ts +1 -1
  385. package/src/templates/jdd-editor.ts +2 -4
  386. package/src/templates/list.ts +0 -1
  387. package/src/templates/multiform.ts +4 -4
  388. package/src/templates/page.ts +1 -6
  389. package/src/templates/shared/collection-create-form.ts +34 -71
  390. package/src/templates/shared/collection-edit-form.ts +46 -108
  391. package/src/templates/shared/collection-list.ts +13 -21
  392. package/src/templates/shared/item-delete.ts +0 -1
  393. package/src/templates/shared/shared-crud-form-fields.ts +38 -177
  394. package/src/templates/templates.ts +5 -1
  395. package/src/test_utils/exec_async.ts +3 -4
  396. package/src/test_utils/test-on-real-app.ts +13 -14
  397. package/src/utils/browser-creator.js +0 -1
  398. package/src/utils/exec.ts +0 -1
  399. package/src/utils/extract-fields-from-collection.ts +76 -25
  400. package/src/utils/input-wrapper.ts +1 -1
  401. package/src/utils/make-slug.ts +1 -1
  402. package/src/utils/wrap-attributes.ts +17 -0
  403. package/src/utils/write-file.ts +1 -1
  404. package/.eslintrc.cjs +0 -39
  405. package/lib/add-verbose-crud.js +0 -119
  406. package/lib/crud-field-snippets.js +0 -52
  407. package/lib/find-css-includes.js +0 -3
  408. package/lib/forms/controls/reverse-single-reference.js +0 -1
  409. package/lib/forms/fields/enum-multiple.js +0 -47
  410. package/lib/forms/fields/enum-multiple.test.js +0 -27
  411. package/lib/forms/fields/enum.js +0 -41
  412. package/lib/forms/fields/enum.test.js +0 -21
  413. package/lib/forms/fields/reverse-single-reference.js +0 -17
  414. package/lib/templates/shared/handlers/boolean.js +0 -14
  415. package/lib/templates/shared/handlers/date.js +0 -8
  416. package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
  417. package/lib/templates/shared/handlers/default.js +0 -49
  418. package/lib/templates/shared/handlers/enum.js +0 -19
  419. package/lib/templates/shared/handlers/file.js +0 -23
  420. package/lib/templates/shared/handlers/image.js +0 -32
  421. package/lib/templates/shared/handlers/int.js +0 -11
  422. package/lib/templates/shared/handlers/jdd.js +0 -10
  423. package/lib/templates/shared/handlers/single-reference.js +0 -12
  424. package/lib/templates/shared/handlers/structured-array.js +0 -33
  425. package/src/add-verbose-crud.ts +0 -138
  426. package/src/crud-field-snippets.ts +0 -57
  427. package/src/find-css-includes.ts +0 -3
  428. package/src/forms/controls/reverse-single-reference.ts +0 -50
  429. package/src/forms/fields/enum-multiple.test.ts +0 -31
  430. package/src/forms/fields/enum-multiple.ts +0 -62
  431. package/src/forms/fields/enum.test.ts +0 -25
  432. package/src/forms/fields/enum.ts +0 -56
  433. package/src/forms/fields/reverse-single-reference.ts +0 -20
  434. package/src/templates/shared/handlers/boolean.ts +0 -18
  435. package/src/templates/shared/handlers/date.ts +0 -12
  436. package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
  437. package/src/templates/shared/handlers/default.ts +0 -64
  438. package/src/templates/shared/handlers/enum.ts +0 -23
  439. package/src/templates/shared/handlers/file.ts +0 -27
  440. package/src/templates/shared/handlers/image.ts +0 -45
  441. package/src/templates/shared/handlers/int.ts +0 -15
  442. package/src/templates/shared/handlers/jdd.ts +0 -14
  443. package/src/templates/shared/handlers/single-reference.ts +0 -16
  444. package/src/templates/shared/handlers/structured-array.ts +0 -42
package/src/forms/form.ts CHANGED
@@ -2,7 +2,7 @@ import { Context } from "koa";
2
2
  import { randomUUID } from "crypto";
3
3
 
4
4
  import Router from "@koa/router";
5
- import { FlatTemplatable, tempstream } from "tempstream";
5
+ import { tempstream } from "tempstream";
6
6
  import {
7
7
  hasFieldOfType,
8
8
  hasShape,
@@ -22,10 +22,14 @@ import {
22
22
  MountableWithFields,
23
23
  PageErrorMessage,
24
24
  } from "../page/mountable-with-fields.js";
25
+ import { Readable } from "stream";
26
+ import { FormField } from "../index.js";
27
+ import { FieldMessages } from "./controls/form-control.js";
28
+ import { Errors as SealiousErrors } from "sealious";
25
29
 
26
30
  export abstract class Form<
27
31
  F extends Fields,
28
- SubmitResult
32
+ SubmitResult,
29
33
  > extends MountableWithFields<F> {
30
34
  defaultSuccessMessage = "Done";
31
35
  submitButtonText = "Wyślij";
@@ -34,7 +38,6 @@ export abstract class Form<
34
38
  form_id = randomUUID() as string;
35
39
 
36
40
  async canAccess(
37
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
41
  _: Context
39
42
  ): Promise<{ canAccess: boolean; message: string }> {
40
43
  return { canAccess: true, message: "" };
@@ -43,11 +46,11 @@ export abstract class Form<
43
46
  async renderError(
44
47
  _: Context,
45
48
  error: PageErrorMessage
46
- ): Promise<FlatTemplatable> {
47
- return tempstream/* HTML */ `<div>${error.message}</div>`;
49
+ ): Promise<JSX.Element | Readable> {
50
+ return tempstream /* HTML */ `<div>${error.message}</div>`;
48
51
  }
49
52
 
50
- makeSubmitButton(): FlatTemplatable {
53
+ makeSubmitButton(): JSX.Element {
51
54
  return /* HTML */ `<input
52
55
  type="submit"
53
56
  value="${this.submitButtonText}"
@@ -60,8 +63,8 @@ export abstract class Form<
60
63
  ctx: Context,
61
64
  data: FormData,
62
65
  show_field_errors: boolean
63
- ): Promise<FlatTemplatable> {
64
- return tempstream/* HTML */ `<div class="form-container">
66
+ ): Promise<JSX.Element | Readable> {
67
+ return tempstream /* HTML */ `<div class="form-container">
65
68
  ${this.makeOpenFormTag(ctx)}
66
69
  ${!this.controls.some((control) => control.role == "messages")
67
70
  ? this.renderMessages(ctx, data)
@@ -76,12 +79,11 @@ export abstract class Form<
76
79
  </div>`;
77
80
  }
78
81
 
79
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
80
82
  public async makeFormClasses(_ctx: Context): Promise<string[]> {
81
83
  return [];
82
84
  }
83
85
 
84
- public makeOpenFormTag(ctx: Context): FlatTemplatable {
86
+ public makeOpenFormTag(ctx: Context): JSX.Element {
85
87
  return tempstream`<form enctype="multipart/form-data" method="POST" id="${
86
88
  this.form_id
87
89
  }" action="${this.action}" class="${this.makeFormClasses(ctx).then(
@@ -91,14 +93,14 @@ export abstract class Form<
91
93
  }></form><div class="form">`;
92
94
  }
93
95
 
94
- public makeCloseFormTag(): FlatTemplatable {
96
+ public makeCloseFormTag(): JSX.Element {
95
97
  return `</div>`;
96
98
  }
97
99
 
98
100
  public async onValuesInvalid(
99
101
  ctx: Context,
100
102
  form_messages: FormMessage[],
101
- _field_errors: Partial<Record<keyof Fields, string>>
103
+ field_errors: FieldMessages<keyof Fields>
102
104
  ): Promise<FormReaction> {
103
105
  const messages = form_messages.length
104
106
  ? form_messages
@@ -110,8 +112,9 @@ export abstract class Form<
110
112
  {
111
113
  raw_values: await this.extractRawValues(ctx),
112
114
  messages,
115
+ field_messages: field_errors,
113
116
  },
114
- "show_field_errors" && true
117
+ true
115
118
  ),
116
119
  messages,
117
120
  };
@@ -123,12 +126,21 @@ export abstract class Form<
123
126
  error: unknown
124
127
  ): Promise<FormReaction> {
125
128
  let error_message = "Unknown error has occured";
129
+ let field_messages: FieldMessages = {};
126
130
  if (
127
131
  is(error, predicates.object) &&
128
132
  hasShape({ message: predicates.string }, error)
129
133
  ) {
130
134
  error_message = error.message;
131
135
  }
136
+ if (error instanceof SealiousErrors.FieldsError) {
137
+ field_messages = Object.fromEntries(
138
+ Object.entries(error.field_messages).map(([key, value]) => {
139
+ const message = value?.message || "";
140
+ return [key, { type: "error", message }];
141
+ })
142
+ );
143
+ }
132
144
  const messages = [<const>{ type: "error", text: error_message }];
133
145
  return {
134
146
  action: "stay",
@@ -137,8 +149,9 @@ export abstract class Form<
137
149
  {
138
150
  raw_values: data.raw_values,
139
151
  messages,
152
+ field_messages,
140
153
  },
141
- "show_field_errors" && true
154
+ true
142
155
  ),
143
156
  };
144
157
  }
@@ -163,8 +176,9 @@ export abstract class Form<
163
176
  {
164
177
  raw_values: await this.getInitialValues(ctx),
165
178
  messages,
179
+ field_messages: {},
166
180
  },
167
- "show_field_errors" && false
181
+ false
168
182
  ),
169
183
  messages,
170
184
  };
@@ -181,10 +195,6 @@ export abstract class Form<
181
195
  raw_values
182
196
  );
183
197
  if (!valid) {
184
- console.debug("Form values invalid: ", {
185
- form_messages,
186
- field_errors,
187
- });
188
198
  return this.onValuesInvalid(ctx, form_messages, field_errors);
189
199
  }
190
200
  try {
@@ -192,12 +202,14 @@ export abstract class Form<
192
202
  const result = await this.onSubmit(ctx, {
193
203
  raw_values,
194
204
  messages: [],
205
+ field_messages: {},
195
206
  });
196
207
  return this.onSuccess(
197
208
  ctx,
198
209
  {
199
210
  raw_values: await this.getRawValuesOnSuccess(ctx),
200
211
  messages: [],
212
+ field_messages: {},
201
213
  },
202
214
  result
203
215
  );
@@ -209,8 +221,8 @@ export abstract class Form<
209
221
  hasFieldOfType(e, "message", predicates.string)
210
222
  ? e?.message
211
223
  : is(e, predicates.string)
212
- ? e
213
- : "Wystąpił błąd";
224
+ ? e
225
+ : "Wystąpił błąd";
214
226
 
215
227
  return this.onError(
216
228
  ctx,
@@ -222,6 +234,7 @@ export abstract class Form<
222
234
  text: message,
223
235
  },
224
236
  ],
237
+ field_messages: {},
225
238
  },
226
239
  e
227
240
  );
@@ -257,12 +270,12 @@ export abstract class Form<
257
270
  {
258
271
  raw_values: await this.extractRawValues(ctx),
259
272
  messages: [],
273
+ field_messages: {},
260
274
  },
261
- "show_field_errors" && false
275
+ false
262
276
  );
263
277
  });
264
278
  router.post(path, async (ctx) => {
265
- console.log("REGULAR FORM HANDLE");
266
279
  const reaction =
267
280
  (ctx.override_reaction as FormReaction | undefined) ||
268
281
  (await this.handlePost(ctx));
@@ -283,4 +296,10 @@ export abstract class Form<
283
296
  ? ctx.$body
284
297
  : this.getInitialValues(ctx);
285
298
  }
299
+
300
+ static initFieldNames(fields: Record<string, FormField>): void {
301
+ for (const [field_name, field] of Object.entries(fields)) {
302
+ field.setName(field_name);
303
+ }
304
+ }
286
305
  }
@@ -1,85 +0,0 @@
1
- .form-message {
2
- --color: black;
3
- border: 1px solid var(--color);
4
- border-radius: 5px;
5
- padding: 10px;
6
- }
7
-
8
- .form-message--error {
9
- --color: #ff4136;
10
- }
11
-
12
- .form-message--success {
13
- --color: #2ecc40;
14
- }
15
-
16
- .form__error {
17
- color: #ff4136;
18
- }
19
-
20
- .form-input__wrapper--checkbox {
21
- display: flex;
22
- flex-flow: row nowrap;
23
- align-items: center;
24
- & > input[type="checkbox"] {
25
- width: 15px;
26
- height: 15px;
27
-
28
- + label {
29
- padding-left: 10px;
30
- }
31
- }
32
- }
33
-
34
- .form-input__wrapper--multiple-files--photos {
35
- ul {
36
- list-style: none;
37
- display: grid;
38
- grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
39
- grid-gap: 10px;
40
- margin-bottom: 20px;
41
-
42
- li {
43
- background-color: white;
44
- box-shadow: 1px 1px 6px 0px #00000038;
45
- padding: 10px;
46
- display: grid;
47
- grid-template-columns: 1fr 20px;
48
- grid-template-rows: 20px auto min-content;
49
- grid-row-gap: 10px;
50
-
51
- a {
52
- grid-row: 1/3;
53
- grid-column: 1/3;
54
-
55
- picture,
56
- img {
57
- width: 100%;
58
- height: 150px;
59
- object-fit: contain;
60
- }
61
- }
62
-
63
- .filename {
64
- grid-row: 3/4;
65
- grid-column: 1/3;
66
- }
67
-
68
- form {
69
- grid-row: 1/2;
70
- grid-column: 2/3;
71
- position: relative;
72
- z-index: 2;
73
- }
74
- }
75
- }
76
- }
77
-
78
- .file-list-item {
79
- display: flex;
80
- flex-flow: row;
81
-
82
- form {
83
- padding-left: 20px;
84
- }
85
- }
@@ -9,7 +9,7 @@ import { Multiform } from "./multiform.js";
9
9
  import { assertThrowsAsync } from "../utils/utils.js";
10
10
  import { form_factory } from "./form.test.js";
11
11
  import { getBrowser } from "../utils/browser-creator.js";
12
- import { SimpleFormField } from "./fields/simple-form-field.js";
12
+ import { TextBasedSimpleField } from "./fields/simple-form-field.js";
13
13
  import { Form } from "./form.js";
14
14
  import { FormHeader } from "./controls/form-header.js";
15
15
  import { SimpleInput } from "./controls/simple-input.js";
@@ -19,10 +19,10 @@ import { EmailField } from "./fields/email.js";
19
19
  import getPort from "get-port";
20
20
 
21
21
  const port = await getPort();
22
- console.log(`Using port ${port} form multiform.test.ts`);
22
+ console.info(`Using port ${port} form multiform.test.ts`);
23
23
 
24
24
  const fields1 = {
25
- email: new SimpleFormField(true),
25
+ email: new TextBasedSimpleField(true),
26
26
  };
27
27
 
28
28
  const form1 = new (class extends Form<typeof fields1, void> {
@@ -35,7 +35,7 @@ const form1 = new (class extends Form<typeof fields1, void> {
35
35
  })();
36
36
 
37
37
  const fields2 = {
38
- name: new SimpleFormField(true),
38
+ name: new TextBasedSimpleField(true),
39
39
  };
40
40
 
41
41
  const form2 = new (class extends Form<Record<never, unknown>, void> {
@@ -58,7 +58,7 @@ function multiform_factory(
58
58
  form2: form_factory(canAccessFun2),
59
59
  };
60
60
  async render(...args: Parameters<Multiform["render"]>): Promise<FlatTemplatable> {
61
- return tempstream/* HTML */ `<!DOCTYPE html>
61
+ return tempstream /* HTML */ `<!DOCTYPE html>
62
62
  <html>
63
63
  <head>
64
64
  <title>Multiform Test - Sealgen</title>
@@ -147,7 +147,7 @@ async function individual_field_validation_e2e_tests(javaScriptEnabled: boolean)
147
147
  await page.getByPlaceholder("text").click();
148
148
  await page.getByPlaceholder("text").fill("yes@an.email");
149
149
  await page.locator("#multiform_test_form1_submit").click();
150
- assertThrowsAsync(async () => {
150
+ await assertThrowsAsync(async () => {
151
151
  return page.getByText("Please enter a proper email address").click({ timeout: 500 });
152
152
  });
153
153
  });
@@ -173,7 +173,7 @@ describe("multiform test", () => {
173
173
  prerenderedForms?: Record<string, FlatTemplatable | undefined>,
174
174
  show_field_errors = true
175
175
  ): Promise<FlatTemplatable> {
176
- return tempstream/* HTML */ `<!DOCTYPE html>
176
+ return tempstream /* HTML */ `<!DOCTYPE html>
177
177
  <html>
178
178
  <head>
179
179
  <title>Multiform Test - Sealgen</title>
@@ -455,7 +455,7 @@ describe("multiform test", () => {
455
455
  async render(
456
456
  ...args: Parameters<Multiform["render"]>
457
457
  ): Promise<FlatTemplatable> {
458
- return tempstream/* HTML */ `<!DOCTYPE html>
458
+ return tempstream /* HTML */ `<!DOCTYPE html>
459
459
  <html>
460
460
  <head>
461
461
  <title>Multiform Test - Sealgen</title>
@@ -518,7 +518,7 @@ describe("multiform test", () => {
518
518
  async render(
519
519
  ...args: Parameters<Multiform["render"]>
520
520
  ): Promise<FlatTemplatable> {
521
- return tempstream/* HTML */ `<!DOCTYPE html>
521
+ return tempstream /* HTML */ `<!DOCTYPE html>
522
522
  <html>
523
523
  <head>
524
524
  <title>Multiform Test - Sealgen</title>
@@ -35,13 +35,14 @@ export class Multiform extends MountableWithFields {
35
35
  this.getSubformRawValues(context, key);
36
36
  const submit_button_id = this.name + "_" + key + "_submit";
37
37
 
38
- form.makeSubmitButton = () => /* HTML */ `<input
39
- type="submit"
40
- value="${form.submitButtonText}"
41
- formaction="${form.action}"
42
- id="${submit_button_id}"
43
- ${form.form_id ? `form="${form.form_id}"` : ""}
44
- /> `;
38
+ form.makeSubmitButton = () =>
39
+ /* HTML */ `<input
40
+ type="submit"
41
+ value="${form.submitButtonText}"
42
+ formaction="${form.action}"
43
+ id="${submit_button_id}"
44
+ ${form.form_id ? `form="${form.form_id}"` : ""}
45
+ /> `;
45
46
  }
46
47
  for (const form of Object.values(this.forms)) {
47
48
  for (const field of Object.values(form.fields)) {
@@ -68,7 +69,6 @@ export class Multiform extends MountableWithFields {
68
69
  };
69
70
  }
70
71
 
71
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
72
  getSubformsToRender(
73
73
  ctx: Context
74
74
  ): Array<readonly [string, Form<any, unknown>]> {
@@ -103,6 +103,7 @@ export class Multiform extends MountableWithFields {
103
103
  {
104
104
  raw_values: await this.getSubformRawValues(ctx, sub_form_name),
105
105
  messages: [],
106
+ field_messages: {},
106
107
  },
107
108
  show_field_errors
108
109
  );
@@ -131,9 +132,10 @@ export class Multiform extends MountableWithFields {
131
132
  prerenderedForms: Record<string, FlatTemplatable | undefined> = {},
132
133
  show_field_errors: boolean
133
134
  ): Promise<FlatTemplatable> {
134
- return tempstream/* HTML */ `${this.renderMessages(ctx, {
135
+ return tempstream /* HTML */ `${this.renderMessages(ctx, {
135
136
  raw_values: {},
136
137
  messages,
138
+ field_messages: {},
137
139
  })}
138
140
  <div class="forms">
139
141
  <form
@@ -147,7 +149,7 @@ export class Multiform extends MountableWithFields {
147
149
  ${this.getSubformsToRender(ctx).map(([form_name]) => {
148
150
  const frame_form_id =
149
151
  this.name + "_" + form_name + "_frame_form";
150
- return tempstream/* HTML */ `<turbo-frame
152
+ return tempstream /* HTML */ `<turbo-frame
151
153
  id="${form_name}"
152
154
  contains-subform
153
155
  subform-id="${frame_form_id}"
@@ -1,8 +1,7 @@
1
1
  import _locreq from "locreq";
2
- import * as prettier from "prettier";
3
2
  import { promises as fs } from "fs";
4
3
  import { assertType, predicates } from "@sealcode/ts-predicates";
5
- import { getPrettierConfig } from "./utils/prettier.js";
4
+ import { formatWithPrettier } from "./utils/prettier.js";
6
5
 
7
6
  const target_locreq = _locreq(process.cwd());
8
7
 
@@ -69,7 +68,7 @@ ${file_data
69
68
  };`;
70
69
  await fs.writeFile(
71
70
  target_locreq.resolve("src/back/collections/collections.ts"),
72
- prettier.format(content, await getPrettierConfig())
71
+ await formatWithPrettier(content)
73
72
  );
74
73
  // eslint-disable-next-line no-console
75
74
  console.log(
@@ -1,7 +1,6 @@
1
1
  import _locreq from "locreq";
2
- import * as prettier from "prettier";
3
2
  import { promises as fs } from "fs";
4
- import { getPrettierConfig } from "./utils/prettier.js";
3
+ import { formatWithPrettier } from "./utils/prettier.js";
5
4
  import recursive from "recursive-readdir";
6
5
  import path from "path";
7
6
  import { toKebabCase, toPascalCase } from "js-convert-case";
@@ -40,7 +39,7 @@ ${component_data
40
39
  const target = "src/back/jdd-components/components.ts";
41
40
  await fs.writeFile(
42
41
  target_locreq.resolve(target),
43
- prettier.format(content, await getPrettierConfig())
42
+ await formatWithPrettier(content)
44
43
  );
45
44
  // eslint-disable-next-line no-console
46
45
  console.log(`Successfuly generated new ${target} file`);
@@ -1,20 +1,15 @@
1
1
  import { generateURL, sortRoutes } from "./generate-routes.js";
2
- import * as prettier from "prettier";
3
- import { getPrettierConfig } from "./utils/prettier.js";
2
+ import { formatWithPrettier } from "./utils/prettier.js";
4
3
  import assert from "node:assert";
5
4
 
6
5
  describe("generate routes", () => {
7
6
  it("handles a url with params", async () => {
8
7
  assert.strictEqual(
9
- prettier.format(
10
- generateURL("EditUser", "/admin/users/:id/edit/"),
11
- await getPrettierConfig()
12
- ),
13
- prettier.format(
8
+ await formatWithPrettier(generateURL("EditUser", "/admin/users/:id/edit/")),
9
+ await formatWithPrettier(
14
10
  `export const EditUserURL = (id: string) => \`/admin/users/\${id}/edit/\`;
15
11
  EditUserURL.params = ["id"];
16
- EditUserURL.rawURL = "/admin/users/:id/edit/";`,
17
- await getPrettierConfig()
12
+ EditUserURL.rawURL = "/admin/users/:id/edit/";`
18
13
  )
19
14
  );
20
15
  });
@@ -28,15 +23,11 @@ EditUserURL.rawURL = "/admin/users/:id/edit/";`,
28
23
 
29
24
  it("handles a url with params and diacritics", async () => {
30
25
  assert.strictEqual(
31
- prettier.format(
32
- generateURL("EditUser", "/admin/użytkownicy/:id/edit/"),
33
- await getPrettierConfig()
34
- ),
35
- prettier.format(
26
+ await formatWithPrettier(generateURL("EditUser", "/admin/użytkownicy/:id/edit/")),
27
+ await formatWithPrettier(
36
28
  `export const EditUserURL = (id: string) => \`/admin/u%C5%BCytkownicy/\${id}/edit/\`;
37
29
  EditUserURL.params = ["id"];
38
- EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/";`,
39
- await getPrettierConfig()
30
+ EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/";`
40
31
  )
41
32
  );
42
33
  });
@@ -1,12 +1,11 @@
1
1
  import { promises as fs } from "fs";
2
- import * as prettier from "prettier";
3
2
  import { relative, resolve, basename } from "path";
4
3
  import _locreq from "locreq";
5
4
  import { walkDir } from "./utils/walk.js";
6
5
  import { importPath } from "./utils/import-path.js";
7
6
  import { assertType, predicates } from "@sealcode/ts-predicates";
8
7
  import { unescape_url_params } from "./utils/escape-url-params.js";
9
- import { getPrettierConfig } from "./utils/prettier.js";
8
+ import { formatWithPrettier } from "./utils/prettier.js";
10
9
  import { Templates } from "./templates/templates.js";
11
10
 
12
11
  const target_locreq = _locreq(process.cwd());
@@ -42,8 +41,8 @@ export function generateURL(actionName: string, url: string) {
42
41
  )
43
42
  .join("/")}\`;
44
43
  ${actionName}URL.params = [${params
45
- .map((param) => `"${param}"`)
46
- .join(",")}];
44
+ .map((param) => `"${param}"`)
45
+ .join(",")}];
47
46
  ${actionName}URL.rawURL = "${encodeURI(url)}";`;
48
47
  }
49
48
 
@@ -70,9 +69,7 @@ export function sortRoutes<T extends { url: string }>(urls: T[]): T[] {
70
69
 
71
70
  export async function generateRoutes(): Promise<void> {
72
71
  const files = await Promise.all(
73
- (
74
- await walkDir(target_locreq.resolve("src/back/routes"))
75
- )
72
+ (await walkDir(target_locreq.resolve("src/back/routes")))
76
73
  .filter((f) =>
77
74
  Object.keys(Templates).some(
78
75
  (key) =>
@@ -129,15 +126,14 @@ ${sortRoutes(files)
129
126
  .join("\n")}
130
127
  `;
131
128
 
132
- const prettier_config = await getPrettierConfig();
133
129
  await fs.writeFile(
134
130
  target_locreq.resolve("src/back/routes/routes.ts"),
135
- prettier.format(routes_content, prettier_config)
131
+ await formatWithPrettier(routes_content)
136
132
  );
137
133
 
138
134
  await fs.writeFile(
139
135
  target_locreq.resolve("src/back/routes/urls.ts"),
140
- prettier.format(urls_content, prettier_config)
136
+ await formatWithPrettier(urls_content)
141
137
  );
142
138
  // eslint-disable-next-line no-console
143
139
  console.log(
@@ -1,7 +1,6 @@
1
1
  import _locreq from "locreq";
2
- import * as prettier from "prettier";
3
2
  import { promises as fs } from "fs";
4
- import { getPrettierConfig } from "./utils/prettier.js";
3
+ import { formatWithPrettier } from "./utils/prettier.js";
5
4
  import recursive from "recursive-readdir";
6
5
  import path, { dirname } from "path";
7
6
  import { toKebabCase, toPascalCase } from "js-convert-case";
@@ -16,6 +15,7 @@ export async function generateStimulusControllers(
16
15
  target_locreq.resolve("src/"),
17
16
  ...controller_dirs,
18
17
  ];
18
+ console.info("Looking for controllers in ", stimulus_search_dirs);
19
19
  const controller_names = (
20
20
  await Promise.all(stimulus_search_dirs.map((dir) => recursive(dir)))
21
21
  )
@@ -53,8 +53,7 @@ export { Turbo };
53
53
 
54
54
  await fs.writeFile(
55
55
  target_locreq.resolve(output_file),
56
- prettier.format(content, await getPrettierConfig())
56
+ await formatWithPrettier(content)
57
57
  );
58
- // eslint-disable-next-line no-console
59
- console.log(`Successfuly generated new ${output_file} file`);
58
+ console.info(`Successfuly generated new ${output_file} file`);
60
59
  }
package/src/get-fonts.ts CHANGED
@@ -34,12 +34,12 @@ export async function getFonts(_: Record<string, string | boolean> = {}) {
34
34
  });
35
35
  await downloader.execute();
36
36
 
37
- console.log("Downloaded new fonts pack from google fonts");
37
+ console.info("Downloaded new fonts pack from google fonts");
38
38
 
39
39
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
40
40
  const squirrel_fonts = fonts_config.fontSquirrel;
41
41
  if (
42
- !is(
42
+ is(
43
43
  squirrel_fonts,
44
44
  predicates.record(
45
45
  predicates.string,
@@ -47,39 +47,41 @@ export async function getFonts(_: Record<string, string | boolean> = {}) {
47
47
  )
48
48
  )
49
49
  ) {
50
- throw new Error("Inocorrect squirrelfonts file");
51
- }
52
-
53
- await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
54
- recursive: true,
55
- });
50
+ await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
51
+ recursive: true,
52
+ });
56
53
 
57
- const config_file = `{
54
+ const config_file = `{
58
55
  "tmpDir": "/tmp/fonts",
59
56
  "fontsDir": "/dist/fontsquirrel/fonts",
60
57
  "cssDir": "/dist/fontsquirrel/css",
61
58
  "cssFile": "fonts.css"
62
59
  }`;
63
- await writeFile("public/fonsta.config.json", config_file);
60
+ await writeFile("public/fonsta.config.json", config_file);
61
+
62
+ await Promise.all(
63
+ Object.keys(squirrel_fonts).map((font) => {
64
+ if (squirrel_fonts[font].length) {
65
+ return execPromise(
66
+ `node ${path_to_fonsta} install ${font}:${squirrel_fonts[
67
+ font
68
+ ].join(",")}`,
69
+ {
70
+ cwd: target_locreq.resolve("public"),
71
+ }
72
+ );
73
+ } else {
74
+ return execPromise(
75
+ `node ${path_to_fonsta} install ${font}`,
76
+ {
77
+ cwd: target_locreq.resolve("public"),
78
+ }
79
+ );
80
+ }
81
+ })
82
+ );
83
+ }
64
84
 
65
- await Promise.all(
66
- Object.keys(squirrel_fonts).map((font) => {
67
- if (squirrel_fonts[font].length) {
68
- return execPromise(
69
- `node ${path_to_fonsta} install ${font}:${squirrel_fonts[
70
- font
71
- ].join(",")}`,
72
- {
73
- cwd: target_locreq.resolve("public"),
74
- }
75
- );
76
- } else {
77
- return execPromise(`node ${path_to_fonsta} install ${font}`, {
78
- cwd: target_locreq.resolve("public"),
79
- });
80
- }
81
- })
82
- );
83
85
  const fonts_css_file_path = resolve(
84
86
  target_locreq.resolve("public/dist/fonts"),
85
87
  "fonts.css"
@@ -93,7 +95,7 @@ export async function getFonts(_: Record<string, string | boolean> = {}) {
93
95
 
94
96
  await unlink("public/fonsta.config.json");
95
97
  await rmdir("public/tmp");
96
- console.log("Downloaded new fonts pack from Font Squirrel");
98
+ console.info("Downloaded new fonts pack from Font Squirrel");
97
99
 
98
- console.log("Downloaded new fonts pack");
100
+ console.info("Downloaded new fonts pack");
99
101
  }