@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">45.2% </span>
26
+ <span class="strong">72.26% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>99/219</span>
28
+ <span class='fraction'>198/274</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">30% </span>
33
+ <span class="strong">66.66% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>3/10</span>
35
+ <span class='fraction'>22/33</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">20% </span>
40
+ <span class="strong">66.66% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>2/10</span>
42
+ <span class='fraction'>8/12</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">45.2% </span>
47
+ <span class="strong">72.26% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>99/219</span>
49
+ <span class='fraction'>198/274</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>
@@ -282,7 +282,62 @@
282
282
  <a name='L217'></a><a href='#L217'>217</a>
283
283
  <a name='L218'></a><a href='#L218'>218</a>
284
284
  <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
286
341
  <span class="cline-any cline-yes">1x</span>
287
342
  <span class="cline-any cline-yes">1x</span>
288
343
  <span class="cline-any cline-yes">1x</span>
@@ -303,35 +358,28 @@
303
358
  <span class="cline-any cline-yes">1x</span>
304
359
  <span class="cline-any cline-yes">1x</span>
305
360
  <span class="cline-any cline-yes">1x</span>
361
+ <span class="cline-any cline-yes">13x</span>
362
+ <span class="cline-any cline-yes">13x</span>
306
363
  <span class="cline-any cline-no">&nbsp;</span>
307
- <span class="cline-any cline-no">&nbsp;</span>
308
- <span class="cline-any cline-no">&nbsp;</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
- <span class="cline-any cline-no">&nbsp;</span>
311
- <span class="cline-any cline-no">&nbsp;</span>
312
- <span class="cline-any cline-no">&nbsp;</span>
313
- <span class="cline-any cline-no">&nbsp;</span>
314
- <span class="cline-any cline-no">&nbsp;</span>
315
- <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-yes">13x</span>
365
+ <span class="cline-any cline-yes">8x</span>
366
+ <span class="cline-any cline-yes">8x</span>
367
+ <span class="cline-any cline-yes">13x</span>
368
+ <span class="cline-any cline-yes">5x</span>
369
+ <span class="cline-any cline-yes">5x</span>
370
+ <span class="cline-any cline-yes">13x</span>
316
371
  <span class="cline-any cline-yes">1x</span>
317
372
  <span class="cline-any cline-yes">1x</span>
318
373
  <span class="cline-any cline-yes">1x</span>
374
+ <span class="cline-any cline-yes">13x</span>
375
+ <span class="cline-any cline-yes">13x</span>
376
+ <span class="cline-any cline-yes">2x</span>
377
+ <span class="cline-any cline-yes">2x</span>
378
+ <span class="cline-any cline-yes">2x</span>
379
+ <span class="cline-any cline-yes">13x</span>
380
+ <span class="cline-any cline-yes">13x</span>
381
+ <span class="cline-any cline-yes">1x</span>
319
382
  <span class="cline-any cline-yes">1x</span>
320
- <span class="cline-any cline-no">&nbsp;</span>
321
- <span class="cline-any cline-no">&nbsp;</span>
322
- <span class="cline-any cline-no">&nbsp;</span>
323
- <span class="cline-any cline-no">&nbsp;</span>
324
- <span class="cline-any cline-no">&nbsp;</span>
325
- <span class="cline-any cline-no">&nbsp;</span>
326
- <span class="cline-any cline-no">&nbsp;</span>
327
- <span class="cline-any cline-no">&nbsp;</span>
328
- <span class="cline-any cline-no">&nbsp;</span>
329
- <span class="cline-any cline-no">&nbsp;</span>
330
- <span class="cline-any cline-no">&nbsp;</span>
331
- <span class="cline-any cline-no">&nbsp;</span>
332
- <span class="cline-any cline-no">&nbsp;</span>
333
- <span class="cline-any cline-no">&nbsp;</span>
334
- <span class="cline-any cline-no">&nbsp;</span>
335
383
  <span class="cline-any cline-yes">1x</span>
336
384
  <span class="cline-any cline-yes">1x</span>
337
385
  <span class="cline-any cline-no">&nbsp;</span>
@@ -346,22 +394,11 @@
346
394
  <span class="cline-any cline-no">&nbsp;</span>
347
395
  <span class="cline-any cline-no">&nbsp;</span>
348
396
  <span class="cline-any cline-no">&nbsp;</span>
349
- <span class="cline-any cline-yes">1x</span>
350
- <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>
354
- <span class="cline-any cline-yes">1x</span>
355
- <span class="cline-any cline-yes">1x</span>
356
- <span class="cline-any cline-yes">1x</span>
357
- <span class="cline-any cline-yes">1x</span>
358
- <span class="cline-any cline-yes">1x</span>
359
- <span class="cline-any cline-yes">1x</span>
360
- <span class="cline-any cline-yes">1x</span>
361
- <span class="cline-any cline-yes">1x</span>
362
397
  <span class="cline-any cline-no">&nbsp;</span>
363
398
  <span class="cline-any cline-no">&nbsp;</span>
364
399
  <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-yes">1x</span>
401
+ <span class="cline-any cline-yes">1x</span>
365
402
  <span class="cline-any cline-no">&nbsp;</span>
366
403
  <span class="cline-any cline-no">&nbsp;</span>
367
404
  <span class="cline-any cline-no">&nbsp;</span>
@@ -377,6 +414,8 @@
377
414
  <span class="cline-any cline-no">&nbsp;</span>
378
415
  <span class="cline-any cline-no">&nbsp;</span>
379
416
  <span class="cline-any cline-no">&nbsp;</span>
417
+ <span class="cline-any cline-yes">1x</span>
418
+ <span class="cline-any cline-yes">1x</span>
380
419
  <span class="cline-any cline-no">&nbsp;</span>
381
420
  <span class="cline-any cline-no">&nbsp;</span>
382
421
  <span class="cline-any cline-no">&nbsp;</span>
@@ -398,19 +437,90 @@
398
437
  <span class="cline-any cline-no">&nbsp;</span>
399
438
  <span class="cline-any cline-yes">1x</span>
400
439
  <span class="cline-any cline-yes">1x</span>
440
+ <span class="cline-any cline-yes">1x</span>
441
+ <span class="cline-any cline-yes">1x</span>
442
+ <span class="cline-any cline-yes">1x</span>
443
+ <span class="cline-any cline-yes">1x</span>
444
+ <span class="cline-any cline-yes">1x</span>
445
+ <span class="cline-any cline-yes">1x</span>
446
+ <span class="cline-any cline-yes">1x</span>
447
+ <span class="cline-any cline-yes">1x</span>
448
+ <span class="cline-any cline-yes">1x</span>
449
+ <span class="cline-any cline-yes">1x</span>
450
+ <span class="cline-any cline-yes">1x</span>
451
+ <span class="cline-any cline-yes">44x</span>
452
+ <span class="cline-any cline-yes">44x</span>
453
+ <span class="cline-any cline-yes">44x</span>
454
+ <span class="cline-any cline-yes">44x</span>
455
+ <span class="cline-any cline-yes">44x</span>
456
+ <span class="cline-any cline-yes">44x</span>
457
+ <span class="cline-any cline-yes">44x</span>
458
+ <span class="cline-any cline-yes">44x</span>
401
459
  <span class="cline-any cline-no">&nbsp;</span>
402
460
  <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>
461
+ <span class="cline-any cline-yes">44x</span>
462
+ <span class="cline-any cline-yes">44x</span>
463
+ <span class="cline-any cline-yes">44x</span>
464
+ <span class="cline-any cline-yes">44x</span>
465
+ <span class="cline-any cline-yes">44x</span>
466
+ <span class="cline-any cline-yes">44x</span>
467
+ <span class="cline-any cline-yes">44x</span>
468
+ <span class="cline-any cline-yes">44x</span>
469
+ <span class="cline-any cline-yes">44x</span>
470
+ <span class="cline-any cline-yes">44x</span>
471
+ <span class="cline-any cline-yes">44x</span>
472
+ <span class="cline-any cline-yes">44x</span>
473
+ <span class="cline-any cline-yes">44x</span>
474
+ <span class="cline-any cline-yes">44x</span>
475
+ <span class="cline-any cline-yes">44x</span>
476
+ <span class="cline-any cline-yes">44x</span>
477
+ <span class="cline-any cline-yes">44x</span>
478
+ <span class="cline-any cline-yes">44x</span>
479
+ <span class="cline-any cline-yes">44x</span>
480
+ <span class="cline-any cline-yes">44x</span>
481
+ <span class="cline-any cline-yes">17x</span>
482
+ <span class="cline-any cline-yes">17x</span>
483
+ <span class="cline-any cline-yes">17x</span>
484
+ <span class="cline-any cline-yes">17x</span>
485
+ <span class="cline-any cline-yes">17x</span>
486
+ <span class="cline-any cline-yes">17x</span>
487
+ <span class="cline-any cline-yes">17x</span>
488
+ <span class="cline-any cline-yes">44x</span>
489
+ <span class="cline-any cline-yes">27x</span>
490
+ <span class="cline-any cline-yes">27x</span>
491
+ <span class="cline-any cline-yes">27x</span>
492
+ <span class="cline-any cline-yes">27x</span>
493
+ <span class="cline-any cline-yes">27x</span>
494
+ <span class="cline-any cline-yes">27x</span>
495
+ <span class="cline-any cline-yes">27x</span>
496
+ <span class="cline-any cline-yes">27x</span>
497
+ <span class="cline-any cline-yes">27x</span>
498
+ <span class="cline-any cline-yes">27x</span>
499
+ <span class="cline-any cline-yes">18x</span>
500
+ <span class="cline-any cline-yes">18x</span>
501
+ <span class="cline-any cline-yes">18x</span>
502
+ <span class="cline-any cline-yes">18x</span>
503
+ <span class="cline-any cline-yes">18x</span>
504
+ <span class="cline-any cline-yes">27x</span>
505
+ <span class="cline-any cline-yes">44x</span>
506
+ <span class="cline-any cline-yes">9x</span>
507
+ <span class="cline-any cline-yes">9x</span>
508
+ <span class="cline-any cline-yes">44x</span>
509
+ <span class="cline-any cline-yes">1x</span>
510
+ <span class="cline-any cline-yes">1x</span>
511
+ <span class="cline-any cline-yes">51x</span>
512
+ <span class="cline-any cline-yes">51x</span>
513
+ <span class="cline-any cline-yes">6x</span>
514
+ <span class="cline-any cline-yes">6x</span>
515
+ <span class="cline-any cline-yes">6x</span>
516
+ <span class="cline-any cline-yes">6x</span>
517
+ <span class="cline-any cline-yes">6x</span>
518
+ <span class="cline-any cline-yes">6x</span>
519
+ <span class="cline-any cline-yes">51x</span>
520
+ <span class="cline-any cline-yes">45x</span>
521
+ <span class="cline-any cline-yes">45x</span>
522
+ <span class="cline-any cline-yes">45x</span>
523
+ <span class="cline-any cline-yes">51x</span>
414
524
  <span class="cline-any cline-yes">1x</span>
415
525
  <span class="cline-any cline-yes">1x</span>
416
526
  <span class="cline-any cline-yes">1x</span>
@@ -432,109 +542,136 @@
432
542
  <span class="cline-any cline-yes">1x</span>
433
543
  <span class="cline-any cline-yes">1x</span>
434
544
  <span class="cline-any cline-yes">1x</span>
545
+ <span class="cline-any cline-yes">2x</span>
546
+ <span class="cline-any cline-yes">2x</span>
435
547
  <span class="cline-any cline-no">&nbsp;</span>
436
548
  <span class="cline-any cline-no">&nbsp;</span>
437
549
  <span class="cline-any cline-no">&nbsp;</span>
438
550
  <span class="cline-any cline-no">&nbsp;</span>
439
551
  <span class="cline-any cline-no">&nbsp;</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
- <span class="cline-any cline-no">&nbsp;</span>
444
- <span class="cline-any cline-no">&nbsp;</span>
445
- <span class="cline-any cline-yes">1x</span>
446
- <span class="cline-any cline-yes">1x</span>
447
- <span class="cline-any cline-yes">9x</span>
448
- <span class="cline-any cline-yes">9x</span>
449
- <span class="cline-any cline-yes">9x</span>
450
- <span class="cline-any cline-yes">9x</span>
451
- <span class="cline-any cline-yes">9x</span>
452
- <span class="cline-any cline-yes">9x</span>
453
- <span class="cline-any cline-yes">9x</span>
454
- <span class="cline-any cline-yes">9x</span>
455
- <span class="cline-any cline-yes">9x</span>
456
- <span class="cline-any cline-yes">9x</span>
457
- <span class="cline-any cline-yes">9x</span>
458
- <span class="cline-any cline-yes">9x</span>
459
- <span class="cline-any cline-yes">9x</span>
460
- <span class="cline-any cline-yes">9x</span>
461
- <span class="cline-any cline-yes">9x</span>
462
- <span class="cline-any cline-yes">9x</span>
463
- <span class="cline-any cline-no">&nbsp;</span>
464
- <span class="cline-any cline-no">&nbsp;</span>
465
- <span class="cline-any cline-yes">9x</span>
466
- <span class="cline-any cline-yes">9x</span>
467
- <span class="cline-any cline-yes">9x</span>
468
- <span class="cline-any cline-yes">9x</span>
469
- <span class="cline-any cline-yes">9x</span>
470
- <span class="cline-any cline-yes">9x</span>
471
- <span class="cline-any cline-no">&nbsp;</span>
472
- <span class="cline-any cline-no">&nbsp;</span>
473
- <span class="cline-any cline-yes">9x</span>
474
- <span class="cline-any cline-yes">9x</span>
475
- <span class="cline-any cline-yes">9x</span>
476
- <span class="cline-any cline-yes">9x</span>
477
- <span class="cline-any cline-yes">9x</span>
478
- <span class="cline-any cline-yes">1x</span>
479
- <span class="cline-any cline-yes">1x</span>
480
- <span class="cline-any cline-yes">1x</span>
481
- <span class="cline-any cline-yes">1x</span>
482
- <span class="cline-any cline-yes">1x</span>
483
- <span class="cline-any cline-yes">1x</span>
484
- <span class="cline-any cline-yes">1x</span>
485
- <span class="cline-any cline-yes">1x</span>
486
- <span class="cline-any cline-yes">1x</span>
487
- <span class="cline-any cline-yes">1x</span>
488
- <span class="cline-any cline-yes">1x</span>
489
- <span class="cline-any cline-yes">1x</span>
490
- <span class="cline-any cline-yes">1x</span>
552
+ <span class="cline-any cline-yes">2x</span>
553
+ <span class="cline-any cline-yes">2x</span>
554
+ <span class="cline-any cline-yes">2x</span>
491
555
  <span class="cline-any cline-yes">1x</span>
492
556
  <span class="cline-any cline-yes">1x</span>
557
+ <span class="cline-any cline-yes">11x</span>
558
+ <span class="cline-any cline-yes">11x</span>
559
+ <span class="cline-any cline-yes">11x</span>
560
+ <span class="cline-any cline-yes">11x</span>
561
+ <span class="cline-any cline-yes">11x</span>
562
+ <span class="cline-any cline-yes">11x</span>
563
+ <span class="cline-any cline-yes">11x</span>
564
+ <span class="cline-any cline-yes">11x</span>
565
+ <span class="cline-any cline-yes">11x</span>
566
+ <span class="cline-any cline-yes">11x</span>
567
+ <span class="cline-any cline-yes">11x</span>
568
+ <span class="cline-any cline-yes">11x</span>
569
+ <span class="cline-any cline-yes">11x</span>
570
+ <span class="cline-any cline-yes">11x</span>
571
+ <span class="cline-any cline-yes">11x</span>
572
+ <span class="cline-any cline-yes">11x</span>
493
573
  <span class="cline-any cline-no">&nbsp;</span>
494
574
  <span class="cline-any cline-no">&nbsp;</span>
575
+ <span class="cline-any cline-yes">11x</span>
576
+ <span class="cline-any cline-yes">11x</span>
577
+ <span class="cline-any cline-yes">11x</span>
578
+ <span class="cline-any cline-yes">11x</span>
579
+ <span class="cline-any cline-yes">11x</span>
580
+ <span class="cline-any cline-yes">11x</span>
495
581
  <span class="cline-any cline-no">&nbsp;</span>
496
582
  <span class="cline-any cline-no">&nbsp;</span>
583
+ <span class="cline-any cline-yes">11x</span>
584
+ <span class="cline-any cline-yes">11x</span>
585
+ <span class="cline-any cline-yes">11x</span>
586
+ <span class="cline-any cline-yes">11x</span>
587
+ <span class="cline-any cline-yes">11x</span>
588
+ <span class="cline-any cline-yes">17x</span>
589
+ <span class="cline-any cline-yes">17x</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>
594
+ <span class="cline-any cline-yes">4x</span>
595
+ <span class="cline-any cline-yes">4x</span>
596
+ <span class="cline-any cline-yes">4x</span>
597
+ <span class="cline-any cline-yes">4x</span>
598
+ <span class="cline-any cline-yes">4x</span>
599
+ <span class="cline-any cline-yes">17x</span>
600
+ <span class="cline-any cline-yes">4x</span>
601
+ <span class="cline-any cline-yes">4x</span>
602
+ <span class="cline-any cline-yes">4x</span>
497
603
  <span class="cline-any cline-yes">1x</span>
498
604
  <span class="cline-any cline-yes">1x</span>
499
605
  <span class="cline-any cline-yes">1x</span>
500
606
  <span class="cline-any cline-yes">1x</span>
501
- <span class="cline-any cline-yes">1x</span>
502
- <span class="cline-any cline-yes">9x</span>
503
- <span class="cline-any cline-yes">9x</span>
607
+ <span class="cline-any cline-yes">4x</span>
608
+ <span class="cline-any cline-yes">4x</span>
609
+ <span class="cline-any cline-yes">4x</span>
610
+ <span class="cline-any cline-yes">4x</span>
611
+ <span class="cline-any cline-yes">17x</span>
612
+ <span class="cline-any cline-yes">11x</span>
613
+ <span class="cline-any cline-yes">11x</span>
504
614
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import makeDebug from 'debug'
505
615
  import _ from 'lodash'
616
+ import qs from 'qs'
506
617
  import 'winston-daily-rotate-file'
507
618
  // import { RateLimiter } from 'limiter'
508
619
  import HttpLimiter from 'express-rate-limit'
509
- import mongodb from 'mongodb'
510
620
  import errors from '@feathersjs/errors'
511
621
  import { AuthenticationService, JWTStrategy } from '@feathersjs/authentication'
512
622
  import { LocalStrategy } from '@feathersjs/authentication-local'
513
623
  import OAuth from '@feathersjs/authentication-oauth'
514
624
  import PasswordValidator from 'password-validator'
625
+ import { isValidObjectID } from './db.js'
515
626
  &nbsp;
516
627
  const debug = makeDebug('kdk:core:authentication')
517
- const { ObjectID } = mongodb
518
628
  const { oauth, OAuthStrategy } = OAuth
519
629
  const { NotAuthenticated } = errors
520
630
  &nbsp;
521
631
  export class Authentication extends AuthenticationService {
522
632
  // Feathers does not seem to take input payload into account when renewing the token,
523
633
  // see https://github.com/feathersjs/feathers/issues/3419
524
- <span class="fstat-no" title="function not covered" > async getPayload (authResult, params) {</span>
525
- <span class="cstat-no" title="statement not covered" > // Params can override defaults</span>
526
- <span class="cstat-no" title="statement not covered" > if (params.payload) {</span>
634
+ async getPayload (authResult, params) {
635
+ // Params can override defaults
636
+ if (params.payload) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
527
637
  <span class="cstat-no" title="statement not covered" > return params.payload</span>
528
- <span class="cstat-no" title="statement not covered" > } else if (authResult.authentication &amp;&amp; authResult.authentication.payload) {</span>
529
- <span class="cstat-no" title="statement not covered" > // Avoid conflicting with default token options added when generating a new token</span>
530
- <span class="cstat-no" title="statement not covered" > return _.omit(authResult.authentication.payload, ['aud', 'iss', 'exp', 'sub', 'iat', 'jti', 'nbf'])</span>
531
- <span class="cstat-no" title="statement not covered" > } else {</span>
532
- <span class="cstat-no" title="statement not covered" > return {}</span>
533
- <span class="cstat-no" title="statement not covered" > }</span>
534
- <span class="cstat-no" title="statement not covered" > }</span>
638
+ } else if (authResult.authentication &amp;&amp; authResult.authentication.payload) {
639
+ // Avoid conflicting with default token options added when generating a new token
640
+ return _.omit(authResult.authentication.payload, ['aud', 'iss', 'exp', 'sub', 'iat', 'jti', 'nbf'])
641
+ } else {
642
+ return {}
643
+ }
644
+ }
645
+ &nbsp;
646
+ // Similarly the subject will not be set by Feathers for stateless tokens that do not target existing users.
647
+ async getTokenOptions (authResult, params) {
648
+ const jwtOptions = await super.getTokenOptions(authResult, params)
649
+ if (!jwtOptions.subject) {
650
+ const subject = _.get(authResult, 'authentication.payload.sub')
651
+ if (subject) jwtOptions.subject = subject
652
+ }
653
+ return jwtOptions
654
+ }
535
655
  }
536
656
  &nbsp;
537
657
  export class AuthenticationProviderStrategy extends OAuthStrategy {
658
+ <span class="fstat-no" title="function not covered" > setAuthentication (auth) {</span>
659
+ <span class="cstat-no" title="statement not covered" > super.setAuthentication(auth)</span>
660
+ <span class="cstat-no" title="statement not covered" > const authConfig = this.authentication.configuration</span>
661
+ <span class="cstat-no" title="statement not covered" > const { oauth } = authConfig</span>
662
+ <span class="cstat-no" title="statement not covered" > // Single logout supported ?</span>
663
+ <span class="cstat-no" title="statement not covered" > const { logout_url: logoutUrl, post_logout_url: postLogoutUrl, key } = this.configuration</span>
664
+ <span class="cstat-no" title="statement not covered" > if (logoutUrl &amp;&amp; key) {</span>
665
+ <span class="cstat-no" title="statement not covered" > // Cannot use oauth/:provider/logout route as oauth/:provider is already intercepted by feathers and this causes an error</span>
666
+ <span class="cstat-no" title="statement not covered" > this.app.get(`/oauth-logout/${this.name}`, (req, res) =&gt; {</span>
667
+ <span class="cstat-no" title="statement not covered" > return res.redirect(logoutUrl + '?' + qs.stringify({</span>
668
+ <span class="cstat-no" title="statement not covered" > post_logout_redirect_uri: postLogoutUrl || oauth.redirect,</span>
669
+ <span class="cstat-no" title="statement not covered" > client_id: key</span>
670
+ <span class="cstat-no" title="statement not covered" > }))</span>
671
+ <span class="cstat-no" title="statement not covered" > })</span>
672
+ <span class="cstat-no" title="statement not covered" > }</span>
673
+ <span class="cstat-no" title="statement not covered" > }</span>
674
+ &nbsp;
538
675
  <span class="fstat-no" title="function not covered" > async getEntityData (profile, entity) {</span>
539
676
  <span class="cstat-no" title="statement not covered" > const createEntity = _.isNil(entity)</span>
540
677
  <span class="cstat-no" title="statement not covered" > // Add provider Id</span>
@@ -553,6 +690,13 @@ export class AuthenticationProviderStrategy extends OAuthStrategy {
553
690
  <span class="cstat-no" title="statement not covered" > }</span>
554
691
  &nbsp;
555
692
  <span class="fstat-no" title="function not covered" > async getEntityQuery (profile) {</span>
693
+ <span class="cstat-no" title="statement not covered" > // Ensure the profile is right before requesting based on it</span>
694
+ <span class="cstat-no" title="statement not covered" > // as when an error is raised the profile will not contain any ID or email</span>
695
+ <span class="cstat-no" title="statement not covered" > // and we might build a request retrieving any user</span>
696
+ <span class="cstat-no" title="statement not covered" > if (!_.has(profile, 'id') &amp;&amp; !_.has(profile, 'sub') &amp;&amp; !_.has(profile, this.emailFieldInProfile || 'email')) {</span>
697
+ <span class="cstat-no" title="statement not covered" > // This ensure no user will be retrieved</span>
698
+ <span class="cstat-no" title="statement not covered" > return { $limit: 0 }</span>
699
+ <span class="cstat-no" title="statement not covered" > }</span>
556
700
  <span class="cstat-no" title="statement not covered" > const query = {</span>
557
701
  <span class="cstat-no" title="statement not covered" > $or: [</span>
558
702
  <span class="cstat-no" title="statement not covered" > { [`${this.name}Id`]: profile.id || profile.sub },</span>
@@ -577,59 +721,80 @@ export class AuthenticationProviderStrategy extends OAuthStrategy {
577
721
  // - a socket or a rest transport
578
722
  // It also supports token given as query parameter
579
723
  export class JWTAuthenticationStrategy extends JWTStrategy {
580
- <span class="fstat-no" title="function not covered" > async authenticate (authentication, params) {</span>
581
- <span class="cstat-no" title="statement not covered" > const { accessToken } = authentication</span>
582
- <span class="cstat-no" title="statement not covered" > const { entity } = this.configuration</span>
583
- <span class="cstat-no" title="statement not covered" > const renewJwt = _.get(this.configuration, 'renewJwt', true)</span>
584
- <span class="cstat-no" title="statement not covered" ></span>
585
- <span class="cstat-no" title="statement not covered" > if (!accessToken) {</span>
724
+ async authenticate (authentication, params) {
725
+ const { accessToken } = authentication
726
+ const authConfig = this.authentication.configuration
727
+ const { identityFields } = authConfig
728
+ const { entity } = this.configuration
729
+ const renewJwt = _.get(this.configuration, 'renewJwt', true)
730
+ const { provider, ...paramsWithoutProvider } = params
731
+ &nbsp;
732
+ if (!accessToken) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
586
733
  <span class="cstat-no" title="statement not covered" > throw new NotAuthenticated('No access token')</span>
587
734
  <span class="cstat-no" title="statement not covered" > }</span>
588
- <span class="cstat-no" title="statement not covered" ></span>
589
- <span class="cstat-no" title="statement not covered" > const payload = await this.authentication.verifyAccessToken(accessToken, params.jwt)</span>
590
- <span class="cstat-no" title="statement not covered" > const result = {</span>
591
- <span class="cstat-no" title="statement not covered" > // First key trick - by deleting the token here</span>
592
- <span class="cstat-no" title="statement not covered" > // we will get Feathers generate a new one</span>
593
- <span class="cstat-no" title="statement not covered" > // accessToken,</span>
594
- <span class="cstat-no" title="statement not covered" > authentication: {</span>
595
- <span class="cstat-no" title="statement not covered" > strategy: 'jwt',</span>
596
- <span class="cstat-no" title="statement not covered" > accessToken,</span>
597
- <span class="cstat-no" title="statement not covered" > payload</span>
598
- <span class="cstat-no" title="statement not covered" > }</span>
599
- <span class="cstat-no" title="statement not covered" > }</span>
600
- <span class="cstat-no" title="statement not covered" > if (!renewJwt) result.accessToken = accessToken</span>
601
- <span class="cstat-no" title="statement not covered" ></span>
602
- <span class="cstat-no" title="statement not covered" > // Second key trick</span>
603
- <span class="cstat-no" title="statement not covered" > // Return user attached to the token if any</span>
604
- <span class="cstat-no" title="statement not covered" > // Return basic information for a stateless token otherwise</span>
605
- <span class="cstat-no" title="statement not covered" > // As we only target MongoDB now, check for a valid ID otherwise assume a stateless token as well</span>
606
- <span class="cstat-no" title="statement not covered" > if (payload.sub &amp;&amp; ObjectID.isValid(payload.sub)) {</span>
607
- <span class="cstat-no" title="statement not covered" > const entityId = await this.getEntityId(result, params)</span>
608
- <span class="cstat-no" title="statement not covered" > const value = await this.getEntity(entityId, params)</span>
609
- <span class="cstat-no" title="statement not covered" ></span>
610
- <span class="cstat-no" title="statement not covered" > return {</span>
611
- <span class="cstat-no" title="statement not covered" > ...result,</span>
612
- <span class="cstat-no" title="statement not covered" > [entity]: value</span>
613
- <span class="cstat-no" title="statement not covered" > }</span>
614
- <span class="cstat-no" title="statement not covered" > }</span>
615
- <span class="cstat-no" title="statement not covered" ></span>
616
- <span class="cstat-no" title="statement not covered" > return result</span>
617
- <span class="cstat-no" title="statement not covered" > }</span>
618
735
  &nbsp;
619
- <span class="fstat-no" title="function not covered" > async parse (req) {</span>
620
- <span class="cstat-no" title="statement not covered" > const { jwt } = req.query</span>
621
- <span class="cstat-no" title="statement not covered" > if (jwt) {</span>
622
- <span class="cstat-no" title="statement not covered" > debug('Found parsed query value')</span>
623
- <span class="cstat-no" title="statement not covered" > delete req.query.jwt</span>
624
- <span class="cstat-no" title="statement not covered" > return {</span>
625
- <span class="cstat-no" title="statement not covered" > strategy: 'jwt',</span>
626
- <span class="cstat-no" title="statement not covered" > accessToken: jwt</span>
627
- <span class="cstat-no" title="statement not covered" > }</span>
628
- <span class="cstat-no" title="statement not covered" > } else {</span>
629
- <span class="cstat-no" title="statement not covered" > const result = await super.parse(req)</span>
630
- <span class="cstat-no" title="statement not covered" > return result</span>
631
- <span class="cstat-no" title="statement not covered" > }</span>
632
- <span class="cstat-no" title="statement not covered" > }</span>
736
+ const payload = await this.authentication.verifyAccessToken(accessToken, params.jwt)
737
+ const result = {
738
+ // First key trick - by deleting the token here
739
+ // we will get Feathers generate a new one
740
+ // accessToken,
741
+ authentication: {
742
+ strategy: 'jwt',
743
+ accessToken,
744
+ payload
745
+ }
746
+ }
747
+ if (!renewJwt) <span class="branch-0 cbranch-no" title="branch not covered" >result.accessToken = accessToken</span>
748
+ &nbsp;
749
+ // Second key trick
750
+ // Return user attached to the token if any
751
+ // Return basic information for a stateless token otherwise
752
+ if (payload.sub) {
753
+ // Check for a valid MongoDB ID
754
+ if (isValidObjectID(payload.sub)) {
755
+ const entityId = await this.getEntityId(result, params)
756
+ const value = await this.getEntity(entityId, params)
757
+ &nbsp;
758
+ return {
759
+ ...result,
760
+ [entity]: value
761
+ }
762
+ } else if (identityFields) {
763
+ // Otherwise use others fields to identify the user if defined
764
+ const query = {
765
+ $or: _.reduce(identityFields, (or, field) =&gt; or.concat([{ [field]: payload.sub }]), []),
766
+ $limit: 1
767
+ }
768
+ // Avoid sending provider to internal call as it might raises some issues with hooks relying on it otherwise
769
+ const response = await this.entityService.find({ ...paramsWithoutProvider, query })
770
+ const [value = null] = response.data ? response.data <span class="branch-0 cbranch-no" title="branch not covered" >: response</span>
771
+ // Otherwise assume a stateless token
772
+ if (value) {
773
+ return {
774
+ ...result,
775
+ [entity]: value
776
+ }
777
+ }
778
+ }
779
+ }
780
+ &nbsp;
781
+ return result
782
+ }
783
+ &nbsp;
784
+ async parse (req) {
785
+ const { jwt } = req.query
786
+ if (jwt) {
787
+ debug('Found parsed query value')
788
+ delete req.query.jwt
789
+ return {
790
+ strategy: 'jwt',
791
+ accessToken: jwt
792
+ }
793
+ } else {
794
+ const result = await super.parse(req)
795
+ return result
796
+ }
797
+ }
633
798
  }
634
799
  &nbsp;
635
800
  export <span class="fstat-no" title="function not covered" >async function createDefaultUsers () {</span>
@@ -650,17 +815,17 @@ export <span class="fstat-no" title="function not covered" >async function creat
650
815
  <span class="cstat-no" title="statement not covered" >}</span>
651
816
  &nbsp;
652
817
  // Middleware to be used to support jwt as a query param
653
- export <span class="fstat-no" title="function not covered" >function extractJwtFromQuery (req, res, next) {</span>
654
- <span class="cstat-no" title="statement not covered" > const { jwt } = req.query</span>
655
- <span class="cstat-no" title="statement not covered" > if (jwt) {</span>
818
+ export function extractJwtFromQuery (req, res, next) {
819
+ const { jwt } = req.query
820
+ if (jwt) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
656
821
  <span class="cstat-no" title="statement not covered" > _.set(req, 'feathers.authentication', {</span>
657
822
  <span class="cstat-no" title="statement not covered" > strategy: 'jwt',</span>
658
823
  <span class="cstat-no" title="statement not covered" > accessToken: jwt</span>
659
824
  <span class="cstat-no" title="statement not covered" > })</span>
660
825
  <span class="cstat-no" title="statement not covered" > }</span>
661
- <span class="cstat-no" title="statement not covered" ></span>
662
- <span class="cstat-no" title="statement not covered" > next()</span>
663
- <span class="cstat-no" title="statement not covered" >}</span>
826
+ &nbsp;
827
+ next()
828
+ }
664
829
  &nbsp;
665
830
  export default function auth (app) {
666
831
  const config = app.get('authentication')
@@ -695,7 +860,7 @@ export default function auth (app) {
695
860
  let validator
696
861
  app.getPasswordPolicy = function () {
697
862
  // Create on first access, should not be done outside a function because the app has not yet been correctly initialized
698
- if (validator) <span class="branch-0 cbranch-no" title="branch not covered" >return validator</span>
863
+ if (validator) return validator
699
864
  const { minLength, maxLength, uppercase, lowercase, digits, symbols, noSpaces, prohibited } = config.passwordPolicy
700
865
  &nbsp;
701
866
  validator = new PasswordValidator()
@@ -708,11 +873,11 @@ export default function auth (app) {
708
873
  if (noSpaces) <span class="branch-0 cbranch-no" title="branch not covered" >validator.not().spaces()</span>
709
874
  if (prohibited) validator.is().not().oneOf(prohibited)
710
875
  &nbsp;
711
- validator.comparePassword = <span class="fstat-no" title="function not covered" >function (entity, password) {</span>
712
- <span class="cstat-no" title="statement not covered" > const [localStrategy] = app.service(config.path).getStrategies('local')</span>
713
- <span class="cstat-no" title="statement not covered" ></span>
714
- <span class="cstat-no" title="statement not covered" > return localStrategy.comparePassword(entity, password)</span>
715
- <span class="cstat-no" title="statement not covered" > }</span>
876
+ validator.comparePassword = function (entity, password) {
877
+ const [localStrategy] = app.service(config.path).getStrategies('local')
878
+ &nbsp;
879
+ return localStrategy.comparePassword(entity, password)
880
+ }
716
881
  &nbsp;
717
882
  validator.options = config.passwordPolicy
718
883
  &nbsp;
@@ -727,7 +892,7 @@ export default function auth (app) {
727
892
  <div class='footer quiet pad2 space-top1 center small'>
728
893
  Code coverage generated by
729
894
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
730
- at 2024-08-13T10:02:04.843Z
895
+ at 2026-03-10T09:15:24.743Z
731
896
  </div>
732
897
  <script src="../../prettify.js"></script>
733
898
  <script>