@sealcode/sealgen 0.8.44 → 0.8.48

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 (423) hide show
  1. package/@types/index.d.ts +1 -0
  2. package/@types/page/stateful-page.d.ts +34 -0
  3. package/@types/templates/stateful-page.d.ts +1 -0
  4. package/@types/utils/base64.d.ts +2 -0
  5. package/@types/utils/utils.d.ts +3 -0
  6. package/lib/add-route.js +3 -0
  7. package/lib/generate-routes.js +2 -1
  8. package/lib/index.js +1 -0
  9. package/lib/make-env.js +1 -1
  10. package/lib/mount.js +1 -1
  11. package/lib/page/stateful-page.js +117 -0
  12. package/lib/templates/stateful-page.js +66 -0
  13. package/lib/utils/base64.js +12 -0
  14. package/lib/utils/utils.js +6 -1
  15. package/package.json +2 -1
  16. package/tsconfig.json +0 -1
  17. package/.arcconfig +0 -12
  18. package/.arclint +0 -18
  19. package/.eslintrc.js +0 -38
  20. package/.mocharc.js +0 -10
  21. package/.nyc_output/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +0 -1
  22. package/.nyc_output/0190dc00-d309-48d0-a5db-e9484e3c7334.json +0 -1
  23. package/.nyc_output/04bfea78-9274-4d35-b7e4-d0bf42636911.json +0 -1
  24. package/.nyc_output/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +0 -1
  25. package/.nyc_output/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +0 -1
  26. package/.nyc_output/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +0 -1
  27. package/.nyc_output/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +0 -1
  28. package/.nyc_output/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +0 -1
  29. package/.nyc_output/4573bb03-90d4-4408-ba15-b6835c618b33.json +0 -1
  30. package/.nyc_output/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +0 -1
  31. package/.nyc_output/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +0 -1
  32. package/.nyc_output/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +0 -1
  33. package/.nyc_output/6934a9dd-6431-48aa-93f1-4eeef0095773.json +0 -1
  34. package/.nyc_output/70979008-f285-481b-bb09-ca48a1376f81.json +0 -1
  35. package/.nyc_output/817c9485-a0ef-486d-8dee-906456fe77fb.json +0 -1
  36. package/.nyc_output/9f725153-f783-4948-81d3-c4cc792738bf.json +0 -1
  37. package/.nyc_output/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +0 -1
  38. package/.nyc_output/ec3011f0-8180-492e-8d85-4d92484ccb44.json +0 -1
  39. package/.nyc_output/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +0 -1
  40. package/.nyc_output/processinfo/00b15432-2e8d-4b16-9dd6-7e23314363c9.json +0 -1
  41. package/.nyc_output/processinfo/0190dc00-d309-48d0-a5db-e9484e3c7334.json +0 -1
  42. package/.nyc_output/processinfo/04bfea78-9274-4d35-b7e4-d0bf42636911.json +0 -1
  43. package/.nyc_output/processinfo/0d4efe84-14e0-4bf0-bf22-b95472fe2be4.json +0 -1
  44. package/.nyc_output/processinfo/1faea508-9cb4-46f4-b7ad-94a816e1ee7d.json +0 -1
  45. package/.nyc_output/processinfo/2b2df469-dc31-48c9-ab34-68a74266e2c2.json +0 -1
  46. package/.nyc_output/processinfo/32b5e63b-c8f8-4d9d-a09b-d97656c0e3f6.json +0 -1
  47. package/.nyc_output/processinfo/442ce939-4f43-496b-a8a9-2f1fb9cfa619.json +0 -1
  48. package/.nyc_output/processinfo/4573bb03-90d4-4408-ba15-b6835c618b33.json +0 -1
  49. package/.nyc_output/processinfo/468fbd9c-6a27-4e33-8423-dbaec01e62a9.json +0 -1
  50. package/.nyc_output/processinfo/51894388-b88d-4f0b-8d5b-4a1dd71cf668.json +0 -1
  51. package/.nyc_output/processinfo/56263b22-3ed5-4ce2-9bbb-f2c9575cdeee.json +0 -1
  52. package/.nyc_output/processinfo/6934a9dd-6431-48aa-93f1-4eeef0095773.json +0 -1
  53. package/.nyc_output/processinfo/70979008-f285-481b-bb09-ca48a1376f81.json +0 -1
  54. package/.nyc_output/processinfo/817c9485-a0ef-486d-8dee-906456fe77fb.json +0 -1
  55. package/.nyc_output/processinfo/9f725153-f783-4948-81d3-c4cc792738bf.json +0 -1
  56. package/.nyc_output/processinfo/cd4d852c-f8fc-4cb1-807b-7d053a0ef8fc.json +0 -1
  57. package/.nyc_output/processinfo/ec3011f0-8180-492e-8d85-4d92484ccb44.json +0 -1
  58. package/.nyc_output/processinfo/f78b831a-65ca-497d-9f9e-001a3efa6f54.json +0 -1
  59. package/.nyc_output/processinfo/index.json +0 -1
  60. package/.nycrc +0 -6
  61. package/.prettierrc +0 -21
  62. package/.xunit +0 -47
  63. package/@types/forms/fields/files-multiple.d.ts +0 -12
  64. package/@types/sealgen-url.d.ts +0 -0
  65. package/@types/tests/manual/multiform.d.ts +0 -1
  66. package/coverage/clover.xml +0 -2240
  67. package/coverage/lcov-report/base.css +0 -224
  68. package/coverage/lcov-report/block-navigation.js +0 -79
  69. package/coverage/lcov-report/favicon.png +0 -0
  70. package/coverage/lcov-report/index.html +0 -231
  71. package/coverage/lcov-report/prettify.css +0 -1
  72. package/coverage/lcov-report/prettify.js +0 -2
  73. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  74. package/coverage/lcov-report/sorter.js +0 -170
  75. package/coverage/lcov-report/src/add-collection.ts.html +0 -173
  76. package/coverage/lcov-report/src/add-route.test.ts.html +0 -254
  77. package/coverage/lcov-report/src/add-route.ts.html +0 -338
  78. package/coverage/lcov-report/src/build.ts.html +0 -359
  79. package/coverage/lcov-report/src/cli.ts.html +0 -188
  80. package/coverage/lcov-report/src/components/components.ts.html +0 -86
  81. package/coverage/lcov-report/src/components/index.html +0 -141
  82. package/coverage/lcov-report/src/components/tabs.ts.html +0 -365
  83. package/coverage/lcov-report/src/components/toggle-modal.ts.html +0 -236
  84. package/coverage/lcov-report/src/example.test.ts.html +0 -89
  85. package/coverage/lcov-report/src/find-scss-includes.ts.html +0 -176
  86. package/coverage/lcov-report/src/forms/controls/array.ts.html +0 -758
  87. package/coverage/lcov-report/src/forms/controls/autocomplete.ts.html +0 -179
  88. package/coverage/lcov-report/src/forms/controls/big-radio-group.ts.html +0 -224
  89. package/coverage/lcov-report/src/forms/controls/checkbox-group.ts.html +0 -293
  90. package/coverage/lcov-report/src/forms/controls/checkbox.ts.html +0 -182
  91. package/coverage/lcov-report/src/forms/controls/checkboxed-list-input.ts.html +0 -230
  92. package/coverage/lcov-report/src/forms/controls/collapsible-checkbox-group.ts.html +0 -164
  93. package/coverage/lcov-report/src/forms/controls/collapsible-field-group.ts.html +0 -362
  94. package/coverage/lcov-report/src/forms/controls/controls.ts.html +0 -170
  95. package/coverage/lcov-report/src/forms/controls/derived-frame.ts.html +0 -353
  96. package/coverage/lcov-report/src/forms/controls/derived.ts.html +0 -404
  97. package/coverage/lcov-report/src/forms/controls/dropdown.ts.html +0 -341
  98. package/coverage/lcov-report/src/forms/controls/editable-collection-subset.ts.html +0 -371
  99. package/coverage/lcov-report/src/forms/controls/field-group.ts.html +0 -287
  100. package/coverage/lcov-report/src/forms/controls/file.ts.html +0 -221
  101. package/coverage/lcov-report/src/forms/controls/form-control.ts.html +0 -152
  102. package/coverage/lcov-report/src/forms/controls/form-field-control.ts.html +0 -146
  103. package/coverage/lcov-report/src/forms/controls/form-header.ts.html +0 -137
  104. package/coverage/lcov-report/src/forms/controls/form-paragraph.ts.html +0 -113
  105. package/coverage/lcov-report/src/forms/controls/frame.ts.html +0 -158
  106. package/coverage/lcov-report/src/forms/controls/hidden-input.ts.html +0 -146
  107. package/coverage/lcov-report/src/forms/controls/html.ts.html +0 -194
  108. package/coverage/lcov-report/src/forms/controls/index.html +0 -561
  109. package/coverage/lcov-report/src/forms/controls/multiple-files.ts.html +0 -848
  110. package/coverage/lcov-report/src/forms/controls/multiple-photos.ts.html +0 -212
  111. package/coverage/lcov-report/src/forms/controls/number.ts.html +0 -194
  112. package/coverage/lcov-report/src/forms/controls/photo.ts.html +0 -302
  113. package/coverage/lcov-report/src/forms/controls/radio.ts.html +0 -209
  114. package/coverage/lcov-report/src/forms/controls/reverse-single-reference.ts.html +0 -230
  115. package/coverage/lcov-report/src/forms/controls/simple-input.ts.html +0 -524
  116. package/coverage/lcov-report/src/forms/controls/textarea.ts.html +0 -260
  117. package/coverage/lcov-report/src/forms/controls/tickable.ts.html +0 -461
  118. package/coverage/lcov-report/src/forms/fields/boolean.test.ts.html +0 -188
  119. package/coverage/lcov-report/src/forms/fields/boolean.ts.html +0 -269
  120. package/coverage/lcov-report/src/forms/fields/checkboxed-list.ts.html +0 -278
  121. package/coverage/lcov-report/src/forms/fields/collection-field.ts.html +0 -266
  122. package/coverage/lcov-report/src/forms/fields/email.test.ts.html +0 -152
  123. package/coverage/lcov-report/src/forms/fields/email.ts.html +0 -140
  124. package/coverage/lcov-report/src/forms/fields/enum-multiple.test.ts.html +0 -173
  125. package/coverage/lcov-report/src/forms/fields/enum-multiple.ts.html +0 -266
  126. package/coverage/lcov-report/src/forms/fields/enum.test.ts.html +0 -155
  127. package/coverage/lcov-report/src/forms/fields/enum.ts.html +0 -248
  128. package/coverage/lcov-report/src/forms/fields/existing-sealious-value.ts.html +0 -146
  129. package/coverage/lcov-report/src/forms/fields/field.ts.html +0 -596
  130. package/coverage/lcov-report/src/forms/fields/file.ts.html +0 -347
  131. package/coverage/lcov-report/src/forms/fields/index.html +0 -456
  132. package/coverage/lcov-report/src/forms/fields/multiple-files.ts.html +0 -140
  133. package/coverage/lcov-report/src/forms/fields/number.test.ts.html +0 -182
  134. package/coverage/lcov-report/src/forms/fields/number.ts.html +0 -290
  135. package/coverage/lcov-report/src/forms/fields/pick-from-list.test.ts.html +0 -137
  136. package/coverage/lcov-report/src/forms/fields/pick-from-list.ts.html +0 -236
  137. package/coverage/lcov-report/src/forms/fields/proxy-field.ts.html +0 -152
  138. package/coverage/lcov-report/src/forms/fields/regexp.test.ts.html +0 -155
  139. package/coverage/lcov-report/src/forms/fields/regexp.ts.html +0 -239
  140. package/coverage/lcov-report/src/forms/fields/reverse-single-reference.ts.html +0 -140
  141. package/coverage/lcov-report/src/forms/fields/simple-form-field.ts.html +0 -170
  142. package/coverage/lcov-report/src/forms/fields/structured-array.ts.html +0 -161
  143. package/coverage/lcov-report/src/forms/form.test.ts.html +0 -1133
  144. package/coverage/lcov-report/src/forms/form.ts.html +0 -962
  145. package/coverage/lcov-report/src/forms/index.html +0 -156
  146. package/coverage/lcov-report/src/forms/multiform.test.ts.html +0 -1700
  147. package/coverage/lcov-report/src/forms/multiform.ts.html +0 -788
  148. package/coverage/lcov-report/src/generate-collections.ts.html +0 -311
  149. package/coverage/lcov-report/src/generate-routes.ts.html +0 -440
  150. package/coverage/lcov-report/src/index.html +0 -321
  151. package/coverage/lcov-report/src/index.ts.html +0 -152
  152. package/coverage/lcov-report/src/make-env.ts.html +0 -125
  153. package/coverage/lcov-report/src/make-hidden-inputs.ts.html +0 -152
  154. package/coverage/lcov-report/src/mount.ts.html +0 -335
  155. package/coverage/lcov-report/src/page/access-control.ts.html +0 -134
  156. package/coverage/lcov-report/src/page/index.html +0 -186
  157. package/coverage/lcov-report/src/page/list.ts.html +0 -800
  158. package/coverage/lcov-report/src/page/mountable-with-fields.ts.html +0 -554
  159. package/coverage/lcov-report/src/page/mountable.ts.html +0 -119
  160. package/coverage/lcov-report/src/page/page.ts.html +0 -218
  161. package/coverage/lcov-report/src/page/props-parser.ts.html +0 -194
  162. package/coverage/lcov-report/src/run.ts.html +0 -80
  163. package/coverage/lcov-report/src/sanitize.ts.html +0 -107
  164. package/coverage/lcov-report/src/templates/collection.ts.html +0 -113
  165. package/coverage/lcov-report/src/templates/form.ts.html +0 -260
  166. package/coverage/lcov-report/src/templates/index.html +0 -216
  167. package/coverage/lcov-report/src/templates/list.ts.html +0 -305
  168. package/coverage/lcov-report/src/templates/multiform.ts.html +0 -254
  169. package/coverage/lcov-report/src/templates/page.ts.html +0 -155
  170. package/coverage/lcov-report/src/templates/post.ts.html +0 -143
  171. package/coverage/lcov-report/src/templates/redirect.ts.html +0 -146
  172. package/coverage/lcov-report/src/templates/route-test.ts.html +0 -161
  173. package/coverage/lcov-report/src/test_utils/index.html +0 -111
  174. package/coverage/lcov-report/src/test_utils/locator_is_visible.ts.html +0 -131
  175. package/coverage/lcov-report/src/utils/assert-throws.ts.html +0 -134
  176. package/coverage/lcov-report/src/utils/browser-creator.js.html +0 -110
  177. package/coverage/lcov-report/src/utils/escape-url-params.ts.html +0 -122
  178. package/coverage/lcov-report/src/utils/exec.ts.html +0 -170
  179. package/coverage/lcov-report/src/utils/format-external-url.ts.html +0 -119
  180. package/coverage/lcov-report/src/utils/import-path.ts.html +0 -155
  181. package/coverage/lcov-report/src/utils/index.html +0 -366
  182. package/coverage/lcov-report/src/utils/input-wrapper.ts.html +0 -143
  183. package/coverage/lcov-report/src/utils/list-collections.ts.html +0 -128
  184. package/coverage/lcov-report/src/utils/make-slug.ts.html +0 -95
  185. package/coverage/lcov-report/src/utils/natural-numbers.ts.html +0 -95
  186. package/coverage/lcov-report/src/utils/prettier.ts.html +0 -119
  187. package/coverage/lcov-report/src/utils/question.ts.html +0 -149
  188. package/coverage/lcov-report/src/utils/render-attributes.ts.html +0 -131
  189. package/coverage/lcov-report/src/utils/sleep.ts.html +0 -89
  190. package/coverage/lcov-report/src/utils/translate.ts.html +0 -119
  191. package/coverage/lcov-report/src/utils/url-with-new-params.ts.html +0 -107
  192. package/coverage/lcov-report/src/utils/utils.ts.html +0 -122
  193. package/coverage/lcov-report/src/utils/walk.ts.html +0 -140
  194. package/coverage/lcov.info +0 -4697
  195. package/jenkins.sanity.sh +0 -3
  196. package/lib/add-collection.js.map +0 -1
  197. package/lib/add-route.js.map +0 -1
  198. package/lib/add-route.test.js.map +0 -1
  199. package/lib/build.js.map +0 -1
  200. package/lib/cli.js.map +0 -1
  201. package/lib/components/components.js.map +0 -1
  202. package/lib/components/tabs.js.map +0 -1
  203. package/lib/components/toggle-modal.js.map +0 -1
  204. package/lib/example.test.js.map +0 -1
  205. package/lib/find-scss-includes.js.map +0 -1
  206. package/lib/forms/controls/array.js.map +0 -1
  207. package/lib/forms/controls/autocomplete.js.map +0 -1
  208. package/lib/forms/controls/big-radio-group.js.map +0 -1
  209. package/lib/forms/controls/checkbox-group.js.map +0 -1
  210. package/lib/forms/controls/checkbox.js.map +0 -1
  211. package/lib/forms/controls/checkboxed-list-input.js.map +0 -1
  212. package/lib/forms/controls/collapsible-checkbox-group.js.map +0 -1
  213. package/lib/forms/controls/collapsible-field-group.js.map +0 -1
  214. package/lib/forms/controls/controls.js.map +0 -1
  215. package/lib/forms/controls/derived-frame.js.map +0 -1
  216. package/lib/forms/controls/derived.js.map +0 -1
  217. package/lib/forms/controls/dropdown.js.map +0 -1
  218. package/lib/forms/controls/editable-collection-subset.js.map +0 -1
  219. package/lib/forms/controls/field-group.js.map +0 -1
  220. package/lib/forms/controls/file.js.map +0 -1
  221. package/lib/forms/controls/form-control.js.map +0 -1
  222. package/lib/forms/controls/form-field-control.js.map +0 -1
  223. package/lib/forms/controls/form-header.js.map +0 -1
  224. package/lib/forms/controls/form-paragraph.js.map +0 -1
  225. package/lib/forms/controls/frame.js.map +0 -1
  226. package/lib/forms/controls/hidden-input.js.map +0 -1
  227. package/lib/forms/controls/html.js.map +0 -1
  228. package/lib/forms/controls/multiple-files.js.map +0 -1
  229. package/lib/forms/controls/multiple-photos.js.map +0 -1
  230. package/lib/forms/controls/number.js.map +0 -1
  231. package/lib/forms/controls/photo.js.map +0 -1
  232. package/lib/forms/controls/radio.js.map +0 -1
  233. package/lib/forms/controls/reverse-single-reference.js.map +0 -1
  234. package/lib/forms/controls/simple-input.js.map +0 -1
  235. package/lib/forms/controls/textarea.js.map +0 -1
  236. package/lib/forms/controls/tickable.js.map +0 -1
  237. package/lib/forms/fields/boolean.js.map +0 -1
  238. package/lib/forms/fields/boolean.test.js.map +0 -1
  239. package/lib/forms/fields/checkboxed-list.js.map +0 -1
  240. package/lib/forms/fields/collection-field.js.map +0 -1
  241. package/lib/forms/fields/email.js.map +0 -1
  242. package/lib/forms/fields/email.test.js.map +0 -1
  243. package/lib/forms/fields/enum-multiple.js.map +0 -1
  244. package/lib/forms/fields/enum-multiple.test.js.map +0 -1
  245. package/lib/forms/fields/enum.js.map +0 -1
  246. package/lib/forms/fields/enum.test.js.map +0 -1
  247. package/lib/forms/fields/existing-sealious-value.js.map +0 -1
  248. package/lib/forms/fields/field.js.map +0 -1
  249. package/lib/forms/fields/file.js.map +0 -1
  250. package/lib/forms/fields/files-multiple.js +0 -18
  251. package/lib/forms/fields/files-multiple.js.map +0 -1
  252. package/lib/forms/fields/multiple-files.js.map +0 -1
  253. package/lib/forms/fields/number.js.map +0 -1
  254. package/lib/forms/fields/number.test.js.map +0 -1
  255. package/lib/forms/fields/pick-from-list.js.map +0 -1
  256. package/lib/forms/fields/pick-from-list.test.js.map +0 -1
  257. package/lib/forms/fields/proxy-field.js.map +0 -1
  258. package/lib/forms/fields/regexp.js.map +0 -1
  259. package/lib/forms/fields/regexp.test.js.map +0 -1
  260. package/lib/forms/fields/reverse-single-reference.js.map +0 -1
  261. package/lib/forms/fields/simple-form-field.js.map +0 -1
  262. package/lib/forms/fields/structured-array.js.map +0 -1
  263. package/lib/forms/form.js.map +0 -1
  264. package/lib/forms/form.test.js.map +0 -1
  265. package/lib/forms/multiform.js.map +0 -1
  266. package/lib/forms/multiform.test.js.map +0 -1
  267. package/lib/generate-collections.js.map +0 -1
  268. package/lib/generate-routes.js.map +0 -1
  269. package/lib/index.js.map +0 -1
  270. package/lib/make-env.js.map +0 -1
  271. package/lib/make-hidden-inputs.js.map +0 -1
  272. package/lib/mount.js.map +0 -1
  273. package/lib/page/access-control.js.map +0 -1
  274. package/lib/page/list.js.map +0 -1
  275. package/lib/page/mountable-with-fields.js.map +0 -1
  276. package/lib/page/mountable.js.map +0 -1
  277. package/lib/page/page.js.map +0 -1
  278. package/lib/page/props-parser.js.map +0 -1
  279. package/lib/run.js.map +0 -1
  280. package/lib/sanitize.js.map +0 -1
  281. package/lib/sealgen-url.js +0 -1
  282. package/lib/sealgen-url.js.map +0 -1
  283. package/lib/templates/collection.js.map +0 -1
  284. package/lib/templates/form.js.map +0 -1
  285. package/lib/templates/list.js.map +0 -1
  286. package/lib/templates/multiform.js.map +0 -1
  287. package/lib/templates/page.js.map +0 -1
  288. package/lib/templates/post.js.map +0 -1
  289. package/lib/templates/redirect.js.map +0 -1
  290. package/lib/templates/route-test.js.map +0 -1
  291. package/lib/test_utils/locator_is_visible.js.map +0 -1
  292. package/lib/tests/manual/multiform.js +0 -95
  293. package/lib/tests/manual/multiform.js.map +0 -1
  294. package/lib/utils/assert-throws.js.map +0 -1
  295. package/lib/utils/browser-creator.js.map +0 -1
  296. package/lib/utils/escape-url-params.js.map +0 -1
  297. package/lib/utils/exec.js.map +0 -1
  298. package/lib/utils/format-external-url.js.map +0 -1
  299. package/lib/utils/import-path.js.map +0 -1
  300. package/lib/utils/input-wrapper.js.map +0 -1
  301. package/lib/utils/list-collections.js.map +0 -1
  302. package/lib/utils/make-slug.js.map +0 -1
  303. package/lib/utils/natural-numbers.js.map +0 -1
  304. package/lib/utils/prettier.js.map +0 -1
  305. package/lib/utils/question.js.map +0 -1
  306. package/lib/utils/render-attributes.js.map +0 -1
  307. package/lib/utils/sleep.js.map +0 -1
  308. package/lib/utils/translate.js.map +0 -1
  309. package/lib/utils/url-with-new-params.js.map +0 -1
  310. package/lib/utils/utils.js.map +0 -1
  311. package/lib/utils/walk.js.map +0 -1
  312. package/mocha_root_hooks.js +0 -6
  313. package/src/add-collection.ts +0 -31
  314. package/src/add-route.test.ts +0 -58
  315. package/src/add-route.ts +0 -86
  316. package/src/build.ts +0 -94
  317. package/src/cli.ts +0 -36
  318. package/src/components/components.ts +0 -2
  319. package/src/components/tabs.ts +0 -95
  320. package/src/components/toggle-modal.ts +0 -52
  321. package/src/example.test.ts +0 -3
  322. package/src/find-scss-includes.ts +0 -32
  323. package/src/forms/controls/array.ts +0 -226
  324. package/src/forms/controls/autocomplete.ts +0 -33
  325. package/src/forms/controls/big-radio-group.ts +0 -48
  326. package/src/forms/controls/checkbox-group.ts +0 -71
  327. package/src/forms/controls/checkbox.ts +0 -34
  328. package/src/forms/controls/checkboxed-list-input.ts +0 -50
  329. package/src/forms/controls/collapsible-checkbox-group.ts +0 -28
  330. package/src/forms/controls/collapsible-field-group.ts +0 -94
  331. package/src/forms/controls/controls.ts +0 -30
  332. package/src/forms/controls/derived-frame.ts +0 -91
  333. package/src/forms/controls/derived.ts +0 -108
  334. package/src/forms/controls/dropdown.ts +0 -87
  335. package/src/forms/controls/editable-collection-subset.ts +0 -97
  336. package/src/forms/controls/field-group.ts +0 -69
  337. package/src/forms/controls/file.ts +0 -47
  338. package/src/forms/controls/form-control.ts +0 -24
  339. package/src/forms/controls/form-field-control.ts +0 -22
  340. package/src/forms/controls/form-header.ts +0 -19
  341. package/src/forms/controls/form-paragraph.ts +0 -11
  342. package/src/forms/controls/frame.ts +0 -26
  343. package/src/forms/controls/hidden-input.ts +0 -22
  344. package/src/forms/controls/html.ts +0 -38
  345. package/src/forms/controls/multiple-files.ts +0 -256
  346. package/src/forms/controls/multiple-photos.ts +0 -44
  347. package/src/forms/controls/number.ts +0 -38
  348. package/src/forms/controls/photo.ts +0 -74
  349. package/src/forms/controls/radio.ts +0 -43
  350. package/src/forms/controls/reverse-single-reference.ts +0 -50
  351. package/src/forms/controls/simple-input.ts +0 -148
  352. package/src/forms/controls/textarea.ts +0 -60
  353. package/src/forms/controls/tickable.ts +0 -127
  354. package/src/forms/fields/boolean.test.ts +0 -36
  355. package/src/forms/fields/boolean.ts +0 -63
  356. package/src/forms/fields/checkboxed-list.ts +0 -66
  357. package/src/forms/fields/collection-field.ts +0 -62
  358. package/src/forms/fields/email.test.ts +0 -24
  359. package/src/forms/fields/email.ts +0 -20
  360. package/src/forms/fields/enum-multiple.test.ts +0 -31
  361. package/src/forms/fields/enum-multiple.ts +0 -62
  362. package/src/forms/fields/enum.test.ts +0 -25
  363. package/src/forms/fields/enum.ts +0 -56
  364. package/src/forms/fields/existing-sealious-value.ts +0 -22
  365. package/src/forms/fields/field.ts +0 -172
  366. package/src/forms/fields/file.ts +0 -89
  367. package/src/forms/fields/multiple-files.ts +0 -20
  368. package/src/forms/fields/number.test.ts +0 -34
  369. package/src/forms/fields/number.ts +0 -70
  370. package/src/forms/fields/pick-from-list.test.ts +0 -19
  371. package/src/forms/fields/pick-from-list.ts +0 -52
  372. package/src/forms/fields/proxy-field.ts +0 -24
  373. package/src/forms/fields/regexp.test.ts +0 -25
  374. package/src/forms/fields/regexp.ts +0 -53
  375. package/src/forms/fields/reverse-single-reference.ts +0 -20
  376. package/src/forms/fields/simple-form-field.ts +0 -30
  377. package/src/forms/fields/structured-array.ts +0 -27
  378. package/src/forms/form.test.ts +0 -351
  379. package/src/forms/form.ts +0 -294
  380. package/src/forms/forms.scss +0 -85
  381. package/src/forms/multiform.test.ts +0 -540
  382. package/src/forms/multiform.ts +0 -236
  383. package/src/generate-collections.ts +0 -77
  384. package/src/generate-routes.ts +0 -120
  385. package/src/index.ts +0 -24
  386. package/src/make-env.ts +0 -15
  387. package/src/make-hidden-inputs.ts +0 -24
  388. package/src/mount.ts +0 -85
  389. package/src/page/access-control.ts +0 -18
  390. package/src/page/list.ts +0 -240
  391. package/src/page/mountable-with-fields.ts +0 -158
  392. package/src/page/mountable.ts +0 -13
  393. package/src/page/page.ts +0 -46
  394. package/src/page/props-parser.ts +0 -38
  395. package/src/run.ts +0 -0
  396. package/src/sanitize.ts +0 -9
  397. package/src/templates/collection.ts +0 -11
  398. package/src/templates/form.ts +0 -60
  399. package/src/templates/list.ts +0 -75
  400. package/src/templates/multiform.ts +0 -58
  401. package/src/templates/page.ts +0 -25
  402. package/src/templates/post.ts +0 -21
  403. package/src/templates/redirect.ts +0 -22
  404. package/src/templates/route-test.ts +0 -27
  405. package/src/test_utils/locator_is_visible.ts +0 -17
  406. package/src/utils/assert-throws.ts +0 -18
  407. package/src/utils/browser-creator.js +0 -10
  408. package/src/utils/escape-url-params.ts +0 -14
  409. package/src/utils/exec.ts +0 -30
  410. package/src/utils/format-external-url.ts +0 -13
  411. package/src/utils/import-path.ts +0 -25
  412. package/src/utils/input-wrapper.ts +0 -21
  413. package/src/utils/list-collections.ts +0 -16
  414. package/src/utils/make-slug.ts +0 -5
  415. package/src/utils/natural-numbers.ts +0 -5
  416. package/src/utils/prettier.ts +0 -13
  417. package/src/utils/question.ts +0 -23
  418. package/src/utils/render-attributes.ts +0 -17
  419. package/src/utils/sleep.ts +0 -3
  420. package/src/utils/translate.ts +0 -13
  421. package/src/utils/url-with-new-params.ts +0 -9
  422. package/src/utils/utils.ts +0 -14
  423. package/src/utils/walk.ts +0 -20
@@ -1,236 +0,0 @@
1
- import Router from "@koa/router";
2
- import { is, predicates } from "@sealcode/ts-predicates";
3
- import { Context } from "koa";
4
- import { FlatTemplatable, tempstream } from "tempstream";
5
- import { Form, FormDataValue, FormMessage } from "..";
6
- import { Fields, MountableWithFields } from "../page/mountable-with-fields";
7
- import { attribute } from "../sanitize";
8
-
9
- const FIELD_PREFIX_SEPARATOR = "___";
10
-
11
- export class Multiform extends MountableWithFields {
12
- controls = [];
13
- public name: string;
14
- public forms: Record<string, Form<Fields, unknown>>;
15
-
16
- init(): void {
17
- super.init();
18
- for (const [key, form] of Object.entries(this.forms)) {
19
- if (key !== attribute(key)) {
20
- throw new Error(
21
- `Form name "${key}" is not url-safe. Try: "${attribute(
22
- key
23
- )}"`
24
- );
25
- }
26
- form.makeOpenFormTag = () => `<div>`;
27
- form.makeCloseFormTag = () => `</div>`;
28
- form.field_names_prefix = key + FIELD_PREFIX_SEPARATOR;
29
- form.form_id = this.name;
30
- form.action = "./" + key;
31
- form.init();
32
- form.extractRawValues = async (context) =>
33
- this.getSubformRawValues(context, key);
34
- const submit_button_id = this.name + "_" + key + "_submit";
35
-
36
- form.makeSubmitButton = () => /* HTML */ `<input
37
- type="submit"
38
- value="${form.submitButtonText}"
39
- formaction="${form.action}"
40
- id="${submit_button_id}"
41
- ${form.form_id ? `form="${form.form_id}"` : ""}
42
- /> `;
43
- }
44
- for (const form of Object.values(this.forms)) {
45
- for (const field of Object.values(form.fields)) {
46
- if (field.name.includes(FIELD_PREFIX_SEPARATOR)) {
47
- throw new Error(
48
- `A field name within multiform cannot contain '${FIELD_PREFIX_SEPARATOR}'`
49
- );
50
- }
51
- }
52
- }
53
- }
54
-
55
- async extractRawValues(
56
- ctx: Context
57
- ): Promise<Record<string, FormDataValue>> {
58
- return ctx.$body || {};
59
- }
60
-
61
- async canAccess(): Promise<{ canAccess: boolean; message: string }> {
62
- return {
63
- canAccess: true,
64
- message:
65
- "this view includes multiple forms and each of them have their unique access rules",
66
- };
67
- }
68
-
69
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
70
- getSubformsToRender(
71
- ctx: Context
72
- ): Array<readonly [string, Form<any, unknown>]> {
73
- const requested_frame = ctx.headers["turbo-frame"];
74
- if (
75
- !is(
76
- requested_frame,
77
- predicates.or(predicates.undefined, predicates.string)
78
- )
79
- ) {
80
- throw new Error("Wrong turbo-frame header value type");
81
- }
82
- const forms_to_render =
83
- requested_frame && this.forms[requested_frame]
84
- ? [<const>[requested_frame, this.forms[requested_frame]]]
85
- : Object.entries(this.forms);
86
- return forms_to_render;
87
- }
88
-
89
- async renderSubform(
90
- ctx: Context,
91
- sub_form_name: string,
92
- show_field_errors: boolean
93
- ): Promise<FlatTemplatable> {
94
- const form = this.forms[sub_form_name];
95
- const result = await form.canAccess(ctx);
96
- if (!result.canAccess) {
97
- return result.message;
98
- }
99
- return form.render(
100
- ctx,
101
- {
102
- raw_values: await this.getSubformRawValues(ctx, sub_form_name),
103
- messages: [],
104
- },
105
- show_field_errors
106
- );
107
- }
108
-
109
- async getSubformRawValues(
110
- ctx: Context,
111
- sub_form_name: string
112
- ): Promise<Record<string, FormDataValue>> {
113
- const result = Object.fromEntries(
114
- Object.entries(await this.extractRawValues(ctx))
115
- .filter(([key]) =>
116
- key.startsWith(sub_form_name + FIELD_PREFIX_SEPARATOR)
117
- )
118
- .map(([key, value]) => [
119
- key.slice((sub_form_name + FIELD_PREFIX_SEPARATOR).length),
120
- value,
121
- ])
122
- );
123
- return result;
124
- }
125
-
126
- async render(
127
- ctx: Context,
128
- messages: FormMessage[],
129
- prerenderedForms: Record<string, FlatTemplatable | undefined> = {},
130
- show_field_errors: boolean
131
- ): Promise<FlatTemplatable> {
132
- return tempstream/* HTML */ `${this.renderMessages(ctx, {
133
- raw_values: {},
134
- messages,
135
- })}
136
- <div class="forms">
137
- <form
138
- id="${this.name}"
139
- novalidate
140
- ${
141
- /* novalidate is here because all the subforms are actually one form and errors in one will prevent submitting all of the forms */ ""
142
- }
143
- method="POST"
144
- ></form>
145
- ${this.getSubformsToRender(ctx).map(([form_name]) => {
146
- const frame_form_id =
147
- this.name + "_" + form_name + "_frame_form";
148
- return tempstream/* HTML */ `<turbo-frame
149
- id="${form_name}"
150
- contains-subform
151
- subform-id="${frame_form_id}"
152
- >
153
- ${prerenderedForms[form_name] ||
154
- this.renderSubform(ctx, form_name, show_field_errors)}
155
- <form id="${frame_form_id}" method="POST"></form>
156
- </turbo-frame>`;
157
- })}
158
- </div>
159
- ${this.makeBottomScript()}`;
160
- }
161
-
162
- makeBottomScript(): string {
163
- // this script assigns each field to its corresponding form, instead of
164
- // the html-only version where all fields are attached to one meta-form
165
- return /* HTML */ ` <script>
166
- (function () {
167
- if (!window.subform_handlers) {
168
- window.subform_handlers = {};
169
- }
170
- if (window.subform_handlers["${this.name}"]) {
171
- return;
172
- }
173
- const handler = () => {
174
- document
175
- .querySelectorAll("turbo-frame[contains-subform]")
176
- .forEach((frame) => {
177
- frame_form_id = frame.getAttribute("subform-id");
178
- frame.querySelectorAll("input").forEach((input) => {
179
- input.setAttribute("form", frame_form_id);
180
- });
181
- });
182
- };
183
- window.subform_handlers["${this.name}"] = handler;
184
- document.documentElement.addEventListener(
185
- "turbo:load",
186
- handler
187
- );
188
- document.documentElement.addEventListener(
189
- "turbo:frame-render",
190
- handler
191
- );
192
- })();
193
- </script>`;
194
- }
195
-
196
- mount(router: Router, path: string): void {
197
- router.get(path, async (ctx) => {
198
- ctx.type = "html";
199
- ctx.body = await this.render(ctx, [], {}, false);
200
- });
201
-
202
- for (const [key, form] of Object.entries(this.forms)) {
203
- router.post(
204
- path + (path.endsWith("/") ? "" : "/") + key,
205
- async (ctx) => {
206
- const result = await form.canAccess(ctx);
207
- if (!result.canAccess) {
208
- ctx.body = this.renderError(ctx, {
209
- type: "access",
210
- message: result.message,
211
- });
212
- ctx.status = 403;
213
- return;
214
- }
215
-
216
- const reaction = await form.handlePost(ctx);
217
- if (reaction.action == "stay") {
218
- ctx.status = 422;
219
- const form_content = reaction.content;
220
- ctx.body = this.render(
221
- ctx,
222
- [],
223
- {
224
- [key]: form_content,
225
- },
226
- true
227
- );
228
- } else if (reaction.action == "redirect") {
229
- ctx.status = 303;
230
- ctx.redirect(reaction.url);
231
- }
232
- }
233
- );
234
- }
235
- }
236
- }
@@ -1,77 +0,0 @@
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";
6
-
7
- const target_locreq = _locreq(process.cwd());
8
-
9
- async function extractCollectionClassname(
10
- full_file_path: string
11
- ): Promise<string> {
12
- const file_content = await fs.readFile(full_file_path, "utf-8");
13
- const result = /export default class (\w+)/.exec(file_content);
14
- if (result === null) {
15
- throw new Error("Missing 'export default class' statement?");
16
- }
17
- return assertType(
18
- result[1],
19
- predicates.string,
20
- `Missing export default class in '${full_file_path}'?`
21
- );
22
- }
23
-
24
- export async function generateCollections(): Promise<void> {
25
- const collections_dir = target_locreq.resolve("src/back/collections");
26
- const files = (await fs.readdir(collections_dir)).filter(
27
- (f) =>
28
- !/\.(sub)?test\./.exec(f) &&
29
- f != "collections.ts" &&
30
- f.endsWith(".ts")
31
- );
32
- const file_data = await Promise.all(
33
- files.map(async (file) => {
34
- const full_path = target_locreq.resolve(
35
- "src/back/collections/" + file
36
- );
37
- const class_name = await extractCollectionClassname(full_path);
38
- return {
39
- class_name,
40
- file,
41
- full_path,
42
- urlname: file.replace(".ts", ""),
43
- };
44
- })
45
- );
46
-
47
- const content = `// DO NOT EDIT! This file is generated automaticaly with 'npm run generate-collections'
48
- import { App } from "sealious";
49
-
50
- ${file_data
51
- .map(
52
- ({ class_name, urlname }) =>
53
- `import _${class_name} from "./${urlname}";`
54
- )
55
- .join("\n")}
56
-
57
- ${file_data
58
- .map(
59
- ({ class_name }) => `export const ${class_name} = new _${class_name}();`
60
- )
61
- .join("\n")}
62
-
63
- export const collections = {
64
- ...App.BaseCollections,
65
- ${file_data
66
- .map(({ class_name, urlname }) => ` "${urlname}": ${class_name},`)
67
- .join("\n")}
68
- };`;
69
- await fs.writeFile(
70
- target_locreq.resolve("src/back/collections/collections.ts"),
71
- prettier.format(content, await getPrettierConfig())
72
- );
73
- // eslint-disable-next-line no-console
74
- console.log(
75
- "Successfuly generated new src/back/collections/collections.ts file"
76
- );
77
- }
@@ -1,120 +0,0 @@
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";
6
- import { importPath } from "./utils/import-path";
7
- import { assertType, predicates } from "@sealcode/ts-predicates";
8
- import { unescape_url_params } from "./utils/escape-url-params";
9
- import { getPrettierConfig } from "./utils/prettier";
10
-
11
- const target_locreq = _locreq(process.cwd());
12
-
13
- async function extractActionName(full_file_path: string): Promise<string> {
14
- const file_content = await fs.readFile(full_file_path, "utf-8");
15
- const result = /export const actionName = "(\w+)"/.exec(file_content);
16
- if (result === null) {
17
- throw new Error("Missing 'export const actionName' statement?");
18
- }
19
- return assertType(
20
- result[1],
21
- predicates.string,
22
- "Missing export default class?"
23
- );
24
- }
25
-
26
- function generateURL(actionName: string, url: string) {
27
- const parts = url.split("/");
28
- const params = parts
29
- .filter((part) => part.startsWith(":"))
30
- .map((part) => part.slice(1));
31
- if (params.length === 0) {
32
- return `export const ${actionName}URL = "${url}";`;
33
- }
34
- return `export const ${actionName}URL = (${params
35
- .map((s) => s + ": string")
36
- .join(", ")})=>\`${parts
37
- .map((part) =>
38
- part.startsWith(":") ? "${" + part.slice(1) + "}" : part
39
- )
40
- .join("/")}\`;
41
- ${actionName}URL.params = [${params
42
- .map((param) => `"${param}"`)
43
- .join(",")}];
44
- ${actionName}URL.rawURL = "${url}";`;
45
- }
46
-
47
- export async function generateRoutes(): Promise<void> {
48
- const files = await Promise.all(
49
- (
50
- await walkDir(target_locreq.resolve("src/back/routes"))
51
- )
52
- .filter(
53
- (f) =>
54
- f.endsWith(".page.ts") ||
55
- f.endsWith(".form.ts") ||
56
- f.endsWith(".multiform.ts") ||
57
- f.endsWith(".list.ts") ||
58
- f.endsWith(".redirect.ts") ||
59
- f.endsWith(".post.ts")
60
- )
61
- .map(async (fullpath) => ({
62
- fullpath,
63
- actionName: await extractActionName(fullpath),
64
- url: unescape_url_params(
65
- "/" +
66
- relative(
67
- target_locreq.resolve("src/back/routes"),
68
- fullpath
69
- ).replace(/\..+/, "") +
70
- "/" // 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
71
- ),
72
- }))
73
- );
74
-
75
- const routes_content = `// DO NOT EDIT! This file is generated automaticaly with npm run generate-routes
76
-
77
- import Router from "@koa/router";
78
- import { mount } from "@sealcode/sealgen";
79
- import * as URLs from "./urls"
80
-
81
- ${files
82
- .map(
83
- ({ actionName, fullpath }) =>
84
- `import { default as ${actionName} } from "${importPath(
85
- target_locreq.resolve("src/back/routes/routes.ts"),
86
- fullpath
87
- )}";`
88
- )
89
- .join("\n")}
90
-
91
- export default function mountAutoRoutes(router: Router) {
92
- ${files
93
- .map(
94
- ({ actionName }) =>
95
- ` mount(router, URLs.${actionName}URL, ${actionName});`
96
- )
97
- .join("\n")}
98
- }`;
99
-
100
- const urls_content = `${files
101
- .sort(({ url: url1 }, { url: url2 }) => (url1 < url2 ? -1 : 1))
102
- .map(({ actionName, url }) => generateURL(actionName, url))
103
- .join("\n")}
104
- `;
105
-
106
- const prettier_config = await getPrettierConfig();
107
- await fs.writeFile(
108
- target_locreq.resolve("src/back/routes/routes.ts"),
109
- prettier.format(routes_content, prettier_config)
110
- );
111
-
112
- await fs.writeFile(
113
- target_locreq.resolve("src/back/routes/urls.ts"),
114
- prettier.format(urls_content, prettier_config)
115
- );
116
- // eslint-disable-next-line no-console
117
- console.log(
118
- "Successfuly generated new src/back/routes/routes.ts and src/back/routes/urls.ts"
119
- );
120
- }
package/src/index.ts DELETED
@@ -1,24 +0,0 @@
1
- import Sealious, { App } from "sealious";
2
- import { FormDataValue } from "./forms/form";
3
-
4
- declare module "koa" {
5
- interface BaseContext {
6
- $context: Sealious.Context;
7
- $app: App;
8
- $body: Record<string, FormDataValue>;
9
- }
10
- }
11
-
12
- export * as Controls from "./forms/controls/controls";
13
- export * as Fields from "./forms/fields/field";
14
- export * from "./page/mountable";
15
- export * from "./page/page";
16
- export * from "./forms/form";
17
- export * from "./page/props-parser";
18
- export * from "./utils/utils";
19
- export * from "./page/list";
20
- export * from "./utils/translate";
21
- export * as sanitize from "./sanitize";
22
- export * from "./forms/multiform";
23
- export * as Components from "./components/components";
24
- export * from "./mount";
package/src/make-env.ts DELETED
@@ -1,15 +0,0 @@
1
- import os from "os";
2
- import { promises as fs } from "fs";
3
-
4
- import _locreq from "locreq";
5
- const target_locreq = _locreq(process.cwd());
6
-
7
- export async function makeEnv(): Promise<void> {
8
- const { uid, gid } = os.userInfo();
9
- const content = `USER_ID=${uid}
10
- GROUD_ID=${gid}
11
- `;
12
- const path = target_locreq.resolve(".env");
13
- await fs.writeFile(path, content);
14
- console.log("wrote .env");
15
- }
@@ -1,24 +0,0 @@
1
- import { Context } from "koa";
2
- import { FlatTemplatable, tempstream } from "tempstream";
3
- import { FormDataValue } from ".";
4
- import { FormField } from "./forms/fields/field";
5
- import { attribute } from "./sanitize";
6
-
7
- export function makeHiddenInputs(
8
- ctx: Context,
9
- fields: Record<string, FormField>,
10
- values: Record<string, FormDataValue>,
11
- fields_to_skip: string[]
12
- ): FlatTemplatable {
13
- return tempstream`${Object.entries(fields)
14
- .filter(([key]) => !fields_to_skip.includes(key))
15
- .map(
16
- ([key, field]) => tempstream/* HTML */ `<input
17
- type="hidden"
18
- name="${key}"
19
- value="${field
20
- .getValue(ctx, values)
21
- .then((r) => attribute(JSON.stringify(r.raw) || ""))}"
22
- />`
23
- )}`;
24
- }
package/src/mount.ts DELETED
@@ -1,85 +0,0 @@
1
- import Router from "@koa/router";
2
- import Koa, { BaseContext, Context } from "koa";
3
- import { Middlewares } from "sealious";
4
- import { Mountable } from "./page/mountable";
5
-
6
- async function handleHtmlPromise(ctx: Context, next: Koa.Next) {
7
- await next();
8
- if (ctx.body instanceof Promise) {
9
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
10
- ctx.body = await ctx.body;
11
- }
12
- ctx.set("content-type", "text/html;charset=utf-8");
13
- }
14
-
15
- export function mount(
16
- router: Router,
17
- url: string | { rawURL: string },
18
- mountable: Mountable,
19
- use_dummy_app = false
20
- ): void {
21
- const raw_url = typeof url === "string" ? url : url.rawURL;
22
- const args = use_dummy_app
23
- ? [
24
- async (ctx: BaseContext, next: any) => {
25
- // this dummy is a temporary solution it's ilustrating the ways that
26
- // sealgen is coupled with sealious. Definitely room for improvement in this
27
- // regard
28
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
29
- ctx.$app = {
30
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
31
- Logger: new Proxy(
32
- {},
33
- {
34
- get: (_target: any, prop: any) => {
35
- if (prop === "info") {
36
- // eslint-disable-next-line @typescript-eslint/no-empty-function
37
- return () => {};
38
- } else {
39
- // eslint-disable-next-line @typescript-eslint/no-empty-function
40
- return () => {};
41
- }
42
- },
43
- }
44
- ),
45
- getString: (x: string) => x,
46
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
- } as any;
48
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call
49
- await next();
50
- },
51
- Middlewares.parseBody(),
52
- handleHtmlPromise,
53
- ]
54
- : [
55
- Middlewares.extractContext(),
56
- Middlewares.parseBody(),
57
- handleHtmlPromise,
58
- ];
59
-
60
- router.use(raw_url, ...args);
61
- mountable.init();
62
-
63
- // to automatically add trailing slashes:
64
- router.get(raw_url.slice(0, -1), async (ctx, next) => {
65
- const url2 = ctx.URL;
66
- if (!url2.pathname.endsWith("/")) {
67
- url2.pathname += "/";
68
- ctx.redirect(url2.pathname);
69
- }
70
- await next();
71
- });
72
-
73
- router.use(raw_url, async (ctx, next) => {
74
- ctx.set("content-type", "text/html;charset=utf-8");
75
- const access_result = await mountable.canAccess(ctx);
76
- if (!access_result.canAccess) {
77
- ctx.status = 403;
78
- ctx.body = access_result.message || "no access";
79
- return;
80
- }
81
- await next();
82
- });
83
-
84
- mountable.mount(router, raw_url);
85
- }
@@ -1,18 +0,0 @@
1
- import { Context } from "koa";
2
- import { ActionName, Collection } from "sealious";
3
-
4
- export function peopleWhoCan(action: ActionName, collection: Collection) {
5
- return async function (ctx: Context) {
6
- const policy = collection.getPolicy(action);
7
- const result = await policy.check(ctx.$context);
8
- if (!result) {
9
- ctx.status = 403;
10
- return { canAccess: false, message: "Not allowed" };
11
- }
12
- if (!result.allowed) {
13
- ctx.status = 403;
14
- return { canAccess: false, message: result.reason };
15
- }
16
- return { canAccess: true, message: "" };
17
- };
18
- }