@kalisio/kdk 1.4.0 → 1.5.1

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 (356) hide show
  1. package/.nyc_output/{0f1a87aa-d3bb-4c61-8c1e-12294055358d.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/{8be4cd9f-124a-41f9-80f4-f267ced63c86.json → 8b1830fa-932e-4a61-9837-4a5b18f83ea9.json} +0 -0
  5. package/.nyc_output/{a63b0924-fd09-4e30-974f-cb4be2243b66.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/{27204015-ebfd-456f-a3bb-6a94f71946b8.json → 2226bcce-9d22-4dad-b9fa-46564b5565c7.json} +1 -1
  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 +219 -68
  13. package/coverage/core/api/application.js.html +455 -455
  14. package/coverage/core/api/authentication.js.html +119 -119
  15. package/coverage/core/api/db.js.html +201 -201
  16. package/coverage/core/api/hooks/hooks.account.js.html +48 -48
  17. package/coverage/core/api/hooks/hooks.authentication.js.html +64 -64
  18. package/coverage/core/api/hooks/hooks.authorisations.js.html +353 -353
  19. package/coverage/core/api/hooks/hooks.devices.js.html +22 -22
  20. package/coverage/core/api/hooks/hooks.groups.js.html +37 -37
  21. package/coverage/core/api/hooks/hooks.logger.js.html +27 -27
  22. package/coverage/core/api/hooks/hooks.model.js.html +269 -269
  23. package/coverage/core/api/hooks/hooks.organisations.js.html +183 -231
  24. package/coverage/core/api/hooks/hooks.pusher.js.html +114 -114
  25. package/coverage/core/api/hooks/hooks.query.js.html +200 -200
  26. package/coverage/core/api/hooks/hooks.service.js.html +82 -82
  27. package/coverage/core/api/hooks/hooks.storage.js.html +121 -121
  28. package/coverage/core/api/hooks/hooks.tags.js.html +232 -232
  29. package/coverage/core/api/hooks/hooks.users.js.html +261 -261
  30. package/coverage/core/api/hooks/index.html +167 -167
  31. package/coverage/core/api/hooks/index.js.html +24 -24
  32. package/coverage/core/api/index.html +75 -75
  33. package/coverage/core/api/index.js.html +26 -26
  34. package/coverage/core/api/marshall.js.html +57 -57
  35. package/coverage/core/api/models/groups.model.mongodb.js.html +20 -20
  36. package/coverage/core/api/models/index.html +50 -50
  37. package/coverage/core/api/models/organisations.model.mongodb.js.html +12 -12
  38. package/coverage/core/api/models/tags.model.mongodb.js.html +22 -22
  39. package/coverage/core/api/models/users.model.mongodb.js.html +20 -20
  40. package/coverage/core/api/oauth2-handler.js.html +18 -18
  41. package/coverage/core/api/oauth2-verifier.js.html +38 -38
  42. package/coverage/core/api/services/account/account.hooks.js.html +16 -16
  43. package/coverage/core/api/services/account/account.service.js.html +108 -108
  44. package/coverage/core/api/services/account/index.html +32 -32
  45. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  46. package/coverage/core/api/services/authorisations/authorisations.service.js.html +132 -132
  47. package/coverage/core/api/services/authorisations/index.html +28 -28
  48. package/coverage/core/api/services/databases/databases.hooks.js.html +9 -9
  49. package/coverage/core/api/services/databases/databases.service.js.html +12 -12
  50. package/coverage/core/api/services/databases/index.html +24 -24
  51. package/coverage/core/api/services/devices/devices.hooks.js.html +9 -9
  52. package/coverage/core/api/services/devices/devices.service.js.html +61 -61
  53. package/coverage/core/api/services/devices/index.html +22 -22
  54. package/coverage/core/api/services/groups/groups.hooks.js.html +9 -9
  55. package/coverage/core/api/services/groups/index.html +13 -13
  56. package/coverage/core/api/services/index.html +21 -21
  57. package/coverage/core/api/services/index.js.html +137 -137
  58. package/coverage/core/api/services/mailer/index.html +24 -24
  59. package/coverage/core/api/services/mailer/mailer.hooks.js.html +9 -9
  60. package/coverage/core/api/services/mailer/mailer.service.js.html +19 -19
  61. package/coverage/core/api/services/organisations/index.html +24 -24
  62. package/coverage/core/api/services/organisations/organisations.hooks.js.html +8 -8
  63. package/coverage/core/api/services/organisations/organisations.service.js.html +67 -67
  64. package/coverage/core/api/services/pusher/index.html +32 -32
  65. package/coverage/core/api/services/pusher/pusher.channels.js.html +8 -8
  66. package/coverage/core/api/services/pusher/pusher.hooks.js.html +10 -10
  67. package/coverage/core/api/services/pusher/pusher.service.js.html +336 -336
  68. package/coverage/core/api/services/storage/index.html +21 -21
  69. package/coverage/core/api/services/storage/storage.hooks.js.html +35 -35
  70. package/coverage/core/api/services/tags/index.html +21 -21
  71. package/coverage/core/api/services/tags/tags.hooks.js.html +25 -25
  72. package/coverage/core/api/services/users/index.html +21 -21
  73. package/coverage/core/api/services/users/users.hooks.js.html +33 -33
  74. package/coverage/core/common/errors.js.html +1 -1
  75. package/coverage/core/common/index.html +42 -27
  76. package/coverage/core/common/index.js.html +16 -16
  77. package/coverage/core/common/permissions.js.html +274 -274
  78. package/coverage/index.html +174 -174
  79. package/coverage/lcov-report/core/api/application.js.html +455 -455
  80. package/coverage/lcov-report/core/api/authentication.js.html +119 -119
  81. package/coverage/lcov-report/core/api/db.js.html +201 -201
  82. package/coverage/lcov-report/core/api/hooks/hooks.account.js.html +48 -48
  83. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +64 -64
  84. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +353 -353
  85. package/coverage/lcov-report/core/api/hooks/hooks.devices.js.html +22 -22
  86. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +37 -37
  87. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +27 -27
  88. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +269 -269
  89. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +183 -231
  90. package/coverage/lcov-report/core/api/hooks/hooks.pusher.js.html +114 -114
  91. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +200 -200
  92. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +82 -82
  93. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +121 -121
  94. package/coverage/lcov-report/core/api/hooks/hooks.tags.js.html +232 -232
  95. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +261 -261
  96. package/coverage/lcov-report/core/api/hooks/index.html +167 -167
  97. package/coverage/lcov-report/core/api/hooks/index.js.html +24 -24
  98. package/coverage/lcov-report/core/api/index.html +75 -75
  99. package/coverage/lcov-report/core/api/index.js.html +26 -26
  100. package/coverage/lcov-report/core/api/marshall.js.html +57 -57
  101. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +20 -20
  102. package/coverage/lcov-report/core/api/models/index.html +50 -50
  103. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +12 -12
  104. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +22 -22
  105. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +20 -20
  106. package/coverage/lcov-report/core/api/oauth2-handler.js.html +18 -18
  107. package/coverage/lcov-report/core/api/oauth2-verifier.js.html +38 -38
  108. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +16 -16
  109. package/coverage/lcov-report/core/api/services/account/account.service.js.html +108 -108
  110. package/coverage/lcov-report/core/api/services/account/index.html +32 -32
  111. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +9 -9
  112. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +132 -132
  113. package/coverage/lcov-report/core/api/services/authorisations/index.html +28 -28
  114. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +9 -9
  115. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +12 -12
  116. package/coverage/lcov-report/core/api/services/databases/index.html +24 -24
  117. package/coverage/lcov-report/core/api/services/devices/devices.hooks.js.html +9 -9
  118. package/coverage/lcov-report/core/api/services/devices/devices.service.js.html +61 -61
  119. package/coverage/lcov-report/core/api/services/devices/index.html +22 -22
  120. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +9 -9
  121. package/coverage/lcov-report/core/api/services/groups/index.html +13 -13
  122. package/coverage/lcov-report/core/api/services/index.html +21 -21
  123. package/coverage/lcov-report/core/api/services/index.js.html +137 -137
  124. package/coverage/lcov-report/core/api/services/mailer/index.html +24 -24
  125. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +9 -9
  126. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +19 -19
  127. package/coverage/lcov-report/core/api/services/organisations/index.html +24 -24
  128. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +8 -8
  129. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +67 -67
  130. package/coverage/lcov-report/core/api/services/pusher/index.html +32 -32
  131. package/coverage/lcov-report/core/api/services/pusher/pusher.channels.js.html +8 -8
  132. package/coverage/lcov-report/core/api/services/pusher/pusher.hooks.js.html +10 -10
  133. package/coverage/lcov-report/core/api/services/pusher/pusher.service.js.html +336 -336
  134. package/coverage/lcov-report/core/api/services/storage/index.html +21 -21
  135. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +35 -35
  136. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  137. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +25 -25
  138. package/coverage/lcov-report/core/api/services/users/index.html +21 -21
  139. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +33 -33
  140. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  141. package/coverage/lcov-report/core/common/index.html +42 -27
  142. package/coverage/lcov-report/core/common/index.js.html +16 -16
  143. package/coverage/lcov-report/core/common/permissions.js.html +274 -274
  144. package/coverage/lcov-report/index.html +174 -174
  145. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +1 -1
  146. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +72 -18
  147. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  148. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  149. package/coverage/lcov-report/map/api/index.html +1 -1
  150. package/coverage/lcov-report/map/api/index.js.html +1 -1
  151. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  152. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  153. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +1 -1
  154. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  155. package/coverage/lcov-report/map/api/models/index.html +1 -1
  156. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  157. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  158. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  159. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +1 -1
  160. package/coverage/lcov-report/map/api/services/catalog/index.html +1 -1
  161. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  162. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  163. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +1 -1
  164. package/coverage/lcov-report/map/api/services/features/index.html +1 -1
  165. package/coverage/lcov-report/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  166. package/coverage/lcov-report/map/api/services/geocoder/geocoder.service.js.html +1 -1
  167. package/coverage/lcov-report/map/api/services/geocoder/index.html +1 -1
  168. package/coverage/lcov-report/map/api/services/index.html +1 -1
  169. package/coverage/lcov-report/map/api/services/index.js.html +1 -1
  170. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  171. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  172. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +1 -1
  173. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  174. package/coverage/lcov-report/map/common/index.html +1 -1
  175. package/coverage/lcov-report/map/common/index.js.html +1 -1
  176. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  177. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  178. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  179. package/coverage/lcov-report/map/common/opendap-utils.js.html +1 -1
  180. package/coverage/lcov-report/map/common/permissions.js.html +1 -1
  181. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  182. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  183. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +1 -1
  184. package/coverage/lcov-report/map/common/wcs-utils.js.html +1 -1
  185. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +1 -1
  186. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  187. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  188. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  189. package/coverage/lcov.info +3289 -3610
  190. package/coverage/map/api/hooks/hooks.catalog.js.html +1 -1
  191. package/coverage/map/api/hooks/hooks.query.js.html +72 -18
  192. package/coverage/map/api/hooks/index.html +7 -7
  193. package/coverage/map/api/hooks/index.js.html +1 -1
  194. package/coverage/map/api/index.html +1 -1
  195. package/coverage/map/api/index.js.html +1 -1
  196. package/coverage/map/api/marshall.js.html +1 -1
  197. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  198. package/coverage/map/api/models/catalog.model.mongodb.js.html +1 -1
  199. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  200. package/coverage/map/api/models/index.html +1 -1
  201. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  202. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  203. package/coverage/map/api/services/alerts/index.html +1 -1
  204. package/coverage/map/api/services/catalog/catalog.hooks.js.html +1 -1
  205. package/coverage/map/api/services/catalog/index.html +1 -1
  206. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  207. package/coverage/map/api/services/daptiles/index.html +1 -1
  208. package/coverage/map/api/services/features/features.hooks.js.html +1 -1
  209. package/coverage/map/api/services/features/index.html +1 -1
  210. package/coverage/map/api/services/geocoder/geocoder.hooks.js.html +1 -1
  211. package/coverage/map/api/services/geocoder/geocoder.service.js.html +1 -1
  212. package/coverage/map/api/services/geocoder/index.html +1 -1
  213. package/coverage/map/api/services/index.html +1 -1
  214. package/coverage/map/api/services/index.js.html +1 -1
  215. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  216. package/coverage/map/common/errors.js.html +1 -1
  217. package/coverage/map/common/geotiff-grid-source.js.html +1 -1
  218. package/coverage/map/common/grid.js.html +1 -1
  219. package/coverage/map/common/index.html +1 -1
  220. package/coverage/map/common/index.js.html +1 -1
  221. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  222. package/coverage/map/common/moment-utils.js.html +1 -1
  223. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  224. package/coverage/map/common/opendap-utils.js.html +1 -1
  225. package/coverage/map/common/permissions.js.html +1 -1
  226. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  227. package/coverage/map/common/tms-utils.js.html +1 -1
  228. package/coverage/map/common/wcs-grid-source.js.html +1 -1
  229. package/coverage/map/common/wcs-utils.js.html +1 -1
  230. package/coverage/map/common/weacast-grid-source.js.html +1 -1
  231. package/coverage/map/common/wfs-utils.js.html +1 -1
  232. package/coverage/map/common/wms-utils.js.html +1 -1
  233. package/coverage/map/common/wmts-utils.js.html +1 -1
  234. package/lib/core/client/components/collection/KBoard.vue +6 -0
  235. package/lib/core/client/components/collection/KColumn.vue +2 -2
  236. package/lib/core/client/components/collection/KHistory.vue +14 -6
  237. package/lib/core/client/components/collection/KHistoryEntry.vue +7 -3
  238. package/lib/core/client/components/form/KFileField.vue +11 -40
  239. package/lib/core/client/components/frame/KChipsPane.vue +2 -2
  240. package/lib/core/client/components/input/KOptionsChooser.vue +2 -2
  241. package/lib/core/client/i18n/core_en.json +7 -1
  242. package/lib/core/client/i18n/core_fr.json +7 -1
  243. package/lib/core/client/index.js +18 -0
  244. package/lib/core/client/index.js.map +1 -1
  245. package/lib/core/client/layout.js +8 -1
  246. package/lib/core/client/layout.js.map +1 -1
  247. package/lib/core/client/mixins/mixin.base-collection.js +8 -2
  248. package/lib/core/client/mixins/mixin.base-collection.js.map +1 -1
  249. package/lib/core/client/reader.js +54 -0
  250. package/lib/core/client/reader.js.map +1 -0
  251. package/lib/core/client/readers/index.js +30 -0
  252. package/lib/core/client/readers/index.js.map +1 -0
  253. package/lib/core/client/readers/reader.csv.js +43 -0
  254. package/lib/core/client/readers/reader.csv.js.map +1 -0
  255. package/lib/core/client/readers/reader.json.js +38 -0
  256. package/lib/core/client/readers/reader.json.js.map +1 -0
  257. package/lib/core/client/services/index.js +1 -3
  258. package/lib/core/client/services/index.js.map +1 -1
  259. package/lib/core/client/time.js +4 -1
  260. package/lib/core/client/time.js.map +1 -1
  261. package/lib/map/api/hooks/hooks.query.js +30 -13
  262. package/lib/map/api/hooks/hooks.query.js.map +1 -1
  263. package/lib/map/client/components/KCaptureToolbar.vue +156 -0
  264. package/lib/map/client/components/KFeaturesFilter.vue +3 -1
  265. package/lib/map/client/components/KLayerEditionToolbar.vue +19 -11
  266. package/lib/map/client/components/KLayerStyleEditor.vue +2 -1
  267. package/lib/map/client/components/KLayerStyleForm.vue +34 -23
  268. package/lib/map/client/components/KLocationMap.vue +3 -1
  269. package/lib/map/client/components/KMeasureTool.vue +340 -0
  270. package/lib/map/client/components/KPositionIndicator.vue +1 -0
  271. package/lib/map/client/components/KTimeline.vue +7 -8
  272. package/lib/map/client/components/catalog/KImportLayer.vue +8 -35
  273. package/lib/map/client/components/catalog/KLayersSelector.vue +13 -11
  274. package/lib/map/client/components/form/KOwsLayerField.vue +7 -0
  275. package/lib/map/client/components/widget/KMapillaryViewer.vue +1 -1
  276. package/lib/map/client/components/widget/KTimeSeries.vue +81 -3
  277. package/lib/map/client/i18n/map_en.json +43 -5
  278. package/lib/map/client/i18n/map_fr.json +43 -5
  279. package/lib/map/client/init.js +6 -1
  280. package/lib/map/client/init.js.map +1 -1
  281. package/lib/map/client/leaflet/MaskLayer.js +12 -3
  282. package/lib/map/client/leaflet/MaskLayer.js.map +1 -1
  283. package/lib/map/client/mixins/globe/mixin.base-globe.js +3 -5
  284. package/lib/map/client/mixins/globe/mixin.base-globe.js.map +1 -1
  285. package/lib/map/client/mixins/globe/mixin.geojson-layers.js +0 -4
  286. package/lib/map/client/mixins/globe/mixin.geojson-layers.js.map +1 -1
  287. package/lib/map/client/mixins/globe/mixin.popup.js +4 -0
  288. package/lib/map/client/mixins/globe/mixin.popup.js.map +1 -1
  289. package/lib/map/client/mixins/globe/mixin.tooltip.js +4 -0
  290. package/lib/map/client/mixins/globe/mixin.tooltip.js.map +1 -1
  291. package/lib/map/client/mixins/map/mixin.base-map.js +46 -7
  292. package/lib/map/client/mixins/map/mixin.base-map.js.map +1 -1
  293. package/lib/map/client/mixins/map/mixin.canvas-layers.js +2 -0
  294. package/lib/map/client/mixins/map/mixin.canvas-layers.js.map +1 -1
  295. package/lib/map/client/mixins/map/mixin.file-layers.js +47 -101
  296. package/lib/map/client/mixins/map/mixin.file-layers.js.map +1 -1
  297. package/lib/map/client/mixins/map/mixin.geojson-layers.js +9 -5
  298. package/lib/map/client/mixins/map/mixin.geojson-layers.js.map +1 -1
  299. package/lib/map/client/mixins/map/mixin.heatmap-layers.js +0 -4
  300. package/lib/map/client/mixins/map/mixin.heatmap-layers.js.map +1 -1
  301. package/lib/map/client/mixins/map/mixin.popup.js +4 -0
  302. package/lib/map/client/mixins/map/mixin.popup.js.map +1 -1
  303. package/lib/map/client/mixins/map/mixin.tooltip.js +4 -0
  304. package/lib/map/client/mixins/map/mixin.tooltip.js.map +1 -1
  305. package/lib/map/client/mixins/mixin.activity.js +2 -0
  306. package/lib/map/client/mixins/mixin.activity.js.map +1 -1
  307. package/lib/map/client/mixins/mixin.context.js +26 -3
  308. package/lib/map/client/mixins/mixin.context.js.map +1 -1
  309. package/lib/map/client/mixins/mixin.feature-service.js +4 -4
  310. package/lib/map/client/mixins/mixin.feature-service.js.map +1 -1
  311. package/lib/map/client/mixins/mixin.infobox.js +4 -0
  312. package/lib/map/client/mixins/mixin.infobox.js.map +1 -1
  313. package/lib/map/client/readers/index.js +42 -0
  314. package/lib/map/client/readers/index.js.map +1 -0
  315. package/lib/map/client/readers/reader.geojson.js +59 -0
  316. package/lib/map/client/readers/reader.geojson.js.map +1 -0
  317. package/lib/map/client/readers/reader.gpx.js +41 -0
  318. package/lib/map/client/readers/reader.gpx.js.map +1 -0
  319. package/lib/map/client/readers/reader.kml.js +41 -0
  320. package/lib/map/client/readers/reader.kml.js.map +1 -0
  321. package/lib/map/client/utils.js +2 -1
  322. package/lib/map/client/utils.js.map +1 -1
  323. package/lib/test/client/core/runner.js +1 -2
  324. package/lib/test/client/core/runner.js.map +1 -1
  325. package/lib/test/client/core/utils.js +58 -38
  326. package/lib/test/client/core/utils.js.map +1 -1
  327. package/lib/test/client/map/catalog.js +50 -49
  328. package/lib/test/client/map/catalog.js.map +1 -1
  329. package/package.json +3 -3
  330. package/.nyc_output/27204015-ebfd-456f-a3bb-6a94f71946b8.json +0 -1
  331. package/.nyc_output/d3d1fa81-57ca-4287-8fbe-96466b0e5aa1.json +0 -1
  332. package/.nyc_output/e921974a-3076-4e89-8dbf-6f37bef10583.json +0 -1
  333. package/.nyc_output/fb790367-ba9f-474f-84c1-f836caf9f50a.json +0 -1
  334. package/.nyc_output/processinfo/0f1a87aa-d3bb-4c61-8c1e-12294055358d.json +0 -1
  335. package/.nyc_output/processinfo/8be4cd9f-124a-41f9-80f4-f267ced63c86.json +0 -1
  336. package/.nyc_output/processinfo/a63b0924-fd09-4e30-974f-cb4be2243b66.json +0 -1
  337. package/.nyc_output/processinfo/d3d1fa81-57ca-4287-8fbe-96466b0e5aa1.json +0 -1
  338. package/.nyc_output/processinfo/e921974a-3076-4e89-8dbf-6f37bef10583.json +0 -1
  339. package/.nyc_output/processinfo/fb790367-ba9f-474f-84c1-f836caf9f50a.json +0 -1
  340. package/extras/testcafe/Dockerfile +0 -48
  341. package/extras/testcafe/docker-entrypoint.sh +0 -27
  342. package/extras/testcafe/page-models/core/account.js +0 -75
  343. package/extras/testcafe/page-models/core/base-collection.js +0 -41
  344. package/extras/testcafe/page-models/core/base-page.js +0 -25
  345. package/extras/testcafe/page-models/core/groups.js +0 -36
  346. package/extras/testcafe/page-models/core/index.js +0 -140
  347. package/extras/testcafe/page-models/core/layout.js +0 -145
  348. package/extras/testcafe/page-models/core/members.js +0 -98
  349. package/extras/testcafe/page-models/core/organisations.js +0 -76
  350. package/extras/testcafe/page-models/core/screens.js +0 -99
  351. package/extras/testcafe/page-models/core/tags.js +0 -21
  352. package/extras/testcafe/page-models/map/add-layer.js +0 -51
  353. package/extras/testcafe/page-models/map/catalog.js +0 -132
  354. package/extras/testcafe/page-models/map/index.js +0 -36
  355. package/extras/testcafe/page-models/map/map-activity.js +0 -42
  356. package/extras/testcafe/page-models/map/timeline.js +0 -67
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">83% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>166/200</span>
28
+ <span class='fraction'>0/192</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">76.92% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>110/143</span>
35
+ <span class='fraction'>0/143</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">84.62% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>22/26</span>
42
+ <span class='fraction'>0/23</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">83.68% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>159/190</span>
49
+ <span class='fraction'>0/182</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>
@@ -410,26 +410,26 @@
410
410
  <a name='L351'></a><a href='#L351'>351</a>
411
411
  <a name='L352'></a><a href='#L352'>352</a>
412
412
  <a name='L353'></a><a href='#L353'>353</a>
413
- <a name='L354'></a><a href='#L354'>354</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
414
- <span class="cline-any cline-yes">1x</span>
415
- <span class="cline-any cline-yes">1x</span>
416
- <span class="cline-any cline-yes">1x</span>
417
- <span class="cline-any cline-yes">1x</span>
418
- <span class="cline-any cline-yes">1x</span>
419
- <span class="cline-any cline-yes">1x</span>
420
- <span class="cline-any cline-yes">1x</span>
413
+ <a name='L354'></a><a href='#L354'>354</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
421
414
  <span class="cline-any cline-neutral">&nbsp;</span>
422
- <span class="cline-any cline-yes">1x</span>
423
415
  <span class="cline-any cline-neutral">&nbsp;</span>
424
416
  <span class="cline-any cline-neutral">&nbsp;</span>
425
- <span class="cline-any cline-yes">8x</span>
426
- <span class="cline-any cline-yes">2x</span>
427
- <span class="cline-any cline-yes">2x</span>
428
- <span class="cline-any cline-yes">2x</span>
429
- <span class="cline-any cline-yes">2x</span>
430
- <span class="cline-any cline-yes">2x</span>
431
417
  <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-yes">2x</span>
418
+ <span class="cline-any cline-neutral">&nbsp;</span>
419
+ <span class="cline-any cline-neutral">&nbsp;</span>
420
+ <span class="cline-any cline-neutral">&nbsp;</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-no">&nbsp;</span>
423
+ <span class="cline-any cline-neutral">&nbsp;</span>
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>
427
+ <span class="cline-any cline-no">&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-neutral">&nbsp;</span>
432
+ <span class="cline-any cline-no">&nbsp;</span>
433
433
  <span class="cline-any cline-neutral">&nbsp;</span>
434
434
  <span class="cline-any cline-neutral">&nbsp;</span>
435
435
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -437,18 +437,18 @@
437
437
  <span class="cline-any cline-neutral">&nbsp;</span>
438
438
  <span class="cline-any cline-neutral">&nbsp;</span>
439
439
  <span class="cline-any cline-neutral">&nbsp;</span>
440
- <span class="cline-any cline-yes">2x</span>
441
- <span class="cline-any cline-yes">2x</span>
442
- <span class="cline-any cline-yes">2x</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-no">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
443
  <span class="cline-any cline-neutral">&nbsp;</span>
444
444
  <span class="cline-any cline-neutral">&nbsp;</span>
445
445
  <span class="cline-any cline-neutral">&nbsp;</span>
446
446
  <span class="cline-any cline-neutral">&nbsp;</span>
447
- <span class="cline-any cline-yes">26x</span>
447
+ <span class="cline-any cline-no">&nbsp;</span>
448
448
  <span class="cline-any cline-no">&nbsp;</span>
449
449
  <span class="cline-any cline-neutral">&nbsp;</span>
450
450
  <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-yes">26x</span>
451
+ <span class="cline-any cline-no">&nbsp;</span>
452
452
  <span class="cline-any cline-neutral">&nbsp;</span>
453
453
  <span class="cline-any cline-neutral">&nbsp;</span>
454
454
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -460,11 +460,11 @@
460
460
  <span class="cline-any cline-neutral">&nbsp;</span>
461
461
  <span class="cline-any cline-neutral">&nbsp;</span>
462
462
  <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-yes">26x</span>
463
+ <span class="cline-any cline-no">&nbsp;</span>
464
464
  <span class="cline-any cline-no">&nbsp;</span>
465
465
  <span class="cline-any cline-neutral">&nbsp;</span>
466
466
  <span class="cline-any cline-neutral">&nbsp;</span>
467
- <span class="cline-any cline-yes">26x</span>
467
+ <span class="cline-any cline-no">&nbsp;</span>
468
468
  <span class="cline-any cline-neutral">&nbsp;</span>
469
469
  <span class="cline-any cline-neutral">&nbsp;</span>
470
470
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -476,35 +476,35 @@
476
476
  <span class="cline-any cline-neutral">&nbsp;</span>
477
477
  <span class="cline-any cline-neutral">&nbsp;</span>
478
478
  <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">4x</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
480
  <span class="cline-any cline-no">&nbsp;</span>
481
481
  <span class="cline-any cline-neutral">&nbsp;</span>
482
482
  <span class="cline-any cline-neutral">&nbsp;</span>
483
- <span class="cline-any cline-yes">4x</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
484
  <span class="cline-any cline-neutral">&nbsp;</span>
485
- <span class="cline-any cline-yes">4x</span>
486
- <span class="cline-any cline-yes">4x</span>
485
+ <span class="cline-any cline-no">&nbsp;</span>
486
+ <span class="cline-any cline-no">&nbsp;</span>
487
487
  <span class="cline-any cline-neutral">&nbsp;</span>
488
- <span class="cline-any cline-yes">4x</span>
489
- <span class="cline-any cline-yes">3x</span>
490
- <span class="cline-any cline-yes">3x</span>
488
+ <span class="cline-any cline-no">&nbsp;</span>
489
+ <span class="cline-any cline-no">&nbsp;</span>
490
+ <span class="cline-any cline-no">&nbsp;</span>
491
491
  <span class="cline-any cline-neutral">&nbsp;</span>
492
492
  <span class="cline-any cline-neutral">&nbsp;</span>
493
- <span class="cline-any cline-yes">4x</span>
494
- <span class="cline-any cline-yes">3x</span>
493
+ <span class="cline-any cline-no">&nbsp;</span>
494
+ <span class="cline-any cline-no">&nbsp;</span>
495
495
  <span class="cline-any cline-neutral">&nbsp;</span>
496
- <span class="cline-any cline-yes">3x</span>
496
+ <span class="cline-any cline-no">&nbsp;</span>
497
497
  <span class="cline-any cline-neutral">&nbsp;</span>
498
- <span class="cline-any cline-yes">3x</span>
499
- <span class="cline-any cline-yes">3x</span>
498
+ <span class="cline-any cline-no">&nbsp;</span>
499
+ <span class="cline-any cline-no">&nbsp;</span>
500
500
  <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-yes">3x</span>
501
+ <span class="cline-any cline-no">&nbsp;</span>
502
502
  <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-yes">3x</span>
503
+ <span class="cline-any cline-no">&nbsp;</span>
504
504
  <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-yes">3x</span>
506
- <span class="cline-any cline-yes">3x</span>
507
- <span class="cline-any cline-yes">3x</span>
505
+ <span class="cline-any cline-no">&nbsp;</span>
506
+ <span class="cline-any cline-no">&nbsp;</span>
507
+ <span class="cline-any cline-no">&nbsp;</span>
508
508
  <span class="cline-any cline-no">&nbsp;</span>
509
509
  <span class="cline-any cline-no">&nbsp;</span>
510
510
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -516,188 +516,188 @@
516
516
  <span class="cline-any cline-neutral">&nbsp;</span>
517
517
  <span class="cline-any cline-neutral">&nbsp;</span>
518
518
  <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-yes">3x</span>
520
- <span class="cline-any cline-yes">3x</span>
521
- <span class="cline-any cline-yes">3x</span>
522
- <span class="cline-any cline-yes">3x</span>
523
- <span class="cline-any cline-yes">3x</span>
524
- <span class="cline-any cline-yes">3x</span>
525
- <span class="cline-any cline-yes">3x</span>
526
- <span class="cline-any cline-yes">1x</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>
522
+ <span class="cline-any cline-no">&nbsp;</span>
523
+ <span class="cline-any cline-no">&nbsp;</span>
524
+ <span class="cline-any cline-no">&nbsp;</span>
525
+ <span class="cline-any cline-no">&nbsp;</span>
526
+ <span class="cline-any cline-no">&nbsp;</span>
527
527
  <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-yes">2x</span>
528
+ <span class="cline-any cline-no">&nbsp;</span>
529
529
  <span class="cline-any cline-neutral">&nbsp;</span>
530
530
  <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-yes">3x</span>
532
- <span class="cline-any cline-yes">1x</span>
533
- <span class="cline-any cline-yes">1x</span>
531
+ <span class="cline-any cline-no">&nbsp;</span>
532
+ <span class="cline-any cline-no">&nbsp;</span>
533
+ <span class="cline-any cline-no">&nbsp;</span>
534
534
  <span class="cline-any cline-neutral">&nbsp;</span>
535
535
  <span class="cline-any cline-neutral">&nbsp;</span>
536
536
  <span class="cline-any cline-neutral">&nbsp;</span>
537
537
  <span class="cline-any cline-neutral">&nbsp;</span>
538
538
  <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-yes">2x</span>
540
- <span class="cline-any cline-yes">1x</span>
541
- <span class="cline-any cline-yes">1x</span>
539
+ <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-no">&nbsp;</span>
541
+ <span class="cline-any cline-no">&nbsp;</span>
542
542
  <span class="cline-any cline-no">&nbsp;</span>
543
543
  <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-yes">2x</span>
545
- <span class="cline-any cline-yes">1x</span>
546
- <span class="cline-any cline-yes">1x</span>
547
- <span class="cline-any cline-yes">1x</span>
544
+ <span class="cline-any cline-no">&nbsp;</span>
545
+ <span class="cline-any cline-no">&nbsp;</span>
546
+ <span class="cline-any cline-no">&nbsp;</span>
547
+ <span class="cline-any cline-no">&nbsp;</span>
548
548
  <span class="cline-any cline-neutral">&nbsp;</span>
549
549
  <span class="cline-any cline-neutral">&nbsp;</span>
550
550
  <span class="cline-any cline-neutral">&nbsp;</span>
551
551
  <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-yes">2x</span>
552
+ <span class="cline-any cline-no">&nbsp;</span>
553
553
  <span class="cline-any cline-neutral">&nbsp;</span>
554
554
  <span class="cline-any cline-neutral">&nbsp;</span>
555
555
  <span class="cline-any cline-neutral">&nbsp;</span>
556
- <span class="cline-any cline-yes">315x</span>
556
+ <span class="cline-any cline-no">&nbsp;</span>
557
557
  <span class="cline-any cline-no">&nbsp;</span>
558
558
  <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-yes">315x</span>
560
- <span class="cline-any cline-yes">315x</span>
561
- <span class="cline-any cline-yes">315x</span>
562
- <span class="cline-any cline-yes">315x</span>
563
- <span class="cline-any cline-yes">315x</span>
564
- <span class="cline-any cline-yes">315x</span>
559
+ <span class="cline-any cline-no">&nbsp;</span>
560
+ <span class="cline-any cline-no">&nbsp;</span>
561
+ <span class="cline-any cline-no">&nbsp;</span>
562
+ <span class="cline-any cline-no">&nbsp;</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-no">&nbsp;</span>
565
565
  <span class="cline-any cline-neutral">&nbsp;</span>
566
566
  <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-yes">315x</span>
568
- <span class="cline-any cline-yes">315x</span>
567
+ <span class="cline-any cline-no">&nbsp;</span>
568
+ <span class="cline-any cline-no">&nbsp;</span>
569
569
  <span class="cline-any cline-neutral">&nbsp;</span>
570
- <span class="cline-any cline-yes">315x</span>
571
- <span class="cline-any cline-yes">22x</span>
572
- <span class="cline-any cline-yes">22x</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-no">&nbsp;</span>
572
+ <span class="cline-any cline-no">&nbsp;</span>
573
573
  <span class="cline-any cline-neutral">&nbsp;</span>
574
574
  <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-yes">315x</span>
576
- <span class="cline-any cline-yes">7x</span>
577
- <span class="cline-any cline-yes">7x</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-no">&nbsp;</span>
578
578
  <span class="cline-any cline-neutral">&nbsp;</span>
579
579
  <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">315x</span>
581
- <span class="cline-any cline-yes">77x</span>
580
+ <span class="cline-any cline-no">&nbsp;</span>
581
+ <span class="cline-any cline-no">&nbsp;</span>
582
582
  <span class="cline-any cline-neutral">&nbsp;</span>
583
- <span class="cline-any cline-yes">77x</span>
584
- <span class="cline-any cline-yes">77x</span>
583
+ <span class="cline-any cline-no">&nbsp;</span>
584
+ <span class="cline-any cline-no">&nbsp;</span>
585
585
  <span class="cline-any cline-neutral">&nbsp;</span>
586
586
  <span class="cline-any cline-neutral">&nbsp;</span>
587
- <span class="cline-any cline-yes">315x</span>
588
- <span class="cline-any cline-yes">315x</span>
587
+ <span class="cline-any cline-no">&nbsp;</span>
588
+ <span class="cline-any cline-no">&nbsp;</span>
589
589
  <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-yes">62x</span>
591
- <span class="cline-any cline-yes">62x</span>
592
- <span class="cline-any cline-yes">62x</span>
593
- <span class="cline-any cline-yes">62x</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
594
  <span class="cline-any cline-neutral">&nbsp;</span>
595
595
  <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-yes">62x</span>
597
- <span class="cline-any cline-yes">3x</span>
598
- <span class="cline-any cline-yes">3x</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
599
  <span class="cline-any cline-neutral">&nbsp;</span>
600
600
  <span class="cline-any cline-neutral">&nbsp;</span>
601
- <span class="cline-any cline-yes">59x</span>
601
+ <span class="cline-any cline-no">&nbsp;</span>
602
602
  <span class="cline-any cline-neutral">&nbsp;</span>
603
603
  <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-yes">41x</span>
605
- <span class="cline-any cline-yes">17x</span>
606
- <span class="cline-any cline-yes">17x</span>
607
- <span class="cline-any cline-yes">17x</span>
608
- <span class="cline-any cline-yes">3x</span>
609
- <span class="cline-any cline-yes">3x</span>
604
+ <span class="cline-any cline-no">&nbsp;</span>
605
+ <span class="cline-any cline-no">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-no">&nbsp;</span>
609
+ <span class="cline-any cline-no">&nbsp;</span>
610
610
  <span class="cline-any cline-neutral">&nbsp;</span>
611
611
  <span class="cline-any cline-neutral">&nbsp;</span>
612
612
  <span class="cline-any cline-neutral">&nbsp;</span>
613
613
  <span class="cline-any cline-neutral">&nbsp;</span>
614
614
  <span class="cline-any cline-neutral">&nbsp;</span>
615
- <span class="cline-any cline-yes">24x</span>
616
- <span class="cline-any cline-yes">24x</span>
617
- <span class="cline-any cline-yes">23x</span>
618
- <span class="cline-any cline-yes">22x</span>
619
- <span class="cline-any cline-yes">22x</span>
615
+ <span class="cline-any cline-no">&nbsp;</span>
616
+ <span class="cline-any cline-no">&nbsp;</span>
617
+ <span class="cline-any cline-no">&nbsp;</span>
618
+ <span class="cline-any cline-no">&nbsp;</span>
619
+ <span class="cline-any cline-no">&nbsp;</span>
620
620
  <span class="cline-any cline-neutral">&nbsp;</span>
621
- <span class="cline-any cline-yes">23x</span>
621
+ <span class="cline-any cline-no">&nbsp;</span>
622
622
  <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-yes">1x</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
624
  <span class="cline-any cline-neutral">&nbsp;</span>
625
625
  <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-yes">38x</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
627
  <span class="cline-any cline-neutral">&nbsp;</span>
628
628
  <span class="cline-any cline-neutral">&nbsp;</span>
629
- <span class="cline-any cline-yes">18x</span>
629
+ <span class="cline-any cline-no">&nbsp;</span>
630
630
  <span class="cline-any cline-neutral">&nbsp;</span>
631
- <span class="cline-any cline-yes">15x</span>
632
- <span class="cline-any cline-yes">15x</span>
631
+ <span class="cline-any cline-no">&nbsp;</span>
632
+ <span class="cline-any cline-no">&nbsp;</span>
633
633
  <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">15x</span>
635
- <span class="cline-any cline-yes">1x</span>
636
- <span class="cline-any cline-yes">1x</span>
634
+ <span class="cline-any cline-no">&nbsp;</span>
635
+ <span class="cline-any cline-no">&nbsp;</span>
636
+ <span class="cline-any cline-no">&nbsp;</span>
637
637
  <span class="cline-any cline-neutral">&nbsp;</span>
638
638
  <span class="cline-any cline-neutral">&nbsp;</span>
639
- <span class="cline-any cline-yes">14x</span>
640
- <span class="cline-any cline-yes">2x</span>
639
+ <span class="cline-any cline-no">&nbsp;</span>
640
+ <span class="cline-any cline-no">&nbsp;</span>
641
641
  <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-yes">14x</span>
643
- <span class="cline-any cline-yes">14x</span>
644
- <span class="cline-any cline-yes">14x</span>
642
+ <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-no">&nbsp;</span>
644
+ <span class="cline-any cline-no">&nbsp;</span>
645
645
  <span class="cline-any cline-neutral">&nbsp;</span>
646
646
  <span class="cline-any cline-neutral">&nbsp;</span>
647
- <span class="cline-any cline-yes">253x</span>
647
+ <span class="cline-any cline-no">&nbsp;</span>
648
648
  <span class="cline-any cline-neutral">&nbsp;</span>
649
649
  <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-yes">294x</span>
651
- <span class="cline-any cline-yes">294x</span>
650
+ <span class="cline-any cline-no">&nbsp;</span>
651
+ <span class="cline-any cline-no">&nbsp;</span>
652
652
  <span class="cline-any cline-neutral">&nbsp;</span>
653
653
  <span class="cline-any cline-neutral">&nbsp;</span>
654
654
  <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-yes">12x</span>
656
- <span class="cline-any cline-yes">9x</span>
657
- <span class="cline-any cline-yes">9x</span>
658
- <span class="cline-any cline-yes">9x</span>
659
- <span class="cline-any cline-yes">9x</span>
655
+ <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-no">&nbsp;</span>
657
+ <span class="cline-any cline-no">&nbsp;</span>
658
+ <span class="cline-any cline-no">&nbsp;</span>
659
+ <span class="cline-any cline-no">&nbsp;</span>
660
660
  <span class="cline-any cline-neutral">&nbsp;</span>
661
661
  <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-yes">9x</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
663
  <span class="cline-any cline-no">&nbsp;</span>
664
664
  <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-yes">9x</span>
666
- <span class="cline-any cline-yes">9x</span>
667
- <span class="cline-any cline-yes">9x</span>
665
+ <span class="cline-any cline-no">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
668
  <span class="cline-any cline-neutral">&nbsp;</span>
669
669
  <span class="cline-any cline-neutral">&nbsp;</span>
670
670
  <span class="cline-any cline-neutral">&nbsp;</span>
671
671
  <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-yes">46x</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
673
  <span class="cline-any cline-neutral">&nbsp;</span>
674
- <span class="cline-any cline-yes">34x</span>
675
- <span class="cline-any cline-yes">34x</span>
676
- <span class="cline-any cline-yes">34x</span>
677
- <span class="cline-any cline-yes">34x</span>
678
- <span class="cline-any cline-yes">34x</span>
679
- <span class="cline-any cline-yes">34x</span>
680
- <span class="cline-any cline-yes">34x</span>
681
- <span class="cline-any cline-yes">34x</span>
682
- <span class="cline-any cline-yes">34x</span>
683
- <span class="cline-any cline-yes">34x</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-no">&nbsp;</span>
676
+ <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-no">&nbsp;</span>
679
+ <span class="cline-any cline-no">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-no">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
684
  <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-yes">34x</span>
685
+ <span class="cline-any cline-no">&nbsp;</span>
686
686
  <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-yes">22x</span>
687
+ <span class="cline-any cline-no">&nbsp;</span>
688
688
  <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-yes">11x</span>
689
+ <span class="cline-any cline-no">&nbsp;</span>
690
690
  <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-yes">11x</span>
692
- <span class="cline-any cline-yes">11x</span>
693
- <span class="cline-any cline-yes">11x</span>
694
- <span class="cline-any cline-yes">11x</span>
691
+ <span class="cline-any cline-no">&nbsp;</span>
692
+ <span class="cline-any cline-no">&nbsp;</span>
693
+ <span class="cline-any cline-no">&nbsp;</span>
694
+ <span class="cline-any cline-no">&nbsp;</span>
695
695
  <span class="cline-any cline-neutral">&nbsp;</span>
696
696
  <span class="cline-any cline-neutral">&nbsp;</span>
697
- <span class="cline-any cline-yes">11x</span>
698
- <span class="cline-any cline-yes">2x</span>
699
- <span class="cline-any cline-yes">2x</span>
700
- <span class="cline-any cline-yes">2x</span>
697
+ <span class="cline-any cline-no">&nbsp;</span>
698
+ <span class="cline-any cline-no">&nbsp;</span>
699
+ <span class="cline-any cline-no">&nbsp;</span>
700
+ <span class="cline-any cline-no">&nbsp;</span>
701
701
  <span class="cline-any cline-neutral">&nbsp;</span>
702
702
  <span class="cline-any cline-neutral">&nbsp;</span>
703
703
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -705,21 +705,21 @@
705
705
  <span class="cline-any cline-neutral">&nbsp;</span>
706
706
  <span class="cline-any cline-neutral">&nbsp;</span>
707
707
  <span class="cline-any cline-neutral">&nbsp;</span>
708
- <span class="cline-any cline-yes">20x</span>
708
+ <span class="cline-any cline-no">&nbsp;</span>
709
709
  <span class="cline-any cline-neutral">&nbsp;</span>
710
710
  <span class="cline-any cline-neutral">&nbsp;</span>
711
711
  <span class="cline-any cline-neutral">&nbsp;</span>
712
712
  <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-yes">5x</span>
714
- <span class="cline-any cline-yes">5x</span>
715
- <span class="cline-any cline-yes">5x</span>
716
- <span class="cline-any cline-yes">5x</span>
713
+ <span class="cline-any cline-no">&nbsp;</span>
714
+ <span class="cline-any cline-no">&nbsp;</span>
715
+ <span class="cline-any cline-no">&nbsp;</span>
716
+ <span class="cline-any cline-no">&nbsp;</span>
717
717
  <span class="cline-any cline-neutral">&nbsp;</span>
718
- <span class="cline-any cline-yes">5x</span>
719
- <span class="cline-any cline-yes">5x</span>
720
- <span class="cline-any cline-yes">5x</span>
718
+ <span class="cline-any cline-no">&nbsp;</span>
719
+ <span class="cline-any cline-no">&nbsp;</span>
720
+ <span class="cline-any cline-no">&nbsp;</span>
721
721
  <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-yes">1x</span>
722
+ <span class="cline-any cline-no">&nbsp;</span>
723
723
  <span class="cline-any cline-neutral">&nbsp;</span>
724
724
  <span class="cline-any cline-neutral">&nbsp;</span>
725
725
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -733,8 +733,8 @@
733
733
  <span class="cline-any cline-neutral">&nbsp;</span>
734
734
  <span class="cline-any cline-neutral">&nbsp;</span>
735
735
  <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-yes">5x</span>
737
- <span class="cline-any cline-yes">5x</span>
736
+ <span class="cline-any cline-no">&nbsp;</span>
737
+ <span class="cline-any cline-no">&nbsp;</span>
738
738
  <span class="cline-any cline-neutral">&nbsp;</span>
739
739
  <span class="cline-any cline-neutral">&nbsp;</span>
740
740
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -772,17 +772,17 @@ import { objectifyIDs } from '../db'
772
772
  import { hasServiceAbilities, hasResourceAbilities, getQueryForAbilities, Roles, RoleNames, countSubjectsForResource } from '../../common/permissions'
773
773
  import { isTagEqual } from './hooks.tags'
774
774
  &nbsp;
775
- const debug = makeDebug('kdk:core:authorisations:hooks')
775
+ const debug = <span class="cstat-no" title="statement not covered" >makeDebug('kdk:core:authorisations:hooks')</span>
776
776
  &nbsp;
777
- export function createJWT (options = {}) {
778
- return async function (hook) {
779
- const defaults = hook.app.get('authentication') || <span class="branch-1 cbranch-no" title="branch not covered" >hook.a</span>pp.get('auth')
780
- const user = _.get(hook, 'params.user')
781
- let items = getItems(hook)
782
- const isArray = Array.isArray(items)
783
- items = (isArray ? <span class="branch-0 cbranch-no" title="branch not covered" >items : [</span>items])
777
+ export function <span class="fstat-no" title="function not covered" >createJWT </span>(options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
778
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >as</span>ync function (hook) {</span>
779
+ const defaults = <span class="cstat-no" title="statement not covered" >hook.app.get('authentication') || hook.app.get('auth')</span>
780
+ const user = <span class="cstat-no" title="statement not covered" >_.get(hook, 'params.user')</span>
781
+ let items = <span class="cstat-no" title="statement not covered" >getItems(hook)</span>
782
+ const isArray = <span class="cstat-no" title="statement not covered" >Array.isArray(items)</span>
783
+ <span class="cstat-no" title="statement not covered" > items = (isArray ? items : [items])</span>
784
784
  // Generate access tokens for all items
785
- const accessTokens = await Promise.all(items.map(item =&gt; hook.app.passport.createJWT(
785
+ const accessTokens = <span class="cstat-no" title="statement not covered" >await Promise.all(items.map(<span class="fstat-no" title="function not covered" >it</span>em =&gt; <span class="cstat-no" title="statement not covered" >hook.app.passport.createJWT(</span></span>
786
786
  // Provided function can be used to pick or omit properties in JWT payload
787
787
  (typeof options.payload === 'function' ? options.payload(user) : {}),
788
788
  // Provided function can be used for custom options cdepending on the user,
@@ -790,76 +790,76 @@ export function createJWT (options = {}) {
790
790
  _.merge({}, defaults, (typeof options.jwt === 'function' ? { jwt: options.jwt(user) } : options)))
791
791
  ))
792
792
  // Store access token on items
793
- items.forEach((item, index) =&gt; _.set(item, options.name || 'accessToken', accessTokens[index]))
794
- replaceItems(hook, isArray ? <span class="branch-0 cbranch-no" title="branch not covered" >items : i</span>tems[0])
795
- return hook
793
+ <span class="cstat-no" title="statement not covered" > items.forEach(<span class="fstat-no" title="function not covered" >(i</span>tem, index) =&gt; <span class="cstat-no" title="statement not covered" >_.set(item, options.name || 'accessToken', accessTokens[index]))</span></span>
794
+ <span class="cstat-no" title="statement not covered" > replaceItems(hook, isArray ? items : items[0])</span>
795
+ <span class="cstat-no" title="statement not covered" > return hook</span>
796
796
  }
797
797
  }
798
798
  &nbsp;
799
- export function populateSubjects (hook) {
800
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hook.type !== 'before') {
801
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Error('The \'populateSubjects\' hook should only be used as a \'before\' hook.')
799
+ export function <span class="fstat-no" title="function not covered" >populateSubjects </span>(hook) {
800
+ <span class="cstat-no" title="statement not covered" > if (hook.type !== 'before') {</span>
801
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'populateSubjects\' hook should only be used as a \'before\' hook.')</span>
802
802
  }
803
803
  &nbsp;
804
- return populateObjects({ serviceField: 'subjectsService', idField: 'subjects', throwOnNotFound: true })(hook)
804
+ <span class="cstat-no" title="statement not covered" > return populateObjects({ serviceField: 'subjectsService', idField: 'subjects', throwOnNotFound: true })(hook)</span>
805
805
  }
806
806
  &nbsp;
807
- export function <span class="fstat-no" title="function not covered" >unpopulateSubjects (h</span>ook) {
807
+ export function <span class="fstat-no" title="function not covered" >unpopulateSubjects </span>(hook) {
808
808
  <span class="cstat-no" title="statement not covered" > if (hook.type !== 'after') {</span>
809
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Error('The \'unpopulateSubjects\' hook should only be used as a \'after\' hook.')
809
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'unpopulateSubjects\' hook should only be used as a \'after\' hook.')</span>
810
810
  }
811
811
  &nbsp;
812
- <span class="cstat-no" title="statement not covered" > return u</span>npopulateObjects({ serviceField: 'subjectsService', idField: 'subjects' })(hook)
812
+ <span class="cstat-no" title="statement not covered" > return unpopulateObjects({ serviceField: 'subjectsService', idField: 'subjects' })(hook)</span>
813
813
  }
814
814
  &nbsp;
815
- export function populateResource (hook) {
816
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hook.type !== 'before') {
817
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Error('The \'populateResource\' hook should only be used as a \'before\' hook.')
815
+ export function <span class="fstat-no" title="function not covered" >populateResource </span>(hook) {
816
+ <span class="cstat-no" title="statement not covered" > if (hook.type !== 'before') {</span>
817
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'populateResource\' hook should only be used as a \'before\' hook.')</span>
818
818
  }
819
819
  &nbsp;
820
- return populateObject({ serviceField: 'resourcesService', idField: 'resource', throwOnNotFound: true })(hook)
820
+ <span class="cstat-no" title="statement not covered" > return populateObject({ serviceField: 'resourcesService', idField: 'resource', throwOnNotFound: true })(hook)</span>
821
821
  }
822
822
  &nbsp;
823
- export function <span class="fstat-no" title="function not covered" >unpopulateResource (h</span>ook) {
823
+ export function <span class="fstat-no" title="function not covered" >unpopulateResource </span>(hook) {
824
824
  <span class="cstat-no" title="statement not covered" > if (hook.type !== 'after') {</span>
825
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Error('The \'unpopulateResource\' hook should only be used as a \'after\' hook.')
825
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'unpopulateResource\' hook should only be used as a \'after\' hook.')</span>
826
826
  }
827
827
  &nbsp;
828
- <span class="cstat-no" title="statement not covered" > return u</span>npopulateObject({ serviceField: 'resourcesService', idField: 'resource' })(hook)
828
+ <span class="cstat-no" title="statement not covered" > return unpopulateObject({ serviceField: 'resourcesService', idField: 'resource' })(hook)</span>
829
829
  }
830
830
  &nbsp;
831
- export function preventEscalation (hook) {
832
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hook.type !== 'before') {
833
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Error('The \'preventEscalation\' hook should only be used as a \'before\' hook.')
831
+ export function <span class="fstat-no" title="function not covered" >preventEscalation </span>(hook) {
832
+ <span class="cstat-no" title="statement not covered" > if (hook.type !== 'before') {</span>
833
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'preventEscalation\' hook should only be used as a \'before\' hook.')</span>
834
834
  }
835
835
  &nbsp;
836
- const params = hook.params
836
+ const params = <span class="cstat-no" title="statement not covered" >hook.params</span>
837
837
  // If called internally we skip authorisation
838
- let checkEscalation = _.has(params, 'provider')
839
- debug('Escalation check ' + (checkEscalation ? <span class="branch-0 cbranch-no" title="branch not covered" >'enabled' : '</span>disabled') + ' for provider')
838
+ let checkEscalation = <span class="cstat-no" title="statement not covered" >_.has(params, 'provider')</span>
839
+ <span class="cstat-no" title="statement not covered" > debug('Escalation check ' + (checkEscalation ? 'enabled' : 'disabled') + ' for provider')</span>
840
840
  // If explicitely asked to perform/skip, override defaults
841
- if (_.has(params, 'checkEscalation')) {
842
- checkEscalation = params.checkEscalation
843
- debug('Escalation check ' + (checkEscalation ? 'forced' : <span class="branch-1 cbranch-no" title="branch not covered" >'unforced'))</span>
841
+ <span class="cstat-no" title="statement not covered" > if (_.has(params, 'checkEscalation')) {</span>
842
+ <span class="cstat-no" title="statement not covered" > checkEscalation = params.checkEscalation</span>
843
+ <span class="cstat-no" title="statement not covered" > debug('Escalation check ' + (checkEscalation ? 'forced' : 'unforced'))</span>
844
844
  }
845
845
  &nbsp;
846
- if (checkEscalation) {
847
- const user = params.user
846
+ <span class="cstat-no" title="statement not covered" > if (checkEscalation) {</span>
847
+ const user = <span class="cstat-no" title="statement not covered" >params.user</span>
848
848
  // Make hook usable on remove as well
849
- const data = hook.data || {}
849
+ const data = <span class="cstat-no" title="statement not covered" >hook.data || {}</span>
850
850
  // Make hook usable with query params as well
851
- const query = params.query || {}
852
- const scopeName = data.scope || query.scope // Get scope name first
851
+ const query = <span class="cstat-no" title="statement not covered" >params.query || {}</span>
852
+ const scopeName = <span class="cstat-no" title="statement not covered" >data.scope || query.scope </span>// Get scope name first
853
853
  // Retrieve the right scope on the user
854
- const scope = _.get(user, scopeName, [])
854
+ const scope = <span class="cstat-no" title="statement not covered" >_.get(user, scopeName, [])</span>
855
855
  // Then the target resource
856
- const resource = _.find(scope, resource =&gt; resource._id &amp;&amp; (resource._id.toString() === params.resource._id.toString()))
856
+ const resource = <span class="cstat-no" title="statement not covered" >_.find(scope, <span class="fstat-no" title="function not covered" >re</span>source =&gt; <span class="cstat-no" title="statement not covered" >resource._id &amp;&amp; (resource._id.toString() === params.resource._id.toString()))</span></span>
857
857
  // Then user permission level
858
- const permissions = (resource ? resource.permissions : <span class="branch-1 cbranch-no" title="branch not covered" >undefined)</span>
859
- const role = (permissions ? Roles[permissions] : <span class="branch-1 cbranch-no" title="branch not covered" >undefined)</span>
860
- <span class="missing-if-branch" title="if path not taken" >I</span>if (_.isUndefined(role)) {
861
- <span class="cstat-no" title="statement not covered" > debug('</span>Role for authorisation not found on user for scope ' + scopeName)
862
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Forbidden('You are not allowed to change authorisation on resource')
858
+ const permissions = (<span class="cstat-no" title="statement not covered" >resource ? resource.permissions : undefined)</span>
859
+ const role = (<span class="cstat-no" title="statement not covered" >permissions ? Roles[permissions] : undefined)</span>
860
+ <span class="cstat-no" title="statement not covered" > if (_.isUndefined(role)) {</span>
861
+ <span class="cstat-no" title="statement not covered" > debug('Role for authorisation not found on user for scope ' + scopeName)</span>
862
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden('You are not allowed to change authorisation on resource')</span>
863
863
  }
864
864
  &nbsp;
865
865
  // Check if privilege escalation might occur, if so clamp to user permission level
@@ -869,188 +869,188 @@ export function preventEscalation (hook) {
869
869
  // (e.g. cannot change a owner into a manager when you are a manager)
870
870
  // - on remove you should not be able to remove permissions on others having higher permissions than yourself
871
871
  // (e.g. cannot remove a owner when you are a manager)
872
- const subjects = params.subjects.filter(subject =&gt; {
873
- const subjectScope = _.get(subject, scopeName, [])
874
- const subjectResource = _.find(subjectScope, resource =&gt; resource._id &amp;&amp; (resource._id.toString() === params.resource._id.toString()))
875
- const subjectPermissions = (subjectResource ? subjectResource.permissions : <span class="branch-1 cbranch-no" title="branch not covered" >undefined)</span>
876
- const subjectRole = (subjectPermissions ? Roles[subjectPermissions] : <span class="branch-1 cbranch-no" title="branch not covered" >undefined)</span>
877
- const hasRole = !_.isUndefined(subjectRole)
878
- if (hook.method === 'create') {
879
- return (!hasRole || (subjectRole &lt;= role)) // The first time no authorisation can be found
872
+ const subjects = <span class="cstat-no" title="statement not covered" >params.subjects.filter(<span class="fstat-no" title="function not covered" >su</span>bject =&gt; {</span>
873
+ const subjectScope = <span class="cstat-no" title="statement not covered" >_.get(subject, scopeName, [])</span>
874
+ const subjectResource = <span class="cstat-no" title="statement not covered" >_.find(subjectScope, <span class="fstat-no" title="function not covered" >re</span>source =&gt; <span class="cstat-no" title="statement not covered" >resource._id &amp;&amp; (resource._id.toString() === params.resource._id.toString()))</span></span>
875
+ const subjectPermissions = (<span class="cstat-no" title="statement not covered" >subjectResource ? subjectResource.permissions : undefined)</span>
876
+ const subjectRole = (<span class="cstat-no" title="statement not covered" >subjectPermissions ? Roles[subjectPermissions] : undefined)</span>
877
+ const hasRole = <span class="cstat-no" title="statement not covered" >!_.isUndefined(subjectRole)</span>
878
+ <span class="cstat-no" title="statement not covered" > if (hook.method === 'create') {</span>
879
+ <span class="cstat-no" title="statement not covered" > return (!hasRole || (subjectRole &lt;= role)) </span>// The first time no authorisation can be found
880
880
  } else {
881
- return (hasRole &amp;&amp; (subjectRole &lt;= role)) // Authorisation must be found on remove
881
+ <span class="cstat-no" title="statement not covered" > return (hasRole &amp;&amp; (subjectRole &lt;= role)) </span>// Authorisation must be found on remove
882
882
  }
883
883
  })
884
- if (subjects.length &lt; params.subjects.length) {
885
- debug(`${(params.subjects.length - subjects.length)} subjects with higher permissions level found for scope ${scopeName}`)
886
- throw new Forbidden('You are not allowed to change authorisation on subject(s)')
884
+ <span class="cstat-no" title="statement not covered" > if (subjects.length &lt; params.subjects.length) {</span>
885
+ <span class="cstat-no" title="statement not covered" > debug(`${(params.subjects.length - subjects.length)} subjects with higher permissions level found for scope ${scopeName}`)</span>
886
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden('You are not allowed to change authorisation on subject(s)')</span>
887
887
  }
888
888
  // Input permissions needs to be checked since:
889
889
  // - you should not be able to give higher permissions than your own ones to others
890
890
  // (e.g. cannot create a owner when you are a manager)
891
891
  let authorisationRole
892
- if (data.permissions) {
893
- authorisationRole = Roles[data.permissions]
894
- } else <span class="missing-if-branch" title="if path not taken" >I</span>if (query.permissions) {
895
- <span class="cstat-no" title="statement not covered" > authorisationRole = R</span>oles[query.permissions]
892
+ <span class="cstat-no" title="statement not covered" > if (data.permissions) {</span>
893
+ <span class="cstat-no" title="statement not covered" > authorisationRole = Roles[data.permissions]</span>
894
+ } else <span class="cstat-no" title="statement not covered" >if (query.permissions) {</span>
895
+ <span class="cstat-no" title="statement not covered" > authorisationRole = Roles[query.permissions]</span>
896
896
  }
897
- if (!_.isUndefined(authorisationRole)) {
898
- <span class="missing-if-branch" title="else path not taken" >E</span>if (authorisationRole &gt; role) {
899
- debug('Cannot escalate with higher permissions level for scope ' + scopeName)
900
- throw new Forbidden('You are not allowed to change authorisation on resource')
897
+ <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(authorisationRole)) {</span>
898
+ <span class="cstat-no" title="statement not covered" > if (authorisationRole &gt; role) {</span>
899
+ <span class="cstat-no" title="statement not covered" > debug('Cannot escalate with higher permissions level for scope ' + scopeName)</span>
900
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden('You are not allowed to change authorisation on resource')</span>
901
901
  }
902
902
  }
903
903
  }
904
904
  &nbsp;
905
- return hook
905
+ <span class="cstat-no" title="statement not covered" > return hook</span>
906
906
  }
907
907
  &nbsp;
908
- export async function authorise (hook) {
909
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hook.type !== 'before') {
910
- <span class="cstat-no" title="statement not covered" > throw n</span>ew Error('The \'authorise\' hook should only be used as a \'before\' hook.')
908
+ export async function <span class="fstat-no" title="function not covered" >authorise </span>(hook) {
909
+ <span class="cstat-no" title="statement not covered" > if (hook.type !== 'before') {</span>
910
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'authorise\' hook should only be used as a \'before\' hook.')</span>
911
911
  }
912
- const operation = hook.method
913
- const resourceType = hook.service.name
914
- debug('Provider is', hook.params.provider)
915
- if (hook.params.user) debug('User is', hook.params.user)
916
- debug('Operation is', operation)
917
- if (resourceType) debug('Resource type is', resourceType)
912
+ const operation = <span class="cstat-no" title="statement not covered" >hook.method</span>
913
+ const resourceType = <span class="cstat-no" title="statement not covered" >hook.service.name</span>
914
+ <span class="cstat-no" title="statement not covered" > debug('Provider is', hook.params.provider)</span>
915
+ <span class="cstat-no" title="statement not covered" > if (hook.params.user) <span class="cstat-no" title="statement not covered" >debug('User is', hook.params.user)</span></span>
916
+ <span class="cstat-no" title="statement not covered" > debug('Operation is', operation)</span>
917
+ <span class="cstat-no" title="statement not covered" > if (resourceType) <span class="cstat-no" title="statement not covered" >debug('Resource type is', resourceType)</span></span>
918
918
  &nbsp;
919
919
  // If called internally we skip authorisation
920
- let checkAuthorisation = _.has(hook.params, 'provider')
921
- debug('Access check ' + (checkAuthorisation ? 'enabled' : 'disabled') + ' for provider')
920
+ let checkAuthorisation = <span class="cstat-no" title="statement not covered" >_.has(hook.params, 'provider')</span>
921
+ <span class="cstat-no" title="statement not covered" > debug('Access check ' + (checkAuthorisation ? 'enabled' : 'disabled') + ' for provider')</span>
922
922
  // If already checked we skip authorisation
923
- if (hook.params.authorised) {
924
- debug('Access already granted')
925
- checkAuthorisation = false
923
+ <span class="cstat-no" title="statement not covered" > if (hook.params.authorised) {</span>
924
+ <span class="cstat-no" title="statement not covered" > debug('Access already granted')</span>
925
+ <span class="cstat-no" title="statement not covered" > checkAuthorisation = false</span>
926
926
  }
927
927
  // We also skip authorisation for built-in Feathers services like authentication
928
- if (typeof hook.service.getPath !== 'function') {
929
- debug('Access disabled on built-in services')
930
- checkAuthorisation = false
928
+ <span class="cstat-no" title="statement not covered" > if (typeof hook.service.getPath !== 'function') {</span>
929
+ <span class="cstat-no" title="statement not covered" > debug('Access disabled on built-in services')</span>
930
+ <span class="cstat-no" title="statement not covered" > checkAuthorisation = false</span>
931
931
  }
932
932
  // If explicitely asked to perform/skip, override defaults
933
- if (_.has(hook.params, 'checkAuthorisation')) {
934
- checkAuthorisation = _.get(hook.params, 'checkAuthorisation')
933
+ <span class="cstat-no" title="statement not covered" > if (_.has(hook.params, 'checkAuthorisation')) {</span>
934
+ <span class="cstat-no" title="statement not covered" > checkAuthorisation = _.get(hook.params, 'checkAuthorisation')</span>
935
935
  // Bypass authorisation for next hooks otherwise we will loop infinitely
936
- delete hook.params.checkAuthorisation
937
- debug('Access check ' + (checkAuthorisation ? 'forced' : 'unforced'))
936
+ <span class="cstat-no" title="statement not covered" > delete hook.params.checkAuthorisation</span>
937
+ <span class="cstat-no" title="statement not covered" > debug('Access check ' + (checkAuthorisation ? 'forced' : 'unforced'))</span>
938
938
  }
939
939
  &nbsp;
940
- const context = hook.service.context
941
- if (checkAuthorisation) {
940
+ const context = <span class="cstat-no" title="statement not covered" >hook.service.context</span>
941
+ <span class="cstat-no" title="statement not covered" > if (checkAuthorisation) {</span>
942
942
  // Build ability for user
943
- const authorisationService = hook.app.getService('authorisations')
944
- const abilities = await authorisationService.getAbilities(hook.params.user)
945
- hook.params.abilities = abilities
946
- debug('User abilities are', abilities.rules)
943
+ const authorisationService = <span class="cstat-no" title="statement not covered" >hook.app.getService('authorisations')</span>
944
+ const abilities = <span class="cstat-no" title="statement not covered" >await authorisationService.getAbilities(hook.params.user)</span>
945
+ <span class="cstat-no" title="statement not covered" > hook.params.abilities = abilities</span>
946
+ <span class="cstat-no" title="statement not covered" > debug('User abilities are', abilities.rules)</span>
947
947
  &nbsp;
948
948
  // Check for access to service fisrt
949
- if (!hasServiceAbilities(abilities, hook.service)) {
950
- debug('Service access not granted')
951
- throw new Forbidden(`You are not allowed to access service ${hook.service.getPath()}`)
949
+ <span class="cstat-no" title="statement not covered" > if (!hasServiceAbilities(abilities, hook.service)) {</span>
950
+ <span class="cstat-no" title="statement not covered" > debug('Service access not granted')</span>
951
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden(`You are not allowed to access service ${hook.service.getPath()}`)</span>
952
952
  }
953
953
  &nbsp;
954
- if (!hook.id) {
954
+ <span class="cstat-no" title="statement not covered" > if (!hook.id) {</span>
955
955
  // In this specific case there is no query to be run,
956
956
  // simply check against the object we'd like to create
957
- if (operation === 'create') {
958
- const resource = hook.data
959
- debug('Target resource is ', resource)
960
- if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) {
961
- debug('Resource access not granted')
962
- throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)
957
+ <span class="cstat-no" title="statement not covered" > if (operation === 'create') {</span>
958
+ const resource = <span class="cstat-no" title="statement not covered" >hook.data</span>
959
+ <span class="cstat-no" title="statement not covered" > debug('Target resource is ', resource)</span>
960
+ <span class="cstat-no" title="statement not covered" > if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) {</span>
961
+ <span class="cstat-no" title="statement not covered" > debug('Resource access not granted')</span>
962
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)</span>
963
963
  }
964
964
  } else {
965
965
  // When we find/update/patch/remove multiple items this ensures that
966
966
  // only the ones authorised by constraints on the resources will be fetched
967
967
  // This avoid fetching all first then check it one by one
968
- const dbQuery = objectifyIDs(getQueryForAbilities(abilities, operation, resourceType))
969
- if (dbQuery) {
970
- hook.params.query = _.transform(hook.params.query, (result, value, key) =&gt; {
971
- <span class="missing-if-branch" title="if path not taken" >I</span>if (key === '$or') <span class="cstat-no" title="statement not covered" >result.$</span>and = [{ $or: value }]
972
- else result[key] = value
968
+ const dbQuery = <span class="cstat-no" title="statement not covered" >objectifyIDs(getQueryForAbilities(abilities, operation, resourceType))</span>
969
+ <span class="cstat-no" title="statement not covered" > if (dbQuery) {</span>
970
+ <span class="cstat-no" title="statement not covered" > hook.params.query = _.transform(hook.params.query, <span class="fstat-no" title="function not covered" >(r</span>esult, value, key) =&gt; {</span>
971
+ <span class="cstat-no" title="statement not covered" > if (key === '$or') <span class="cstat-no" title="statement not covered" >result.$and = [{ $or: value }]</span></span>
972
+ else <span class="cstat-no" title="statement not covered" >result[key] = value</span>
973
973
  }, {})
974
- _.merge(hook.params.query, dbQuery)
974
+ <span class="cstat-no" title="statement not covered" > _.merge(hook.params.query, dbQuery)</span>
975
975
  } else {
976
- hook.result = { total: 0, skip: 0, data: [] }
976
+ <span class="cstat-no" title="statement not covered" > hook.result = { total: 0, skip: 0, data: [] }</span>
977
977
  }
978
978
  }
979
- debug('Resource access granted')
979
+ <span class="cstat-no" title="statement not covered" > debug('Resource access granted')</span>
980
980
  // Some specific services might not expose a get function, in this case we cannot check for authorisation
981
981
  // this has to be implemented by the service itself
982
- } else if (typeof hook.service.get === 'function') {
982
+ } else <span class="cstat-no" title="statement not covered" >if (typeof hook.service.get === 'function') {</span>
983
983
  // In this case (single get/update/patch/remove) we need to fetch the item first
984
- const resource = await hook.service.get(hook.id, Object.assign({ checkAuthorisation: false }, hook.params))
985
- debug('Target resource is', resource)
984
+ const resource = <span class="cstat-no" title="statement not covered" >await hook.service.get(hook.id, Object.assign({ checkAuthorisation: false }, hook.params))</span>
985
+ <span class="cstat-no" title="statement not covered" > debug('Target resource is', resource)</span>
986
986
  // Then check against the object we'd like to manage
987
- if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) {
988
- debug('Resource access not granted')
989
- throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)
987
+ <span class="cstat-no" title="statement not covered" > if (!hasResourceAbilities(abilities, operation, resourceType, context, resource)) {</span>
988
+ <span class="cstat-no" title="statement not covered" > debug('Resource access not granted')</span>
989
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden(`You are not allowed to perform ${operation} operation on ${resourceType}`)</span>
990
990
  }
991
991
  // Avoid fetching again the object in this case
992
- if (operation === 'get') {
993
- hook.result = resource
992
+ <span class="cstat-no" title="statement not covered" > if (operation === 'get') {</span>
993
+ <span class="cstat-no" title="statement not covered" > hook.result = resource</span>
994
994
  }
995
- hook.params.authorised = true
996
- debug('Resource access granted')
997
- return hook
995
+ <span class="cstat-no" title="statement not covered" > hook.params.authorised = true</span>
996
+ <span class="cstat-no" title="statement not covered" > debug('Resource access granted')</span>
997
+ <span class="cstat-no" title="statement not covered" > return hook</span>
998
998
  }
999
999
  } else {
1000
- debug('Authorisation check skipped, access granted')
1000
+ <span class="cstat-no" title="statement not covered" > debug('Authorisation check skipped, access granted')</span>
1001
1001
  }
1002
1002
  &nbsp;
1003
- hook.params.authorised = true
1004
- return hook
1003
+ <span class="cstat-no" title="statement not covered" > hook.params.authorised = true</span>
1004
+ <span class="cstat-no" title="statement not covered" > return hook</span>
1005
1005
  }
1006
1006
  &nbsp;
1007
- export function updateAbilities (options = {}) {
1008
- return async function (hook) {
1009
- const app = hook.app
1010
- const params = hook.params
1011
- const authorisationService = app.getService('authorisations')
1012
- let subject = (options.subjectAsItem ? <span class="branch-0 cbranch-no" title="branch not covered" >getItems(h</span>ook) : params.user)
1007
+ export function <span class="fstat-no" title="function not covered" >updateAbilities </span>(options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> {
1008
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >as</span>ync function (hook) {</span>
1009
+ const app = <span class="cstat-no" title="statement not covered" >hook.app</span>
1010
+ const params = <span class="cstat-no" title="statement not covered" >hook.params</span>
1011
+ const authorisationService = <span class="cstat-no" title="statement not covered" >app.getService('authorisations')</span>
1012
+ let subject = (<span class="cstat-no" title="statement not covered" >options.subjectAsItem ? getItems(hook) : params.user)</span>
1013
1013
  // We might not have all information required eg on patch to compute new abilities,
1014
1014
  // in this case we have to fetch the whole subject
1015
- <span class="missing-if-branch" title="if path not taken" >I</span>if (options.fetchSubject) {
1016
- <span class="cstat-no" title="statement not covered" > subject = a</span>wait hook.service.get(subject._id.toString())
1015
+ <span class="cstat-no" title="statement not covered" > if (options.fetchSubject) {</span>
1016
+ <span class="cstat-no" title="statement not covered" > subject = await hook.service.get(subject._id.toString())</span>
1017
1017
  }
1018
- const abilities = await authorisationService.updateAbilities(subject)
1019
- debug('Abilities updated on subject', subject, abilities.rules)
1020
- return hook
1018
+ const abilities = <span class="cstat-no" title="statement not covered" >await authorisationService.updateAbilities(subject)</span>
1019
+ <span class="cstat-no" title="statement not covered" > debug('Abilities updated on subject', subject, abilities.rules)</span>
1020
+ <span class="cstat-no" title="statement not covered" > return hook</span>
1021
1021
  }
1022
1022
  }
1023
1023
  &nbsp;
1024
- export function preventRemovingLastOwner (resourceScope) {
1025
- return async function (hook) {
1024
+ export function <span class="fstat-no" title="function not covered" >preventRemovingLastOwner </span>(resourceScope) {
1025
+ <span class="cstat-no" title="statement not covered" > return <span class="fstat-no" title="function not covered" >as</span>ync function (hook) {</span>
1026
1026
  // By pass check ?
1027
- <span class="missing-if-branch" title="if path not taken" >I</span>if (hook.params.force) <span class="cstat-no" title="statement not covered" >return h</span>ook
1028
- const params = hook.params
1029
- const data = hook.data || {}
1030
- const query = params.query || {}
1031
- const scope = data.scope || query.scope
1032
- const grantedPermissions = data.permissions || query.permissions
1033
- const grantedRole = (grantedPermissions ? Roles[grantedPermissions] : undefined)
1034
- const resource = hook.params.resource
1035
- const subjects = hook.params.subjects
1036
- const subjectService = hook.params.subjectsService
1027
+ <span class="cstat-no" title="statement not covered" > if (hook.params.force) <span class="cstat-no" title="statement not covered" >return hook</span></span>
1028
+ const params = <span class="cstat-no" title="statement not covered" >hook.params</span>
1029
+ const data = <span class="cstat-no" title="statement not covered" >hook.data || {}</span>
1030
+ const query = <span class="cstat-no" title="statement not covered" >params.query || {}</span>
1031
+ const scope = <span class="cstat-no" title="statement not covered" >data.scope || query.scope</span>
1032
+ const grantedPermissions = <span class="cstat-no" title="statement not covered" >data.permissions || query.permissions</span>
1033
+ const grantedRole = (<span class="cstat-no" title="statement not covered" >grantedPermissions ? Roles[grantedPermissions] : undefined)</span>
1034
+ const resource = <span class="cstat-no" title="statement not covered" >hook.params.resource</span>
1035
+ const subjects = <span class="cstat-no" title="statement not covered" >hook.params.subjects</span>
1036
+ const subjectService = <span class="cstat-no" title="statement not covered" >hook.params.subjectsService</span>
1037
1037
  // On create check if we try to downgrade permissions otherwise let pass through
1038
- if (!_.isUndefined(grantedRole) &amp;&amp; (grantedRole === Roles.owner)) return hook
1038
+ <span class="cstat-no" title="statement not covered" > if (!_.isUndefined(grantedRole) &amp;&amp; (grantedRole === Roles.owner)) <span class="cstat-no" title="statement not covered" >return hook</span></span>
1039
1039
  &nbsp;
1040
- if ((scope === resourceScope) &amp;&amp; resource &amp;&amp; resource._id) {
1040
+ <span class="cstat-no" title="statement not covered" > if ((scope === resourceScope) &amp;&amp; resource &amp;&amp; resource._id) {</span>
1041
1041
  // Count existing owners
1042
- const owners = await countSubjectsForResource(subjectService, resourceScope, resource._id, Roles.owner)
1042
+ const owners = <span class="cstat-no" title="statement not covered" >await countSubjectsForResource(subjectService, resourceScope, resource._id, Roles.owner)</span>
1043
1043
  // Now count owners we change/remove permissions on
1044
- const removedOwners = subjects.reduce((count, subject) =&gt; {
1045
- const resources = _.get(subject, resourceScope, [])
1046
- const ownedResource = _.find(resources, { _id: resource._id, permissions: RoleNames[Roles.owner] })
1047
- return (ownedResource ? count + 1 : count)
1044
+ const removedOwners = <span class="cstat-no" title="statement not covered" >subjects.reduce(<span class="fstat-no" title="function not covered" >(c</span>ount, subject) =&gt; {</span>
1045
+ const resources = <span class="cstat-no" title="statement not covered" >_.get(subject, resourceScope, [])</span>
1046
+ const ownedResource = <span class="cstat-no" title="statement not covered" >_.find(resources, { _id: resource._id, permissions: RoleNames[Roles.owner] })</span>
1047
+ <span class="cstat-no" title="statement not covered" > return (ownedResource ? count + 1 : count)</span>
1048
1048
  }, 0)
1049
1049
  // If none remains stop
1050
- if (removedOwners &gt;= owners.total) {
1051
- debug('Cannot remove the last owner of resource ', resource)
1052
- const resourceName = resource.name ? resource.name : <span class="branch-1 cbranch-no" title="branch not covered" >resource._</span>id.toString()
1053
- throw new Forbidden('You are not allowed to remove the last owner of resource ' + resourceName, {
1050
+ <span class="cstat-no" title="statement not covered" > if (removedOwners &gt;= owners.total) {</span>
1051
+ <span class="cstat-no" title="statement not covered" > debug('Cannot remove the last owner of resource ', resource)</span>
1052
+ const resourceName = <span class="cstat-no" title="statement not covered" >resource.name ? resource.name : resource._id.toString()</span>
1053
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden('You are not allowed to remove the last owner of resource ' + resourceName, {</span>
1054
1054
  translation: {
1055
1055
  key: 'CANNOT_REMOVE_LAST_OWNER',
1056
1056
  params: { resource: resourceName }
@@ -1058,21 +1058,21 @@ export function preventRemovingLastOwner (resourceScope) {
1058
1058
  })
1059
1059
  }
1060
1060
  }
1061
- return hook
1061
+ <span class="cstat-no" title="statement not covered" > return hook</span>
1062
1062
  }
1063
1063
  }
1064
1064
  &nbsp;
1065
- export async function removeOrganisationGroupsAuthorisations (hook) {
1066
- const app = hook.app
1067
- const authorisationService = app.getService('authorisations')
1068
- const org = hook.params.resource
1069
- const user = hook.params.user
1065
+ export async function <span class="fstat-no" title="function not covered" >removeOrganisationGroupsAuthorisations </span>(hook) {
1066
+ const app = <span class="cstat-no" title="statement not covered" >hook.app</span>
1067
+ const authorisationService = <span class="cstat-no" title="statement not covered" >app.getService('authorisations')</span>
1068
+ const org = <span class="cstat-no" title="statement not covered" >hook.params.resource</span>
1069
+ const user = <span class="cstat-no" title="statement not covered" >hook.params.user</span>
1070
1070
  // Unset membership for the all org groups
1071
- const orgGroupService = app.getService('groups', org)
1072
- const groups = await orgGroupService.find({ paginate: false })
1073
- await Promise.all(groups.map(group =&gt; {
1071
+ const orgGroupService = <span class="cstat-no" title="statement not covered" >app.getService('groups', org)</span>
1072
+ const groups = <span class="cstat-no" title="statement not covered" >await orgGroupService.find({ paginate: false })</span>
1073
+ <span class="cstat-no" title="statement not covered" > await Promise.all(groups.map(<span class="fstat-no" title="function not covered" >gr</span>oup =&gt; {</span>
1074
1074
  // Unset membership on group for the all org users
1075
- return authorisationService.remove(group._id.toString(), {
1075
+ <span class="cstat-no" title="statement not covered" > return authorisationService.remove(group._id.toString(), {</span>
1076
1076
  query: {
1077
1077
  scope: 'groups'
1078
1078
  },
@@ -1086,35 +1086,35 @@ export async function removeOrganisationGroupsAuthorisations (hook) {
1086
1086
  resourcesService: orgGroupService
1087
1087
  })
1088
1088
  }))
1089
- debug('Authorisations unset on groups for organisation ' + org._id)
1090
- return hook
1089
+ <span class="cstat-no" title="statement not covered" > debug('Authorisations unset on groups for organisation ' + org._id)</span>
1090
+ <span class="cstat-no" title="statement not covered" > return hook</span>
1091
1091
  }
1092
1092
  &nbsp;
1093
- export <span class="fstat-no" title="function not covered" >async function r</span>emoveOrganisationTagsAuthorisations (hook) {
1093
+ export async function <span class="fstat-no" title="function not covered" >removeOrganisationTagsAuthorisations </span>(hook) {
1094
1094
  const app = <span class="cstat-no" title="statement not covered" >hook.app</span>
1095
1095
  const org = <span class="cstat-no" title="statement not covered" >hook.params.resource</span>
1096
1096
  const subjectService = <span class="cstat-no" title="statement not covered" >hook.params.subjectsService</span>
1097
- const orgTagsService = <span class="cstat-no" title="statement not covered" >app.g</span>etService('tags', org)
1097
+ const orgTagsService = <span class="cstat-no" title="statement not covered" >app.getService('tags', org)</span>
1098
1098
  const subjects = <span class="cstat-no" title="statement not covered" >hook.params.subjects || []</span>
1099
- <span class="cstat-no" title="statement not covered" > if (subjects.length === 0) <span class="cstat-no" title="statement not covered" >return h</span></span>ook
1099
+ <span class="cstat-no" title="statement not covered" > if (subjects.length === 0) <span class="cstat-no" title="statement not covered" >return hook</span></span>
1100
1100
  // Retrieve org tags
1101
- const orgTags = <span class="cstat-no" title="statement not covered" >await orgTagsService.f</span>ind({ paginate: false })
1101
+ const orgTags = <span class="cstat-no" title="statement not covered" >await orgTagsService.find({ paginate: false })</span>
1102
1102
  const promises = <span class="cstat-no" title="statement not covered" >[]</span>
1103
- <span class="cstat-no" title="statement not covered" > subjects.f</span>orEach(<span class="fstat-no" title="function not covered" >subject =&gt; {</span>
1103
+ <span class="cstat-no" title="statement not covered" > subjects.forEach(<span class="fstat-no" title="function not covered" >su</span>bject =&gt; {</span>
1104
1104
  const tags = <span class="cstat-no" title="statement not covered" >subject.tags || []</span>
1105
1105
  // Find tags from org
1106
- const fromOrg = <span class="cstat-no" title="statement not covered" >_.i</span>ntersectionWith(tags, orgTags, isTagEqual)
1106
+ const fromOrg = <span class="cstat-no" title="statement not covered" >_.intersectionWith(tags, orgTags, isTagEqual)</span>
1107
1107
  // Clear removed tags
1108
- const notFromOrg = <span class="cstat-no" title="statement not covered" >_.d</span>ifferenceWith(tags, orgTags, isTagEqual)
1108
+ const notFromOrg = <span class="cstat-no" title="statement not covered" >_.differenceWith(tags, orgTags, isTagEqual)</span>
1109
1109
  // Update subject if required
1110
1110
  <span class="cstat-no" title="statement not covered" > if (fromOrg.length &gt; 0) {</span>
1111
- <span class="cstat-no" title="statement not covered" > promises.p</span>ush(subjectService.patch(subject._id.toString(), { tags: notFromOrg, devices: subject.devices }))
1111
+ <span class="cstat-no" title="statement not covered" > promises.push(subjectService.patch(subject._id.toString(), { tags: notFromOrg, devices: subject.devices }))</span>
1112
1112
  }
1113
1113
  })
1114
1114
  // Perform subject updates in parallel
1115
- <span class="cstat-no" title="statement not covered" > await P</span>romise.all(promises)
1116
- <span class="cstat-no" title="statement not covered" > debug(`</span>Tags unset on ${promises.length} subjects for organisation ` + org._id)
1117
- <span class="cstat-no" title="statement not covered" > return h</span>ook
1115
+ <span class="cstat-no" title="statement not covered" > await Promise.all(promises)</span>
1116
+ <span class="cstat-no" title="statement not covered" > debug(`Tags unset on ${promises.length} subjects for organisation ` + org._id)</span>
1117
+ <span class="cstat-no" title="statement not covered" > return hook</span>
1118
1118
  }
1119
1119
  &nbsp;</pre></td></tr></table></pre>
1120
1120
 
@@ -1123,7 +1123,7 @@ export <span class="fstat-no" title="function not covered" >async function r</sp
1123
1123
  <div class='footer quiet pad2 space-top1 center small'>
1124
1124
  Code coverage generated by
1125
1125
  <a href="https://istanbul.js.org/" target="_blank">istanbul</a>
1126
- at Fri Sep 24 2021 10:39:04 GMT+0200 (GMT+02:00)
1126
+ at Fri Jan 07 2022 19:29:57 GMT+0100 (GMT+01:00)
1127
1127
  </div>
1128
1128
  </div>
1129
1129
  <script src="../../../prettify.js"></script>