@kalisio/kdk 2.6.2 → 2.6.3

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 (299) hide show
  1. package/client/css/core.variables.scss +72 -0
  2. package/client/i18n/core_en.json +744 -0
  3. package/client/i18n/core_fr.json +744 -0
  4. package/client/i18n/map_en.json +800 -0
  5. package/client/i18n/map_fr.json +800 -0
  6. package/client/kdk.client.css +47 -0
  7. package/client/kdk.client.js +41097 -0
  8. package/client/kdk.client.map.css +47 -0
  9. package/client/kdk.client.map.js +38182 -0
  10. package/client/kdk.client.map.min.css +1 -0
  11. package/client/kdk.client.map.min.js +27032 -0
  12. package/client/kdk.client.min.css +1 -0
  13. package/client/kdk.client.min.js +29074 -0
  14. package/client/schemas/capture.create.json +132 -0
  15. package/client/schemas/catalog.update.json +44 -0
  16. package/client/schemas/messages.update.json +16 -0
  17. package/client/schemas/projects.create.json +52 -0
  18. package/client/schemas/projects.update.json +52 -0
  19. package/client/schemas/settings.update.json +286 -0
  20. package/client/schemas/tags.update.json +35 -0
  21. package/client/schemas/users.update-profile.json +34 -0
  22. package/core/api/authentication.js +13 -1
  23. package/core/api/hooks/hooks.query.js +9 -0
  24. package/core/client/capabilities.js +6 -1
  25. package/core/client/components/KChip.vue +27 -6
  26. package/core/client/components/collection/KCard.vue +2 -2
  27. package/core/client/utils/utils.session.js +5 -1
  28. package/coverage/core/api/application.js.html +392 -398
  29. package/coverage/core/api/authentication.js.html +352 -187
  30. package/coverage/core/api/db.js.html +165 -126
  31. package/coverage/core/api/hooks/hooks.authentication.js.html +22 -196
  32. package/coverage/core/api/hooks/hooks.authorisations.js.html +383 -662
  33. package/coverage/core/api/hooks/hooks.logger.js.html +41 -41
  34. package/coverage/core/api/hooks/hooks.model.js.html +113 -101
  35. package/coverage/core/api/hooks/hooks.push.js.html +112 -97
  36. package/coverage/core/api/hooks/hooks.query.js.html +270 -222
  37. package/coverage/core/api/hooks/hooks.schemas.js.html +123 -123
  38. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  39. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  40. package/coverage/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  41. package/coverage/core/api/hooks/hooks.users.js.html +255 -447
  42. package/coverage/core/api/hooks/index.html +107 -122
  43. package/coverage/core/api/hooks/index.js.html +4 -10
  44. package/coverage/core/api/index.html +46 -61
  45. package/coverage/core/api/index.js.html +9 -9
  46. package/coverage/core/api/marshall.js.html +9 -9
  47. package/coverage/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  48. package/coverage/core/api/models/index.html +35 -50
  49. package/coverage/core/api/models/messages.model.mongodb.js.html +39 -27
  50. package/coverage/core/api/models/tags.model.mongodb.js.html +26 -32
  51. package/coverage/core/api/models/users.model.mongodb.js.html +10 -10
  52. package/coverage/core/api/services/account/account.hooks.js.html +5 -5
  53. package/coverage/core/api/services/account/account.service.js.html +127 -127
  54. package/coverage/core/api/services/account/index.html +22 -22
  55. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  56. package/coverage/core/api/services/authorisations/authorisations.service.js.html +213 -222
  57. package/coverage/core/api/services/authorisations/index.html +21 -21
  58. package/coverage/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  59. package/coverage/{lcov-report/core/api/services/groups → core/api/services/configurations}/index.html +8 -8
  60. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  61. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  62. package/coverage/core/api/services/databases/index.html +1 -1
  63. package/coverage/core/api/services/import-export/import-export.hooks.js.html +76 -76
  64. package/coverage/core/api/services/import-export/import-export.service.js.html +32 -32
  65. package/coverage/core/api/services/import-export/index.html +32 -32
  66. package/coverage/core/api/services/index.html +21 -21
  67. package/coverage/core/api/services/index.js.html +313 -142
  68. package/coverage/core/api/services/mailer/index.html +32 -32
  69. package/coverage/core/api/services/mailer/mailer.hooks.js.html +80 -80
  70. package/coverage/core/api/services/mailer/mailer.service.js.html +32 -32
  71. package/coverage/core/api/services/messages/index.html +21 -21
  72. package/coverage/core/api/services/messages/messages.hooks.js.html +112 -76
  73. package/coverage/core/api/services/push/index.html +32 -32
  74. package/coverage/core/api/services/push/push.hooks.js.html +80 -80
  75. package/coverage/core/api/services/push/push.service.js.html +34 -34
  76. package/coverage/core/api/services/storage/index.html +29 -29
  77. package/coverage/core/api/services/storage/storage.hooks.js.html +80 -80
  78. package/coverage/core/api/services/storage/storage.service.js.html +29 -29
  79. package/coverage/core/api/services/tags/index.html +21 -21
  80. package/coverage/core/api/services/tags/tags.hooks.js.html +119 -71
  81. package/coverage/core/api/services/users/index.html +27 -12
  82. package/coverage/core/api/services/users/users.hooks.js.html +14 -11
  83. package/coverage/core/api/services/users/users.service.js.html +100 -0
  84. package/coverage/core/common/errors.js.html +1 -1
  85. package/coverage/core/common/index.html +42 -27
  86. package/coverage/core/common/index.js.html +1 -1
  87. package/coverage/core/common/permissions.js.html +166 -472
  88. package/coverage/core/common/schema.js.html +4 -4
  89. package/coverage/core/common/utils.js.html +31 -25
  90. package/coverage/core/common/utils.offline.js.html +199 -0
  91. package/coverage/index.html +192 -192
  92. package/coverage/lcov-report/core/api/application.js.html +392 -398
  93. package/coverage/lcov-report/core/api/authentication.js.html +352 -187
  94. package/coverage/lcov-report/core/api/db.js.html +165 -126
  95. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +22 -196
  96. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +383 -662
  97. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +41 -41
  98. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +113 -101
  99. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +112 -97
  100. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +270 -222
  101. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +123 -123
  102. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  103. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  104. package/coverage/lcov-report/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  105. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +255 -447
  106. package/coverage/lcov-report/core/api/hooks/index.html +107 -122
  107. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  108. package/coverage/lcov-report/core/api/index.html +46 -61
  109. package/coverage/lcov-report/core/api/index.js.html +9 -9
  110. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  111. package/coverage/lcov-report/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  112. package/coverage/lcov-report/core/api/models/index.html +35 -50
  113. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +39 -27
  114. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +26 -32
  115. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +10 -10
  116. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +5 -5
  117. package/coverage/lcov-report/core/api/services/account/account.service.js.html +127 -127
  118. package/coverage/lcov-report/core/api/services/account/index.html +22 -22
  119. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  120. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +213 -222
  121. package/coverage/lcov-report/core/api/services/authorisations/index.html +21 -21
  122. package/coverage/lcov-report/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  123. package/coverage/{core/api/services/groups → lcov-report/core/api/services/configurations}/index.html +8 -8
  124. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  125. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  126. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  127. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +76 -76
  128. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +32 -32
  129. package/coverage/lcov-report/core/api/services/import-export/index.html +32 -32
  130. package/coverage/lcov-report/core/api/services/index.html +21 -21
  131. package/coverage/lcov-report/core/api/services/index.js.html +313 -142
  132. package/coverage/lcov-report/core/api/services/mailer/index.html +32 -32
  133. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +80 -80
  134. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +32 -32
  135. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  136. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +112 -76
  137. package/coverage/lcov-report/core/api/services/push/index.html +32 -32
  138. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +80 -80
  139. package/coverage/lcov-report/core/api/services/push/push.service.js.html +34 -34
  140. package/coverage/lcov-report/core/api/services/storage/index.html +29 -29
  141. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +80 -80
  142. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +29 -29
  143. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  144. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +119 -71
  145. package/coverage/lcov-report/core/api/services/users/index.html +27 -12
  146. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +14 -11
  147. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  148. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  149. package/coverage/lcov-report/core/common/index.html +42 -27
  150. package/coverage/lcov-report/core/common/index.js.html +1 -1
  151. package/coverage/lcov-report/core/common/permissions.js.html +166 -472
  152. package/coverage/lcov-report/core/common/schema.js.html +4 -4
  153. package/coverage/lcov-report/core/common/utils.js.html +31 -25
  154. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  155. package/coverage/lcov-report/index.html +192 -192
  156. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +169 -31
  157. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  158. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +32 -32
  159. package/coverage/lcov-report/map/api/hooks/index.html +5 -5
  160. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  161. package/coverage/lcov-report/map/api/index.html +1 -1
  162. package/coverage/lcov-report/map/api/index.js.html +1 -1
  163. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  164. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  165. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +82 -7
  166. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  167. package/coverage/lcov-report/map/api/models/index.html +22 -7
  168. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  169. package/coverage/lcov-report/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  170. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  171. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  172. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  173. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +39 -12
  174. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  175. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  176. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  177. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +86 -11
  178. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  179. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  180. package/coverage/lcov-report/map/api/services/index.html +5 -5
  181. package/coverage/lcov-report/map/api/services/index.js.html +326 -50
  182. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  183. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  184. package/coverage/{core/api/services/organisations → lcov-report/map/api/services/styles}/index.html +10 -25
  185. package/coverage/{core/api/services/organisations/organisations.hooks.js.html → lcov-report/map/api/services/styles/styles.hooks.js.html} +45 -12
  186. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  187. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  188. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +7 -10
  189. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  190. package/coverage/lcov-report/map/common/index.html +19 -19
  191. package/coverage/lcov-report/map/common/index.js.html +1 -1
  192. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  193. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  194. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  195. package/coverage/lcov-report/map/common/opendap-utils.js.html +4 -7
  196. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  197. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  198. package/coverage/lcov-report/map/common/tms-utils.js.html +9 -12
  199. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  200. package/coverage/lcov-report/map/common/wcs-utils.js.html +12 -15
  201. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +2 -2
  202. package/coverage/lcov-report/map/common/wfs-utils.js.html +14 -17
  203. package/coverage/lcov-report/map/common/wms-utils.js.html +30 -12
  204. package/coverage/lcov-report/map/common/wmts-utils.js.html +10 -13
  205. package/coverage/lcov.info +4172 -3909
  206. package/coverage/map/api/hooks/hooks.catalog.js.html +169 -31
  207. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  208. package/coverage/map/api/hooks/hooks.query.js.html +32 -32
  209. package/coverage/map/api/hooks/index.html +5 -5
  210. package/coverage/map/api/hooks/index.js.html +1 -1
  211. package/coverage/map/api/index.html +1 -1
  212. package/coverage/map/api/index.js.html +1 -1
  213. package/coverage/map/api/marshall.js.html +1 -1
  214. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  215. package/coverage/map/api/models/catalog.model.mongodb.js.html +82 -7
  216. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  217. package/coverage/map/api/models/index.html +22 -7
  218. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  219. package/coverage/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  220. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  221. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  222. package/coverage/map/api/services/alerts/index.html +1 -1
  223. package/coverage/map/api/services/catalog/catalog.hooks.js.html +39 -12
  224. package/coverage/map/api/services/catalog/index.html +5 -5
  225. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  226. package/coverage/map/api/services/daptiles/index.html +1 -1
  227. package/coverage/map/api/services/features/features.hooks.js.html +86 -11
  228. package/coverage/map/api/services/features/features.service.js.html +307 -4
  229. package/coverage/map/api/services/features/index.html +7 -7
  230. package/coverage/map/api/services/index.html +5 -5
  231. package/coverage/map/api/services/index.js.html +326 -50
  232. package/coverage/map/api/services/projects/index.html +1 -1
  233. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  234. package/coverage/{lcov-report/core/api/services/organisations → map/api/services/styles}/index.html +10 -25
  235. package/coverage/{lcov-report/core/api/services/organisations/organisations.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  236. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  237. package/coverage/map/common/errors.js.html +1 -1
  238. package/coverage/map/common/geotiff-grid-source.js.html +7 -10
  239. package/coverage/map/common/grid.js.html +1 -1
  240. package/coverage/map/common/index.html +19 -19
  241. package/coverage/map/common/index.js.html +1 -1
  242. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  243. package/coverage/map/common/moment-utils.js.html +1 -1
  244. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  245. package/coverage/map/common/opendap-utils.js.html +4 -7
  246. package/coverage/map/common/permissions.js.html +10 -4
  247. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  248. package/coverage/map/common/tms-utils.js.html +9 -12
  249. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  250. package/coverage/map/common/wcs-utils.js.html +12 -15
  251. package/coverage/map/common/weacast-grid-source.js.html +2 -2
  252. package/coverage/map/common/wfs-utils.js.html +14 -17
  253. package/coverage/map/common/wms-utils.js.html +30 -12
  254. package/coverage/map/common/wmts-utils.js.html +10 -13
  255. package/coverage/tmp/coverage-222524-1765963609350-0.json +1 -0
  256. package/coverage/tmp/coverage-222536-1765963609335-0.json +1 -0
  257. package/coverage/tmp/coverage-222547-1765963609324-0.json +1 -0
  258. package/coverage/tmp/coverage-222559-1765963609309-0.json +1 -0
  259. package/coverage/tmp/coverage-222566-1765963609278-0.json +1 -0
  260. package/map/api/hooks/hooks.query.js +60 -0
  261. package/map/client/components/stickies/KZoomControl.vue +17 -9
  262. package/map/client/i18n/map_en.json +6 -0
  263. package/map/client/i18n/map_fr.json +6 -0
  264. package/map/client/mixins/map/mixin.base-map.js +19 -1
  265. package/package.json +2 -2
  266. package/scripts/kash/CHANGELOG.md +4 -0
  267. package/scripts/kash/LICENSE +21 -0
  268. package/scripts/kash/README.md +9 -0
  269. package/scripts/kash/kash.sh +40 -45
  270. package/scripts/kash/scripts/run_tests.sh +4 -1
  271. package/test/api/core/config/default.cjs +1 -0
  272. package/test/api/core/test-log-2025-07-31.log +15 -0
  273. package/test/api/core/{test-log-2024-04-23.log → test-log-2025-10-03.log} +4 -9
  274. package/test/api/core/test-log-2025-11-12.log +117 -0
  275. package/test/api/core/test-log-2025-11-27.log +0 -0
  276. package/test/api/core/test-log-2025-11-28.log +17 -0
  277. package/test/api/core/test-log-2025-12-09.log +148 -0
  278. package/test/api/core/test-log-2025-12-17.log +58 -0
  279. package/test/api/core/test-log-2026-01-29.log +17 -0
  280. package/test/api/map/index.test.js +21 -0
  281. package/test/api/map/test-log-2025-07-23.log +1 -0
  282. package/test/api/map/test-log-2025-11-28.log +33 -0
  283. package/test/api/map/test-log-2025-12-10.log +2 -0
  284. package/test/api/map/test-log-2026-01-06.log +26 -0
  285. package/.vscode/settings.json +0 -5
  286. package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
  287. package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
  288. package/coverage/core/api/utils.js.html +0 -118
  289. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
  290. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
  291. package/coverage/lcov-report/core/api/utils.js.html +0 -118
  292. package/coverage/tmp/coverage-151166-1723543324307-0.json +0 -1
  293. package/coverage/tmp/coverage-151178-1723543324283-0.json +0 -1
  294. package/coverage/tmp/coverage-151189-1723543324271-0.json +0 -1
  295. package/coverage/tmp/coverage-151201-1723543324248-0.json +0 -1
  296. package/coverage/tmp/coverage-151208-1723543324227-0.json +0 -1
  297. package/test/api/core/test-log-2024-04-22.log +0 -84
  298. package/test/api/core/test-log-2024-08-13.log +0 -3
  299. /package/test/api/{map/test-log-2025-03-08.log → core/test-log-2025-11-10.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">19.64% </span>
26
+ <span class="strong">85.24% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>11/56</span>
28
+ <span class='fraction'>52/61</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">71.42% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>1/1</span>
35
+ <span class='fraction'>10/14</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">100% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/2</span>
42
+ <span class='fraction'>2/2</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">19.64% </span>
47
+ <span class="strong">85.24% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>11/56</span>
49
+ <span class='fraction'>52/61</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 high'></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>
@@ -119,7 +119,12 @@
119
119
  <a name='L54'></a><a href='#L54'>54</a>
120
120
  <a name='L55'></a><a href='#L55'>55</a>
121
121
  <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
123
128
  <span class="cline-any cline-yes">1x</span>
124
129
  <span class="cline-any cline-yes">1x</span>
125
130
  <span class="cline-any cline-yes">1x</span>
@@ -128,53 +133,58 @@
128
133
  <span class="cline-any cline-yes">1x</span>
129
134
  <span class="cline-any cline-yes">1x</span>
130
135
  <span class="cline-any cline-yes">1x</span>
131
- <span class="cline-any cline-no">&nbsp;</span>
132
- <span class="cline-any cline-no">&nbsp;</span>
136
+ <span class="cline-any cline-yes">2x</span>
137
+ <span class="cline-any cline-yes">2x</span>
133
138
  <span class="cline-any cline-yes">1x</span>
134
139
  <span class="cline-any cline-yes">1x</span>
135
- <span class="cline-any cline-no">&nbsp;</span>
136
- <span class="cline-any cline-no">&nbsp;</span>
137
- <span class="cline-any cline-no">&nbsp;</span>
138
- <span class="cline-any cline-no">&nbsp;</span>
139
- <span class="cline-any cline-no">&nbsp;</span>
140
- <span class="cline-any cline-no">&nbsp;</span>
141
- <span class="cline-any cline-no">&nbsp;</span>
142
- <span class="cline-any cline-no">&nbsp;</span>
143
- <span class="cline-any cline-no">&nbsp;</span>
144
- <span class="cline-any cline-no">&nbsp;</span>
145
- <span class="cline-any cline-no">&nbsp;</span>
146
- <span class="cline-any cline-no">&nbsp;</span>
147
- <span class="cline-any cline-no">&nbsp;</span>
148
- <span class="cline-any cline-no">&nbsp;</span>
149
- <span class="cline-any cline-no">&nbsp;</span>
150
- <span class="cline-any cline-no">&nbsp;</span>
151
- <span class="cline-any cline-no">&nbsp;</span>
152
- <span class="cline-any cline-no">&nbsp;</span>
153
- <span class="cline-any cline-no">&nbsp;</span>
154
- <span class="cline-any cline-no">&nbsp;</span>
155
- <span class="cline-any cline-no">&nbsp;</span>
156
- <span class="cline-any cline-no">&nbsp;</span>
157
- <span class="cline-any cline-no">&nbsp;</span>
158
- <span class="cline-any cline-no">&nbsp;</span>
159
- <span class="cline-any cline-no">&nbsp;</span>
160
- <span class="cline-any cline-no">&nbsp;</span>
161
- <span class="cline-any cline-no">&nbsp;</span>
162
- <span class="cline-any cline-no">&nbsp;</span>
163
- <span class="cline-any cline-no">&nbsp;</span>
164
- <span class="cline-any cline-no">&nbsp;</span>
165
- <span class="cline-any cline-no">&nbsp;</span>
166
- <span class="cline-any cline-no">&nbsp;</span>
167
- <span class="cline-any cline-no">&nbsp;</span>
168
- <span class="cline-any cline-no">&nbsp;</span>
169
- <span class="cline-any cline-no">&nbsp;</span>
170
- <span class="cline-any cline-no">&nbsp;</span>
171
- <span class="cline-any cline-no">&nbsp;</span>
172
- <span class="cline-any cline-no">&nbsp;</span>
173
- <span class="cline-any cline-no">&nbsp;</span>
174
- <span class="cline-any cline-no">&nbsp;</span>
175
- <span class="cline-any cline-no">&nbsp;</span>
176
- <span class="cline-any cline-no">&nbsp;</span>
177
- <span class="cline-any cline-no">&nbsp;</span>
140
+ <span class="cline-any cline-yes">17x</span>
141
+ <span class="cline-any cline-no">&nbsp;</span>
142
+ <span class="cline-any cline-no">&nbsp;</span>
143
+ <span class="cline-any cline-yes">17x</span>
144
+ <span class="cline-any cline-yes">17x</span>
145
+ <span class="cline-any cline-yes">17x</span>
146
+ <span class="cline-any cline-yes">17x</span>
147
+ <span class="cline-any cline-yes">17x</span>
148
+ <span class="cline-any cline-yes">17x</span>
149
+ <span class="cline-any cline-yes">17x</span>
150
+ <span class="cline-any cline-yes">17x</span>
151
+ <span class="cline-any cline-yes">6x</span>
152
+ <span class="cline-any cline-yes">6x</span>
153
+ <span class="cline-any cline-yes">17x</span>
154
+ <span class="cline-any cline-yes">2x</span>
155
+ <span class="cline-any cline-yes">2x</span>
156
+ <span class="cline-any cline-no">&nbsp;</span>
157
+ <span class="cline-any cline-yes">2x</span>
158
+ <span class="cline-any cline-yes">17x</span>
159
+ <span class="cline-any cline-no">&nbsp;</span>
160
+ <span class="cline-any cline-no">&nbsp;</span>
161
+ <span class="cline-any cline-no">&nbsp;</span>
162
+ <span class="cline-any cline-yes">2x</span>
163
+ <span class="cline-any cline-yes">2x</span>
164
+ <span class="cline-any cline-yes">2x</span>
165
+ <span class="cline-any cline-yes">2x</span>
166
+ <span class="cline-any cline-yes">2x</span>
167
+ <span class="cline-any cline-yes">17x</span>
168
+ <span class="cline-any cline-yes">17x</span>
169
+ <span class="cline-any cline-yes">17x</span>
170
+ <span class="cline-any cline-yes">17x</span>
171
+ <span class="cline-any cline-yes">17x</span>
172
+ <span class="cline-any cline-yes">17x</span>
173
+ <span class="cline-any cline-yes">17x</span>
174
+ <span class="cline-any cline-yes">17x</span>
175
+ <span class="cline-any cline-yes">17x</span>
176
+ <span class="cline-any cline-yes">17x</span>
177
+ <span class="cline-any cline-yes">17x</span>
178
+ <span class="cline-any cline-yes">17x</span>
179
+ <span class="cline-any cline-yes">2x</span>
180
+ <span class="cline-any cline-yes">2x</span>
181
+ <span class="cline-any cline-yes">2x</span>
182
+ <span class="cline-any cline-yes">2x</span>
183
+ <span class="cline-any cline-yes">17x</span>
184
+ <span class="cline-any cline-no">&nbsp;</span>
185
+ <span class="cline-any cline-no">&nbsp;</span>
186
+ <span class="cline-any cline-no">&nbsp;</span>
187
+ <span class="cline-any cline-yes">17x</span>
178
188
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import emails from 'email-templates'
179
189
  import path from 'path'
180
190
  import makeDebug from 'debug'
@@ -183,54 +193,59 @@ import _ from 'lodash'
183
193
  const debug = makeDebug('kdk:core:push:hooks')
184
194
  &nbsp;
185
195
  // Helper functions to be used in iff hooks
186
- export <span class="fstat-no" title="function not covered" >function disallowExternalPush (hook) {</span>
187
- <span class="cstat-no" title="statement not covered" > return _.get(hook.app.get('push'), 'disallowExternalPush', true)</span>
188
- <span class="cstat-no" title="statement not covered" >}</span>
196
+ export function disallowExternalPush (hook) {
197
+ return _.get(hook.app.get('push'), 'disallowExternalPush', true)
198
+ }
189
199
  &nbsp;
190
- export <span class="fstat-no" title="function not covered" >async function sendNewSubscriptionEmail (hook) {</span>
191
- <span class="cstat-no" title="statement not covered" > if (hook.type !== 'after') {</span>
200
+ export async function sendNewSubscriptionEmail (hook) {
201
+ if (hook.type !== 'after') <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
192
202
  <span class="cstat-no" title="statement not covered" > throw new Error('The \'sendNewSubscriptionEmail\' hook should only be used as a \'after\' hook.')</span>
193
203
  <span class="cstat-no" title="statement not covered" > }</span>
194
- <span class="cstat-no" title="statement not covered" ></span>
195
- <span class="cstat-no" title="statement not covered" > // Check for a new subscription if any</span>
196
- <span class="cstat-no" title="statement not covered" > const updatedUser = hook.result</span>
197
- <span class="cstat-no" title="statement not covered" > const previousUser = hook.params.user</span>
198
- <span class="cstat-no" title="statement not covered" > // If we can't compare abort, eg f-a-m might patch user to update tokens</span>
199
- <span class="cstat-no" title="statement not covered" > if (!updatedUser || !previousUser) return hook</span>
200
- <span class="cstat-no" title="statement not covered" > const newSubscription = _.differenceBy(_.get(updatedUser, 'subscriptions', []), _.get(previousUser, 'subscriptions', []), 'endpoint')</span>
201
- <span class="cstat-no" title="statement not covered" > if (_.size(newSubscription) !== 1) return</span>
202
- <span class="cstat-no" title="statement not covered" ></span>
203
- <span class="cstat-no" title="statement not covered" > // Data</span>
204
- <span class="cstat-no" title="statement not covered" > const app = hook.app</span>
205
- <span class="cstat-no" title="statement not covered" > const mailerService = app.getService('mailer')</span>
206
- <span class="cstat-no" title="statement not covered" > const domainPath = app.get('domain') + '/#/'</span>
207
- <span class="cstat-no" title="statement not covered" > const email = {</span>
208
- <span class="cstat-no" title="statement not covered" > subject: 'Security alert - new browser detected',</span>
209
- <span class="cstat-no" title="statement not covered" > from: mailerService.options.auth.user,</span>
210
- <span class="cstat-no" title="statement not covered" > // When changing email send to the new one so that it can be verified</span>
211
- <span class="cstat-no" title="statement not covered" > to: updatedUser.email,</span>
212
- <span class="cstat-no" title="statement not covered" > link: domainPath,</span>
213
- <span class="cstat-no" title="statement not covered" > domainPath</span>
204
+ const app = hook.app
205
+ const mailerService = app.getService('mailer')
206
+ if (!mailerService) <span class="branch-0 cbranch-no" title="branch not covered" >return</span>
207
+ // Check for a new subscription if any
208
+ const currentUser = hook.result
209
+ const previousUser = hook.params.user
210
+ // If we can't compare abort, eg f-a-m might patch user to update tokens
211
+ if (!currentUser || !previousUser) return
212
+ // Retrieve the last subscription
213
+ const lastSubscription = _.last(_.get(currentUser, 'subscriptions', []))
214
+ if (!lastSubscription) return
215
+ // Check whether the subscription has an existing fingerprint
216
+ const existingSubscription = _.find(_.get(previousUser, 'subscriptions', []), subscription =&gt; {
217
+ <span class="cstat-no" title="statement not covered" > return _.isEqual(subscription.fingerprint, lastSubscription.fingerprint)</span>
218
+ })
219
+ if (existingSubscription) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
220
+ <span class="cstat-no" title="statement not covered" > debug('Last subscription uses an existing fingerprint')</span>
221
+ <span class="cstat-no" title="statement not covered" > return</span>
214
222
  <span class="cstat-no" title="statement not covered" > }</span>
215
- <span class="cstat-no" title="statement not covered" ></span>
216
- <span class="cstat-no" title="statement not covered" > // Build the subject &amp; link to the app to perform the different actions</span>
217
- <span class="cstat-no" title="statement not covered" > const templateDir = path.join(mailerService.options.templateDir, 'newSubscription')</span>
218
- <span class="cstat-no" title="statement not covered" > const template = new emails.EmailTemplate(templateDir)</span>
219
- <span class="cstat-no" title="statement not covered" > // Errors does not seem to be correctly catched by the caller</span>
220
- <span class="cstat-no" title="statement not covered" > // so we catch them here to avoid any problem</span>
221
- <span class="cstat-no" title="statement not covered" > try {</span>
222
- <span class="cstat-no" title="statement not covered" > const emailContent = await template.render({ email, user: updatedUser, subscription: _.first(newSubscription) }, updatedUser.locale || 'en-us')</span>
223
- <span class="cstat-no" title="statement not covered" > // Update compiled content</span>
224
- <span class="cstat-no" title="statement not covered" > email.html = emailContent.html</span>
225
- <span class="cstat-no" title="statement not covered" > debug('Sending email ', email)</span>
226
- <span class="cstat-no" title="statement not covered" > await mailerService.create(email)</span>
227
- <span class="cstat-no" title="statement not covered" > } catch (error) {</span>
223
+ debug('Last subscription uses a new fingerprint')
224
+ // Send an email to notify the user
225
+ const domainPath = app.get('domain') + '/#/'
226
+ const email = {
227
+ subject: 'Security alert - new browser detected',
228
+ from: mailerService.options.from || mailerService.options.auth.user,
229
+ to: currentUser.email,
230
+ link: domainPath,
231
+ domainPath
232
+ }
233
+ // Build the subject &amp; link to the app to perform the different actions
234
+ const templateDir = path.join(mailerService.options.templateDir, 'newSubscription')
235
+ const template = new emails.EmailTemplate(templateDir)
236
+ // Errors does not seem to be correctly catched by the caller
237
+ // so we catch them here to avoid any problem
238
+ try {
239
+ const emailContent = await template.render({ email, user: currentUser, subscription: lastSubscription }, currentUser.locale || 'en-us')
240
+ // Update compiled content
241
+ email.html = emailContent.html
242
+ debug('Sending email ', email)
243
+ await mailerService.create(email)
244
+ } <span class="branch-0 cbranch-no" title="branch not covered" >catch (error) {</span>
228
245
  <span class="cstat-no" title="statement not covered" > debug('Sending email failed', error)</span>
229
246
  <span class="cstat-no" title="statement not covered" > app.logger.error(error)</span>
230
247
  <span class="cstat-no" title="statement not covered" > }</span>
231
- <span class="cstat-no" title="statement not covered" ></span>
232
- <span class="cstat-no" title="statement not covered" > return hook</span>
233
- <span class="cstat-no" title="statement not covered" >}</span>
248
+ }
234
249
  &nbsp;</pre></td></tr></table></pre>
235
250
 
236
251
  <div class='push'></div><!-- for sticky footer -->
@@ -238,7 +253,7 @@ export <span class="fstat-no" title="function not covered" >async function sendN
238
253
  <div class='footer quiet pad2 space-top1 center small'>
239
254
  Code coverage generated by
240
255
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
241
- at 2024-08-13T10:02:04.843Z
256
+ at 2025-12-17T09:26:49.744Z
242
257
  </div>
243
258
  <script src="../../../prettify.js"></script>
244
259
  <script>