@kalisio/kdk 2.6.4 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (398) hide show
  1. package/core/api/application.js +2 -4
  2. package/core/api/authentication.js +2 -3
  3. package/core/api/db.js +10 -2
  4. package/core/api/hooks/hooks.authorisations.js +4 -2
  5. package/core/api/hooks/hooks.push.js +6 -2
  6. package/core/api/hooks/hooks.query.js +29 -12
  7. package/core/api/hooks/hooks.users.js +30 -17
  8. package/core/api/models/configurations.model.mongodb.js +4 -0
  9. package/core/api/services/authorisations/authorisations.service.js +1 -1
  10. package/core/api/services/configurations/configurations.hooks.js +33 -0
  11. package/core/api/services/index.js +41 -7
  12. package/core/api/services/messages/messages.hooks.js +9 -3
  13. package/core/client/api.js +14 -1
  14. package/core/client/capabilities.js +1 -6
  15. package/core/client/components/KAvatar.vue +24 -20
  16. package/core/client/components/account/KProfile.vue +10 -71
  17. package/core/client/components/account/index.js +0 -2
  18. package/core/client/components/app/KSettings.vue +1 -0
  19. package/core/client/components/collection/KBoard.vue +4 -3
  20. package/core/client/components/collection/KCardSection.vue +1 -0
  21. package/core/client/components/collection/KGrid.vue +2 -0
  22. package/core/client/components/collection/KTable.vue +5 -1
  23. package/core/client/components/collection/KTimeLine.vue +9 -1
  24. package/core/client/components/collection/index.js +0 -2
  25. package/core/client/components/form/KChipsField.vue +2 -1
  26. package/core/client/components/form/KEmailField.vue +1 -0
  27. package/core/client/components/form/KFileField.vue +22 -1
  28. package/core/client/components/form/KForm.vue +2 -0
  29. package/core/client/components/form/KItemField.vue +1 -0
  30. package/core/client/components/form/KNumberField.vue +1 -0
  31. package/core/client/components/form/KPasswordField.vue +1 -0
  32. package/core/client/components/form/KPhoneField.vue +1 -0
  33. package/core/client/components/form/KPropertyItemField.vue +1 -0
  34. package/core/client/components/form/KResolutionField.vue +1 -0
  35. package/core/client/components/form/KSelectField.vue +31 -0
  36. package/core/client/components/form/KTagField.vue +1 -0
  37. package/core/client/components/form/KTextField.vue +1 -0
  38. package/core/client/components/form/KTokenField.vue +1 -0
  39. package/core/client/components/form/KUnitField.vue +1 -0
  40. package/core/client/components/form/KUrlField.vue +1 -0
  41. package/core/client/components/graphics/KIcon.vue +3 -4
  42. package/core/client/components/layout/KPage.vue +1 -0
  43. package/core/client/components/layout/KWindow.vue +6 -3
  44. package/core/client/components/messages/KMessageComposer.vue +2 -1
  45. package/core/client/components/messages/KMessagesTimeLine.vue +1 -1
  46. package/core/client/components/time/KDate.vue +1 -2
  47. package/core/client/components/time/KDateTime.vue +11 -11
  48. package/core/client/components/time/KTime.vue +1 -1
  49. package/core/client/composables/collection.js +33 -8
  50. package/core/client/composables/errors.js +1 -1
  51. package/core/client/composables/layout.js +9 -9
  52. package/core/client/configurations.js +50 -0
  53. package/core/client/exporter.js +1 -1
  54. package/core/client/i18n/core_en.json +6 -39
  55. package/core/client/i18n/core_fr.json +6 -39
  56. package/core/client/index.js +2 -0
  57. package/core/client/layout.js +8 -8
  58. package/core/client/mixins/mixin.base-activity.js +5 -2
  59. package/core/client/mixins/mixin.base-field.js +3 -3
  60. package/core/client/search.js +2 -1
  61. package/core/client/utils/utils.collection.js +8 -8
  62. package/core/client/utils/utils.items.js +4 -0
  63. package/core/client/utils/utils.push.js +3 -3
  64. package/core/client/utils/utils.session.js +7 -5
  65. package/core/client/utils/utils.shapes.js +38 -7
  66. package/core/client/utils/utils.time.js +21 -22
  67. package/core/common/schemas/users.update-profile.json +3 -2
  68. package/coverage/core/api/application.js.html +392 -398
  69. package/coverage/core/api/authentication.js.html +352 -187
  70. package/coverage/core/api/db.js.html +165 -126
  71. package/coverage/core/api/hooks/hooks.authentication.js.html +22 -196
  72. package/coverage/core/api/hooks/hooks.authorisations.js.html +383 -662
  73. package/coverage/core/api/hooks/hooks.logger.js.html +41 -41
  74. package/coverage/core/api/hooks/hooks.model.js.html +113 -101
  75. package/coverage/core/api/hooks/hooks.push.js.html +124 -97
  76. package/coverage/core/api/hooks/hooks.query.js.html +292 -217
  77. package/coverage/core/api/hooks/hooks.schemas.js.html +123 -123
  78. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  79. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  80. package/coverage/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  81. package/coverage/core/api/hooks/hooks.users.js.html +255 -447
  82. package/coverage/core/api/hooks/index.html +107 -122
  83. package/coverage/core/api/hooks/index.js.html +4 -10
  84. package/coverage/core/api/index.html +46 -61
  85. package/coverage/core/api/index.js.html +9 -9
  86. package/coverage/core/api/marshall.js.html +9 -9
  87. package/coverage/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  88. package/coverage/core/api/models/index.html +35 -50
  89. package/coverage/core/api/models/messages.model.mongodb.js.html +39 -27
  90. package/coverage/core/api/models/tags.model.mongodb.js.html +26 -32
  91. package/coverage/core/api/models/users.model.mongodb.js.html +10 -10
  92. package/coverage/core/api/services/account/account.hooks.js.html +5 -5
  93. package/coverage/core/api/services/account/account.service.js.html +127 -127
  94. package/coverage/core/api/services/account/index.html +22 -22
  95. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  96. package/coverage/core/api/services/authorisations/authorisations.service.js.html +213 -222
  97. package/coverage/core/api/services/authorisations/index.html +21 -21
  98. package/coverage/core/api/services/{organisations/organisations.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  99. package/coverage/core/api/services/{groups → configurations}/index.html +8 -8
  100. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  101. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  102. package/coverage/core/api/services/databases/index.html +1 -1
  103. package/coverage/core/api/services/import-export/import-export.hooks.js.html +76 -76
  104. package/coverage/core/api/services/import-export/import-export.service.js.html +32 -32
  105. package/coverage/core/api/services/import-export/index.html +32 -32
  106. package/coverage/core/api/services/index.html +21 -21
  107. package/coverage/core/api/services/index.js.html +313 -142
  108. package/coverage/core/api/services/mailer/index.html +32 -32
  109. package/coverage/core/api/services/mailer/mailer.hooks.js.html +80 -80
  110. package/coverage/core/api/services/mailer/mailer.service.js.html +32 -32
  111. package/coverage/core/api/services/messages/index.html +21 -21
  112. package/coverage/core/api/services/messages/messages.hooks.js.html +112 -76
  113. package/coverage/core/api/services/push/index.html +32 -32
  114. package/coverage/core/api/services/push/push.hooks.js.html +80 -80
  115. package/coverage/core/api/services/push/push.service.js.html +34 -34
  116. package/coverage/core/api/services/storage/index.html +29 -29
  117. package/coverage/core/api/services/storage/storage.hooks.js.html +80 -80
  118. package/coverage/core/api/services/storage/storage.service.js.html +29 -29
  119. package/coverage/core/api/services/tags/index.html +21 -21
  120. package/coverage/core/api/services/tags/tags.hooks.js.html +119 -71
  121. package/coverage/core/api/services/users/index.html +27 -12
  122. package/coverage/core/api/services/users/users.hooks.js.html +14 -11
  123. package/coverage/core/api/services/users/users.service.js.html +100 -0
  124. package/coverage/core/common/errors.js.html +1 -1
  125. package/coverage/core/common/index.html +42 -27
  126. package/coverage/core/common/index.js.html +1 -1
  127. package/coverage/core/common/permissions.js.html +166 -472
  128. package/coverage/core/common/schema.js.html +4 -4
  129. package/coverage/core/common/utils.js.html +31 -25
  130. package/coverage/core/common/utils.offline.js.html +199 -0
  131. package/coverage/index.html +192 -192
  132. package/coverage/lcov-report/core/api/application.js.html +392 -398
  133. package/coverage/lcov-report/core/api/authentication.js.html +352 -187
  134. package/coverage/lcov-report/core/api/db.js.html +165 -126
  135. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +22 -196
  136. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +383 -662
  137. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +41 -41
  138. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +113 -101
  139. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +124 -97
  140. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +292 -217
  141. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +123 -123
  142. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  143. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  144. package/coverage/lcov-report/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  145. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +255 -447
  146. package/coverage/lcov-report/core/api/hooks/index.html +107 -122
  147. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  148. package/coverage/lcov-report/core/api/index.html +46 -61
  149. package/coverage/lcov-report/core/api/index.js.html +9 -9
  150. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  151. package/coverage/lcov-report/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  152. package/coverage/lcov-report/core/api/models/index.html +35 -50
  153. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +39 -27
  154. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +26 -32
  155. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +10 -10
  156. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +5 -5
  157. package/coverage/lcov-report/core/api/services/account/account.service.js.html +127 -127
  158. package/coverage/lcov-report/core/api/services/account/index.html +22 -22
  159. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  160. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +213 -222
  161. package/coverage/lcov-report/core/api/services/authorisations/index.html +21 -21
  162. package/coverage/lcov-report/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  163. package/coverage/lcov-report/core/api/services/{groups → configurations}/index.html +8 -8
  164. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  165. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  166. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  167. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +76 -76
  168. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +32 -32
  169. package/coverage/lcov-report/core/api/services/import-export/index.html +32 -32
  170. package/coverage/lcov-report/core/api/services/index.html +21 -21
  171. package/coverage/lcov-report/core/api/services/index.js.html +313 -142
  172. package/coverage/lcov-report/core/api/services/mailer/index.html +32 -32
  173. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +80 -80
  174. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +32 -32
  175. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  176. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +112 -76
  177. package/coverage/lcov-report/core/api/services/push/index.html +32 -32
  178. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +80 -80
  179. package/coverage/lcov-report/core/api/services/push/push.service.js.html +34 -34
  180. package/coverage/lcov-report/core/api/services/storage/index.html +29 -29
  181. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +80 -80
  182. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +29 -29
  183. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  184. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +119 -71
  185. package/coverage/lcov-report/core/api/services/users/index.html +27 -12
  186. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +14 -11
  187. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  188. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  189. package/coverage/lcov-report/core/common/index.html +42 -27
  190. package/coverage/lcov-report/core/common/index.js.html +1 -1
  191. package/coverage/lcov-report/core/common/permissions.js.html +166 -472
  192. package/coverage/lcov-report/core/common/schema.js.html +4 -4
  193. package/coverage/lcov-report/core/common/utils.js.html +31 -25
  194. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  195. package/coverage/lcov-report/index.html +192 -192
  196. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +169 -31
  197. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  198. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +215 -35
  199. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  200. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  201. package/coverage/lcov-report/map/api/index.html +1 -1
  202. package/coverage/lcov-report/map/api/index.js.html +1 -1
  203. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  204. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  205. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +82 -7
  206. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  207. package/coverage/lcov-report/map/api/models/index.html +22 -7
  208. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  209. package/coverage/lcov-report/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  210. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  211. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  212. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  213. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +39 -12
  214. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  215. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  216. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  217. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +86 -11
  218. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  219. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  220. package/coverage/lcov-report/map/api/services/index.html +5 -5
  221. package/coverage/lcov-report/map/api/services/index.js.html +326 -50
  222. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  223. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  224. package/coverage/{core/api/services/organisations → lcov-report/map/api/services/styles}/index.html +10 -25
  225. package/coverage/lcov-report/{core/api/services/organisations/organisations.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  226. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  227. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  228. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +7 -10
  229. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  230. package/coverage/lcov-report/map/common/index.html +19 -19
  231. package/coverage/lcov-report/map/common/index.js.html +1 -1
  232. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  233. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  234. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  235. package/coverage/lcov-report/map/common/opendap-utils.js.html +4 -7
  236. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  237. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  238. package/coverage/lcov-report/map/common/tms-utils.js.html +9 -12
  239. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  240. package/coverage/lcov-report/map/common/wcs-utils.js.html +12 -15
  241. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +2 -2
  242. package/coverage/lcov-report/map/common/wfs-utils.js.html +14 -17
  243. package/coverage/lcov-report/map/common/wms-utils.js.html +30 -12
  244. package/coverage/lcov-report/map/common/wmts-utils.js.html +10 -13
  245. package/coverage/lcov.info +4157 -3816
  246. package/coverage/map/api/hooks/hooks.catalog.js.html +169 -31
  247. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  248. package/coverage/map/api/hooks/hooks.query.js.html +215 -35
  249. package/coverage/map/api/hooks/index.html +7 -7
  250. package/coverage/map/api/hooks/index.js.html +1 -1
  251. package/coverage/map/api/index.html +1 -1
  252. package/coverage/map/api/index.js.html +1 -1
  253. package/coverage/map/api/marshall.js.html +1 -1
  254. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  255. package/coverage/map/api/models/catalog.model.mongodb.js.html +82 -7
  256. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  257. package/coverage/map/api/models/index.html +22 -7
  258. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  259. package/coverage/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  260. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  261. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  262. package/coverage/map/api/services/alerts/index.html +1 -1
  263. package/coverage/map/api/services/catalog/catalog.hooks.js.html +39 -12
  264. package/coverage/map/api/services/catalog/index.html +5 -5
  265. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  266. package/coverage/map/api/services/daptiles/index.html +1 -1
  267. package/coverage/map/api/services/features/features.hooks.js.html +86 -11
  268. package/coverage/map/api/services/features/features.service.js.html +307 -4
  269. package/coverage/map/api/services/features/index.html +7 -7
  270. package/coverage/map/api/services/index.html +5 -5
  271. package/coverage/map/api/services/index.js.html +326 -50
  272. package/coverage/map/api/services/projects/index.html +1 -1
  273. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  274. package/coverage/{lcov-report/core/api/services/organisations → map/api/services/styles}/index.html +10 -25
  275. package/coverage/{core/api/services/groups/groups.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  276. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  277. package/coverage/map/common/errors.js.html +1 -1
  278. package/coverage/map/common/geotiff-grid-source.js.html +7 -10
  279. package/coverage/map/common/grid.js.html +1 -1
  280. package/coverage/map/common/index.html +19 -19
  281. package/coverage/map/common/index.js.html +1 -1
  282. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  283. package/coverage/map/common/moment-utils.js.html +1 -1
  284. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  285. package/coverage/map/common/opendap-utils.js.html +4 -7
  286. package/coverage/map/common/permissions.js.html +10 -4
  287. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  288. package/coverage/map/common/tms-utils.js.html +9 -12
  289. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  290. package/coverage/map/common/wcs-utils.js.html +12 -15
  291. package/coverage/map/common/weacast-grid-source.js.html +2 -2
  292. package/coverage/map/common/wfs-utils.js.html +14 -17
  293. package/coverage/map/common/wms-utils.js.html +30 -12
  294. package/coverage/map/common/wmts-utils.js.html +10 -13
  295. package/coverage/tmp/coverage-1028514-1773134124472-0.json +1 -0
  296. package/coverage/tmp/coverage-1028526-1773134124448-0.json +1 -0
  297. package/coverage/tmp/coverage-1028537-1773134124431-0.json +1 -0
  298. package/coverage/tmp/coverage-1028549-1773134124401-0.json +1 -0
  299. package/coverage/tmp/coverage-1028556-1773134124353-0.json +1 -0
  300. package/extras/configs/widgets.top.js +3 -3
  301. package/extras/tests/core/collection.mjs +2 -9
  302. package/extras/tours/pane.top.js +0 -9
  303. package/map/api/hooks/hooks.catalog.js +18 -4
  304. package/map/api/services/catalog/catalog.hooks.js +3 -0
  305. package/map/api/services/features/features.hooks.js +3 -1
  306. package/map/api/services/index.js +2 -6
  307. package/map/api/services/styles/styles.hooks.js +6 -1
  308. package/map/client/components/KFeatureActionButton.vue +9 -3
  309. package/map/client/components/KFeaturesFilterManager.vue +5 -5
  310. package/map/client/components/KFilterCondition.vue +17 -10
  311. package/map/client/components/KLayerEditor.vue +49 -39
  312. package/map/client/components/KMeasureTool.vue +7 -1
  313. package/map/client/components/KTimezoneMap.vue +29 -9
  314. package/map/client/components/catalog/KLayersPanel.vue +26 -16
  315. package/map/client/components/catalog/KLayersSelector.vue +13 -2
  316. package/map/client/components/catalog/KViewsPanel.vue +5 -4
  317. package/map/client/components/form/KSelectLayersField.vue +28 -17
  318. package/map/client/components/form/KSelectViewsField.vue +18 -9
  319. package/map/client/components/form/KTimezoneField.vue +1 -2
  320. package/map/client/components/legend/KVariablesLegend.vue +10 -1
  321. package/map/client/components/location/KLocationCardSection.vue +7 -2
  322. package/map/client/components/location/KLocationMap.vue +31 -7
  323. package/map/client/components/selection/KSelectedLayerFeatures.vue +2 -2
  324. package/map/client/components/stickies/KZoomControl.vue +1 -1
  325. package/map/client/components/styles/KStyleManager.vue +4 -1
  326. package/map/client/components/widget/KTimeSeries.vue +174 -497
  327. package/map/client/components/widget/KTimeSeriesSelector.vue +72 -0
  328. package/map/client/components/widget/KTimeSeriesToolbar.vue +83 -0
  329. package/map/client/composables/catalog.js +6 -10
  330. package/map/client/composables/highlight.js +12 -9
  331. package/map/client/composables/project.js +1 -1
  332. package/map/client/composables/selection.js +8 -7
  333. package/map/client/composables/weather.js +9 -2
  334. package/map/client/geolocation.js +8 -5
  335. package/map/client/i18n/map_en.json +11 -10
  336. package/map/client/i18n/map_fr.json +10 -9
  337. package/map/client/leaflet/TiledFeatureLayer.js +85 -82
  338. package/map/client/leaflet/utils/utils.geojson.js +3 -3
  339. package/map/client/mixins/globe/mixin.base-globe.js +15 -6
  340. package/map/client/mixins/globe/mixin.geojson-layers.js +27 -18
  341. package/map/client/mixins/map/mixin.edit-layers.js +9 -1
  342. package/map/client/mixins/map/mixin.pmtiles-layers.js +118 -29
  343. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +12 -5
  344. package/map/client/mixins/map/mixin.tiled-wind-layers.js +19 -10
  345. package/map/client/mixins/mixin.activity.js +23 -30
  346. package/map/client/mixins/mixin.feature-selection.js +41 -5
  347. package/map/client/planets.js +1 -1
  348. package/map/client/readers/reader.kml.js +2 -3
  349. package/map/client/utils/utils.catalog.js +36 -10
  350. package/map/client/utils/utils.layers.js +39 -8
  351. package/map/client/utils/utils.project.js +4 -0
  352. package/map/client/utils/utils.style.js +37 -7
  353. package/map/client/utils/utils.time-series.js +215 -6
  354. package/map/common/schemas/catalog.update.json +1 -1
  355. package/map/common/weacast-grid-source.js +1 -1
  356. package/package.json +3 -3
  357. package/scripts/kash/CHANGELOG.md +0 -4
  358. package/scripts/kash/README.md +0 -9
  359. package/scripts/kash/kash.sh +45 -40
  360. package/scripts/kash/scripts/run_tests.sh +1 -4
  361. package/test/api/core/authentication.test.js +9 -4
  362. package/test/api/core/config/default.cjs +1 -0
  363. package/test/api/core/hooks.test.js +6 -0
  364. package/test/api/core/index.test.js +43 -18
  365. package/test/api/core/push.test.js +8 -8
  366. package/test/api/core/test-log-2026-03-10.log +60 -0
  367. package/test/api/core/users.test.js +384 -0
  368. package/test/api/map/grid-sources.test.js +1 -1
  369. package/test/api/map/test-log-2026-03-10.log +56 -0
  370. package/vite/package.json +11 -2
  371. package/vite/test/core/composables.test.js +77 -0
  372. package/vite/vitest.config.js +13 -0
  373. package/vite/yarn.lock +1096 -18
  374. package/.vscode/settings.json +0 -5
  375. package/core/client/components/account/KAccount.vue +0 -68
  376. package/core/client/components/account/KDeleteAccountManager.vue +0 -62
  377. package/core/client/components/account/KEmailManager.vue +0 -128
  378. package/core/client/components/account/KPasswordManager.vue +0 -90
  379. package/core/client/components/account/KVerifyEmailManager.vue +0 -105
  380. package/core/client/components/collection/KColumn.vue +0 -227
  381. package/core/client/components/collection/KHistory.vue +0 -113
  382. package/core/client/components/collection/KHistoryEntry.vue +0 -109
  383. package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
  384. package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
  385. package/coverage/core/api/utils.js.html +0 -118
  386. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
  387. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
  388. package/coverage/lcov-report/core/api/utils.js.html +0 -118
  389. package/coverage/tmp/coverage-151166-1723543324307-0.json +0 -1
  390. package/coverage/tmp/coverage-151178-1723543324283-0.json +0 -1
  391. package/coverage/tmp/coverage-151189-1723543324271-0.json +0 -1
  392. package/coverage/tmp/coverage-151201-1723543324248-0.json +0 -1
  393. package/coverage/tmp/coverage-151208-1723543324227-0.json +0 -1
  394. package/scripts/kash/LICENSE +0 -21
  395. package/test/api/core/test-log-2024-04-22.log +0 -84
  396. package/test/api/core/test-log-2024-04-23.log +0 -23
  397. package/test/api/core/test-log-2024-08-13.log +0 -3
  398. package/test/api/map/test-log-2025-03-08.log +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">25.86% </span>
26
+ <span class="strong">62.45% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>67/259</span>
28
+ <span class='fraction'>178/285</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">80% </span>
33
+ <span class="strong">57.69% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>8/10</span>
35
+ <span class='fraction'>30/52</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">36.36% </span>
40
+ <span class="strong">58.33% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>4/11</span>
42
+ <span class='fraction'>7/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">25.86% </span>
47
+ <span class="strong">62.45% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>67/259</span>
49
+ <span class='fraction'>178/285</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -322,7 +322,35 @@
322
322
  <a name='L257'></a><a href='#L257'>257</a>
323
323
  <a name='L258'></a><a href='#L258'>258</a>
324
324
  <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
351
+ <span class="cline-any cline-yes">1x</span>
352
+ <span class="cline-any cline-yes">1x</span>
353
+ <span class="cline-any cline-yes">1x</span>
326
354
  <span class="cline-any cline-yes">1x</span>
327
355
  <span class="cline-any cline-yes">1x</span>
328
356
  <span class="cline-any cline-yes">1x</span>
@@ -340,12 +368,12 @@
340
368
  <span class="cline-any cline-no">&nbsp;</span>
341
369
  <span class="cline-any cline-yes">1x</span>
342
370
  <span class="cline-any cline-yes">1x</span>
343
- <span class="cline-any cline-yes">1x</span>
344
- <span class="cline-any cline-yes">1x</span>
345
- <span class="cline-any cline-yes">1x</span>
346
- <span class="cline-any cline-yes">1x</span>
347
- <span class="cline-any cline-yes">1x</span>
348
- <span class="cline-any cline-yes">1x</span>
371
+ <span class="cline-any cline-yes">4x</span>
372
+ <span class="cline-any cline-yes">4x</span>
373
+ <span class="cline-any cline-yes">3x</span>
374
+ <span class="cline-any cline-yes">3x</span>
375
+ <span class="cline-any cline-yes">3x</span>
376
+ <span class="cline-any cline-yes">4x</span>
349
377
  <span class="cline-any cline-yes">1x</span>
350
378
  <span class="cline-any cline-yes">1x</span>
351
379
  <span class="cline-any cline-no">&nbsp;</span>
@@ -393,45 +421,6 @@
393
421
  <span class="cline-any cline-no">&nbsp;</span>
394
422
  <span class="cline-any cline-no">&nbsp;</span>
395
423
  <span class="cline-any cline-no">&nbsp;</span>
396
- <span class="cline-any cline-yes">1x</span>
397
- <span class="cline-any cline-yes">1x</span>
398
- <span class="cline-any cline-no">&nbsp;</span>
399
- <span class="cline-any cline-no">&nbsp;</span>
400
- <span class="cline-any cline-no">&nbsp;</span>
401
- <span class="cline-any cline-no">&nbsp;</span>
402
- <span class="cline-any cline-no">&nbsp;</span>
403
- <span class="cline-any cline-no">&nbsp;</span>
404
- <span class="cline-any cline-no">&nbsp;</span>
405
- <span class="cline-any cline-no">&nbsp;</span>
406
- <span class="cline-any cline-no">&nbsp;</span>
407
- <span class="cline-any cline-no">&nbsp;</span>
408
- <span class="cline-any cline-no">&nbsp;</span>
409
- <span class="cline-any cline-no">&nbsp;</span>
410
- <span class="cline-any cline-no">&nbsp;</span>
411
- <span class="cline-any cline-no">&nbsp;</span>
412
- <span class="cline-any cline-no">&nbsp;</span>
413
- <span class="cline-any cline-no">&nbsp;</span>
414
- <span class="cline-any cline-no">&nbsp;</span>
415
- <span class="cline-any cline-no">&nbsp;</span>
416
- <span class="cline-any cline-no">&nbsp;</span>
417
- <span class="cline-any cline-no">&nbsp;</span>
418
- <span class="cline-any cline-no">&nbsp;</span>
419
- <span class="cline-any cline-no">&nbsp;</span>
420
- <span class="cline-any cline-no">&nbsp;</span>
421
- <span class="cline-any cline-no">&nbsp;</span>
422
- <span class="cline-any cline-no">&nbsp;</span>
423
- <span class="cline-any cline-no">&nbsp;</span>
424
- <span class="cline-any cline-no">&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-no">&nbsp;</span>
432
- <span class="cline-any cline-no">&nbsp;</span>
433
- <span class="cline-any cline-no">&nbsp;</span>
434
- <span class="cline-any cline-no">&nbsp;</span>
435
424
  <span class="cline-any cline-no">&nbsp;</span>
436
425
  <span class="cline-any cline-no">&nbsp;</span>
437
426
  <span class="cline-any cline-no">&nbsp;</span>
@@ -439,35 +428,81 @@
439
428
  <span class="cline-any cline-no">&nbsp;</span>
440
429
  <span class="cline-any cline-no">&nbsp;</span>
441
430
  <span class="cline-any cline-no">&nbsp;</span>
431
+ <span class="cline-any cline-yes">1x</span>
432
+ <span class="cline-any cline-yes">1x</span>
433
+ <span class="cline-any cline-yes">4x</span>
434
+ <span class="cline-any cline-yes">4x</span>
435
+ <span class="cline-any cline-yes">4x</span>
436
+ <span class="cline-any cline-yes">4x</span>
437
+ <span class="cline-any cline-yes">4x</span>
438
+ <span class="cline-any cline-yes">4x</span>
439
+ <span class="cline-any cline-yes">4x</span>
440
+ <span class="cline-any cline-yes">4x</span>
441
+ <span class="cline-any cline-yes">4x</span>
442
+ <span class="cline-any cline-yes">4x</span>
443
+ <span class="cline-any cline-yes">4x</span>
442
444
  <span class="cline-any cline-no">&nbsp;</span>
443
445
  <span class="cline-any cline-no">&nbsp;</span>
444
446
  <span class="cline-any cline-no">&nbsp;</span>
447
+ <span class="cline-any cline-yes">4x</span>
445
448
  <span class="cline-any cline-no">&nbsp;</span>
446
449
  <span class="cline-any cline-no">&nbsp;</span>
447
450
  <span class="cline-any cline-no">&nbsp;</span>
451
+ <span class="cline-any cline-yes">4x</span>
452
+ <span class="cline-any cline-yes">4x</span>
453
+ <span class="cline-any cline-yes">4x</span>
454
+ <span class="cline-any cline-yes">4x</span>
455
+ <span class="cline-any cline-yes">4x</span>
456
+ <span class="cline-any cline-yes">4x</span>
457
+ <span class="cline-any cline-yes">4x</span>
458
+ <span class="cline-any cline-yes">4x</span>
448
459
  <span class="cline-any cline-no">&nbsp;</span>
449
460
  <span class="cline-any cline-no">&nbsp;</span>
450
461
  <span class="cline-any cline-no">&nbsp;</span>
462
+ <span class="cline-any cline-yes">4x</span>
451
463
  <span class="cline-any cline-no">&nbsp;</span>
452
464
  <span class="cline-any cline-no">&nbsp;</span>
453
465
  <span class="cline-any cline-no">&nbsp;</span>
466
+ <span class="cline-any cline-yes">4x</span>
467
+ <span class="cline-any cline-yes">4x</span>
468
+ <span class="cline-any cline-yes">4x</span>
454
469
  <span class="cline-any cline-no">&nbsp;</span>
455
470
  <span class="cline-any cline-no">&nbsp;</span>
456
471
  <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-yes">4x</span>
473
+ <span class="cline-any cline-yes">4x</span>
474
+ <span class="cline-any cline-yes">4x</span>
475
+ <span class="cline-any cline-yes">4x</span>
476
+ <span class="cline-any cline-yes">4x</span>
477
+ <span class="cline-any cline-yes">4x</span>
478
+ <span class="cline-any cline-yes">4x</span>
479
+ <span class="cline-any cline-yes">4x</span>
480
+ <span class="cline-any cline-yes">4x</span>
481
+ <span class="cline-any cline-yes">4x</span>
482
+ <span class="cline-any cline-yes">4x</span>
483
+ <span class="cline-any cline-yes">4x</span>
457
484
  <span class="cline-any cline-no">&nbsp;</span>
458
485
  <span class="cline-any cline-no">&nbsp;</span>
459
486
  <span class="cline-any cline-no">&nbsp;</span>
460
487
  <span class="cline-any cline-no">&nbsp;</span>
488
+ <span class="cline-any cline-yes">4x</span>
461
489
  <span class="cline-any cline-no">&nbsp;</span>
462
490
  <span class="cline-any cline-no">&nbsp;</span>
463
491
  <span class="cline-any cline-no">&nbsp;</span>
492
+ <span class="cline-any cline-yes">4x</span>
464
493
  <span class="cline-any cline-no">&nbsp;</span>
465
494
  <span class="cline-any cline-no">&nbsp;</span>
466
495
  <span class="cline-any cline-no">&nbsp;</span>
496
+ <span class="cline-any cline-yes">4x</span>
497
+ <span class="cline-any cline-yes">4x</span>
498
+ <span class="cline-any cline-yes">4x</span>
499
+ <span class="cline-any cline-yes">4x</span>
467
500
  <span class="cline-any cline-no">&nbsp;</span>
468
501
  <span class="cline-any cline-no">&nbsp;</span>
469
502
  <span class="cline-any cline-no">&nbsp;</span>
470
503
  <span class="cline-any cline-no">&nbsp;</span>
504
+ <span class="cline-any cline-yes">4x</span>
505
+ <span class="cline-any cline-yes">4x</span>
471
506
  <span class="cline-any cline-yes">1x</span>
472
507
  <span class="cline-any cline-yes">1x</span>
473
508
  <span class="cline-any cline-no">&nbsp;</span>
@@ -484,85 +519,85 @@
484
519
  <span class="cline-any cline-no">&nbsp;</span>
485
520
  <span class="cline-any cline-yes">1x</span>
486
521
  <span class="cline-any cline-yes">1x</span>
522
+ <span class="cline-any cline-yes">4x</span>
523
+ <span class="cline-any cline-yes">4x</span>
524
+ <span class="cline-any cline-yes">4x</span>
525
+ <span class="cline-any cline-yes">4x</span>
526
+ <span class="cline-any cline-yes">4x</span>
527
+ <span class="cline-any cline-yes">4x</span>
528
+ <span class="cline-any cline-yes">4x</span>
529
+ <span class="cline-any cline-yes">4x</span>
530
+ <span class="cline-any cline-yes">4x</span>
531
+ <span class="cline-any cline-yes">4x</span>
532
+ <span class="cline-any cline-yes">4x</span>
487
533
  <span class="cline-any cline-no">&nbsp;</span>
488
534
  <span class="cline-any cline-no">&nbsp;</span>
489
535
  <span class="cline-any cline-no">&nbsp;</span>
536
+ <span class="cline-any cline-yes">4x</span>
490
537
  <span class="cline-any cline-no">&nbsp;</span>
491
538
  <span class="cline-any cline-no">&nbsp;</span>
492
539
  <span class="cline-any cline-no">&nbsp;</span>
540
+ <span class="cline-any cline-yes">4x</span>
541
+ <span class="cline-any cline-yes">4x</span>
542
+ <span class="cline-any cline-yes">4x</span>
543
+ <span class="cline-any cline-yes">4x</span>
544
+ <span class="cline-any cline-yes">4x</span>
545
+ <span class="cline-any cline-yes">4x</span>
546
+ <span class="cline-any cline-yes">4x</span>
547
+ <span class="cline-any cline-yes">4x</span>
493
548
  <span class="cline-any cline-no">&nbsp;</span>
494
549
  <span class="cline-any cline-no">&nbsp;</span>
495
550
  <span class="cline-any cline-no">&nbsp;</span>
551
+ <span class="cline-any cline-yes">4x</span>
496
552
  <span class="cline-any cline-no">&nbsp;</span>
497
553
  <span class="cline-any cline-no">&nbsp;</span>
498
554
  <span class="cline-any cline-no">&nbsp;</span>
555
+ <span class="cline-any cline-yes">4x</span>
556
+ <span class="cline-any cline-yes">4x</span>
557
+ <span class="cline-any cline-yes">4x</span>
558
+ <span class="cline-any cline-yes">4x</span>
559
+ <span class="cline-any cline-yes">4x</span>
560
+ <span class="cline-any cline-yes">4x</span>
561
+ <span class="cline-any cline-yes">4x</span>
562
+ <span class="cline-any cline-yes">4x</span>
499
563
  <span class="cline-any cline-no">&nbsp;</span>
500
564
  <span class="cline-any cline-no">&nbsp;</span>
501
565
  <span class="cline-any cline-no">&nbsp;</span>
502
566
  <span class="cline-any cline-no">&nbsp;</span>
503
567
  <span class="cline-any cline-no">&nbsp;</span>
504
568
  <span class="cline-any cline-no">&nbsp;</span>
569
+ <span class="cline-any cline-yes">4x</span>
570
+ <span class="cline-any cline-yes">4x</span>
571
+ <span class="cline-any cline-yes">4x</span>
572
+ <span class="cline-any cline-yes">4x</span>
573
+ <span class="cline-any cline-yes">4x</span>
574
+ <span class="cline-any cline-yes">4x</span>
575
+ <span class="cline-any cline-yes">4x</span>
576
+ <span class="cline-any cline-yes">4x</span>
577
+ <span class="cline-any cline-yes">4x</span>
578
+ <span class="cline-any cline-yes">4x</span>
505
579
  <span class="cline-any cline-no">&nbsp;</span>
506
580
  <span class="cline-any cline-no">&nbsp;</span>
507
581
  <span class="cline-any cline-no">&nbsp;</span>
582
+ <span class="cline-any cline-yes">4x</span>
508
583
  <span class="cline-any cline-no">&nbsp;</span>
509
584
  <span class="cline-any cline-no">&nbsp;</span>
510
585
  <span class="cline-any cline-no">&nbsp;</span>
586
+ <span class="cline-any cline-yes">4x</span>
511
587
  <span class="cline-any cline-no">&nbsp;</span>
512
588
  <span class="cline-any cline-no">&nbsp;</span>
513
589
  <span class="cline-any cline-no">&nbsp;</span>
590
+ <span class="cline-any cline-yes">4x</span>
591
+ <span class="cline-any cline-yes">4x</span>
592
+ <span class="cline-any cline-yes">4x</span>
593
+ <span class="cline-any cline-yes">4x</span>
514
594
  <span class="cline-any cline-no">&nbsp;</span>
515
595
  <span class="cline-any cline-no">&nbsp;</span>
516
596
  <span class="cline-any cline-no">&nbsp;</span>
517
597
  <span class="cline-any cline-no">&nbsp;</span>
518
- <span class="cline-any cline-no">&nbsp;</span>
519
- <span class="cline-any cline-no">&nbsp;</span>
520
- <span class="cline-any cline-no">&nbsp;</span>
521
- <span class="cline-any cline-no">&nbsp;</span>
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
- <span class="cline-any cline-no">&nbsp;</span>
528
- <span class="cline-any cline-no">&nbsp;</span>
529
- <span class="cline-any cline-no">&nbsp;</span>
530
- <span class="cline-any cline-no">&nbsp;</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
- <span class="cline-any cline-no">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-no">&nbsp;</span>
537
- <span class="cline-any cline-no">&nbsp;</span>
538
- <span class="cline-any cline-no">&nbsp;</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
- <span class="cline-any cline-no">&nbsp;</span>
543
- <span class="cline-any cline-no">&nbsp;</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
- <span class="cline-any cline-no">&nbsp;</span>
549
- <span class="cline-any cline-no">&nbsp;</span>
550
- <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</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
- <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-yes">4x</span>
599
+ <span class="cline-any cline-yes">4x</span>
600
+ <span class="cline-any cline-yes">4x</span>
566
601
  <span class="cline-any cline-yes">1x</span>
567
602
  <span class="cline-any cline-yes">1x</span>
568
603
  <span class="cline-any cline-no">&nbsp;</span>
@@ -571,23 +606,41 @@
571
606
  <span class="cline-any cline-yes">1x</span>
572
607
  <span class="cline-any cline-yes">1x</span>
573
608
  <span class="cline-any cline-yes">1x</span>
609
+ <span class="cline-any cline-yes">1x</span>
610
+ <span class="cline-any cline-yes">29x</span>
574
611
  <span class="cline-any cline-yes">2x</span>
575
- <span class="cline-any cline-yes">2x</span>
576
- <span class="cline-any cline-yes">2x</span>
577
- <span class="cline-any cline-yes">2x</span>
578
- <span class="cline-any cline-yes">2x</span>
579
- <span class="cline-any cline-yes">2x</span>
580
- <span class="cline-any cline-yes">2x</span>
581
- <span class="cline-any cline-yes">2x</span>
582
- <span class="cline-any cline-yes">2x</span>
583
- <span class="cline-any cline-yes">2x</span>
584
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
585
- import { marshallComparisonFields, marshallTime, marshallBooleanFields, marshallNumberFields, marshallDateFields } from '../marshall.js'
612
+ <span class="cline-any cline-yes">29x</span>
613
+ <span class="cline-any cline-yes">17x</span>
614
+ <span class="cline-any cline-yes">17x</span>
615
+ <span class="cline-any cline-yes">17x</span>
616
+ <span class="cline-any cline-yes">17x</span>
617
+ <span class="cline-any cline-yes">6x</span>
618
+ <span class="cline-any cline-yes">6x</span>
619
+ <span class="cline-any cline-yes">6x</span>
620
+ <span class="cline-any cline-yes">6x</span>
621
+ <span class="cline-any cline-yes">17x</span>
622
+ <span class="cline-any cline-yes">11x</span>
623
+ <span class="cline-any cline-yes">11x</span>
624
+ <span class="cline-any cline-yes">17x</span>
625
+ <span class="cline-any cline-yes">17x</span>
626
+ <span class="cline-any cline-yes">29x</span>
627
+ <span class="cline-any cline-yes">1x</span>
628
+ <span class="cline-any cline-yes">1x</span>
629
+ <span class="cline-any cline-yes">1x</span>
630
+ <span class="cline-any cline-yes">6x</span>
631
+ <span class="cline-any cline-yes">16x</span>
632
+ <span class="cline-any cline-yes">16x</span>
633
+ <span class="cline-any cline-yes">16x</span>
634
+ <span class="cline-any cline-yes">6x</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
586
635
  import mongodb from 'mongodb'
636
+ import errors from '@feathersjs/errors'
587
637
  import makeDebug from 'debug'
638
+ import { marshallComparisonFields, marshallTime, marshallBooleanFields, marshallNumberFields, marshallDateFields } from '../marshall.js'
639
+ import { isValidObjectID, isObjectID } from '../db.js'
588
640
  import { makeDiacriticPattern } from '../../common/utils.js'
589
641
  &nbsp;
590
642
  const { ObjectID } = mongodb
643
+ const { Forbidden } = errors
591
644
  const debug = makeDebug('kdk:core:query:hooks')
592
645
  &nbsp;
593
646
  export <span class="fstat-no" title="function not covered" >function marshallTimeQuery (hook) {</span>
@@ -642,10 +695,17 @@ export function marshallHttpQuery (hook) {
642
695
  }
643
696
  &nbsp;
644
697
  export <span class="fstat-no" title="function not covered" >async function aggregationQuery (hook) {</span>
698
+ <span class="cstat-no" title="statement not covered" > if (hook.type !== 'before') {</span>
699
+ <span class="cstat-no" title="statement not covered" > throw new Error('The \'aggregationQuery\' hook should only be used as a \'before\' hook.')</span>
700
+ <span class="cstat-no" title="statement not covered" > }</span>
645
701
  <span class="cstat-no" title="statement not covered" > const query = hook.params.query</span>
646
702
  <span class="cstat-no" title="statement not covered" > if (!query) return</span>
647
703
  <span class="cstat-no" title="statement not covered" > const service = hook.service</span>
648
704
  <span class="cstat-no" title="statement not covered" > if (query.$aggregation) {</span>
705
+ <span class="cstat-no" title="statement not covered" > // Generic aggregation request could allow to disclose or update information in DB so that it should only be used through controlled internal calls</span>
706
+ <span class="cstat-no" title="statement not covered" > if (hook.params.provider) {</span>
707
+ <span class="cstat-no" title="statement not covered" > throw new Forbidden('You are not allowed to perform aggregation')</span>
708
+ <span class="cstat-no" title="statement not covered" > }</span>
649
709
  <span class="cstat-no" title="statement not covered" > const collection = service.Model</span>
650
710
  <span class="cstat-no" title="statement not covered" > // Set result to avoid service DB call</span>
651
711
  <span class="cstat-no" title="statement not covered" > hook.result = await collection.aggregate(query.$aggregation.pipeline, query.$aggregation.options).toArray()</span>
@@ -653,80 +713,80 @@ export <span class="fstat-no" title="function not covered" >async function aggre
653
713
  <span class="cstat-no" title="statement not covered" > return hook</span>
654
714
  <span class="cstat-no" title="statement not covered" >}</span>
655
715
  &nbsp;
656
- export <span class="fstat-no" title="function not covered" >function populateObject (options) {</span>
657
- <span class="cstat-no" title="statement not covered" > return async function (hook) {</span>
658
- <span class="cstat-no" title="statement not covered" > const app = hook.app</span>
659
- <span class="cstat-no" title="statement not covered" > const data = hook.data</span>
660
- <span class="cstat-no" title="statement not covered" > const params = hook.params</span>
661
- <span class="cstat-no" title="statement not covered" > const query = params.query</span>
662
- <span class="cstat-no" title="statement not covered" > const context = hook.service.context</span>
663
- <span class="cstat-no" title="statement not covered" > const idProperty = options.nameIdAs || options.idField</span>
664
- <span class="cstat-no" title="statement not covered" > const serviceProperty = options.nameServiceAs || options.serviceField</span>
665
- <span class="cstat-no" title="statement not covered" ></span>
666
- <span class="cstat-no" title="statement not covered" > // Check if not already done</span>
667
- <span class="cstat-no" title="statement not covered" > if (typeof _.get(params, idProperty) === 'object') {</span>
716
+ export function populateObject (options) {
717
+ return async function (hook) {
718
+ const app = hook.app
719
+ const data = hook.data
720
+ const params = hook.params
721
+ const query = params.query
722
+ const context = hook.service.context
723
+ const idProperty = options.nameIdAs || options.idField
724
+ const serviceProperty = options.nameServiceAs || options.serviceField
725
+ &nbsp;
726
+ // Check if not already done
727
+ if (typeof _.get(params, idProperty) === 'object') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
668
728
  <span class="cstat-no" title="statement not covered" > debug(`Skipping populating ${idProperty} as already done`)</span>
669
729
  <span class="cstat-no" title="statement not covered" > return hook</span>
670
730
  <span class="cstat-no" title="statement not covered" > }</span>
671
- <span class="cstat-no" title="statement not covered" > if (typeof _.get(params, serviceProperty) === 'object') {</span>
731
+ if (typeof _.get(params, serviceProperty) === 'object') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
672
732
  <span class="cstat-no" title="statement not covered" > debug(`Skipping populating ${serviceProperty} as already done`)</span>
673
733
  <span class="cstat-no" title="statement not covered" > return hook</span>
674
734
  <span class="cstat-no" title="statement not covered" > }</span>
675
- <span class="cstat-no" title="statement not covered" ></span>
676
- <span class="cstat-no" title="statement not covered" > // Get service where we can find the object to populate</span>
677
- <span class="cstat-no" title="statement not covered" > // Make hook usable with query params as well and service name or real object</span>
678
- <span class="cstat-no" title="statement not covered" > let service = _.get(data, options.serviceField) || _.get(query, options.serviceField)</span>
679
- <span class="cstat-no" title="statement not covered" > if (typeof service === 'string') {</span>
680
- <span class="cstat-no" title="statement not covered" > const message = `Cannot find the service for ${options.serviceField} = ${service} to dynamically populate.`</span>
681
- <span class="cstat-no" title="statement not covered" > service = app.getService(service, context)</span>
682
- <span class="cstat-no" title="statement not covered" > if (!service) {</span>
735
+ &nbsp;
736
+ // Get service where we can find the object to populate
737
+ // Make hook usable with query params as well and service name or real object
738
+ let service = _.get(data, options.serviceField) || _.get(query, options.serviceField)
739
+ if (typeof service === 'string') {
740
+ const message = `Cannot find the service for ${options.serviceField} = ${service} to dynamically populate.`
741
+ service = app.getService(service, context)
742
+ if (!service) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
683
743
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(message)</span>
684
744
  <span class="cstat-no" title="statement not covered" > else return hook</span>
685
745
  <span class="cstat-no" title="statement not covered" > }</span>
686
- <span class="cstat-no" title="statement not covered" > } else if (!service) {</span>
746
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else if (!service) {</span>
687
747
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(`No ${options.serviceField} given to dynamically populate.`)</span>
688
748
  <span class="cstat-no" title="statement not covered" > else return hook</span>
689
749
  <span class="cstat-no" title="statement not covered" > }</span>
690
- <span class="cstat-no" title="statement not covered" > // Then the object ID</span>
691
- <span class="cstat-no" title="statement not covered" > const id = _.get(data, options.idField) || _.get(query, options.idField) || _.get(hook, 'id')</span>
692
- <span class="cstat-no" title="statement not covered" > if (!id) {</span>
750
+ // Then the object ID
751
+ const id = _.get(data, options.idField) || _.get(query, options.idField) || _.get(hook, 'id')
752
+ if (!id) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
693
753
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(`Cannot find the ${options.idField} to dynamically populate.`)</span>
694
754
  <span class="cstat-no" title="statement not covered" > else return hook</span>
695
755
  <span class="cstat-no" title="statement not covered" > }</span>
696
- <span class="cstat-no" title="statement not covered" > debug(`Populating ${idProperty} with ID ${id}`)</span>
697
- <span class="cstat-no" title="statement not covered" > // Set the retrieved service on the same field or given one in hook params</span>
698
- <span class="cstat-no" title="statement not covered" > _.set(params, serviceProperty, service)</span>
699
- <span class="cstat-no" title="statement not covered" > // Let it work with id/name string or real object</span>
700
- <span class="cstat-no" title="statement not covered" > if (typeof id === 'string' || ObjectID.isValid(id)) {</span>
701
- <span class="cstat-no" title="statement not covered" > const args = { user: hook.params.user }</span>
702
- <span class="cstat-no" title="statement not covered" > let object</span>
703
- <span class="cstat-no" title="statement not covered" > try {</span>
704
- <span class="cstat-no" title="statement not covered" > // Get by ID or name ?</span>
705
- <span class="cstat-no" title="statement not covered" > if (ObjectID.isValid(id)) {</span>
706
- <span class="cstat-no" title="statement not covered" > object = await service.get(id.toString(), args)</span>
707
- <span class="cstat-no" title="statement not covered" > } else {</span>
756
+ debug(`Populating ${idProperty} with ID ${id}`)
757
+ // Set the retrieved service on the same field or given one in hook params
758
+ _.set(params, serviceProperty, service)
759
+ // Let it work with id/name string or real object
760
+ if (typeof id === 'string' || isObjectID(id)) {
761
+ const args = { user: hook.params.user }
762
+ let object
763
+ try {
764
+ // Get by ID or name ?
765
+ if (isObjectID(id) || isValidObjectID(id)) {
766
+ object = await service.get(id.toString(), args)
767
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
708
768
  <span class="cstat-no" title="statement not covered" > Object.assign(args, { query: { name: id.toString() }, paginate: false })</span>
709
769
  <span class="cstat-no" title="statement not covered" > const results = await service.find(args)</span>
710
770
  <span class="cstat-no" title="statement not covered" > if (results.length &gt;= 0) object = results[0]</span>
711
771
  <span class="cstat-no" title="statement not covered" > }</span>
712
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
772
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
713
773
  <span class="cstat-no" title="statement not covered" > // Not found error is managed hereafter</span>
714
774
  <span class="cstat-no" title="statement not covered" > if (error.code !== 404) throw error</span>
715
775
  <span class="cstat-no" title="statement not covered" > }</span>
716
- <span class="cstat-no" title="statement not covered" > if (!object) {</span>
776
+ if (!object) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
717
777
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(`Cannot find object with id ${id} to dynamically populate.`)</span>
718
778
  <span class="cstat-no" title="statement not covered" > else return hook</span>
719
779
  <span class="cstat-no" title="statement not covered" > }</span>
720
- <span class="cstat-no" title="statement not covered" > // Set the retrieved object on the same field or given one in hook params</span>
721
- <span class="cstat-no" title="statement not covered" > _.set(params, idProperty, object)</span>
722
- <span class="cstat-no" title="statement not covered" > return hook</span>
723
- <span class="cstat-no" title="statement not covered" > } else {</span>
780
+ // Set the retrieved object on the same field or given one in hook params
781
+ _.set(params, idProperty, object)
782
+ return hook
783
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
724
784
  <span class="cstat-no" title="statement not covered" > // Set the object on the same field or given one in hook params</span>
725
785
  <span class="cstat-no" title="statement not covered" > _.set(params, idProperty, id)</span>
726
786
  <span class="cstat-no" title="statement not covered" > return hook</span>
727
787
  <span class="cstat-no" title="statement not covered" > }</span>
728
- <span class="cstat-no" title="statement not covered" > }</span>
729
- <span class="cstat-no" title="statement not covered" >}</span>
788
+ }
789
+ }
730
790
  &nbsp;
731
791
  export <span class="fstat-no" title="function not covered" >function unpopulateObject (options) {</span>
732
792
  <span class="cstat-no" title="statement not covered" > return function (hook) {</span>
@@ -742,112 +802,127 @@ export <span class="fstat-no" title="function not covered" >function unpopulateO
742
802
  <span class="cstat-no" title="statement not covered" > }</span>
743
803
  <span class="cstat-no" title="statement not covered" >}</span>
744
804
  &nbsp;
745
- export <span class="fstat-no" title="function not covered" >function populateObjects (options) {</span>
746
- <span class="cstat-no" title="statement not covered" > return async function (hook) {</span>
747
- <span class="cstat-no" title="statement not covered" > const app = hook.app</span>
748
- <span class="cstat-no" title="statement not covered" > const data = hook.data</span>
749
- <span class="cstat-no" title="statement not covered" > const params = hook.params</span>
750
- <span class="cstat-no" title="statement not covered" > const query = params.query</span>
751
- <span class="cstat-no" title="statement not covered" > const context = hook.service.context</span>
752
- <span class="cstat-no" title="statement not covered" > const idProperty = options.nameIdAs || options.idField</span>
753
- <span class="cstat-no" title="statement not covered" > const serviceProperty = options.nameServiceAs || options.serviceField</span>
754
- <span class="cstat-no" title="statement not covered" ></span>
755
- <span class="cstat-no" title="statement not covered" > // Check if not already done</span>
756
- <span class="cstat-no" title="statement not covered" > if (Array.isArray(_.get(params, idProperty))) {</span>
805
+ export function populateObjects (options) {
806
+ return async function (hook) {
807
+ const app = hook.app
808
+ const data = hook.data
809
+ const params = hook.params
810
+ const query = params.query
811
+ const context = hook.service.context
812
+ const idProperty = options.nameIdAs || options.idField
813
+ const serviceProperty = options.nameServiceAs || options.serviceField
814
+ &nbsp;
815
+ // Check if not already done
816
+ if (Array.isArray(_.get(params, idProperty))) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
757
817
  <span class="cstat-no" title="statement not covered" > debug(`Skipping populating ${idProperty} as already done`)</span>
758
818
  <span class="cstat-no" title="statement not covered" > return hook</span>
759
819
  <span class="cstat-no" title="statement not covered" > }</span>
760
- <span class="cstat-no" title="statement not covered" > if (typeof _.get(params, serviceProperty) === 'object') {</span>
820
+ if (typeof _.get(params, serviceProperty) === 'object') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
761
821
  <span class="cstat-no" title="statement not covered" > debug(`Skipping populating ${serviceProperty} as already done`)</span>
762
822
  <span class="cstat-no" title="statement not covered" > return hook</span>
763
823
  <span class="cstat-no" title="statement not covered" > }</span>
764
- <span class="cstat-no" title="statement not covered" ></span>
765
- <span class="cstat-no" title="statement not covered" > // Get service where we can find the object to populate</span>
766
- <span class="cstat-no" title="statement not covered" > // Make hook usable with query params as well and service name or real object</span>
767
- <span class="cstat-no" title="statement not covered" > let service = _.get(data, options.serviceField) || _.get(query, options.serviceField)</span>
768
- <span class="cstat-no" title="statement not covered" > if (typeof service === 'string') {</span>
769
- <span class="cstat-no" title="statement not covered" > const message = `Cannot find the service for ${options.serviceField} = ${service} to dynamically populate.`</span>
770
- <span class="cstat-no" title="statement not covered" > service = app.getService(service, context)</span>
771
- <span class="cstat-no" title="statement not covered" > if (!service) {</span>
824
+ &nbsp;
825
+ // Get service where we can find the object to populate
826
+ // Make hook usable with query params as well and service name or real object
827
+ let service = _.get(data, options.serviceField) || _.get(query, options.serviceField)
828
+ if (typeof service === 'string') {
829
+ const message = `Cannot find the service for ${options.serviceField} = ${service} to dynamically populate.`
830
+ service = app.getService(service, context)
831
+ if (!service) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
772
832
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(message)</span>
773
833
  <span class="cstat-no" title="statement not covered" > else return hook</span>
774
834
  <span class="cstat-no" title="statement not covered" > }</span>
775
- <span class="cstat-no" title="statement not covered" > } else if (!service) {</span>
835
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else if (!service) {</span>
776
836
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(`No ${options.serviceField} given to dynamically populate.`)</span>
777
837
  <span class="cstat-no" title="statement not covered" > else return hook</span>
778
838
  <span class="cstat-no" title="statement not covered" > }</span>
779
- <span class="cstat-no" title="statement not covered" ></span>
780
- <span class="cstat-no" title="statement not covered" > // Set the retrieved service on the same field or given one in hook params</span>
781
- <span class="cstat-no" title="statement not covered" > _.set(params, serviceProperty, service)</span>
782
- <span class="cstat-no" title="statement not covered" ></span>
783
- <span class="cstat-no" title="statement not covered" > // Then the object ID</span>
784
- <span class="cstat-no" title="statement not covered" > const id = _.get(data, options.idField) || _.get(query, options.idField)</span>
785
- <span class="cstat-no" title="statement not covered" > // If no ID given we perform a find, no pagination to be sure we get all objects</span>
786
- <span class="cstat-no" title="statement not covered" > if (!id) {</span>
839
+ &nbsp;
840
+ // Set the retrieved service on the same field or given one in hook params
841
+ _.set(params, serviceProperty, service)
842
+ &nbsp;
843
+ // Then the object ID
844
+ const id = _.get(data, options.idField) || _.get(query, options.idField)
845
+ // If no ID given we perform a find, no pagination to be sure we get all objects
846
+ if (!id) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
787
847
  <span class="cstat-no" title="statement not covered" > debug(`Populating ${idProperty}`)</span>
788
848
  <span class="cstat-no" title="statement not covered" > const objects = await service.find({ query: {}, paginate: false, user: hook.params.user })</span>
789
849
  <span class="cstat-no" title="statement not covered" > // Set the retrieved objects on the same field or given one in hook params</span>
790
850
  <span class="cstat-no" title="statement not covered" > debug(`Populated ${objects.length} ${idProperty}`)</span>
791
851
  <span class="cstat-no" title="statement not covered" > _.set(params, idProperty, objects)</span>
792
852
  <span class="cstat-no" title="statement not covered" > return hook</span>
793
- <span class="cstat-no" title="statement not covered" > } else {</span>
794
- <span class="cstat-no" title="statement not covered" > debug(`Populating ${idProperty} with ID ${id}`)</span>
795
- <span class="cstat-no" title="statement not covered" > // Let it work with id/name string or real object</span>
796
- <span class="cstat-no" title="statement not covered" > if (typeof id === 'string' || ObjectID.isValid(id)) {</span>
797
- <span class="cstat-no" title="statement not covered" > let object</span>
798
- <span class="cstat-no" title="statement not covered" > try {</span>
799
- <span class="cstat-no" title="statement not covered" > // Get by ID or name ?</span>
800
- <span class="cstat-no" title="statement not covered" > if (ObjectID.isValid(id)) {</span>
801
- <span class="cstat-no" title="statement not covered" > object = await service.get(id.toString(), { user: hook.params.user })</span>
802
- <span class="cstat-no" title="statement not covered" > } else {</span>
853
+ } else {
854
+ debug(`Populating ${idProperty} with ID ${id}`)
855
+ // Let it work with id/name string or real object
856
+ if (typeof id === 'string' <span class="branch-0 cbranch-no" title="branch not covered" >|| isObjectID(id))</span> {
857
+ let object
858
+ try {
859
+ // Get by ID or name ?
860
+ if (isObjectID(id) || isValidObjectID(id)) {
861
+ object = await service.get(id.toString(), { user: hook.params.user })
862
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
803
863
  <span class="cstat-no" title="statement not covered" > const results = await service.find({ query: { name: id.toString() }, paginate: false, user: hook.params.user })</span>
804
864
  <span class="cstat-no" title="statement not covered" > if (results.length &gt;= 0) object = results[0]</span>
805
865
  <span class="cstat-no" title="statement not covered" > }</span>
806
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
866
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
807
867
  <span class="cstat-no" title="statement not covered" > // Not found error is managed hereafter</span>
808
868
  <span class="cstat-no" title="statement not covered" > if (error.code !== 404) throw error</span>
809
869
  <span class="cstat-no" title="statement not covered" > }</span>
810
- <span class="cstat-no" title="statement not covered" > if (!object) {</span>
870
+ if (!object) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
811
871
  <span class="cstat-no" title="statement not covered" > if (options.throwOnNotFound) throw new Error(`Cannot find ${options.idField} = ${id} to dynamically populate.`)</span>
812
872
  <span class="cstat-no" title="statement not covered" > else return hook</span>
813
873
  <span class="cstat-no" title="statement not covered" > }</span>
814
- <span class="cstat-no" title="statement not covered" > // Set the retrieved object on the same field or given one in hook params</span>
815
- <span class="cstat-no" title="statement not covered" > _.set(params, idProperty, [object])</span>
816
- <span class="cstat-no" title="statement not covered" > return hook</span>
817
- <span class="cstat-no" title="statement not covered" > } else {</span>
874
+ // Set the retrieved object on the same field or given one in hook params
875
+ _.set(params, idProperty, [object])
876
+ return hook
877
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
818
878
  <span class="cstat-no" title="statement not covered" > // Set the object on the same field or given one in hook params</span>
819
879
  <span class="cstat-no" title="statement not covered" > _.set(params, idProperty, [id])</span>
820
880
  <span class="cstat-no" title="statement not covered" > return hook</span>
821
881
  <span class="cstat-no" title="statement not covered" > }</span>
822
- <span class="cstat-no" title="statement not covered" > }</span>
823
- <span class="cstat-no" title="statement not covered" > }</span>
824
- <span class="cstat-no" title="statement not covered" >}</span>
882
+ }
883
+ }
884
+ }
825
885
  &nbsp;
826
886
  export <span class="fstat-no" title="function not covered" >function unpopulateObjects (options) {</span>
827
887
  <span class="cstat-no" title="statement not covered" > // These are similar behaviour</span>
828
888
  <span class="cstat-no" title="statement not covered" > return unpopulateObject(options)</span>
829
889
  <span class="cstat-no" title="statement not covered" >}</span>
830
890
  &nbsp;
831
- // Used to manage diacritic insensitive fuzzy search
832
- export function diacriticSearch (options = {}) {
833
- return hook =&gt; {
834
- const query = hook.params.query
835
- _.forOwn(query, (value, key) =&gt; {
836
- if (value.$regex &amp;&amp; value.$regex.source &amp;&amp; !value.$diacriticSensitive) {
891
+ // Recursively transform any $regex on object to a new $regex managing diacritics.
892
+ // Will flag the regex items with a diacritic property in order to avoid do it twice.
893
+ export function toDiacriticRegex(object) {
894
+ if (Array.isArray(object)) {
895
+ object.forEach(toDiacriticRegex)
896
+ } else if (typeof object === 'object') {
897
+ _.forOwn(object, (value, key) =&gt; {
898
+ if (!value) <span class="branch-0 cbranch-no" title="branch not covered" >return</span>
899
+ // Check if applicable
900
+ if (value.$regex &amp;&amp; !value.$regex.diacritic &amp;&amp; value.$regex.source &amp;&amp; !value.$diacriticSensitive) {
837
901
  // Take care to support as well case sensitivity by keeping flags
838
- query[key].$regex = new RegExp(makeDiacriticPattern(value.$regex.source), value.$regex.flags)
902
+ value.$regex = new RegExp(makeDiacriticPattern(value.$regex.source), value.$regex.flags)
903
+ // Custom internal property to make the hook reentrant
904
+ value.$regex.diacritic = true
905
+ } else {
906
+ toDiacriticRegex(value)
839
907
  }
840
908
  })
841
909
  }
842
910
  }
843
- &nbsp;</pre></td></tr></table></pre>
911
+ &nbsp;
912
+ // Used to manage diacritic insensitive fuzzy search
913
+ export function diacriticSearch (options = {}) {
914
+ return hook =&gt; {
915
+ const query = hook.params.query
916
+ if (query) toDiacriticRegex(query)
917
+ }
918
+ }</pre></td></tr></table></pre>
844
919
 
845
920
  <div class='push'></div><!-- for sticky footer -->
846
921
  </div><!-- /wrapper -->
847
922
  <div class='footer quiet pad2 space-top1 center small'>
848
923
  Code coverage generated by
849
924
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
850
- at 2024-08-13T10:02:04.872Z
925
+ at 2026-03-10T09:15:24.774Z
851
926
  </div>
852
927
  <script src="../../../prettify.js"></script>
853
928
  <script>