@kalisio/kdk 1.3.6 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (577) hide show
  1. package/.nyc_output/{0d403586-0c7c-4336-94d1-a49e9f02a905.json → 058fc679-d60a-4501-ac04-71171e5200b8.json} +0 -0
  2. package/.nyc_output/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +1 -0
  3. package/.nyc_output/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +1 -0
  4. package/.nyc_output/{21dd57bd-48c5-41c8-8800-252db32a9366.json → 8b1830fa-932e-4a61-9837-4a5b18f83ea9.json} +0 -0
  5. package/.nyc_output/{3eb3a2ca-53c2-4551-ba6b-adf70f9a53cd.json → afd2d144-3570-4858-b94a-b523dbd023dd.json} +0 -0
  6. package/.nyc_output/processinfo/058fc679-d60a-4501-ac04-71171e5200b8.json +1 -0
  7. package/.nyc_output/processinfo/2226bcce-9d22-4dad-b9fa-46564b5565c7.json +1 -0
  8. package/.nyc_output/processinfo/6dc4b140-1a8a-4d69-b91c-89c557883d6e.json +1 -0
  9. package/.nyc_output/processinfo/8b1830fa-932e-4a61-9837-4a5b18f83ea9.json +1 -0
  10. package/.nyc_output/processinfo/afd2d144-3570-4858-b94a-b523dbd023dd.json +1 -0
  11. package/.nyc_output/processinfo/index.json +1 -1
  12. package/CHANGELOG.md +167 -79
  13. package/README.md +1 -1
  14. package/coverage/core/api/application.js.html +436 -436
  15. package/coverage/core/api/authentication.js.html +119 -119
  16. package/coverage/core/api/db.js.html +201 -201
  17. package/coverage/core/api/hooks/hooks.account.js.html +48 -48
  18. package/coverage/core/api/hooks/hooks.authentication.js.html +64 -64
  19. package/coverage/core/api/hooks/hooks.authorisations.js.html +369 -378
  20. package/coverage/core/api/hooks/hooks.devices.js.html +49 -49
  21. package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
  22. package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
  23. package/coverage/core/api/hooks/hooks.model.js.html +269 -269
  24. package/coverage/core/api/hooks/hooks.organisations.js.html +183 -231
  25. package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
  26. package/coverage/core/api/hooks/hooks.query.js.html +234 -198
  27. package/coverage/core/api/hooks/hooks.service.js.html +82 -82
  28. package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
  29. package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
  30. package/coverage/core/api/hooks/hooks.users.js.html +304 -256
  31. package/coverage/core/api/hooks/index.html +172 -172
  32. package/coverage/core/api/hooks/index.js.html +24 -24
  33. package/coverage/core/api/index.html +75 -75
  34. package/coverage/core/api/index.js.html +26 -26
  35. package/coverage/core/api/marshall.js.html +57 -57
  36. package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
  37. package/coverage/core/api/models/index.html +50 -50
  38. package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
  39. package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
  40. package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
  41. package/coverage/core/api/oauth2-handler.js.html +18 -18
  42. package/coverage/core/api/oauth2-verifier.js.html +38 -38
  43. package/coverage/core/api/services/account/account.hooks.js.html +16 -16
  44. package/coverage/core/api/services/account/account.service.js.html +108 -108
  45. package/coverage/core/api/services/account/index.html +32 -32
  46. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  47. package/coverage/core/api/services/authorisations/authorisations.service.js.html +132 -129
  48. package/coverage/core/api/services/authorisations/index.html +28 -28
  49. package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
  50. package/coverage/core/api/services/databases/databases.service.js.html +12 -12
  51. package/coverage/core/api/services/databases/index.html +24 -24
  52. package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
  53. package/coverage/core/api/services/devices/devices.service.js.html +121 -121
  54. package/coverage/core/api/services/devices/index.html +28 -28
  55. package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
  56. package/coverage/core/api/services/groups/index.html +13 -13
  57. package/coverage/core/api/services/index.html +21 -21
  58. package/coverage/core/api/services/index.js.html +137 -137
  59. package/coverage/core/api/services/mailer/index.html +24 -24
  60. package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
  61. package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
  62. package/coverage/core/api/services/organisations/index.html +24 -24
  63. package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
  64. package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
  65. package/coverage/core/api/services/pusher/index.html +34 -34
  66. package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
  67. package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
  68. package/coverage/core/api/services/pusher/pusher.service.js.html +414 -414
  69. package/coverage/core/api/services/storage/index.html +21 -21
  70. package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
  71. package/coverage/core/api/services/tags/index.html +21 -21
  72. package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
  73. package/coverage/core/api/services/users/index.html +21 -21
  74. package/coverage/core/api/services/users/users.hooks.js.html +33 -33
  75. package/coverage/core/common/errors.js.html +1 -1
  76. package/coverage/core/common/index.html +42 -27
  77. package/coverage/core/common/index.js.html +16 -16
  78. package/coverage/core/common/permissions.js.html +325 -265
  79. package/coverage/index.html +182 -182
  80. package/coverage/lcov-report/core/api/application.js.html +436 -436
  81. package/coverage/lcov-report/core/api/authentication.js.html +119 -119
  82. package/coverage/lcov-report/core/api/db.js.html +201 -201
  83. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +48 -48
  84. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +64 -64
  85. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +369 -378
  86. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +49 -49
  87. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
  88. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
  89. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
  90. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +183 -231
  91. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
  92. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +234 -198
  93. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
  94. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
  95. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
  96. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +304 -256
  97. package/coverage/lcov-report/core/api/hooks/index.html +172 -172
  98. package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
  99. package/coverage/lcov-report/core/api/index.html +75 -75
  100. package/coverage/lcov-report/core/api/index.js.html +26 -26
  101. package/coverage/lcov-report/core/api/marshall.js.html +57 -57
  102. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
  103. package/coverage/lcov-report/core/api/models/index.html +50 -50
  104. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
  105. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
  106. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
  107. package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
  108. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
  109. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
  110. package/coverage/lcov-report/core/api/services/account/account.service.js.html +108 -108
  111. package/coverage/lcov-report/core/api/services/account/index.html +32 -32
  112. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  113. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +132 -129
  114. package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
  115. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
  116. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
  117. package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
  118. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
  119. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +121 -121
  120. package/coverage/lcov-report/core/api/services/devices/index.html +28 -28
  121. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
  122. package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
  123. package/coverage/lcov-report/core/api/services/index.html +21 -21
  124. package/coverage/lcov-report/core/api/services/index.js.html +137 -137
  125. package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
  126. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
  127. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
  128. package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
  129. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
  130. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
  131. package/coverage/lcov-report/core/api/services/pusher/index.html +34 -34
  132. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
  133. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
  134. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +414 -414
  135. package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
  136. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
  137. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  138. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
  139. package/coverage/lcov-report/core/api/services/users/index.html +21 -21
  140. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
  141. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  142. package/coverage/lcov-report/core/common/index.html +42 -27
  143. package/coverage/lcov-report/core/common/index.js.html +16 -16
  144. package/coverage/lcov-report/core/common/permissions.js.html +325 -265
  145. package/coverage/lcov-report/index.html +182 -182
  146. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  147. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +118 -37
  148. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  149. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  150. package/coverage/lcov-report/map/api/index.html +1 -1
  151. package/coverage/lcov-report/map/api/index.js.html +1 -1
  152. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  153. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  154. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  155. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  156. package/coverage/lcov-report/map/api/models/index.html +1 -1
  157. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  158. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  159. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  160. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  161. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  162. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  163. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  164. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +2 -2
  165. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  166. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  167. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
  168. package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
  169. package/coverage/lcov-report/map/api/services/index.html +1 -1
  170. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  171. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  172. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  173. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  174. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  175. package/coverage/lcov-report/map/common/index.html +12 -12
  176. package/coverage/lcov-report/map/common/index.js.html +1 -1
  177. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  178. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  179. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  180. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  181. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  182. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  183. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  184. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  185. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  186. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  187. package/coverage/lcov-report/map/common/wfs-utils.js.html +8 -5
  188. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  189. package/coverage/lcov-report/map/common/wmts-utils.js.html +71 -11
  190. package/coverage/lcov.info +3742 -3949
  191. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  192. package/coverage/map/api/hooks/hooks.query.js.html +118 -37
  193. package/coverage/map/api/hooks/index.html +7 -7
  194. package/coverage/map/api/hooks/index.js.html +1 -1
  195. package/coverage/map/api/index.html +1 -1
  196. package/coverage/map/api/index.js.html +1 -1
  197. package/coverage/map/api/marshall.js.html +1 -1
  198. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  199. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  200. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  201. package/coverage/map/api/models/index.html +1 -1
  202. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  203. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  204. package/coverage/map/api/services/alerts/index.html +1 -1
  205. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  206. package/coverage/map/api/services/catalog/index.html +1 -1
  207. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  208. package/coverage/map/api/services/daptiles/index.html +1 -1
  209. package/coverage/map/api/services/features/features.hooks.js.html +2 -2
  210. package/coverage/map/api/services/features/index.html +1 -1
  211. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  212. package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
  213. package/coverage/map/api/services/geocoder/index.html +1 -1
  214. package/coverage/map/api/services/index.html +1 -1
  215. package/coverage/map/api/services/index.js.html +1 -1
  216. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  217. package/coverage/map/common/errors.js.html +1 -1
  218. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  219. package/coverage/map/common/grid.js.html +1 -1
  220. package/coverage/map/common/index.html +12 -12
  221. package/coverage/map/common/index.js.html +1 -1
  222. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  223. package/coverage/map/common/moment-utils.js.html +1 -1
  224. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  225. package/coverage/map/common/opendap-utils.js.html +1 -1
  226. package/coverage/map/common/permissions.js.html +1 -1
  227. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  228. package/coverage/map/common/tms-utils.js.html +1 -1
  229. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  230. package/coverage/map/common/wcs-utils.js.html +1 -1
  231. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  232. package/coverage/map/common/wfs-utils.js.html +8 -5
  233. package/coverage/map/common/wms-utils.js.html +1 -1
  234. package/coverage/map/common/wmts-utils.js.html +71 -11
  235. package/extras/icons/kanban.png +0 -0
  236. package/extras/tours/core/add-member.js +10 -1
  237. package/extras/tours/core/{tag-member.js → edit-member-tags.js} +4 -3
  238. package/extras/tours/core/groups.js +8 -2
  239. package/extras/tours/core/members.js +11 -21
  240. package/extras/tours/core/tags.js +7 -1
  241. package/extras/tours/map/catalog-categories.js +4 -4
  242. package/extras/tours/map/catalog-panel.js +16 -16
  243. package/extras/tours/map/favorite-views.js +3 -3
  244. package/lib/core/api/hooks/hooks.authorisations.js +149 -140
  245. package/lib/core/api/hooks/hooks.authorisations.js.map +1 -1
  246. package/lib/core/api/hooks/hooks.organisations.js +1 -23
  247. package/lib/core/api/hooks/hooks.organisations.js.map +1 -1
  248. package/lib/core/api/hooks/hooks.query.js +22 -0
  249. package/lib/core/api/hooks/hooks.query.js.map +1 -1
  250. package/lib/core/api/hooks/hooks.users.js +34 -18
  251. package/lib/core/api/hooks/hooks.users.js.map +1 -1
  252. package/lib/core/api/services/authorisations/authorisations.service.js +34 -25
  253. package/lib/core/api/services/authorisations/authorisations.service.js.map +1 -1
  254. package/lib/core/client/api.js +1 -0
  255. package/lib/core/client/api.js.map +1 -1
  256. package/lib/core/client/components/account/KAccountDZ.vue +3 -4
  257. package/lib/core/client/components/account/KAccountDevices.vue +5 -6
  258. package/lib/core/client/components/account/KDeviceCard.vue +2 -1
  259. package/lib/core/client/components/account/KIdentityPanel.vue +1 -7
  260. package/lib/core/client/components/collection/KBoard.vue +26 -155
  261. package/lib/core/client/components/collection/KCard.vue +144 -42
  262. package/lib/core/client/components/collection/KCardSection.vue +52 -0
  263. package/lib/core/client/components/collection/KColumn.vue +181 -0
  264. package/lib/core/client/components/collection/KGrid.vue +13 -18
  265. package/lib/core/client/components/collection/KHistory.vue +61 -89
  266. package/lib/core/client/components/collection/KHistoryEntry.vue +90 -66
  267. package/lib/core/client/components/collection/KItem.vue +21 -2
  268. package/lib/core/client/components/collection/KList.vue +9 -12
  269. package/lib/core/client/components/collection/KTable.vue +33 -39
  270. package/lib/core/client/components/collection/index.js +6 -1
  271. package/lib/core/client/components/collection/index.js.map +1 -1
  272. package/lib/core/client/components/editor/KEditor.vue +0 -6
  273. package/lib/core/client/components/editor/KModalEditor.vue +4 -4
  274. package/lib/core/client/components/editor/KSettingsEditor.vue +49 -0
  275. package/lib/core/client/components/form/KAttachmentField.vue +10 -10
  276. package/lib/core/client/components/form/KChipsField.vue +28 -23
  277. package/lib/core/client/components/form/KColorField.vue +30 -25
  278. package/lib/core/client/components/form/KFileField.vue +11 -40
  279. package/lib/core/client/components/form/KForm.vue +0 -12
  280. package/lib/core/client/components/form/KIconField.vue +1 -0
  281. package/lib/core/client/components/form/KItemField.vue +6 -2
  282. package/lib/core/client/components/form/KRoleField.vue +56 -0
  283. package/lib/core/client/components/form/KSelectField.vue +16 -1
  284. package/lib/core/client/components/form/KView.vue +5 -14
  285. package/lib/core/client/components/frame/KAction.vue +18 -12
  286. package/lib/core/client/components/frame/KAvatar.vue +3 -3
  287. package/lib/core/client/components/frame/KChart.vue +60 -0
  288. package/lib/core/client/components/frame/KChipsPane.vue +80 -0
  289. package/lib/core/client/components/frame/KContent.vue +1 -1
  290. package/lib/core/client/components/frame/KModal.vue +30 -44
  291. package/lib/core/client/components/frame/KPanel.vue +1 -1
  292. package/lib/core/client/components/frame/{KMenu.vue → KPopupAction.vue} +6 -7
  293. package/lib/core/client/components/frame/KSpot.vue +31 -0
  294. package/lib/core/client/components/frame/KStamp.vue +62 -0
  295. package/lib/core/client/components/frame/index.js +56 -1
  296. package/lib/core/client/components/frame/index.js.map +1 -1
  297. package/lib/core/client/components/input/KColorChooser.vue +16 -8
  298. package/lib/core/client/components/input/KIconChooser.vue +2 -1
  299. package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
  300. package/lib/core/client/components/input/KUploader.vue +14 -5
  301. package/lib/core/client/components/layout/KAbout.vue +9 -3
  302. package/lib/core/client/components/layout/KFab.vue +1 -1
  303. package/lib/core/client/components/layout/KPage.vue +44 -19
  304. package/lib/core/client/components/layout/KTour.vue +2 -2
  305. package/lib/core/client/components/layout/KWelcome.vue +13 -12
  306. package/lib/core/client/components/layout/KWindow.vue +1 -1
  307. package/lib/core/client/components/media/KImageViewer.vue +9 -7
  308. package/lib/core/client/components/media/KMediaBrowser.vue +12 -8
  309. package/lib/core/client/components/menu/KMenu.vue +103 -0
  310. package/lib/core/client/components/team/KAddMember.vue +17 -9
  311. package/lib/core/client/components/team/KChangeRole.vue +5 -7
  312. package/lib/core/client/components/team/KGroupCard.vue +34 -51
  313. package/lib/core/client/components/team/KGroupsActivity.vue +9 -2
  314. package/lib/core/client/components/team/KJoinGroup.vue +5 -7
  315. package/lib/core/client/components/team/KMemberCard.vue +104 -63
  316. package/lib/core/client/components/team/KMembersActivity.vue +9 -2
  317. package/lib/core/client/components/team/KOrganisationsActivity.vue +8 -1
  318. package/lib/core/client/components/team/KTagCard.vue +26 -26
  319. package/lib/core/client/components/team/KTagsActivity.vue +9 -2
  320. package/lib/core/client/components/time/KTimeRange.vue +144 -0
  321. package/lib/core/client/components/viewer/KModalViewer.vue +6 -0
  322. package/lib/core/client/components/viewer/KViewer.vue +0 -6
  323. package/lib/core/client/i18n/core_en.json +138 -94
  324. package/lib/core/client/i18n/core_fr.json +61 -17
  325. package/lib/core/client/index.js +46 -14
  326. package/lib/core/client/index.js.map +1 -1
  327. package/lib/core/client/layout.js +8 -1
  328. package/lib/core/client/layout.js.map +1 -1
  329. package/lib/core/client/mixins/mixin.authorisation.js +28 -18
  330. package/lib/core/client/mixins/mixin.authorisation.js.map +1 -1
  331. package/lib/core/client/mixins/mixin.base-collection.js +57 -9
  332. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  333. package/lib/core/client/mixins/mixin.base-context.js +1 -1
  334. package/lib/core/client/mixins/mixin.base-context.js.map +1 -1
  335. package/lib/core/client/mixins/mixin.base-editor.js +26 -16
  336. package/lib/core/client/mixins/mixin.base-editor.js.map +1 -1
  337. package/lib/core/client/mixins/mixin.base-field.js +0 -4
  338. package/lib/core/client/mixins/mixin.base-field.js.map +1 -1
  339. package/lib/core/client/mixins/mixin.base-item.js +29 -14
  340. package/lib/core/client/mixins/mixin.base-item.js.map +1 -1
  341. package/lib/core/client/mixins/mixin.base-viewer.js +0 -2
  342. package/lib/core/client/mixins/mixin.base-viewer.js.map +1 -1
  343. package/lib/core/client/mixins/mixin.object-proxy.js +17 -3
  344. package/lib/core/client/mixins/mixin.object-proxy.js.map +1 -1
  345. package/lib/core/client/mixins/mixin.schema-proxy.js +31 -0
  346. package/lib/core/client/mixins/mixin.schema-proxy.js.map +1 -1
  347. package/lib/core/client/mixins/mixin.service.js +5 -33
  348. package/lib/core/client/mixins/mixin.service.js.map +1 -1
  349. package/lib/core/client/reader.js +54 -0
  350. package/lib/core/client/reader.js.map +1 -0
  351. package/lib/core/client/readers/index.js +30 -0
  352. package/lib/core/client/readers/index.js.map +1 -0
  353. package/lib/core/client/readers/reader.csv.js +43 -0
  354. package/lib/core/client/readers/reader.csv.js.map +1 -0
  355. package/lib/core/client/readers/reader.json.js +38 -0
  356. package/lib/core/client/readers/reader.json.js.map +1 -0
  357. package/lib/core/client/services/index.js +23 -0
  358. package/lib/core/client/services/index.js.map +1 -1
  359. package/lib/core/client/services/local-settings.service.js +4 -0
  360. package/lib/core/client/services/local-settings.service.js.map +1 -1
  361. package/lib/core/client/time.js +131 -0
  362. package/lib/core/client/time.js.map +1 -0
  363. package/lib/core/common/permissions.js +65 -23
  364. package/lib/core/common/permissions.js.map +1 -1
  365. package/lib/core/common/schemas/groups.create.json +1 -1
  366. package/lib/core/common/schemas/groups.update.json +1 -1
  367. package/lib/core/common/schemas/organisations.create.json +1 -1
  368. package/lib/core/common/schemas/organisations.update.json +2 -2
  369. package/lib/core/common/schemas/settings.update.json +139 -0
  370. package/lib/core/common/schemas/tags.update.json +9 -1
  371. package/lib/map/api/hooks/hooks.query.js +55 -29
  372. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  373. package/lib/map/api/services/features/features.hooks.js +1 -1
  374. package/lib/map/api/services/features/features.hooks.js.map +1 -1
  375. package/lib/map/client/components/KCaptureToolbar.vue +156 -0
  376. package/lib/map/client/components/KColorLegend.vue +25 -23
  377. package/lib/map/client/components/KFavoriteViews.vue +71 -35
  378. package/lib/map/client/components/KFeaturesChart.vue +11 -9
  379. package/lib/map/client/components/KFeaturesFilter.vue +18 -8
  380. package/lib/map/client/components/KFeaturesTable.vue +27 -2
  381. package/lib/map/client/components/KLayerEditionToolbar.vue +51 -0
  382. package/lib/map/client/components/KLayerStyleEditor.vue +12 -5
  383. package/lib/map/client/components/KLayerStyleForm.vue +44 -33
  384. package/lib/map/client/components/KLocationInput.vue +126 -65
  385. package/lib/map/client/components/KLocationMap.vue +199 -84
  386. package/lib/map/client/components/KMeasureTool.vue +340 -0
  387. package/lib/map/client/components/KPositionIndicator.vue +1 -0
  388. package/lib/map/client/components/KTimeline.vue +41 -37
  389. package/lib/map/client/components/KUrlLegend.vue +21 -19
  390. package/lib/map/client/components/catalog/KBaseLayersSelector.vue +105 -0
  391. package/lib/map/client/components/catalog/KCatalog.vue +14 -2
  392. package/lib/map/client/components/catalog/KConnectLayer.vue +31 -11
  393. package/lib/map/client/components/catalog/KCreateLayer.vue +37 -14
  394. package/lib/map/client/components/catalog/KImportLayer.vue +33 -40
  395. package/lib/map/client/components/catalog/KLayerCategories.vue +86 -62
  396. package/lib/map/client/components/catalog/KLayersSelector.vue +44 -42
  397. package/lib/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
  398. package/lib/map/client/components/form/KLocationField.vue +1 -1
  399. package/lib/map/client/components/form/KOwsLayerField.vue +7 -0
  400. package/lib/map/client/components/form/KOwsServiceField.vue +1 -0
  401. package/lib/map/client/components/widget/KInformationBox.vue +10 -16
  402. package/lib/map/client/components/widget/KMapillaryViewer.vue +59 -49
  403. package/lib/map/client/components/widget/KTimeSeries.vue +119 -31
  404. package/lib/map/client/i18n/map_en.json +105 -20
  405. package/lib/map/client/i18n/map_fr.json +107 -23
  406. package/lib/map/client/init.js +24 -7
  407. package/lib/map/client/init.js.map +1 -1
  408. package/lib/map/client/leaflet/GSMaPLayer.js +4 -9
  409. package/lib/map/client/leaflet/GSMaPLayer.js.map +1 -1
  410. package/lib/map/client/leaflet/MaskLayer.js +73 -0
  411. package/lib/map/client/leaflet/MaskLayer.js.map +1 -0
  412. package/lib/map/client/mixins/globe/mixin.base-globe.js +7 -6
  413. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  414. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +7 -9
  415. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  416. package/lib/map/client/mixins/globe/mixin.popup.js +4 -0
  417. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  418. package/lib/map/client/mixins/globe/mixin.tooltip.js +4 -0
  419. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  420. package/lib/map/client/mixins/index.js +8 -13
  421. package/lib/map/client/mixins/index.js.map +1 -1
  422. package/lib/map/client/mixins/map/mixin.base-map.js +71 -8
  423. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  424. package/lib/map/client/mixins/map/mixin.canvas-layers.js +276 -51
  425. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  426. package/lib/map/client/mixins/map/mixin.edit-layers.js +218 -121
  427. package/lib/map/client/mixins/map/mixin.edit-layers.js.map +1 -1
  428. package/lib/map/client/mixins/map/mixin.file-layers.js +46 -93
  429. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  430. package/lib/map/client/mixins/map/mixin.geojson-layers.js +22 -11
  431. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  432. package/lib/map/client/mixins/map/mixin.georaster-layers.js +7 -4
  433. package/lib/map/client/mixins/map/mixin.georaster-layers.js.map +1 -1
  434. package/lib/map/client/mixins/map/mixin.gsmap-layers.js +3 -3
  435. package/lib/map/client/mixins/map/mixin.gsmap-layers.js.map +1 -1
  436. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +8 -10
  437. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  438. package/lib/map/client/mixins/map/mixin.mapillary-layers.js +25 -40
  439. package/lib/map/client/mixins/map/mixin.mapillary-layers.js.map +1 -1
  440. package/lib/map/client/mixins/map/mixin.popup.js +4 -0
  441. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  442. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js +5 -3
  443. package/lib/map/client/mixins/map/mixin.tiled-mesh-layers.js.map +1 -1
  444. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js +5 -3
  445. package/lib/map/client/mixins/map/mixin.tiled-wind-layers.js.map +1 -1
  446. package/lib/map/client/mixins/map/mixin.tooltip.js +4 -0
  447. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  448. package/lib/map/client/mixins/mixin.activity.js +62 -68
  449. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  450. package/lib/map/client/mixins/mixin.context.js +26 -3
  451. package/lib/map/client/mixins/mixin.context.js.map +1 -1
  452. package/lib/map/client/mixins/mixin.feature-selection.js +8 -10
  453. package/lib/map/client/mixins/mixin.feature-selection.js.map +1 -1
  454. package/lib/map/client/mixins/mixin.feature-service.js +9 -7
  455. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  456. package/lib/map/client/mixins/mixin.infobox.js +4 -0
  457. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  458. package/lib/map/client/mixins/mixin.weacast.js +6 -4
  459. package/lib/map/client/mixins/mixin.weacast.js.map +1 -1
  460. package/lib/map/client/pixi-utils.js +9 -0
  461. package/lib/map/client/pixi-utils.js.map +1 -1
  462. package/lib/map/client/readers/index.js +42 -0
  463. package/lib/map/client/readers/index.js.map +1 -0
  464. package/lib/map/client/readers/reader.geojson.js +59 -0
  465. package/lib/map/client/readers/reader.geojson.js.map +1 -0
  466. package/lib/map/client/readers/reader.gpx.js +41 -0
  467. package/lib/map/client/readers/reader.gpx.js.map +1 -0
  468. package/lib/map/client/readers/reader.kml.js +41 -0
  469. package/lib/map/client/readers/reader.kml.js.map +1 -0
  470. package/lib/map/client/utils.js +52 -1
  471. package/lib/map/client/utils.js.map +1 -1
  472. package/lib/map/common/wfs-utils.js +1 -1
  473. package/lib/map/common/wfs-utils.js.map +1 -1
  474. package/lib/map/common/wmts-utils.js +31 -7
  475. package/lib/map/common/wmts-utils.js.map +1 -1
  476. package/lib/test/client/core/account.js +100 -0
  477. package/lib/test/client/core/account.js.map +1 -0
  478. package/lib/test/client/core/api.js +400 -0
  479. package/lib/test/client/core/api.js.map +1 -0
  480. package/lib/test/client/core/collection.js +109 -0
  481. package/lib/test/client/core/collection.js.map +1 -0
  482. package/lib/test/client/core/index.js +90 -0
  483. package/lib/test/client/core/index.js.map +1 -0
  484. package/lib/test/client/core/layout.js +221 -0
  485. package/lib/test/client/core/layout.js.map +1 -0
  486. package/lib/test/client/core/runner.js +203 -0
  487. package/lib/test/client/core/runner.js.map +1 -0
  488. package/lib/test/client/core/screens.js +68 -0
  489. package/lib/test/client/core/screens.js.map +1 -0
  490. package/lib/test/client/core/utils.js +304 -0
  491. package/lib/test/client/core/utils.js.map +1 -0
  492. package/lib/test/client/index.js +20 -0
  493. package/lib/test/client/index.js.map +1 -0
  494. package/lib/test/client/map/catalog.js +192 -0
  495. package/lib/test/client/map/catalog.js.map +1 -0
  496. package/lib/test/client/map/controls.js +54 -0
  497. package/lib/test/client/map/controls.js.map +1 -0
  498. package/lib/test/client/map/index.js +30 -0
  499. package/lib/test/client/map/index.js.map +1 -0
  500. package/package.json +18 -9
  501. package/test.client.js +1 -0
  502. package/tests/core/test-log-2021-09-02.log +47 -0
  503. package/tests/map/test-log-%DATE%.logYYYY-09-DD +6 -0
  504. package/tests/map/test-log-2021-09-02.log +3 -0
  505. package/.nyc_output/5baea3f8-cf8e-4c76-8ccf-0e48b6f16fa4.json +0 -1
  506. package/.nyc_output/dddde6b5-9024-4b0e-8d8b-4502d437b8a4.json +0 -1
  507. package/.nyc_output/ef5e94ba-9a99-4fb6-ab1d-1a974112bb83.json +0 -1
  508. package/.nyc_output/fd4681f8-5f41-4f17-b393-9f399b24c128.json +0 -1
  509. package/.nyc_output/processinfo/0d403586-0c7c-4336-94d1-a49e9f02a905.json +0 -1
  510. package/.nyc_output/processinfo/21dd57bd-48c5-41c8-8800-252db32a9366.json +0 -1
  511. package/.nyc_output/processinfo/3eb3a2ca-53c2-4551-ba6b-adf70f9a53cd.json +0 -1
  512. package/.nyc_output/processinfo/5baea3f8-cf8e-4c76-8ccf-0e48b6f16fa4.json +0 -1
  513. package/.nyc_output/processinfo/dddde6b5-9024-4b0e-8d8b-4502d437b8a4.json +0 -1
  514. package/.nyc_output/processinfo/ef5e94ba-9a99-4fb6-ab1d-1a974112bb83.json +0 -1
  515. package/.nyc_output/processinfo/fd4681f8-5f41-4f17-b393-9f399b24c128.json +0 -1
  516. package/extras/testcafe/Dockerfile +0 -48
  517. package/extras/testcafe/docker-entrypoint.sh +0 -27
  518. package/extras/testcafe/page-models/core/account.js +0 -75
  519. package/extras/testcafe/page-models/core/base-collection.js +0 -41
  520. package/extras/testcafe/page-models/core/base-page.js +0 -25
  521. package/extras/testcafe/page-models/core/groups.js +0 -36
  522. package/extras/testcafe/page-models/core/index.js +0 -140
  523. package/extras/testcafe/page-models/core/layout.js +0 -145
  524. package/extras/testcafe/page-models/core/members.js +0 -98
  525. package/extras/testcafe/page-models/core/organisations.js +0 -76
  526. package/extras/testcafe/page-models/core/screens.js +0 -99
  527. package/extras/testcafe/page-models/core/tags.js +0 -21
  528. package/extras/testcafe/page-models/map/add-layer.js +0 -51
  529. package/extras/testcafe/page-models/map/catalog.js +0 -132
  530. package/extras/testcafe/page-models/map/index.js +0 -36
  531. package/extras/testcafe/page-models/map/map-activity.js +0 -42
  532. package/extras/testcafe/page-models/map/timeline.js +0 -67
  533. package/lib/core/client/components/frame/KLabel.vue +0 -56
  534. package/lib/core/client/components/team/KTagsPane.vue +0 -35
  535. package/lib/map/client/leaflet/TiledMapillaryLayer.js +0 -137
  536. package/lib/map/client/leaflet/TiledMapillaryLayer.js.map +0 -1
  537. package/lib/map/client/mixins/mixin.time.js +0 -73
  538. package/lib/map/client/mixins/mixin.time.js.map +0 -1
  539. package/tests/core/account.test.js +0 -423
  540. package/tests/core/client.test.js.skip +0 -37
  541. package/tests/core/config/default.js +0 -96
  542. package/tests/core/config/email-templates/confirmInvitation/html.ejs +0 -18
  543. package/tests/core/config/email-templates/identityChange/html.ejs +0 -12
  544. package/tests/core/config/email-templates/newDevice/html.ejs +0 -7
  545. package/tests/core/config/email-templates/passwordChange/html.ejs +0 -5
  546. package/tests/core/config/email-templates/resendVerifySignup/html.ejs +0 -10
  547. package/tests/core/config/email-templates/resetPwd/html.ejs +0 -5
  548. package/tests/core/config/email-templates/sendResetPwd/html.ejs +0 -8
  549. package/tests/core/config/email-templates/verifySignup/html.ejs +0 -3
  550. package/tests/core/data/10k_most_common_passwords.txt +0 -10000
  551. package/tests/core/data/logo.png +0 -0
  552. package/tests/core/hooks.test.js +0 -175
  553. package/tests/core/index.test.js +0 -432
  554. package/tests/core/notifications.test.js +0 -465
  555. package/tests/core/storage.test.js +0 -134
  556. package/tests/core/team.test.js +0 -610
  557. package/tests/core/utils.js +0 -62
  558. package/tests/map/alerts.test.js +0 -554
  559. package/tests/map/config/default.js +0 -112
  560. package/tests/map/config/layers.json +0 -37
  561. package/tests/map/daptiles.test.js +0 -41
  562. package/tests/map/data/DescribeCoverage.xml +0 -55
  563. package/tests/map/data/GetCoverage.tif +0 -0
  564. package/tests/map/data/adsb.observations.json +0 -132
  565. package/tests/map/data/dataset.grb.das +0 -55
  566. package/tests/map/data/dataset.grb.dds +0 -17
  567. package/tests/map/data/dataset.grb.dods +0 -0
  568. package/tests/map/data/lat_lon_bounds.grb.dods +0 -0
  569. package/tests/map/data/subdataset.grb.dods +0 -0
  570. package/tests/map/data/vigicrues.observations.json +0 -47042
  571. package/tests/map/data/vigicrues.stations.json +0 -15422
  572. package/tests/map/data/zones.json +0 -1228
  573. package/tests/map/forecast-data/gfs-world/u-wind/2021-07-15_12-00-00_2021-07-15_12-00-00.grib +0 -0
  574. package/tests/map/forecast-data/gfs-world/v-wind/2021-07-15_12-00-00_2021-07-15_12-00-00.grib +0 -0
  575. package/tests/map/grid-sources.test.js +0 -304
  576. package/tests/map/hooks.test.js +0 -96
  577. package/tests/map/index.test.js +0 -333
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">86.47% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>115/133</span>
28
+ <span class='fraction'>0/143</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">68.57% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>48/70</span>
35
+ <span class='fraction'>0/74</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">75% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>21/28</span>
42
+ <span class='fraction'>0/34</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">91.8% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>112/122</span>
49
+ <span class='fraction'>0/129</span>
50
50
  </div>
51
51
 
52
52
 
@@ -55,7 +55,7 @@
55
55
  Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
56
  </p>
57
57
  </div>
58
- <div class='status-line high'></div>
58
+ <div class='status-line low'></div>
59
59
  <pre><table class="coverage">
60
60
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
61
61
  <a name='L2'></a><a href='#L2'>2</a>
@@ -336,230 +336,270 @@
336
336
  <a name='L277'></a><a href='#L277'>277</a>
337
337
  <a name='L278'></a><a href='#L278'>278</a>
338
338
  <a name='L279'></a><a href='#L279'>279</a>
339
- <a name='L280'></a><a href='#L280'>280</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
340
- <span class="cline-any cline-yes">1x</span>
339
+ <a name='L280'></a><a href='#L280'>280</a>
340
+ <a name='L281'></a><a href='#L281'>281</a>
341
+ <a name='L282'></a><a href='#L282'>282</a>
342
+ <a name='L283'></a><a href='#L283'>283</a>
343
+ <a name='L284'></a><a href='#L284'>284</a>
344
+ <a name='L285'></a><a href='#L285'>285</a>
345
+ <a name='L286'></a><a href='#L286'>286</a>
346
+ <a name='L287'></a><a href='#L287'>287</a>
347
+ <a name='L288'></a><a href='#L288'>288</a>
348
+ <a name='L289'></a><a href='#L289'>289</a>
349
+ <a name='L290'></a><a href='#L290'>290</a>
350
+ <a name='L291'></a><a href='#L291'>291</a>
351
+ <a name='L292'></a><a href='#L292'>292</a>
352
+ <a name='L293'></a><a href='#L293'>293</a>
353
+ <a name='L294'></a><a href='#L294'>294</a>
354
+ <a name='L295'></a><a href='#L295'>295</a>
355
+ <a name='L296'></a><a href='#L296'>296</a>
356
+ <a name='L297'></a><a href='#L297'>297</a>
357
+ <a name='L298'></a><a href='#L298'>298</a>
358
+ <a name='L299'></a><a href='#L299'>299</a>
359
+ <a name='L300'></a><a href='#L300'>300</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
341
360
  <span class="cline-any cline-neutral">&nbsp;</span>
342
361
  <span class="cline-any cline-neutral">&nbsp;</span>
343
- <span class="cline-any cline-yes">1x</span>
344
- <span class="cline-any cline-yes">1x</span>
345
- <span class="cline-any cline-yes">1x</span>
346
- <span class="cline-any cline-yes">1x</span>
347
362
  <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-yes">1x</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-no">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
349
367
  <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
350
369
  <span class="cline-any cline-neutral">&nbsp;</span>
351
370
  <span class="cline-any cline-neutral">&nbsp;</span>
352
371
  <span class="cline-any cline-neutral">&nbsp;</span>
353
372
  <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-yes">1x</span>
355
373
  <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
356
375
  <span class="cline-any cline-neutral">&nbsp;</span>
357
376
  <span class="cline-any cline-neutral">&nbsp;</span>
358
377
  <span class="cline-any cline-neutral">&nbsp;</span>
359
378
  <span class="cline-any cline-neutral">&nbsp;</span>
360
379
  <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-yes">1x</span>
362
380
  <span class="cline-any cline-neutral">&nbsp;</span>
381
+ <span class="cline-any cline-no">&nbsp;</span>
363
382
  <span class="cline-any cline-neutral">&nbsp;</span>
364
- <span class="cline-any cline-yes">1x</span>
365
- <span class="cline-any cline-yes">1x</span>
366
383
  <span class="cline-any cline-neutral">&nbsp;</span>
367
384
  <span class="cline-any cline-neutral">&nbsp;</span>
368
- <span class="cline-any cline-yes">74x</span>
385
+ <span class="cline-any cline-no">&nbsp;</span>
369
386
  <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-yes">74x</span>
371
- <span class="cline-any cline-yes">74x</span>
372
387
  <span class="cline-any cline-neutral">&nbsp;</span>
373
- <span class="cline-any cline-yes">74x</span>
374
- <span class="cline-any cline-yes">63x</span>
375
- <span class="cline-any cline-yes">63x</span>
376
388
  <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-yes">74x</span>
378
- <span class="cline-any cline-yes">54x</span>
389
+ <span class="cline-any cline-no">&nbsp;</span>
390
+ <span class="cline-any cline-no">&nbsp;</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
379
392
  <span class="cline-any cline-neutral">&nbsp;</span>
380
393
  <span class="cline-any cline-neutral">&nbsp;</span>
381
394
  <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-no">&nbsp;</span>
396
+ <span class="cline-any cline-no">&nbsp;</span>
397
+ <span class="cline-any cline-no">&nbsp;</span>
382
398
  <span class="cline-any cline-neutral">&nbsp;</span>
383
399
  <span class="cline-any cline-neutral">&nbsp;</span>
384
400
  <span class="cline-any cline-neutral">&nbsp;</span>
385
- <span class="cline-any cline-yes">54x</span>
386
- <span class="cline-any cline-yes">54x</span>
401
+ <span class="cline-any cline-no">&nbsp;</span>
387
402
  <span class="cline-any cline-neutral">&nbsp;</span>
388
- <span class="cline-any cline-yes">54x</span>
389
- <span class="cline-any cline-yes">54x</span>
390
- <span class="cline-any cline-yes">54x</span>
391
- <span class="cline-any cline-yes">54x</span>
392
- <span class="cline-any cline-yes">54x</span>
393
403
  <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-yes">54x</span>
404
+ <span class="cline-any cline-no">&nbsp;</span>
405
+ <span class="cline-any cline-no">&nbsp;</span>
395
406
  <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">43x</span>
397
407
  <span class="cline-any cline-neutral">&nbsp;</span>
398
- <span class="cline-any cline-yes">43x</span>
408
+ <span class="cline-any cline-no">&nbsp;</span>
399
409
  <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">43x</span>
410
+ <span class="cline-any cline-no">&nbsp;</span>
411
+ <span class="cline-any cline-no">&nbsp;</span>
401
412
  <span class="cline-any cline-neutral">&nbsp;</span>
402
- <span class="cline-any cline-yes">43x</span>
413
+ <span class="cline-any cline-no">&nbsp;</span>
414
+ <span class="cline-any cline-no">&nbsp;</span>
415
+ <span class="cline-any cline-no">&nbsp;</span>
403
416
  <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-no">&nbsp;</span>
418
+ <span class="cline-any cline-no">&nbsp;</span>
404
419
  <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-yes">43x</span>
406
- <span class="cline-any cline-yes">43x</span>
407
- <span class="cline-any cline-yes">43x</span>
408
- <span class="cline-any cline-yes">43x</span>
409
420
  <span class="cline-any cline-neutral">&nbsp;</span>
410
- <span class="cline-any cline-yes">43x</span>
411
421
  <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-yes">43x</span>
413
- <span class="cline-any cline-yes">43x</span>
414
- <span class="cline-any cline-yes">43x</span>
415
- <span class="cline-any cline-yes">43x</span>
416
- <span class="cline-any cline-yes">43x</span>
417
422
  <span class="cline-any cline-neutral">&nbsp;</span>
418
423
  <span class="cline-any cline-neutral">&nbsp;</span>
419
424
  <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-no">&nbsp;</span>
426
+ <span class="cline-any cline-no">&nbsp;</span>
420
427
  <span class="cline-any cline-neutral">&nbsp;</span>
428
+ <span class="cline-any cline-no">&nbsp;</span>
429
+ <span class="cline-any cline-no">&nbsp;</span>
430
+ <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-no">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
421
433
  <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-yes">54x</span>
434
+ <span class="cline-any cline-no">&nbsp;</span>
423
435
  <span class="cline-any cline-neutral">&nbsp;</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
424
437
  <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-yes">142x</span>
438
+ <span class="cline-any cline-no">&nbsp;</span>
426
439
  <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
427
441
  <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
428
443
  <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-yes">54x</span>
430
444
  <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-yes">234x</span>
432
- <span class="cline-any cline-yes">162x</span>
445
+ <span class="cline-any cline-no">&nbsp;</span>
446
+ <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
+ <span class="cline-any cline-no">&nbsp;</span>
433
449
  <span class="cline-any cline-neutral">&nbsp;</span>
434
- <span class="cline-any cline-yes">72x</span>
450
+ <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-no">&nbsp;</span>
453
+ <span class="cline-any cline-no">&nbsp;</span>
454
+ <span class="cline-any cline-no">&nbsp;</span>
455
+ <span class="cline-any cline-no">&nbsp;</span>
456
+ <span class="cline-any cline-no">&nbsp;</span>
435
457
  <span class="cline-any cline-neutral">&nbsp;</span>
436
458
  <span class="cline-any cline-neutral">&nbsp;</span>
437
459
  <span class="cline-any cline-neutral">&nbsp;</span>
438
460
  <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-yes">1x</span>
440
- <span class="cline-any cline-yes">8x</span>
441
- <span class="cline-any cline-yes">3x</span>
442
461
  <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-no">&nbsp;</span>
443
463
  <span class="cline-any cline-neutral">&nbsp;</span>
444
464
  <span class="cline-any cline-neutral">&nbsp;</span>
445
- <span class="cline-any cline-yes">1x</span>
465
+ <span class="cline-any cline-no">&nbsp;</span>
446
466
  <span class="cline-any cline-no">&nbsp;</span>
447
467
  <span class="cline-any cline-neutral">&nbsp;</span>
448
468
  <span class="cline-any cline-neutral">&nbsp;</span>
449
469
  <span class="cline-any cline-neutral">&nbsp;</span>
450
- <span class="cline-any cline-yes">66x</span>
451
470
  <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
452
472
  <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-no">&nbsp;</span>
474
+ <span class="cline-any cline-no">&nbsp;</span>
453
475
  <span class="cline-any cline-neutral">&nbsp;</span>
454
- <span class="cline-any cline-yes">66x</span>
455
- <span class="cline-any cline-yes">66x</span>
476
+ <span class="cline-any cline-no">&nbsp;</span>
456
477
  <span class="cline-any cline-neutral">&nbsp;</span>
457
478
  <span class="cline-any cline-neutral">&nbsp;</span>
458
479
  <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-yes">36x</span>
460
480
  <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-yes">36x</span>
462
- <span class="cline-any cline-yes">36x</span>
481
+ <span class="cline-any cline-no">&nbsp;</span>
482
+ <span class="cline-any cline-no">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
463
484
  <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-yes">36x</span>
465
485
  <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">36x</span>
467
486
  <span class="cline-any cline-neutral">&nbsp;</span>
468
- <span class="cline-any cline-yes">36x</span>
487
+ <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
469
489
  <span class="cline-any cline-neutral">&nbsp;</span>
470
490
  <span class="cline-any cline-neutral">&nbsp;</span>
471
491
  <span class="cline-any cline-neutral">&nbsp;</span>
492
+ <span class="cline-any cline-no">&nbsp;</span>
472
493
  <span class="cline-any cline-neutral">&nbsp;</span>
473
- <span class="cline-any cline-yes">49x</span>
474
494
  <span class="cline-any cline-neutral">&nbsp;</span>
475
495
  <span class="cline-any cline-neutral">&nbsp;</span>
476
- <span class="cline-any cline-yes">119x</span>
477
- <span class="cline-any cline-yes">5x</span>
478
- <span class="cline-any cline-yes">114x</span>
479
- <span class="cline-any cline-yes">12x</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
+ <span class="cline-any cline-no">&nbsp;</span>
480
498
  <span class="cline-any cline-neutral">&nbsp;</span>
481
499
  <span class="cline-any cline-neutral">&nbsp;</span>
482
500
  <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-yes">9x</span>
484
- <span class="cline-any cline-yes">105x</span>
485
- <span class="cline-any cline-yes">14x</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
486
502
  <span class="cline-any cline-neutral">&nbsp;</span>
487
- <span class="cline-any cline-yes">14x</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-no">&nbsp;</span>
488
505
  <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
489
507
  <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-yes">49x</span>
508
+ <span class="cline-any cline-no">&nbsp;</span>
491
509
  <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-no">&nbsp;</span>
492
511
  <span class="cline-any cline-neutral">&nbsp;</span>
493
512
  <span class="cline-any cline-neutral">&nbsp;</span>
494
513
  <span class="cline-any cline-neutral">&nbsp;</span>
495
514
  <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-yes">24x</span>
515
+ <span class="cline-any cline-no">&nbsp;</span>
497
516
  <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-yes">24x</span>
499
- <span class="cline-any cline-yes">24x</span>
500
517
  <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-no">&nbsp;</span>
519
+ <span class="cline-any cline-no">&nbsp;</span>
520
+ <span class="cline-any cline-no">&nbsp;</span>
521
+ <span class="cline-any cline-no">&nbsp;</span>
501
522
  <span class="cline-any cline-neutral">&nbsp;</span>
502
- <span class="cline-any cline-yes">24x</span>
503
523
  <span class="cline-any cline-neutral">&nbsp;</span>
504
524
  <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-no">&nbsp;</span>
527
+ <span class="cline-any cline-no">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-no">&nbsp;</span>
505
530
  <span class="cline-any cline-neutral">&nbsp;</span>
506
- <span class="cline-any cline-yes">13x</span>
507
- <span class="cline-any cline-yes">13x</span>
508
- <span class="cline-any cline-yes">13x</span>
509
531
  <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-yes">13x</span>
532
+ <span class="cline-any cline-no">&nbsp;</span>
511
533
  <span class="cline-any cline-neutral">&nbsp;</span>
512
534
  <span class="cline-any cline-neutral">&nbsp;</span>
513
535
  <span class="cline-any cline-neutral">&nbsp;</span>
514
536
  <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-yes">2x</span>
516
537
  <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-yes">2x</span>
538
+ <span class="cline-any cline-no">&nbsp;</span>
518
539
  <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
519
542
  <span class="cline-any cline-neutral">&nbsp;</span>
520
543
  <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
521
545
  <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-yes">11x</span>
523
546
  <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-yes">11x</span>
525
547
  <span class="cline-any cline-neutral">&nbsp;</span>
526
- <span class="cline-any cline-yes">11x</span>
548
+ <span class="cline-any cline-no">&nbsp;</span>
549
+ <span class="cline-any cline-no">&nbsp;</span>
550
+ <span class="cline-any cline-no">&nbsp;</span>
527
551
  <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
528
553
  <span class="cline-any cline-neutral">&nbsp;</span>
529
554
  <span class="cline-any cline-neutral">&nbsp;</span>
530
555
  <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-yes">44x</span>
532
556
  <span class="cline-any cline-neutral">&nbsp;</span>
533
- <span class="cline-any cline-yes">40x</span>
534
- <span class="cline-any cline-yes">40x</span>
557
+ <span class="cline-any cline-no">&nbsp;</span>
535
558
  <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-yes">40x</span>
537
- <span class="cline-any cline-yes">40x</span>
538
- <span class="cline-any cline-yes">60x</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
539
560
  <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-yes">60x</span>
541
561
  <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-yes">60x</span>
543
- <span class="cline-any cline-yes">60x</span>
544
562
  <span class="cline-any cline-neutral">&nbsp;</span>
545
563
  <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-yes">60x</span>
547
- <span class="cline-any cline-yes">60x</span>
548
- <span class="cline-any cline-yes">60x</span>
549
- <span class="cline-any cline-yes">60x</span>
550
- <span class="cline-any cline-yes">60x</span>
551
- <span class="cline-any cline-yes">60x</span>
552
- <span class="cline-any cline-yes">60x</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-no">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-neutral">&nbsp;</span>
570
+ <span class="cline-any cline-neutral">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-no">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-no">&nbsp;</span>
576
+ <span class="cline-any cline-no">&nbsp;</span>
577
+ <span class="cline-any cline-neutral">&nbsp;</span>
578
+ <span class="cline-any cline-no">&nbsp;</span>
579
+ <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
+ <span class="cline-any cline-no">&nbsp;</span>
553
586
  <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-yes">60x</span>
555
587
  <span class="cline-any cline-neutral">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
+ <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-no">&nbsp;</span>
591
+ <span class="cline-any cline-no">&nbsp;</span>
592
+ <span class="cline-any cline-no">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-no">&nbsp;</span>
556
595
  <span class="cline-any cline-neutral">&nbsp;</span>
557
- <span class="cline-any cline-yes">56x</span>
558
- <span class="cline-any cline-yes">56x</span>
559
- <span class="cline-any cline-yes">56x</span>
560
- <span class="cline-any cline-yes">56x</span>
596
+ <span class="cline-any cline-no">&nbsp;</span>
597
+ <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-no">&nbsp;</span>
561
601
  <span class="cline-any cline-neutral">&nbsp;</span>
562
- <span class="cline-any cline-yes">56x</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
563
603
  <span class="cline-any cline-neutral">&nbsp;</span>
564
604
  <span class="cline-any cline-neutral">&nbsp;</span>
565
605
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -569,12 +609,12 @@
569
609
  <span class="cline-any cline-neutral">&nbsp;</span>
570
610
  <span class="cline-any cline-neutral">&nbsp;</span>
571
611
  <span class="cline-any cline-neutral">&nbsp;</span>
572
- <span class="cline-any cline-yes">44x</span>
573
- <span class="cline-any cline-yes">40x</span>
574
- <span class="cline-any cline-yes">28x</span>
575
- <span class="cline-any cline-yes">14x</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
613
+ <span class="cline-any cline-no">&nbsp;</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-no">&nbsp;</span>
576
616
  <span class="cline-any cline-neutral">&nbsp;</span>
577
- <span class="cline-any cline-yes">14x</span>
617
+ <span class="cline-any cline-no">&nbsp;</span>
578
618
  <span class="cline-any cline-neutral">&nbsp;</span>
579
619
  <span class="cline-any cline-neutral">&nbsp;</span>
580
620
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -584,7 +624,7 @@
584
624
  <span class="cline-any cline-neutral">&nbsp;</span>
585
625
  <span class="cline-any cline-neutral">&nbsp;</span>
586
626
  <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-yes">1x</span>
627
+ <span class="cline-any cline-no">&nbsp;</span>
588
628
  <span class="cline-any cline-neutral">&nbsp;</span>
589
629
  <span class="cline-any cline-neutral">&nbsp;</span>
590
630
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -593,7 +633,7 @@
593
633
  <span class="cline-any cline-neutral">&nbsp;</span>
594
634
  <span class="cline-any cline-neutral">&nbsp;</span>
595
635
  <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-yes">1x</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
597
637
  <span class="cline-any cline-neutral">&nbsp;</span>
598
638
  <span class="cline-any cline-neutral">&nbsp;</span>
599
639
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -619,226 +659,246 @@
619
659
  import { Ability, AbilityBuilder, toMongoQuery } from 'casl/dist/umd'
620
660
  &nbsp;
621
661
  // Define some alias to simplify ability definitions
622
- Ability.addAlias('update', 'patch')
623
- Ability.addAlias('read', ['get', 'find'])
624
- Ability.addAlias('remove', 'delete')
625
- Ability.addAlias('all', ['read', 'create', 'update', 'remove'])
662
+ <span class="cstat-no" title="statement not covered" >Ability.addAlias('update', 'patch')</span>
663
+ <span class="cstat-no" title="statement not covered" >Ability.addAlias('read', ['get', 'find'])</span>
664
+ <span class="cstat-no" title="statement not covered" >Ability.addAlias('remove', 'delete')</span>
665
+ <span class="cstat-no" title="statement not covered" >Ability.addAlias('all', ['read', 'create', 'update', 'remove'])</span>
626
666
  &nbsp;
627
- export const Roles = {
667
+ export const Roles = <span class="cstat-no" title="statement not covered" >{</span>
628
668
  member: 0,
629
669
  manager: 1,
630
670
  owner: 2
631
671
  }
632
672
  &nbsp;
633
- export const RoleNames = [
673
+ export const RoleNames = <span class="cstat-no" title="statement not covered" >[</span>
634
674
  'member',
635
675
  'manager',
636
676
  'owner'
637
677
  ]
638
678
  &nbsp;
679
+ export function <span class="fstat-no" title="function not covered" >isSeniorRole </span>(roleName, juniorName) {
680
+ <span class="cstat-no" title="statement not covered" > return Roles[roleName] &gt;= Roles[juniorName]</span>
681
+ }
682
+ &nbsp;
683
+ export function <span class="fstat-no" title="function not covered" >isJuniorRole </span>(roleName, seniorName) {
684
+ <span class="cstat-no" title="statement not covered" > return Roles[roleName] &lt; Roles[seniorName]</span>
685
+ }
686
+ &nbsp;
687
+ export function <span class="fstat-no" title="function not covered" >getSeniorRoles </span>(roleName) {
688
+ const seniorRoles = <span class="cstat-no" title="statement not covered" >[]</span>
689
+ <span class="cstat-no" title="statement not covered" > _.forEach(Roles, <span class="fstat-no" title="function not covered" >ro</span>le =&gt; { <span class="cstat-no" title="statement not covered" >if (Roles[roleName] &lt; role) <span class="cstat-no" title="statement not covered" >seniorRoles.push(RoleNames[role]) </span></span>})</span>
690
+ <span class="cstat-no" title="statement not covered" > return seniorRoles</span>
691
+ }
692
+ &nbsp;
693
+ export function <span class="fstat-no" title="function not covered" >getJuniorRoles </span>(roleName) {
694
+ const juniorRoles = <span class="cstat-no" title="statement not covered" >[]</span>
695
+ <span class="cstat-no" title="statement not covered" > _.forEach(Roles, <span class="fstat-no" title="function not covered" >ro</span>le =&gt; { <span class="cstat-no" title="statement not covered" >if (Roles[roleName] &gt;= role) <span class="cstat-no" title="statement not covered" >juniorRoles.push(RoleNames[role]) </span></span>})</span>
696
+ <span class="cstat-no" title="statement not covered" > return juniorRoles</span>
697
+ }
698
+ &nbsp;
639
699
  // Hooks that can be added to customize abilities computation
640
- let hooks = []
700
+ let hooks = <span class="cstat-no" title="statement not covered" >[]</span>
641
701
  &nbsp;
642
702
  // Get the unique global symbol to store resource type / context on a resource object
643
- export const RESOURCE_TYPE = 'type'
644
- export const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)
703
+ export const RESOURCE_TYPE = <span class="cstat-no" title="statement not covered" >'type'</span>
704
+ export const RESOURCE_TYPE_KEY = <span class="cstat-no" title="statement not covered" >Symbol.for(RESOURCE_TYPE)</span>
645
705
  &nbsp;
646
- export function defineResourceRules (subject, resource, resourceService, can) {
647
- const role = Roles[resource.permissions]
706
+ export function <span class="fstat-no" title="function not covered" >defineResourceRules </span>(subject, resource, resourceService, can) {
707
+ const role = <span class="cstat-no" title="statement not covered" >Roles[resource.permissions]</span>
648
708
  &nbsp;
649
- <span class="missing-if-branch" title="else path not taken" >E</span>if (role &gt;= Roles.member) {
650
- can('read', resourceService, { _id: resource._id })
709
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.member) {</span>
710
+ <span class="cstat-no" title="statement not covered" > can('read', resourceService, { _id: resource._id })</span>
651
711
  }
652
- if (role &gt;= Roles.manager) {
653
- can('update', resourceService, { _id: resource._id })
654
- can(['create', 'remove'], 'authorisations', { resource: resource._id })
712
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.manager) {</span>
713
+ <span class="cstat-no" title="statement not covered" > can('update', resourceService, { _id: resource._id })</span>
714
+ <span class="cstat-no" title="statement not covered" > can(['create', 'remove'], 'authorisations', { resource: resource._id })</span>
655
715
  }
656
- if (role &gt;= Roles.owner) {
657
- can('remove', resourceService, { _id: resource._id })
716
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.owner) {</span>
717
+ <span class="cstat-no" title="statement not covered" > can('remove', resourceService, { _id: resource._id })</span>
658
718
  }
659
719
  }
660
720
  &nbsp;
661
721
  // Hook computing default abilities for a given user
662
- export function defineUserAbilities (subject, can, cannot) {
722
+ export function <span class="fstat-no" title="function not covered" >defineUserAbilities </span>(subject, can, cannot) {
663
723
  // Allow user registration
664
- can('service', 'users')
665
- can('create', 'users')
724
+ <span class="cstat-no" title="statement not covered" > can('service', 'users')</span>
725
+ <span class="cstat-no" title="statement not covered" > can('create', 'users')</span>
666
726
  // Verification email, reset password, etc.
667
- can('service', 'account')
668
- can('create', 'account')
669
- can('service', 'devices')
670
- can('update', 'devices')
671
- can('remove', 'devices')
727
+ <span class="cstat-no" title="statement not covered" > can('service', 'account')</span>
728
+ <span class="cstat-no" title="statement not covered" > can('create', 'account')</span>
729
+ <span class="cstat-no" title="statement not covered" > can('service', 'devices')</span>
730
+ <span class="cstat-no" title="statement not covered" > can('update', 'devices')</span>
731
+ <span class="cstat-no" title="statement not covered" > can('remove', 'devices')</span>
672
732
  &nbsp;
673
- if (subject &amp;&amp; subject._id) {
733
+ <span class="cstat-no" title="statement not covered" > if (subject &amp;&amp; subject._id) {</span>
674
734
  // Read user profiles for authorizing
675
- can('read', 'users')
735
+ <span class="cstat-no" title="statement not covered" > can('read', 'users')</span>
676
736
  // Update user profile and destroy it
677
- can(['update', 'remove'], 'users', { _id: subject._id })
737
+ <span class="cstat-no" title="statement not covered" > can(['update', 'remove'], 'users', { _id: subject._id })</span>
678
738
  // Access authorisation service, then rights will be granted on a per-resource basis
679
- can('service', 'authorisations')
739
+ <span class="cstat-no" title="statement not covered" > can('service', 'authorisations')</span>
680
740
  // Access storage service, then rights will be granted on a per-resource basis
681
- can('service', 'storage')
741
+ <span class="cstat-no" title="statement not covered" > can('service', 'storage')</span>
682
742
  // This is for the user avatar
683
743
  // take care that the storage service uses 'id' as input but produces _id as output
684
- can('create', 'storage', { id: 'avatars/' + subject._id.toString() })
685
- can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })
686
- can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })
687
- can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })
744
+ <span class="cstat-no" title="statement not covered" > can('create', 'storage', { id: 'avatars/' + subject._id.toString() })</span>
745
+ <span class="cstat-no" title="statement not covered" > can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })</span>
746
+ <span class="cstat-no" title="statement not covered" > can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })</span>
747
+ <span class="cstat-no" title="statement not covered" > can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })</span>
688
748
  // Avatar is part of user profiles so that they can be read by any
689
- can('read', 'storage', { _id: { $regex: '^avatars/*' } })
749
+ <span class="cstat-no" title="statement not covered" > can('read', 'storage', { _id: { $regex: '^avatars/*' } })</span>
690
750
  // Verification email, reset password, etc.
691
- can('service', 'account')
692
- can('create', 'account')
693
- can('service', 'devices')
694
- can('update', 'devices')
695
- can('remove', 'devices')
751
+ <span class="cstat-no" title="statement not covered" > can('service', 'account')</span>
752
+ <span class="cstat-no" title="statement not covered" > can('create', 'account')</span>
753
+ <span class="cstat-no" title="statement not covered" > can('service', 'devices')</span>
754
+ <span class="cstat-no" title="statement not covered" > can('update', 'devices')</span>
755
+ <span class="cstat-no" title="statement not covered" > can('remove', 'devices')</span>
696
756
  }
697
757
  }
698
758
  &nbsp;
699
759
  // Compute abilities for a given user
700
- export function defineAbilities (subject) {
701
- const { rules, can, cannot } = AbilityBuilder.extract()
760
+ export async function <span class="fstat-no" title="function not covered" >defineAbilities </span>(subject, ...args) {
761
+ const { rules, can, cannot } = <span class="cstat-no" title="statement not covered" >AbilityBuilder.extract()</span>
702
762
  &nbsp;
703
- // Run registered hooks
704
- hooks.forEach(hook =&gt; hook(subject, can, cannot))
763
+ // Run registered hooks providing any additional arguments used to handle complex use cases
764
+ <span class="cstat-no" title="statement not covered" > await Promise.all(hooks.map(<span class="fstat-no" title="function not covered" >as</span>ync hook =&gt; {</span>
765
+ <span class="cstat-no" title="statement not covered" > await hook(subject, can, cannot, ...args)</span>
766
+ }))
705
767
  &nbsp;
706
768
  // CASL cannot infer the object type from the object itself so we need
707
769
  // to tell it how he can find the object type, i.e. service name.
708
- return new Ability(rules, {
709
- subjectName: resource =&gt; {
710
- if (!resource || typeof resource === 'string') {
711
- return resource
770
+ <span class="cstat-no" title="statement not covered" > return new Ability(rules, {</span>
771
+ subjectName: <span class="fstat-no" title="function not covered" >re</span>source =&gt; {
772
+ <span class="cstat-no" title="statement not covered" > if (!resource || typeof resource === 'string') {</span>
773
+ <span class="cstat-no" title="statement not covered" > return resource</span>
712
774
  }
713
- return resource[RESOURCE_TYPE_KEY]
775
+ <span class="cstat-no" title="statement not covered" > return resource[RESOURCE_TYPE_KEY]</span>
714
776
  }
715
777
  })
716
778
  }
717
779
  &nbsp;
718
- defineAbilities.registerHook = function (hook) {
719
- if (!hooks.includes(hook)) {
720
- hooks.push(hook)
780
+ <span class="cstat-no" title="statement not covered" >defineAbilities.registerHook = <span class="fstat-no" title="function not covered" >fu</span>nction (hook) {</span>
781
+ <span class="cstat-no" title="statement not covered" > if (!hooks.includes(hook)) {</span>
782
+ <span class="cstat-no" title="statement not covered" > hooks.push(hook)</span>
721
783
  }
722
784
  }
723
785
  &nbsp;
724
- defineAbilities.unregisterHook = <span class="fstat-no" title="function not covered" >function (h</span>ook) {
725
- <span class="cstat-no" title="statement not covered" > hooks = h</span>ooks.filter(<span class="fstat-no" title="function not covered" >registeredHook =&gt; <span class="cstat-no" title="statement not covered" >r</span>egisteredHook !== hook)</span>
786
+ <span class="cstat-no" title="statement not covered" >defineAbilities.unregisterHook = <span class="fstat-no" title="function not covered" >fu</span>nction (hook) {</span>
787
+ <span class="cstat-no" title="statement not covered" > hooks = hooks.filter(<span class="fstat-no" title="function not covered" >re</span>gisteredHook =&gt; <span class="cstat-no" title="statement not covered" >registeredHook !== hook)</span></span>
726
788
  }
727
789
  &nbsp;
728
- export function hasServiceAbilities (abilities, service) {
729
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!abilities) <span class="cstat-no" title="statement not covered" >return f</span>alse
790
+ export function <span class="fstat-no" title="function not covered" >hasServiceAbilities </span>(abilities, service) {
791
+ <span class="cstat-no" title="statement not covered" > if (!abilities) <span class="cstat-no" title="statement not covered" >return false</span></span>
730
792
  // The unique identifier of a service is its path not its name.
731
793
  // Indeed we have for instance a 'groups' service in each organisation
732
794
  // Take care that in client we have the service path while on server we have the actual object
733
- const path = typeof service === 'string' ? <span class="branch-0 cbranch-no" title="branch not covered" >service : s</span>ervice.getPath()
734
- return abilities.can('service', path) || abilities.can('service', _.replace(path, /^.*\//, '*/'))
795
+ const path = <span class="cstat-no" title="statement not covered" >typeof service === 'string' ? service : service.getPath()</span>
796
+ <span class="cstat-no" title="statement not covered" > return abilities.can('service', path) || abilities.can('service', _.replace(path, /^.*\//, '*/'))</span>
735
797
  }
736
798
  &nbsp;
737
- export function hasResourceAbilities (abilities, operation, resourceType, context, resource) {
738
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!abilities) <span class="cstat-no" title="statement not covered" >return f</span>alse
799
+ export function <span class="fstat-no" title="function not covered" >hasResourceAbilities </span>(abilities, operation, resourceType, context, resource) {
800
+ <span class="cstat-no" title="statement not covered" > if (!abilities) <span class="cstat-no" title="statement not covered" >return false</span></span>
739
801
  // Create a shallow copy adding context and type
740
- const object = Object.assign({}, resource)
741
- object[RESOURCE_TYPE_KEY] = resourceType
802
+ const object = <span class="cstat-no" title="statement not covered" >Object.assign({}, resource)</span>
803
+ <span class="cstat-no" title="statement not covered" > object[RESOURCE_TYPE_KEY] = resourceType</span>
742
804
  // Add a virtual context to take it into account for object having no link to it
743
- if (context) object.context = (typeof context === 'object' ? context._id.toString() : <span class="branch-1 cbranch-no" title="branch not covered" >context.t</span>oString())
805
+ <span class="cstat-no" title="statement not covered" > if (context) <span class="cstat-no" title="statement not covered" >object.context = (typeof context === 'object' ? context._id.toString() : context.toString())</span></span>
744
806
  &nbsp;
745
- const result = abilities.can(operation, object)
807
+ const result = <span class="cstat-no" title="statement not covered" >abilities.can(operation, object)</span>
746
808
  &nbsp;
747
- return result
809
+ <span class="cstat-no" title="statement not covered" > return result</span>
748
810
  }
749
811
  &nbsp;
750
812
  // Utility function used to remove the virtual context from query
751
- export function removeContext (query) {
752
- _.forOwn(query, (value, key) =&gt; {
813
+ export function <span class="fstat-no" title="function not covered" >removeContext </span>(query) {
814
+ <span class="cstat-no" title="statement not covered" > _.forOwn(query, <span class="fstat-no" title="function not covered" >(v</span>alue, key) =&gt; {</span>
753
815
  // Process current attributes or recurse
754
816
  // Take care to nested fields like 'field._id'
755
- if (key === 'context') {
756
- delete query.context
757
- } else if (Array.isArray(value)) {
758
- value.forEach(item =&gt; removeContext(item))
817
+ <span class="cstat-no" title="statement not covered" > if (key === 'context') {</span>
818
+ <span class="cstat-no" title="statement not covered" > delete query.context</span>
819
+ } else <span class="cstat-no" title="statement not covered" >if (Array.isArray(value)) {</span>
820
+ <span class="cstat-no" title="statement not covered" > value.forEach(<span class="fstat-no" title="function not covered" >it</span>em =&gt; <span class="cstat-no" title="statement not covered" >removeContext(item))</span></span>
759
821
  // Remove empty objects from array
760
822
  // _.remove(value, item =&gt; _.isEmpty(item))
761
823
  // Remove empty arrays from query
762
- <span class="missing-if-branch" title="if path not taken" >I</span>if (_.isEmpty(value)) <span class="cstat-no" title="statement not covered" >delete q</span>uery[key]
763
- } else if (typeof value === 'object') {
764
- removeContext(value)
824
+ <span class="cstat-no" title="statement not covered" > if (_.isEmpty(value)) <span class="cstat-no" title="statement not covered" >delete query[key]</span></span>
825
+ } else <span class="cstat-no" title="statement not covered" >if (typeof value === 'object') {</span>
826
+ <span class="cstat-no" title="statement not covered" > removeContext(value)</span>
765
827
  // Remove empty objects from query
766
- <span class="missing-if-branch" title="if path not taken" >I</span>if (_.isEmpty(value)) <span class="cstat-no" title="statement not covered" >delete q</span>uery[key]
828
+ <span class="cstat-no" title="statement not covered" > if (_.isEmpty(value)) <span class="cstat-no" title="statement not covered" >delete query[key]</span></span>
767
829
  }
768
830
  })
769
- return query
831
+ <span class="cstat-no" title="statement not covered" > return query</span>
770
832
  }
771
833
  &nbsp;
772
834
  // Get the query used to filter the objects according to given abilities
773
835
  // A null query indicates that access should not be granted
774
- export function getQueryForAbilities (abilities, operation, resourceType) {
775
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!abilities) <span class="cstat-no" title="statement not covered" >return n</span>ull
836
+ export function <span class="fstat-no" title="function not covered" >getQueryForAbilities </span>(abilities, operation, resourceType) {
837
+ <span class="cstat-no" title="statement not covered" > if (!abilities) <span class="cstat-no" title="statement not covered" >return null</span></span>
776
838
  &nbsp;
777
- const rules = abilities.rulesFor(operation, resourceType)
778
- const query = toMongoQuery(rules)
839
+ const rules = <span class="cstat-no" title="statement not covered" >abilities.rulesFor(operation, resourceType)</span>
840
+ const query = <span class="cstat-no" title="statement not covered" >toMongoQuery(rules)</span>
779
841
  // Remove any context to avoid taking it into account because it is not really stored on objects
780
842
  // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)
781
- return (query ? removeContext(_.cloneDeep(query)) : null)
843
+ <span class="cstat-no" title="statement not covered" > return (query ? removeContext(_.cloneDeep(query)) : null)</span>
782
844
  }
783
845
  &nbsp;
784
- function buildSubjectsQueryForResource (resourceScope, resourceId, role) {
785
- const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }
786
- <span class="missing-if-branch" title="else path not taken" >E</span>if (role) {
787
- _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? <span class="branch-0 cbranch-no" title="branch not covered" >role : R</span>oleNames[role]))
846
+ function <span class="fstat-no" title="function not covered" >buildSubjectsQueryForResource </span>(resourceScope, resourceId, role) {
847
+ const query = <span class="cstat-no" title="statement not covered" >{ [resourceScope]: { $elemMatch: { _id: resourceId } } }</span>
848
+ <span class="cstat-no" title="statement not covered" > if (role) {</span>
849
+ <span class="cstat-no" title="statement not covered" > _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))</span>
788
850
  }
789
- return query
851
+ <span class="cstat-no" title="statement not covered" > return query</span>
790
852
  }
791
853
  &nbsp;
792
- export function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {
854
+ export function <span class="fstat-no" title="function not covered" >findSubjectsForResource </span>(subjectService, resourceScope, resourceId, role) {
793
855
  // Build the query
794
- const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)
856
+ const query = <span class="cstat-no" title="statement not covered" >buildSubjectsQueryForResource(resourceScope, resourceId, role)</span>
795
857
  // Execute the query
796
- return subjectService.find({ query })
858
+ <span class="cstat-no" title="statement not covered" > return subjectService.find({ query })</span>
797
859
  }
798
860
  &nbsp;
799
- export function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {
861
+ export function <span class="fstat-no" title="function not covered" >countSubjectsForResource </span>(subjectService, resourceScope, resourceId, role) {
800
862
  // Build the query
801
- const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)
863
+ const query = <span class="cstat-no" title="statement not covered" >buildSubjectsQueryForResource(resourceScope, resourceId, role)</span>
802
864
  // Indicate we'd only like to count
803
- query.$limit = 0
865
+ <span class="cstat-no" title="statement not covered" > query.$limit = 0</span>
804
866
  // Execute the query
805
- return subjectService.find({ query })
867
+ <span class="cstat-no" title="statement not covered" > return subjectService.find({ query })</span>
806
868
  }
807
869
  &nbsp;
808
870
  // Hook computing organisation abilities for a given user
809
- export function defineOrganisationAbilities (subject, can, cannot) {
810
- if (subject) {
871
+ export function <span class="fstat-no" title="function not covered" >defineOrganisationAbilities </span>(subject, can, cannot) {
872
+ <span class="cstat-no" title="statement not covered" > if (subject) {</span>
811
873
  // Create new organisations
812
- can('service', 'organisations')
813
- can('create', 'organisations')
874
+ <span class="cstat-no" title="statement not covered" > can('service', 'organisations')</span>
875
+ <span class="cstat-no" title="statement not covered" > can('create', 'organisations')</span>
814
876
  &nbsp;
815
- <span class="missing-if-branch" title="else path not taken" >E</span>if (subject.organisations) {
816
- subject.organisations.forEach(organisation =&gt; {
817
- <span class="missing-if-branch" title="else path not taken" >E</span>if (organisation._id) {
877
+ <span class="cstat-no" title="statement not covered" > if (subject.organisations) {</span>
878
+ <span class="cstat-no" title="statement not covered" > subject.organisations.forEach(<span class="fstat-no" title="function not covered" >or</span>ganisation =&gt; {</span>
879
+ <span class="cstat-no" title="statement not covered" > if (organisation._id) {</span>
818
880
  // Generic rules for resources
819
- defineResourceRules(subject, organisation, 'organisations', can)
881
+ <span class="cstat-no" title="statement not covered" > defineResourceRules(subject, organisation, 'organisations', can)</span>
820
882
  // Specific rules for organisations
821
- const role = Roles[organisation.permissions]
822
- <span class="missing-if-branch" title="else path not taken" >E</span>if (role &gt;= Roles.member) {
883
+ const role = <span class="cstat-no" title="statement not covered" >Roles[organisation.permissions]</span>
884
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.member) {</span>
823
885
  // The unique identifier of a service is its path not its name.
824
886
  // Indeed we have for instance a 'groups' service in each organisation.
825
- can('service', organisation._id.toString() + '/members')
826
- can('read', 'members', { context: organisation._id })
827
- can('service', organisation._id.toString() + '/tags')
828
- can('read', 'tags', { context: organisation._id })
829
- can('service', organisation._id.toString() + '/groups')
830
- can('service', organisation._id.toString() + '/storage')
831
- can(['read', 'create', 'remove'], 'storage', { context: organisation._id })
887
+ <span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/members')</span>
888
+ <span class="cstat-no" title="statement not covered" > can('read', 'members', { context: organisation._id })</span>
889
+ <span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/tags')</span>
890
+ <span class="cstat-no" title="statement not covered" > can('read', 'tags', { context: organisation._id })</span>
891
+ <span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/groups')</span>
892
+ <span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/storage')</span>
893
+ <span class="cstat-no" title="statement not covered" > can(['read', 'create', 'remove'], 'storage', { context: organisation._id })</span>
832
894
  }
833
- if (role &gt;= Roles.manager) {
834
- // The unique identifier of a service is its path not its name.
835
- // Indeed we have for instance a 'groups' service in each organisation.
836
- can('update', 'members', { context: organisation._id })
837
- can('update', 'tags', { context: organisation._id })
838
- can('create', 'groups', { context: organisation._id })
839
- can(['create', 'remove'], 'tags', { context: organisation._id })
895
+ <span class="cstat-no" title="statement not covered" > if (role &gt;= Roles.manager) {</span>
896
+ <span class="cstat-no" title="statement not covered" > can('update', 'members', { context: organisation._id })</span>
897
+ <span class="cstat-no" title="statement not covered" > can('update', 'tags', { context: organisation._id })</span>
898
+ <span class="cstat-no" title="statement not covered" > can('create', 'groups', { context: organisation._id })</span>
899
+ <span class="cstat-no" title="statement not covered" > can(['create', 'remove'], 'tags', { context: organisation._id })</span>
840
900
  // Remove invited members
841
- can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })
901
+ <span class="cstat-no" title="statement not covered" > can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })</span>
842
902
  }
843
903
  }
844
904
  })
@@ -847,13 +907,13 @@ export function defineOrganisationAbilities (subject, can, cannot) {
847
907
  }
848
908
  &nbsp;
849
909
  // Hook computing group abilities for a given user
850
- export function defineGroupAbilities (subject, can, cannot) {
851
- if (subject) {
852
- if (subject.groups) {
853
- subject.groups.forEach(group =&gt; {
854
- <span class="missing-if-branch" title="else path not taken" >E</span>if (group._id) {
910
+ export function <span class="fstat-no" title="function not covered" >defineGroupAbilities </span>(subject, can, cannot) {
911
+ <span class="cstat-no" title="statement not covered" > if (subject) {</span>
912
+ <span class="cstat-no" title="statement not covered" > if (subject.groups) {</span>
913
+ <span class="cstat-no" title="statement not covered" > subject.groups.forEach(<span class="fstat-no" title="function not covered" >gr</span>oup =&gt; {</span>
914
+ <span class="cstat-no" title="statement not covered" > if (group._id) {</span>
855
915
  // Generic rules for resources
856
- defineResourceRules(subject, group, 'groups', can)
916
+ <span class="cstat-no" title="statement not covered" > defineResourceRules(subject, group, 'groups', can)</span>
857
917
  // No specific rules for groups
858
918
  }
859
919
  })
@@ -862,37 +922,37 @@ export function defineGroupAbilities (subject, can, cannot) {
862
922
  }
863
923
  &nbsp;
864
924
  // Helper functions to find the members of a given organisation
865
- export function findMembersOfOrganisation (usersService, organisationId, role) {
866
- return findSubjectsForResource(usersService, 'organisations', organisationId, role)
925
+ export function <span class="fstat-no" title="function not covered" >findMembersOfOrganisation </span>(usersService, organisationId, role) {
926
+ <span class="cstat-no" title="statement not covered" > return findSubjectsForResource(usersService, 'organisations', organisationId, role)</span>
867
927
  }
868
928
  &nbsp;
869
- export function <span class="fstat-no" title="function not covered" >countMembersOfOrganisation (u</span>sersService, organisationId, role) {
870
- <span class="cstat-no" title="statement not covered" > return c</span>ountSubjectsForResource(usersService, 'organisations', organisationId, role)
929
+ export function <span class="fstat-no" title="function not covered" >countMembersOfOrganisation </span>(usersService, organisationId, role) {
930
+ <span class="cstat-no" title="statement not covered" > return countSubjectsForResource(usersService, 'organisations', organisationId, role)</span>
871
931
  }
872
932
  &nbsp;
873
933
  // Helper functions to find the members of a given group
874
- export function findMembersOfGroup (membersService, groupId, role) {
875
- return findSubjectsForResource(membersService, 'groups', groupId, role)
934
+ export function <span class="fstat-no" title="function not covered" >findMembersOfGroup </span>(membersService, groupId, role) {
935
+ <span class="cstat-no" title="statement not covered" > return findSubjectsForResource(membersService, 'groups', groupId, role)</span>
876
936
  }
877
937
  &nbsp;
878
- export function <span class="fstat-no" title="function not covered" >countMembersOfGroup (m</span>embersService, groupId, role) {
879
- <span class="cstat-no" title="statement not covered" > return c</span>ountSubjectsForResource(membersService, 'groups', groupId, role)
938
+ export function <span class="fstat-no" title="function not covered" >countMembersOfGroup </span>(membersService, groupId, role) {
939
+ <span class="cstat-no" title="statement not covered" > return countSubjectsForResource(membersService, 'groups', groupId, role)</span>
880
940
  }
881
941
  &nbsp;
882
- export function <span class="fstat-no" title="function not covered" >getRoleForOrganisation (u</span>ser, organisationId) {
883
- const result = <span class="cstat-no" title="statement not covered" >_.f</span>ind(user.organisations, { _id: organisationId })
884
- <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) <span class="cstat-no" title="statement not covered" >return r</span></span>esult.permissions
885
- <span class="cstat-no" title="statement not covered" > return u</span>ndefined
942
+ export function <span class="fstat-no" title="function not covered" >getRoleForOrganisation </span>(user, organisationId) {
943
+ const result = <span class="cstat-no" title="statement not covered" >_.find(user.organisations, { _id: organisationId })</span>
944
+ <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) <span class="cstat-no" title="statement not covered" >return result.permissions</span></span>
945
+ <span class="cstat-no" title="statement not covered" > return undefined</span>
886
946
  }
887
947
  &nbsp;
888
- export function <span class="fstat-no" title="function not covered" >getRoleForGroup (u</span>ser, organisationId, groupId) {
889
- const result = <span class="cstat-no" title="statement not covered" >_.f</span>ind(user.groups, { context: organisationId, _id: groupId })
890
- <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) <span class="cstat-no" title="statement not covered" >return r</span></span>esult.permissions
891
- <span class="cstat-no" title="statement not covered" > return u</span>ndefined
948
+ export function <span class="fstat-no" title="function not covered" >getRoleForGroup </span>(user, organisationId, groupId) {
949
+ const result = <span class="cstat-no" title="statement not covered" >_.find(user.groups, { context: organisationId, _id: groupId })</span>
950
+ <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) <span class="cstat-no" title="statement not covered" >return result.permissions</span></span>
951
+ <span class="cstat-no" title="statement not covered" > return undefined</span>
892
952
  }
893
953
  &nbsp;
894
- export function <span class="fstat-no" title="function not covered" >findGroupsWithRole (u</span>ser, organisationId, role) {
895
- <span class="cstat-no" title="statement not covered" > return _</span>.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })
954
+ export function <span class="fstat-no" title="function not covered" >findGroupsWithRole </span>(user, organisationId, role) {
955
+ <span class="cstat-no" title="statement not covered" > return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })</span>
896
956
  }
897
957
  &nbsp;</pre></td></tr></table></pre>
898
958
 
@@ -901,7 +961,7 @@ export function <span class="fstat-no" title="function not covered" >findGroupsW
901
961
  <div class='footer quiet pad2 space-top1 center small'>
902
962
  Code coverage generated by
903
963
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
904
- at Thu Jul 15 2021 17:32:35 GMT+0200 (GMT+02:00)
964
+ at Fri Jan 07 2022 19:29:57 GMT+0100 (GMT+01:00)
905
965
  </div>
906
966
  </div>
907
967
  <script src="../../prettify.js"></script>