@sealcode/sealgen 0.11.8 → 0.12.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 (539) hide show
  1. package/@types/components/components.d.ts +2 -2
  2. package/@types/components/toggle-modal.d.ts +1 -1
  3. package/@types/example.test.d.ts +1 -0
  4. package/@types/forms/controls/array.d.ts +7 -7
  5. package/@types/forms/controls/autocomplete.d.ts +3 -3
  6. package/@types/forms/controls/big-radio-group.d.ts +3 -3
  7. package/@types/forms/controls/checkbox-group.d.ts +4 -4
  8. package/@types/forms/controls/checkbox.d.ts +3 -3
  9. package/@types/forms/controls/checkboxed-list-input.d.ts +4 -4
  10. package/@types/forms/controls/collapsible-checkbox-group.d.ts +3 -3
  11. package/@types/forms/controls/collapsible-field-group.d.ts +2 -2
  12. package/@types/forms/controls/controls.d.ts +29 -29
  13. package/@types/forms/controls/derived-frame.d.ts +6 -6
  14. package/@types/forms/controls/derived.d.ts +3 -3
  15. package/@types/forms/controls/dropdown.d.ts +4 -4
  16. package/@types/forms/controls/editable-collection-subset.d.ts +3 -3
  17. package/@types/forms/controls/field-group.d.ts +2 -2
  18. package/@types/forms/controls/file.d.ts +5 -5
  19. package/@types/forms/controls/form-control.d.ts +2 -2
  20. package/@types/forms/controls/form-field-control.d.ts +3 -3
  21. package/@types/forms/controls/form-header.d.ts +2 -2
  22. package/@types/forms/controls/form-paragraph.d.ts +1 -1
  23. package/@types/forms/controls/frame.d.ts +1 -1
  24. package/@types/forms/controls/hidden-input.d.ts +3 -3
  25. package/@types/forms/controls/html.d.ts +2 -2
  26. package/@types/forms/controls/multiple-files.d.ts +5 -5
  27. package/@types/forms/controls/multiple-photos.d.ts +5 -5
  28. package/@types/forms/controls/number.d.ts +3 -3
  29. package/@types/forms/controls/photo.d.ts +7 -7
  30. package/@types/forms/controls/radio.d.ts +3 -3
  31. package/@types/forms/controls/reverse-single-reference.d.ts +1 -0
  32. package/@types/forms/controls/simple-input.d.ts +4 -4
  33. package/@types/forms/controls/textarea.d.ts +4 -4
  34. package/@types/forms/controls/tickable.d.ts +4 -4
  35. package/@types/forms/fields/boolean.d.ts +2 -2
  36. package/@types/forms/fields/checkboxed-list.d.ts +2 -2
  37. package/@types/forms/fields/collection-field.d.ts +2 -2
  38. package/@types/forms/fields/email.d.ts +1 -1
  39. package/@types/forms/fields/enum-multiple.d.ts +2 -2
  40. package/@types/forms/fields/enum.d.ts +2 -2
  41. package/@types/forms/fields/existing-sealious-value.d.ts +1 -1
  42. package/@types/forms/fields/field.d.ts +16 -16
  43. package/@types/forms/fields/file.d.ts +2 -2
  44. package/@types/forms/fields/multiple-files.d.ts +1 -1
  45. package/@types/forms/fields/number.d.ts +2 -2
  46. package/@types/forms/fields/pick-from-list.d.ts +3 -3
  47. package/@types/forms/fields/proxy-field.d.ts +1 -1
  48. package/@types/forms/fields/regexp.d.ts +2 -2
  49. package/@types/forms/fields/reverse-single-reference.d.ts +1 -1
  50. package/@types/forms/fields/simple-form-field.d.ts +2 -2
  51. package/@types/forms/fields/structured-array.d.ts +2 -2
  52. package/@types/forms/form.d.ts +3 -3
  53. package/@types/forms/form.test.d.ts +1 -1
  54. package/@types/forms/multiform.d.ts +4 -4
  55. package/@types/index.d.ts +17 -17
  56. package/@types/make-hidden-inputs.d.ts +2 -2
  57. package/@types/mount.d.ts +2 -2
  58. package/@types/page/list.d.ts +4 -4
  59. package/@types/page/mountable-with-fields.d.ts +4 -4
  60. package/@types/page/mountable.d.ts +1 -1
  61. package/@types/page/page.d.ts +4 -4
  62. package/@types/page/props-parser.d.ts +2 -2
  63. package/@types/page/sealious-list.d.ts +1 -1
  64. package/@types/page/stateful-page.d.ts +3 -3
  65. package/@types/remove-named-imports.d.ts +4 -0
  66. package/@types/run.d.ts +1 -0
  67. package/@types/src/add-collection.d.ts +1 -0
  68. package/@types/src/add-jdd-component.d.ts +1 -0
  69. package/@types/src/add-route.d.ts +3 -0
  70. package/@types/src/add-route.test.d.ts +1 -0
  71. package/@types/src/build.d.ts +3 -0
  72. package/@types/src/cli.d.ts +2 -0
  73. package/@types/src/components/components.d.ts +2 -0
  74. package/@types/src/components/tabs.d.ts +2 -0
  75. package/@types/src/components/toggle-modal.d.ts +7 -0
  76. package/@types/src/example.test.d.ts +1 -0
  77. package/@types/src/find-css-includes.d.ts +1 -0
  78. package/@types/src/forms/controls/array.d.ts +35 -0
  79. package/@types/src/forms/controls/autocomplete.d.ts +22 -0
  80. package/@types/src/forms/controls/big-radio-group.d.ts +14 -0
  81. package/@types/src/forms/controls/checkbox-group.d.ts +22 -0
  82. package/@types/src/forms/controls/checkbox.d.ts +15 -0
  83. package/@types/src/forms/controls/checkboxed-list-input.d.ts +14 -0
  84. package/@types/src/forms/controls/collapsible-checkbox-group.d.ts +11 -0
  85. package/@types/src/forms/controls/collapsible-field-group.d.ts +21 -0
  86. package/@types/src/forms/controls/controls.d.ts +29 -0
  87. package/@types/src/forms/controls/derived-frame.d.ts +22 -0
  88. package/@types/src/forms/controls/derived.d.ts +13 -0
  89. package/@types/src/forms/controls/dropdown.d.ts +30 -0
  90. package/@types/src/forms/controls/editable-collection-subset.d.ts +20 -0
  91. package/@types/src/forms/controls/field-group.d.ts +23 -0
  92. package/@types/src/forms/controls/file.d.ts +16 -0
  93. package/@types/src/forms/controls/form-control.d.ts +19 -0
  94. package/@types/src/forms/controls/form-field-control.d.ts +13 -0
  95. package/@types/src/forms/controls/form-header.d.ts +8 -0
  96. package/@types/src/forms/controls/form-paragraph.d.ts +7 -0
  97. package/@types/src/forms/controls/frame.d.ts +17 -0
  98. package/@types/src/forms/controls/hidden-input.d.ts +9 -0
  99. package/@types/src/forms/controls/html.d.ts +11 -0
  100. package/@types/src/forms/controls/multiple-files.d.ts +40 -0
  101. package/@types/src/forms/controls/multiple-photos.d.ts +18 -0
  102. package/@types/src/forms/controls/number.d.ts +13 -0
  103. package/@types/src/forms/controls/photo.d.ts +22 -0
  104. package/@types/src/forms/controls/radio.d.ts +16 -0
  105. package/@types/src/forms/controls/reverse-single-reference.d.ts +1 -0
  106. package/@types/src/forms/controls/simple-input.d.ts +32 -0
  107. package/@types/src/forms/controls/textarea.d.ts +25 -0
  108. package/@types/src/forms/controls/tickable.d.ts +24 -0
  109. package/@types/src/forms/fields/boolean.d.ts +17 -0
  110. package/@types/src/forms/fields/boolean.test.d.ts +1 -0
  111. package/@types/src/forms/fields/checkboxed-list.d.ts +20 -0
  112. package/@types/src/forms/fields/collection-field.d.ts +15 -0
  113. package/@types/src/forms/fields/email.d.ts +7 -0
  114. package/@types/src/forms/fields/email.test.d.ts +1 -0
  115. package/@types/src/forms/fields/enum-multiple.d.ts +18 -0
  116. package/@types/src/forms/fields/enum-multiple.test.d.ts +1 -0
  117. package/@types/src/forms/fields/enum.d.ts +18 -0
  118. package/@types/src/forms/fields/enum.test.d.ts +1 -0
  119. package/@types/src/forms/fields/existing-sealious-value.d.ts +6 -0
  120. package/@types/src/forms/fields/field.d.ts +43 -0
  121. package/@types/src/forms/fields/fields.d.ts +15 -0
  122. package/@types/src/forms/fields/file.d.ts +16 -0
  123. package/@types/src/forms/fields/multiple-files.d.ts +14 -0
  124. package/@types/src/forms/fields/number.d.ts +23 -0
  125. package/@types/src/forms/fields/number.test.d.ts +1 -0
  126. package/@types/src/forms/fields/pick-from-list.d.ts +14 -0
  127. package/@types/src/forms/fields/pick-from-list.test.d.ts +1 -0
  128. package/@types/src/forms/fields/proxy-field.d.ts +13 -0
  129. package/@types/src/forms/fields/regexp.d.ts +16 -0
  130. package/@types/src/forms/fields/regexp.test.d.ts +1 -0
  131. package/@types/src/forms/fields/reverse-single-reference.d.ts +13 -0
  132. package/@types/src/forms/fields/simple-form-field.d.ts +9 -0
  133. package/@types/src/forms/fields/structured-array.d.ts +14 -0
  134. package/@types/src/forms/form-types.d.ts +26 -0
  135. package/@types/src/forms/form.d.ts +31 -0
  136. package/@types/src/forms/form.test.d.ts +6 -0
  137. package/@types/src/forms/multiform.d.ts +24 -0
  138. package/@types/src/forms/multiform.test.d.ts +1 -0
  139. package/@types/src/generate-collections.d.ts +2 -0
  140. package/@types/src/generate-components.d.ts +1 -0
  141. package/@types/src/generate-routes.d.ts +1 -0
  142. package/@types/src/hehe.test.d.ts +1 -0
  143. package/@types/src/index.d.ts +27 -0
  144. package/@types/src/make-env.d.ts +1 -0
  145. package/@types/src/make-hidden-inputs.d.ts +5 -0
  146. package/@types/src/mount.d.ts +6 -0
  147. package/@types/src/notifier.d.ts +1 -0
  148. package/@types/src/page/access-control.d.ts +6 -0
  149. package/@types/src/page/default-list-filters.d.ts +6 -0
  150. package/@types/src/page/list.d.ts +47 -0
  151. package/@types/src/page/mountable-with-fields.d.ts +36 -0
  152. package/@types/src/page/mountable.d.ts +11 -0
  153. package/@types/src/page/page.d.ts +19 -0
  154. package/@types/src/page/props-parser.d.ts +16 -0
  155. package/@types/src/page/sealious-list.d.ts +19 -0
  156. package/@types/src/page/stateful-page.d.ts +34 -0
  157. package/@types/src/run.d.ts +1 -0
  158. package/@types/src/sample-index.d.ts +1 -0
  159. package/@types/src/sample-lib.d.ts +3 -0
  160. package/@types/src/sanitize.d.ts +1 -0
  161. package/@types/src/templates/collection.d.ts +1 -0
  162. package/@types/src/templates/form.d.ts +1 -0
  163. package/@types/src/templates/jdd-component.d.ts +1 -0
  164. package/@types/src/templates/list.d.ts +1 -0
  165. package/@types/src/templates/long-running-process.d.ts +1 -0
  166. package/@types/src/templates/multiform.d.ts +1 -0
  167. package/@types/src/templates/page.d.ts +1 -0
  168. package/@types/src/templates/post.d.ts +1 -0
  169. package/@types/src/templates/redirect.d.ts +1 -0
  170. package/@types/src/templates/route-test.d.ts +1 -0
  171. package/@types/src/templates/stateful-page.d.ts +1 -0
  172. package/@types/src/templates/templates.d.ts +19 -0
  173. package/@types/src/test_utils/locator_is_visible.d.ts +2 -0
  174. package/@types/src/utils/assert-throws.d.ts +1 -0
  175. package/@types/src/utils/base64.d.ts +2 -0
  176. package/@types/src/utils/browser-creator.d.ts +1 -0
  177. package/@types/src/utils/escape-url-params.d.ts +2 -0
  178. package/@types/src/utils/exec.d.ts +5 -0
  179. package/@types/src/utils/extract-fields-from-collection.d.ts +4 -0
  180. package/@types/src/utils/format-external-url.d.ts +1 -0
  181. package/@types/src/utils/import-path.d.ts +2 -0
  182. package/@types/src/utils/input-wrapper.d.ts +5 -0
  183. package/@types/src/utils/list-collections.d.ts +1 -0
  184. package/@types/src/utils/make-slug.d.ts +1 -0
  185. package/@types/src/utils/natural-numbers.d.ts +1 -0
  186. package/@types/src/utils/prettier.d.ts +2 -0
  187. package/@types/src/utils/question.d.ts +1 -0
  188. package/@types/src/utils/render-attributes.d.ts +1 -0
  189. package/@types/src/utils/sleep.d.ts +1 -0
  190. package/@types/src/utils/translate.d.ts +3 -0
  191. package/@types/src/utils/url-with-new-params.d.ts +2 -0
  192. package/@types/src/utils/utils.d.ts +16 -0
  193. package/@types/src/utils/walk.d.ts +1 -0
  194. package/@types/src/vitest.config.d.ts +2 -0
  195. package/@types/templates/templates.d.ts +8 -8
  196. package/@types/utils/input-wrapper.d.ts +1 -1
  197. package/@types/utils/utils.d.ts +12 -12
  198. package/@types/vitest.config.d.ts +2 -0
  199. package/build.js +18 -0
  200. package/dist/add-collection.js +31 -0
  201. package/dist/add-jdd-component.js +42 -0
  202. package/dist/add-route.js +67 -0
  203. package/dist/add-route.test.js +90 -0
  204. package/dist/back/routes/sample.page.js +17 -0
  205. package/dist/back/routes/sample.test.js +39 -0
  206. package/dist/build.js +149 -0
  207. package/dist/cli.js +35 -0
  208. package/dist/components/components.js +3 -0
  209. package/{lib → dist}/components/tabs.js +32 -23
  210. package/{lib → dist}/components/toggle-modal.js +9 -10
  211. package/dist/example.test.js +5 -0
  212. package/dist/find-css-includes.js +27 -0
  213. package/dist/forms/controls/array.js +171 -0
  214. package/dist/forms/controls/autocomplete.js +34 -0
  215. package/dist/forms/controls/big-radio-group.js +38 -0
  216. package/dist/forms/controls/checkbox-group.js +46 -0
  217. package/dist/forms/controls/checkbox.js +28 -0
  218. package/dist/forms/controls/checkboxed-list-input.js +44 -0
  219. package/dist/forms/controls/collapsible-checkbox-group.js +16 -0
  220. package/{lib → dist}/forms/controls/collapsible-field-group.js +32 -27
  221. package/dist/forms/controls/controls.js +44 -0
  222. package/dist/forms/controls/derived-frame.js +77 -0
  223. package/dist/forms/controls/derived.js +81 -0
  224. package/dist/forms/controls/dropdown.js +62 -0
  225. package/dist/forms/controls/editable-collection-subset.js +82 -0
  226. package/dist/forms/controls/field-group.js +52 -0
  227. package/dist/forms/controls/file.js +38 -0
  228. package/dist/forms/controls/form-control.js +19 -0
  229. package/dist/forms/controls/form-field-control.js +12 -0
  230. package/dist/forms/controls/form-header.js +17 -0
  231. package/dist/forms/controls/form-paragraph.js +15 -0
  232. package/dist/forms/controls/frame.js +22 -0
  233. package/dist/forms/controls/hidden-input.js +17 -0
  234. package/dist/forms/controls/html.js +23 -0
  235. package/dist/forms/controls/multiple-files.js +190 -0
  236. package/dist/forms/controls/multiple-photos.js +36 -0
  237. package/dist/forms/controls/number.js +24 -0
  238. package/dist/forms/controls/photo.js +56 -0
  239. package/dist/forms/controls/radio.js +28 -0
  240. package/dist/forms/controls/reverse-single-reference.js +1 -0
  241. package/dist/forms/controls/simple-input.js +85 -0
  242. package/dist/forms/controls/textarea.js +40 -0
  243. package/dist/forms/controls/tickable.js +72 -0
  244. package/dist/forms/fields/boolean.js +49 -0
  245. package/dist/forms/fields/boolean.test.js +33 -0
  246. package/dist/forms/fields/checkboxed-list.js +49 -0
  247. package/dist/forms/fields/collection-field.js +47 -0
  248. package/dist/forms/fields/email.js +19 -0
  249. package/dist/forms/fields/email.test.js +20 -0
  250. package/dist/forms/fields/enum-multiple.js +47 -0
  251. package/dist/forms/fields/enum-multiple.test.js +27 -0
  252. package/dist/forms/fields/enum.js +41 -0
  253. package/dist/forms/fields/enum.test.js +21 -0
  254. package/dist/forms/fields/existing-sealious-value.js +21 -0
  255. package/dist/forms/fields/field.js +82 -0
  256. package/dist/forms/fields/fields.js +16 -0
  257. package/dist/forms/fields/file.js +63 -0
  258. package/dist/forms/fields/multiple-files.js +18 -0
  259. package/dist/forms/fields/number.js +42 -0
  260. package/dist/forms/fields/number.test.js +31 -0
  261. package/dist/forms/fields/pick-from-list.js +34 -0
  262. package/dist/forms/fields/pick-from-list.test.js +17 -0
  263. package/dist/forms/fields/proxy-field.js +23 -0
  264. package/dist/forms/fields/regexp.js +42 -0
  265. package/dist/forms/fields/regexp.test.js +21 -0
  266. package/dist/forms/fields/reverse-single-reference.js +17 -0
  267. package/dist/forms/fields/simple-form-field.js +22 -0
  268. package/dist/forms/fields/structured-array.js +21 -0
  269. package/dist/forms/form-types.js +1 -0
  270. package/dist/forms/form.js +203 -0
  271. package/dist/forms/form.test.js +316 -0
  272. package/dist/forms/multiform.js +200 -0
  273. package/dist/forms/multiform.test.js +486 -0
  274. package/dist/generate-collections.js +65 -0
  275. package/dist/generate-components.js +41 -0
  276. package/dist/generate-routes.js +90 -0
  277. package/dist/hehe.test.js +7 -0
  278. package/dist/index.js +26 -0
  279. package/dist/make-env.js +17 -0
  280. package/dist/make-hidden-inputs.js +15 -0
  281. package/dist/mount.js +66 -0
  282. package/dist/notifier.js +21 -0
  283. package/dist/page/access-control.js +19 -0
  284. package/dist/page/default-list-filters.js +46 -0
  285. package/dist/page/list.js +199 -0
  286. package/dist/page/mountable-with-fields.js +106 -0
  287. package/dist/page/mountable.js +9 -0
  288. package/dist/page/page.js +31 -0
  289. package/dist/page/props-parser.js +24 -0
  290. package/dist/page/sealious-list.js +61 -0
  291. package/dist/page/stateful-page.js +123 -0
  292. package/dist/run.js +1 -0
  293. package/dist/sample-index.js +3 -0
  294. package/dist/sample-lib.js +9 -0
  295. package/dist/sanitize.js +10 -0
  296. package/dist/templates/collection.js +15 -0
  297. package/{lib → dist}/templates/form.js +8 -9
  298. package/dist/templates/jdd-component.js +44 -0
  299. package/{lib → dist}/templates/list.js +47 -49
  300. package/{lib → dist}/templates/long-running-process.js +7 -8
  301. package/{lib → dist}/templates/multiform.js +7 -8
  302. package/{lib → dist}/templates/page.js +7 -8
  303. package/{lib → dist}/templates/post.js +5 -6
  304. package/{lib → dist}/templates/redirect.js +5 -6
  305. package/{lib → dist}/templates/route-test.js +12 -9
  306. package/{lib → dist}/templates/stateful-page.js +7 -8
  307. package/dist/templates/templates.js +24 -0
  308. package/dist/test_utils/locator_is_visible.js +14 -0
  309. package/dist/utils/assert-throws.js +18 -0
  310. package/dist/utils/base64.js +11 -0
  311. package/dist/utils/browser-creator.js +11 -0
  312. package/dist/utils/escape-url-params.js +11 -0
  313. package/dist/utils/exec.js +29 -0
  314. package/dist/utils/extract-fields-from-collection.js +33 -0
  315. package/dist/utils/format-external-url.js +11 -0
  316. package/dist/utils/import-path.js +23 -0
  317. package/dist/utils/input-wrapper.js +19 -0
  318. package/dist/utils/list-collections.js +13 -0
  319. package/dist/utils/make-slug.js +7 -0
  320. package/dist/utils/natural-numbers.js +9 -0
  321. package/dist/utils/prettier.js +15 -0
  322. package/dist/utils/question.js +20 -0
  323. package/dist/utils/render-attributes.js +18 -0
  324. package/dist/utils/sleep.js +7 -0
  325. package/dist/utils/translate.js +12 -0
  326. package/dist/utils/url-with-new-params.js +8 -0
  327. package/dist/utils/utils.js +28 -0
  328. package/dist/utils/walk.js +23 -0
  329. package/dist/vitest.config.js +23 -0
  330. package/package.json +22 -21
  331. package/remove-named-imports.js +65 -0
  332. package/src/add-collection.ts +3 -3
  333. package/src/add-jdd-component.ts +3 -3
  334. package/src/add-route.test.ts +38 -10
  335. package/src/add-route.ts +5 -5
  336. package/src/build.ts +16 -90
  337. package/src/cli.ts +14 -13
  338. package/src/components/components.ts +2 -2
  339. package/src/components/toggle-modal.ts +1 -1
  340. package/src/find-css-includes.ts +1 -1
  341. package/src/forms/controls/array.ts +9 -8
  342. package/src/forms/controls/autocomplete.ts +4 -4
  343. package/src/forms/controls/big-radio-group.ts +3 -3
  344. package/src/forms/controls/checkbox-group.ts +7 -6
  345. package/src/forms/controls/checkbox.ts +3 -3
  346. package/src/forms/controls/checkboxed-list-input.ts +4 -6
  347. package/src/forms/controls/collapsible-checkbox-group.ts +4 -7
  348. package/src/forms/controls/collapsible-field-group.ts +2 -2
  349. package/src/forms/controls/controls.ts +29 -29
  350. package/src/forms/controls/derived-frame.ts +4 -4
  351. package/src/forms/controls/derived.ts +3 -3
  352. package/src/forms/controls/dropdown.ts +6 -5
  353. package/src/forms/controls/editable-collection-subset.ts +4 -4
  354. package/src/forms/controls/field-group.ts +2 -4
  355. package/src/forms/controls/file.ts +4 -4
  356. package/src/forms/controls/form-control.ts +1 -1
  357. package/src/forms/controls/form-field-control.ts +3 -4
  358. package/src/forms/controls/form-header.ts +1 -3
  359. package/src/forms/controls/form-paragraph.ts +1 -1
  360. package/src/forms/controls/frame.ts +2 -2
  361. package/src/forms/controls/hidden-input.ts +5 -5
  362. package/src/forms/controls/html.ts +1 -4
  363. package/src/forms/controls/multiple-files.ts +24 -26
  364. package/src/forms/controls/multiple-photos.ts +4 -4
  365. package/src/forms/controls/number.ts +3 -6
  366. package/src/forms/controls/photo.ts +9 -8
  367. package/src/forms/controls/radio.ts +3 -3
  368. package/src/forms/controls/simple-input.ts +6 -6
  369. package/src/forms/controls/textarea.ts +4 -4
  370. package/src/forms/controls/tickable.ts +6 -6
  371. package/src/forms/fields/boolean.test.ts +2 -1
  372. package/src/forms/fields/boolean.ts +2 -2
  373. package/src/forms/fields/checkboxed-list.ts +2 -2
  374. package/src/forms/fields/collection-field.ts +2 -2
  375. package/src/forms/fields/email.test.ts +1 -1
  376. package/src/forms/fields/email.ts +1 -1
  377. package/src/forms/fields/enum-multiple.test.ts +1 -1
  378. package/src/forms/fields/enum-multiple.ts +2 -2
  379. package/src/forms/fields/enum.test.ts +1 -1
  380. package/src/forms/fields/enum.ts +2 -2
  381. package/src/forms/fields/existing-sealious-value.ts +1 -1
  382. package/src/forms/fields/field.ts +2 -18
  383. package/src/forms/fields/fields.ts +15 -0
  384. package/src/forms/fields/file.ts +8 -9
  385. package/src/forms/fields/multiple-files.ts +1 -1
  386. package/src/forms/fields/number.test.ts +2 -1
  387. package/src/forms/fields/number.ts +2 -2
  388. package/src/forms/fields/pick-from-list.test.ts +1 -1
  389. package/src/forms/fields/pick-from-list.ts +3 -3
  390. package/src/forms/fields/proxy-field.ts +1 -1
  391. package/src/forms/fields/regexp.test.ts +1 -1
  392. package/src/forms/fields/regexp.ts +2 -2
  393. package/src/forms/fields/reverse-single-reference.ts +1 -1
  394. package/src/forms/fields/simple-form-field.ts +2 -2
  395. package/src/forms/fields/structured-array.ts +2 -2
  396. package/src/forms/form-types.ts +30 -0
  397. package/src/forms/form.test.ts +16 -13
  398. package/src/forms/form.ts +11 -31
  399. package/src/forms/multiform.test.ts +33 -28
  400. package/src/forms/multiform.ts +4 -3
  401. package/src/generate-collections.ts +1 -1
  402. package/src/generate-components.ts +3 -1
  403. package/src/generate-routes.ts +5 -5
  404. package/src/index.ts +19 -17
  405. package/src/make-hidden-inputs.ts +3 -3
  406. package/src/mount.ts +5 -5
  407. package/src/page/list.ts +8 -6
  408. package/src/page/mountable-with-fields.ts +8 -4
  409. package/src/page/page.ts +3 -4
  410. package/src/page/props-parser.ts +2 -2
  411. package/src/page/sealious-list.ts +2 -2
  412. package/src/page/stateful-page.ts +3 -3
  413. package/src/templates/form.ts +1 -1
  414. package/src/templates/list.ts +6 -6
  415. package/src/templates/long-running-process.ts +1 -1
  416. package/src/templates/multiform.ts +1 -1
  417. package/src/templates/page.ts +1 -1
  418. package/src/templates/route-test.ts +1 -1
  419. package/src/templates/stateful-page.ts +1 -1
  420. package/src/templates/templates.ts +9 -9
  421. package/src/test_utils/locator_is_visible.ts +1 -1
  422. package/src/utils/extract-fields-from-collection.ts +1 -1
  423. package/src/utils/list-collections.ts +1 -1
  424. package/src/utils/prettier.ts +2 -2
  425. package/src/utils/render-attributes.ts +1 -1
  426. package/src/utils/utils.ts +12 -12
  427. package/src/vitest.config.ts +21 -0
  428. package/tsconfig.json +12 -5
  429. package/lib/add-collection.js +0 -31
  430. package/lib/add-jdd-component.js +0 -34
  431. package/lib/add-route.js +0 -72
  432. package/lib/add-route.test.js +0 -66
  433. package/lib/build.js +0 -217
  434. package/lib/cli.js +0 -36
  435. package/lib/components/components.js +0 -19
  436. package/lib/example.test.js +0 -4
  437. package/lib/find-css-includes.js +0 -30
  438. package/lib/find-scss-includes.js +0 -30
  439. package/lib/forms/controls/array.js +0 -148
  440. package/lib/forms/controls/autocomplete.js +0 -27
  441. package/lib/forms/controls/big-radio-group.js +0 -38
  442. package/lib/forms/controls/checkbox-group.js +0 -33
  443. package/lib/forms/controls/checkbox.js +0 -29
  444. package/lib/forms/controls/checkboxed-list-input.js +0 -39
  445. package/lib/forms/controls/collapsible-checkbox-group.js +0 -17
  446. package/lib/forms/controls/controls.js +0 -60
  447. package/lib/forms/controls/derived-frame.js +0 -56
  448. package/lib/forms/controls/derived.js +0 -81
  449. package/lib/forms/controls/dropdown.js +0 -60
  450. package/lib/forms/controls/editable-collection-subset.js +0 -72
  451. package/lib/forms/controls/field-group.js +0 -57
  452. package/lib/forms/controls/file.js +0 -39
  453. package/lib/forms/controls/form-control.js +0 -19
  454. package/lib/forms/controls/form-field-control.js +0 -13
  455. package/lib/forms/controls/form-header.js +0 -18
  456. package/lib/forms/controls/form-paragraph.js +0 -16
  457. package/lib/forms/controls/frame.js +0 -29
  458. package/lib/forms/controls/hidden-input.js +0 -18
  459. package/lib/forms/controls/html.js +0 -27
  460. package/lib/forms/controls/multiple-files.js +0 -164
  461. package/lib/forms/controls/multiple-photos.js +0 -37
  462. package/lib/forms/controls/number.js +0 -29
  463. package/lib/forms/controls/photo.js +0 -61
  464. package/lib/forms/controls/radio.js +0 -29
  465. package/lib/forms/controls/reverse-single-reference.js +0 -46
  466. package/lib/forms/controls/simple-input.js +0 -82
  467. package/lib/forms/controls/textarea.js +0 -37
  468. package/lib/forms/controls/tickable.js +0 -79
  469. package/lib/forms/fields/boolean.js +0 -55
  470. package/lib/forms/fields/boolean.test.js +0 -37
  471. package/lib/forms/fields/checkboxed-list.js +0 -44
  472. package/lib/forms/fields/collection-field.js +0 -33
  473. package/lib/forms/fields/email.js +0 -15
  474. package/lib/forms/fields/email.test.js +0 -25
  475. package/lib/forms/fields/enum-multiple.js +0 -51
  476. package/lib/forms/fields/enum-multiple.test.js +0 -32
  477. package/lib/forms/fields/enum.js +0 -43
  478. package/lib/forms/fields/enum.test.js +0 -26
  479. package/lib/forms/fields/existing-sealious-value.js +0 -20
  480. package/lib/forms/fields/field.js +0 -100
  481. package/lib/forms/fields/file.js +0 -57
  482. package/lib/forms/fields/multiple-files.js +0 -19
  483. package/lib/forms/fields/number.js +0 -49
  484. package/lib/forms/fields/number.test.js +0 -35
  485. package/lib/forms/fields/pick-from-list.js +0 -35
  486. package/lib/forms/fields/pick-from-list.test.js +0 -22
  487. package/lib/forms/fields/proxy-field.js +0 -24
  488. package/lib/forms/fields/regexp.js +0 -44
  489. package/lib/forms/fields/regexp.test.js +0 -26
  490. package/lib/forms/fields/reverse-single-reference.js +0 -18
  491. package/lib/forms/fields/simple-form-field.js +0 -23
  492. package/lib/forms/fields/structured-array.js +0 -22
  493. package/lib/forms/form.js +0 -183
  494. package/lib/forms/form.test.js +0 -275
  495. package/lib/forms/multiform.js +0 -178
  496. package/lib/forms/multiform.test.js +0 -431
  497. package/lib/generate-collections.js +0 -83
  498. package/lib/generate-components.js +0 -63
  499. package/lib/generate-routes.js +0 -105
  500. package/lib/index.js +0 -46
  501. package/lib/make-env.js +0 -21
  502. package/lib/make-hidden-inputs.js +0 -18
  503. package/lib/mount.js +0 -74
  504. package/lib/notifier.js +0 -26
  505. package/lib/page/access-control.js +0 -20
  506. package/lib/page/default-list-filters.js +0 -45
  507. package/lib/page/list.js +0 -190
  508. package/lib/page/mountable-with-fields.js +0 -89
  509. package/lib/page/mountable.js +0 -9
  510. package/lib/page/page.js +0 -30
  511. package/lib/page/props-parser.js +0 -31
  512. package/lib/page/sealious-list.js +0 -66
  513. package/lib/page/stateful-page.js +0 -104
  514. package/lib/run.js +0 -1
  515. package/lib/sanitize.js +0 -14
  516. package/lib/templates/collection.js +0 -16
  517. package/lib/templates/jdd-component.js +0 -43
  518. package/lib/templates/templates.js +0 -24
  519. package/lib/test_utils/locator_is_visible.js +0 -15
  520. package/lib/utils/assert-throws.js +0 -24
  521. package/lib/utils/base64.js +0 -12
  522. package/lib/utils/browser-creator.js +0 -14
  523. package/lib/utils/escape-url-params.js +0 -19
  524. package/lib/utils/exec.js +0 -26
  525. package/lib/utils/extract-fields-from-collection.js +0 -32
  526. package/lib/utils/format-external-url.js +0 -15
  527. package/lib/utils/import-path.js +0 -24
  528. package/lib/utils/input-wrapper.js +0 -20
  529. package/lib/utils/list-collections.js +0 -20
  530. package/lib/utils/make-slug.js +0 -10
  531. package/lib/utils/natural-numbers.js +0 -10
  532. package/lib/utils/prettier.js +0 -40
  533. package/lib/utils/question.js +0 -23
  534. package/lib/utils/render-attributes.js +0 -23
  535. package/lib/utils/sleep.js +0 -8
  536. package/lib/utils/translate.js +0 -10
  537. package/lib/utils/url-with-new-params.js +0 -12
  538. package/lib/utils/utils.js +0 -43
  539. package/lib/utils/walk.js +0 -27
@@ -0,0 +1,486 @@
1
+ import Router from "@koa/router";
2
+ import Koa from "koa";
3
+ import axios from "axios";
4
+ import { expect } from "@playwright/test";
5
+ import { tempstream } from "tempstream";
6
+ import { mount } from "../mount.js";
7
+ import { Multiform } from "./multiform.js";
8
+ import { assertThrowsAsync } from "../utils/utils.js";
9
+ import { form_factory } from "./form.test.js";
10
+ import { getBrowser } from "../utils/browser-creator.js";
11
+ import { SimpleFormField } from "./fields/simple-form-field.js";
12
+ import { Form } from "./form.js";
13
+ import { FormHeader } from "./controls/form-header.js";
14
+ import { SimpleInput } from "./controls/simple-input.js";
15
+ import { EmailField } from "./fields/email.js";
16
+ const fields1 = {
17
+ email: new SimpleFormField(true)
18
+ };
19
+ const form1 = new class extends Form {
20
+ constructor() {
21
+ super(...arguments);
22
+ this.defaultSuccessMessage = "Form1 done!";
23
+ this.controls = [new FormHeader("form1"), new SimpleInput(fields1.email)];
24
+ this.fields = fields1;
25
+ }
26
+ onSubmit() {
27
+ return;
28
+ }
29
+ }();
30
+ const fields2 = {
31
+ name: new SimpleFormField(true)
32
+ };
33
+ const form2 = new class extends Form {
34
+ constructor() {
35
+ super(...arguments);
36
+ this.defaultSuccessMessage = "Form2 done!";
37
+ this.controls = [new FormHeader("form2"), new SimpleInput(fields2.name)];
38
+ this.fields = fields2;
39
+ }
40
+ onSubmit() {
41
+ return;
42
+ }
43
+ }();
44
+ function multiform_factory(canAccessFun1, canAccessFun2) {
45
+ return new class extends Multiform {
46
+ constructor() {
47
+ super(...arguments);
48
+ this.name = "multiform_test";
49
+ this.forms = {
50
+ form1: form_factory(canAccessFun1),
51
+ form2: form_factory(canAccessFun2)
52
+ };
53
+ }
54
+ async render(...args) {
55
+ return tempstream`<!DOCTYPE html>
56
+ <html>
57
+ <head>
58
+ <title>Multiform Test - Sealgen</title>
59
+ <script type="module">
60
+ import hotwiredTurbo from "https://cdn.skypack.dev/pin/@hotwired/turbo@v7.0.0-9XNv1By6uiqRlBzQLO2d/mode=imports,min/optimized/@hotwired/turbo.js";
61
+ </script>
62
+ </head>
63
+ <body>
64
+ ${super.render(...args)}
65
+ </body>
66
+ </html>`;
67
+ }
68
+ }();
69
+ }
70
+ async function tests(js_enabled) {
71
+ let page;
72
+ beforeAll(async () => {
73
+ const browser = await getBrowser();
74
+ const context = await browser.newContext({
75
+ javaScriptEnabled: js_enabled
76
+ });
77
+ page = await context.newPage();
78
+ await page.goto("http://localhost:8080");
79
+ await page.getByLabel("email").click();
80
+ await page.getByLabel("email").fill("sample1");
81
+ await page.getByLabel("name").click();
82
+ await page.getByLabel("name").fill("sample2");
83
+ await page.locator("#multiform_test_form1_submit").click();
84
+ });
85
+ it("checking whether only one submit handler is run", async () => {
86
+ await page.getByText("Form1 done!").click();
87
+ await assertThrowsAsync(async () => {
88
+ return page.getByText("Form2 done!").click({ timeout: 500 });
89
+ });
90
+ });
91
+ it("checking whether the input in the not submitted form prevails", async () => {
92
+ await expect(page.getByLabel("name")).toHaveValue("sample2");
93
+ });
94
+ }
95
+ async function general_form_validation_e2e_tests(js_enabled) {
96
+ let browser;
97
+ let page;
98
+ browser = await getBrowser();
99
+ const context = await browser.newContext({
100
+ javaScriptEnabled: js_enabled
101
+ });
102
+ page = await context.newPage();
103
+ await page.goto("http://localhost:8080");
104
+ await page.getByPlaceholder("text").click();
105
+ await page.getByPlaceholder("text").fill("incorrect");
106
+ await page.getByPlaceholder("password").click();
107
+ await page.getByPlaceholder("password").fill("test");
108
+ await page.locator("#multiform_test_form2_submit").click();
109
+ await assertThrowsAsync(async () => {
110
+ await page.getByText("Incorrect input").click({ timeout: 500 });
111
+ });
112
+ }
113
+ async function individual_field_validation_e2e_tests(javaScriptEnabled) {
114
+ let browser;
115
+ let page;
116
+ beforeAll(async () => {
117
+ browser = await getBrowser();
118
+ const context = await browser.newContext({
119
+ javaScriptEnabled
120
+ });
121
+ page = await context.newPage();
122
+ await page.goto("http://localhost:8080");
123
+ });
124
+ it("validation message shows when incorrect input is given", async () => {
125
+ await page.getByPlaceholder("text").click();
126
+ await page.getByPlaceholder("text").fill("notanemail");
127
+ await page.locator("#multiform_test_form1_submit").click();
128
+ await page.getByText("Please enter a proper email address").click();
129
+ });
130
+ it("validation message doesn't show when correct input is given", async () => {
131
+ await page.getByPlaceholder("text").click();
132
+ await page.getByPlaceholder("text").fill("yes@an.email");
133
+ await page.locator("#multiform_test_form1_submit").click();
134
+ assertThrowsAsync(async () => {
135
+ return page.getByText("Please enter a proper email address").click({ timeout: 500 });
136
+ });
137
+ });
138
+ }
139
+ describe("multiform test", () => {
140
+ describe("basic tests", async () => {
141
+ let server;
142
+ beforeAll(async () => {
143
+ const app = new Koa();
144
+ const router = new Router();
145
+ mount(
146
+ router,
147
+ "/",
148
+ new class extends Multiform {
149
+ constructor() {
150
+ super(...arguments);
151
+ this.name = "multiform_test";
152
+ this.forms = { form1, form2 };
153
+ }
154
+ async render(ctx, messages, prerenderedForms, show_field_errors = true) {
155
+ return tempstream`<!DOCTYPE html>
156
+ <html>
157
+ <head>
158
+ <title>Multiform Test - Sealgen</title>
159
+ <script type="module">
160
+ import hotwiredTurbo from "https://cdn.skypack.dev/pin/@hotwired/turbo@v7.0.0-9XNv1By6uiqRlBzQLO2d/mode=imports,min/optimized/@hotwired/turbo.js";
161
+ </script>
162
+ </head>
163
+ <body>
164
+ ${super.render(
165
+ ctx,
166
+ messages,
167
+ prerenderedForms,
168
+ show_field_errors
169
+ )}
170
+ </body>
171
+ </html>`;
172
+ }
173
+ }(),
174
+ true
175
+ );
176
+ app.use(router.routes()).use(router.allowedMethods());
177
+ server = app.listen(8080);
178
+ });
179
+ afterAll(() => {
180
+ server.close();
181
+ });
182
+ describe("turbolinks + js enabled", async () => tests(true));
183
+ describe("turbolinks + js disabled", async () => tests(false));
184
+ });
185
+ describe("canAccess", async () => {
186
+ let page;
187
+ let server;
188
+ describe("allow access to both forms when both canAccess return true", async () => {
189
+ beforeAll(async () => {
190
+ const app = new Koa();
191
+ const router = new Router();
192
+ mount(
193
+ router,
194
+ "/",
195
+ multiform_factory(
196
+ async (ctx) => {
197
+ return { canAccess: true, message: "" };
198
+ },
199
+ async (ctx) => {
200
+ return { canAccess: true, message: "" };
201
+ }
202
+ ),
203
+ true
204
+ );
205
+ app.use(router.routes()).use(router.allowedMethods());
206
+ server = app.listen(8080);
207
+ const browser = await getBrowser();
208
+ const context = await browser.newContext();
209
+ page = await context.newPage();
210
+ });
211
+ afterAll(async () => {
212
+ server.close();
213
+ });
214
+ it("check wether it renders", async () => {
215
+ const response = await page.goto("http://localhost:8080");
216
+ if (response?.status() != 200) {
217
+ throw new Error(
218
+ `Should return 200 status and it returns ${response?.status()}`
219
+ );
220
+ }
221
+ await page.locator("#form1").getByText("This is a test:").click();
222
+ await page.locator("#form2").getByText("This is a test:").click();
223
+ });
224
+ it("check wether you can submit through http (axios)", async () => {
225
+ await axios.post(
226
+ "http://localhost:8080/form2",
227
+ {
228
+ form2__text: "pass"
229
+ },
230
+ {
231
+ validateStatus: (status) => {
232
+ if (status == 422)
233
+ return true;
234
+ return false;
235
+ }
236
+ }
237
+ );
238
+ });
239
+ });
240
+ describe("deny access to both forms", async () => {
241
+ beforeAll(async () => {
242
+ const app = new Koa();
243
+ const router = new Router();
244
+ mount(
245
+ router,
246
+ "/",
247
+ multiform_factory(
248
+ async (ctx) => {
249
+ return { canAccess: false, message: "" };
250
+ },
251
+ async (ctx) => {
252
+ return { canAccess: false, message: "" };
253
+ }
254
+ ),
255
+ true
256
+ );
257
+ app.use(router.routes()).use(router.allowedMethods());
258
+ server = app.listen(8080);
259
+ const browser = await getBrowser();
260
+ const context = await browser.newContext();
261
+ page = await context.newPage();
262
+ });
263
+ afterAll(async () => {
264
+ server.close();
265
+ });
266
+ it("check wether forms didnt render", async () => {
267
+ await page.goto("http://localhost:8080");
268
+ await assertThrowsAsync(async () => {
269
+ return page.locator("#form1").getByText("This is a test:").click({ timeout: 300 });
270
+ });
271
+ });
272
+ it("check wether it's possible to submit through http", async () => {
273
+ await axios.post(
274
+ "http://localhost:8080/form2",
275
+ {
276
+ form2__text: "pass"
277
+ },
278
+ {
279
+ validateStatus: (status) => {
280
+ if (status == 403)
281
+ return true;
282
+ return false;
283
+ }
284
+ }
285
+ );
286
+ });
287
+ });
288
+ describe("allow access to one form, deny to the other", async () => {
289
+ beforeAll(async () => {
290
+ const app = new Koa();
291
+ const router = new Router();
292
+ mount(
293
+ router,
294
+ "/",
295
+ multiform_factory(
296
+ async (ctx) => {
297
+ return { canAccess: true, message: "" };
298
+ },
299
+ async (ctx) => {
300
+ return { canAccess: false, message: "" };
301
+ }
302
+ ),
303
+ true
304
+ );
305
+ app.use(router.routes()).use(router.allowedMethods());
306
+ server = app.listen(8080);
307
+ const browser = await getBrowser();
308
+ const context = await browser.newContext({});
309
+ page = await context.newPage();
310
+ });
311
+ afterAll(async () => {
312
+ server.close();
313
+ });
314
+ it("check wether form1 renders", async () => {
315
+ await page.goto("http://localhost:8080");
316
+ await page.locator("#form1").getByText("This is a test:").click({ timeout: 300 });
317
+ });
318
+ it("check wether it's possible to submit to form1 through http", async () => {
319
+ await axios.post(
320
+ "http://localhost:8080/form1",
321
+ {
322
+ form1__text: "pass"
323
+ },
324
+ {
325
+ validateStatus: (status) => {
326
+ if (status == 422)
327
+ return true;
328
+ return false;
329
+ }
330
+ }
331
+ );
332
+ });
333
+ it("check wether form2 does not render", async () => {
334
+ await page.goto("http://localhost:8080");
335
+ await assertThrowsAsync(async () => {
336
+ return page.locator("#form2").getByText("This is a test:").click({ timeout: 300 });
337
+ });
338
+ });
339
+ it("check wether it's possible to submit to form2 through http", async () => {
340
+ await axios.post(
341
+ "http://localhost:8080/form2",
342
+ {
343
+ form2__text: "pass"
344
+ },
345
+ {
346
+ validateStatus: (status) => {
347
+ if (status == 403)
348
+ return true;
349
+ return false;
350
+ }
351
+ }
352
+ );
353
+ });
354
+ });
355
+ });
356
+ describe("validation e2e", async () => {
357
+ describe("basic tests", async () => {
358
+ let server;
359
+ beforeAll(async () => {
360
+ const app = new Koa();
361
+ const router = new Router();
362
+ mount(
363
+ router,
364
+ "/",
365
+ new class extends Multiform {
366
+ constructor() {
367
+ super(...arguments);
368
+ this.name = "multiform_test";
369
+ this.forms = {
370
+ form1: new class extends Form {
371
+ constructor() {
372
+ super(...arguments);
373
+ this.fields = fields1;
374
+ this.submitButtonText = "Submit";
375
+ this.controls = [
376
+ new SimpleInput(fields1.email, {
377
+ label: "This is a test:",
378
+ type: "text"
379
+ })
380
+ ];
381
+ }
382
+ async onSubmit() {
383
+ return;
384
+ }
385
+ async validateValues(ctx, data) {
386
+ if (data.email === "incorrect")
387
+ return {
388
+ valid: false,
389
+ error: "Incorrect input"
390
+ };
391
+ return { valid: true, error: "" };
392
+ }
393
+ }(),
394
+ form2: form_factory()
395
+ };
396
+ }
397
+ async render(...args) {
398
+ return tempstream`<!DOCTYPE html>
399
+ <html>
400
+ <head>
401
+ <title>Multiform Test - Sealgen</title>
402
+ <script type="module">
403
+ import hotwiredTurbo from "https://cdn.skypack.dev/pin/@hotwired/turbo@v7.0.0-9XNv1By6uiqRlBzQLO2d/mode=imports,min/optimized/@hotwired/turbo.js";
404
+ </script>
405
+ </head>
406
+ <body>
407
+ ${super.render(...args)}
408
+ </body>
409
+ </html>`;
410
+ }
411
+ }(),
412
+ true
413
+ );
414
+ app.use(router.routes()).use(router.allowedMethods());
415
+ server = app.listen(8080);
416
+ });
417
+ afterAll(async () => {
418
+ server.close();
419
+ });
420
+ it("js enabled", async () => general_form_validation_e2e_tests(true));
421
+ it("js disabled", async () => general_form_validation_e2e_tests(false));
422
+ });
423
+ describe("field specific validation", async () => {
424
+ let server;
425
+ beforeAll(async () => {
426
+ const app = new Koa();
427
+ const router = new Router();
428
+ const fields = {
429
+ text: new EmailField(true)
430
+ };
431
+ mount(
432
+ router,
433
+ "/",
434
+ new class extends Multiform {
435
+ constructor() {
436
+ super(...arguments);
437
+ this.name = "multiform_test";
438
+ this.forms = {
439
+ form1: new class extends Form {
440
+ constructor() {
441
+ super(...arguments);
442
+ this.fields = fields;
443
+ this.submitButtonText = "Submit";
444
+ this.controls = [
445
+ new SimpleInput(fields.text, {
446
+ label: "This is a test:",
447
+ type: "text"
448
+ })
449
+ ];
450
+ }
451
+ async onSubmit() {
452
+ return;
453
+ }
454
+ }(),
455
+ form2: form_factory()
456
+ };
457
+ }
458
+ async render(...args) {
459
+ return tempstream`<!DOCTYPE html>
460
+ <html>
461
+ <head>
462
+ <title>Multiform Test - Sealgen</title>
463
+ <script type="module">
464
+ import hotwiredTurbo from "https://cdn.skypack.dev/pin/@hotwired/turbo@v7.0.0-9XNv1By6uiqRlBzQLO2d/mode=imports,min/optimized/@hotwired/turbo.js";
465
+ </script>
466
+ </head>
467
+ <body>
468
+ ${super.render(...args)}
469
+ </body>
470
+ </html>`;
471
+ }
472
+ }(),
473
+ true
474
+ );
475
+ app.use(router.routes()).use(router.allowedMethods());
476
+ server = app.listen(8080);
477
+ });
478
+ afterAll(async () => {
479
+ server.close();
480
+ });
481
+ describe("js enabled", async () => individual_field_validation_e2e_tests(true));
482
+ describe("js disabled", async () => individual_field_validation_e2e_tests(false));
483
+ });
484
+ });
485
+ });
486
+ //# sourceMappingURL=multiform.test.js.map
@@ -0,0 +1,65 @@
1
+ import _locreq from "locreq";
2
+ import * as prettier from "prettier";
3
+ import { promises as fs } from "fs";
4
+ import { assertType, predicates } from "@sealcode/ts-predicates";
5
+ import { getPrettierConfig } from "./utils/prettier.js";
6
+ const target_locreq = _locreq(process.cwd());
7
+ async function extractCollectionClassname(full_file_path) {
8
+ const file_content = await fs.readFile(full_file_path, "utf-8");
9
+ const result = /export default class (\w+)/.exec(file_content);
10
+ if (result === null) {
11
+ throw new Error("Missing 'export default class' statement?");
12
+ }
13
+ return assertType(
14
+ result[1],
15
+ predicates.string,
16
+ `Missing export default class in '${full_file_path}'?`
17
+ );
18
+ }
19
+ async function generateCollections() {
20
+ const collections_dir = target_locreq.resolve("src/back/collections");
21
+ const files = (await fs.readdir(collections_dir)).filter(
22
+ (f) => !/\.(sub)?test\./.exec(f) && f != "collections.ts" && !f.includes(".#") && f.endsWith(".ts")
23
+ );
24
+ const file_data = await Promise.all(
25
+ files.map(async (file) => {
26
+ const full_path = target_locreq.resolve(
27
+ "src/back/collections/" + file
28
+ );
29
+ const class_name = await extractCollectionClassname(full_path);
30
+ return {
31
+ class_name,
32
+ file,
33
+ full_path,
34
+ urlname: file.replace(".ts", "")
35
+ };
36
+ })
37
+ );
38
+ const content = `// DO NOT EDIT! This file is generated automaticaly with 'npm run generate-collections'
39
+ import { App } from "sealious";
40
+
41
+ ${file_data.map(
42
+ ({ class_name, urlname }) => `import _${class_name} from "./${urlname}.js";`
43
+ ).join("\n")}
44
+
45
+ ${file_data.map(
46
+ ({ class_name }) => `export const ${class_name} = new _${class_name}();`
47
+ ).join("\n")}
48
+
49
+ export const collections = {
50
+ ...App.BaseCollections,
51
+ ${file_data.map(({ class_name, urlname }) => ` "${urlname}": ${class_name},`).join("\n")}
52
+ };`;
53
+ await fs.writeFile(
54
+ target_locreq.resolve("src/back/collections/collections.ts"),
55
+ prettier.format(content, await getPrettierConfig())
56
+ );
57
+ console.log(
58
+ "Successfuly generated new src/back/collections/collections.ts file"
59
+ );
60
+ }
61
+ export {
62
+ extractCollectionClassname,
63
+ generateCollections
64
+ };
65
+ //# sourceMappingURL=generate-collections.js.map
@@ -0,0 +1,41 @@
1
+ import _locreq from "locreq";
2
+ import * as prettier from "prettier";
3
+ import { promises as fs } from "fs";
4
+ import { getPrettierConfig } from "./utils/prettier.js";
5
+ import recursive from "recursive-readdir";
6
+ import path from "path";
7
+ import { toKebabCase, toPascalCase } from "js-convert-case";
8
+ import { mkdir } from "fs/promises";
9
+ const target_locreq = _locreq(process.cwd());
10
+ async function generateComponents() {
11
+ const components_dir = target_locreq.resolve("src/back/jdd-components");
12
+ await mkdir(components_dir, { recursive: true });
13
+ const component_names = (await recursive(components_dir)).filter(
14
+ (c) => c.endsWith(".jdd.tsx")
15
+ );
16
+ const component_data = component_names.map(
17
+ (p) => "./" + path.relative(components_dir, p).replace(/\.[tj]sx?$/, ".js")
18
+ ).map((relative_path) => {
19
+ const name = relative_path.match(/\/([^\/]+).jdd/)?.[1];
20
+ return { name, relative_path };
21
+ });
22
+ const content = `// DO NOT EDIT! This file is generated automaticaly with 'npm run generate-components'
23
+ import { Registry } from "@sealcode/jdd";
24
+
25
+ export const registry = new Registry();
26
+ ${component_data.map(
27
+ (c) => `
28
+ import { ${toPascalCase(c.name)} } from "${c.relative_path}";
29
+ registry.add("${toKebabCase(c.name)}", ${toPascalCase(c.name)});`
30
+ ).join("\n")}`;
31
+ const target = "src/back/jdd-components/components.ts";
32
+ await fs.writeFile(
33
+ target_locreq.resolve(target),
34
+ prettier.format(content, await getPrettierConfig())
35
+ );
36
+ console.log(`Successfuly generated new ${target} file`);
37
+ }
38
+ export {
39
+ generateComponents
40
+ };
41
+ //# sourceMappingURL=generate-components.js.map
@@ -0,0 +1,90 @@
1
+ import { promises as fs } from "fs";
2
+ import * as prettier from "prettier";
3
+ import { relative } from "path";
4
+ import _locreq from "locreq";
5
+ import { walkDir } from "./utils/walk.js";
6
+ import { importPath } from "./utils/import-path.js";
7
+ import { assertType, predicates } from "@sealcode/ts-predicates";
8
+ import { unescape_url_params } from "./utils/escape-url-params.js";
9
+ import { getPrettierConfig } from "./utils/prettier.js";
10
+ import { Templates } from "./templates/templates.js";
11
+ const target_locreq = _locreq(process.cwd());
12
+ async function extractActionName(full_file_path) {
13
+ const file_content = await fs.readFile(full_file_path, "utf-8");
14
+ const result = /export const actionName = "(\w+)"/.exec(file_content);
15
+ if (result === null) {
16
+ throw new Error("Missing 'export const actionName' statement?");
17
+ }
18
+ return assertType(
19
+ result[1],
20
+ predicates.string,
21
+ "Missing export default class?"
22
+ );
23
+ }
24
+ function generateURL(actionName, url) {
25
+ const parts = url.split("/");
26
+ const params = parts.filter((part) => part.startsWith(":")).map((part) => part.slice(1));
27
+ if (params.length === 0) {
28
+ return `export const ${actionName}URL = "${url}";`;
29
+ }
30
+ return `export const ${actionName}URL = (${params.map((s) => s + ": string").join(", ")})=>\`${parts.map(
31
+ (part) => part.startsWith(":") ? "${" + part.slice(1) + "}" : part
32
+ ).join("/")}\`;
33
+ ${actionName}URL.params = [${params.map((param) => `"${param}"`).join(",")}];
34
+ ${actionName}URL.rawURL = "${url}";`;
35
+ }
36
+ async function generateRoutes() {
37
+ const files = await Promise.all(
38
+ (await walkDir(target_locreq.resolve("src/back/routes"))).filter(
39
+ (f) => Object.keys(Templates).some(
40
+ (key) => f.endsWith(`.${key}.ts`) || f.endsWith(`.${key}.tsx`)
41
+ )
42
+ ).map(async (fullpath) => ({
43
+ fullpath,
44
+ actionName: await extractActionName(fullpath),
45
+ url: unescape_url_params(
46
+ "/" + relative(
47
+ target_locreq.resolve("src/back/routes"),
48
+ fullpath
49
+ ).replace(/\..+/, "") + "/"
50
+ // trailing slash is important here, as it enables to use the entire path while building relative URLs. For example, while visiting /users/123, the path ./add-photo leads to /users/add-photo. While visiting /users/123/ (note the trailing slash), the path ./add-photo leads to /users/123/add-photo
51
+ )
52
+ }))
53
+ );
54
+ const routes_content = `// DO NOT EDIT! This file is generated automaticaly with npm run generate-routes
55
+
56
+ import Router from "@koa/router";
57
+ import { mount } from "@sealcode/sealgen";
58
+ import * as URLs from "./urls.js"
59
+
60
+ ${files.map(
61
+ ({ actionName, fullpath }) => `import { default as ${actionName} } from "${importPath(
62
+ target_locreq.resolve("src/back/routes/routes.ts"),
63
+ fullpath
64
+ )}";`
65
+ ).join("\n")}
66
+
67
+ export default function mountAutoRoutes(router: Router) {
68
+ ${files.map(
69
+ ({ actionName }) => ` mount(router, URLs.${actionName}URL, ${actionName});`
70
+ ).join("\n")}
71
+ }`;
72
+ const urls_content = `${files.sort(({ url: url1 }, { url: url2 }) => url1 < url2 ? -1 : 1).map(({ actionName, url }) => generateURL(actionName, url)).join("\n")}
73
+ `;
74
+ const prettier_config = await getPrettierConfig();
75
+ await fs.writeFile(
76
+ target_locreq.resolve("src/back/routes/routes.ts"),
77
+ prettier.format(routes_content, prettier_config)
78
+ );
79
+ await fs.writeFile(
80
+ target_locreq.resolve("src/back/routes/urls.ts"),
81
+ prettier.format(urls_content, prettier_config)
82
+ );
83
+ console.log(
84
+ "Successfuly generated new src/back/routes/routes.ts and src/back/routes/urls.ts"
85
+ );
86
+ }
87
+ export {
88
+ generateRoutes
89
+ };
90
+ //# sourceMappingURL=generate-routes.js.map
@@ -0,0 +1,7 @@
1
+ import { hehe } from "./sample-lib.js";
2
+ describe("hehe", () => {
3
+ it("hehe", () => {
4
+ hehe.hehe;
5
+ });
6
+ });
7
+ //# sourceMappingURL=hehe.test.js.map