@kalisio/kdk 2.5.3 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (541) hide show
  1. package/.github/workflows/main.yaml +35 -6
  2. package/.vscode/settings.json +5 -0
  3. package/client.globe.js +8 -0
  4. package/client.js +8 -0
  5. package/client.map.js +8 -0
  6. package/core/api/hooks/hooks.push.js +3 -2
  7. package/core/api/hooks/hooks.tags.js +56 -0
  8. package/core/api/models/tags.model.mongodb.js +8 -0
  9. package/core/api/services/index.js +33 -2
  10. package/core/api/services/tags/tags.hooks.js +47 -0
  11. package/core/client/api.js +5 -5
  12. package/core/client/components/KActivity.vue +3 -2
  13. package/core/client/components/KChip.vue +2 -2
  14. package/core/client/components/KEditor.vue +3 -1
  15. package/core/client/components/KFollower.vue +4 -4
  16. package/core/client/components/KStore.vue +1 -1
  17. package/core/client/components/KTab.vue +20 -7
  18. package/core/client/components/account/KProfile.vue +9 -25
  19. package/core/client/components/action/KAction.vue +10 -10
  20. package/core/client/components/action/KToggleFullscreenAction.vue +2 -11
  21. package/core/client/components/app/KHome.vue +3 -2
  22. package/core/client/components/collection/KFilter.vue +5 -4
  23. package/core/client/components/collection/KGrid.vue +5 -1
  24. package/core/client/components/collection/KItemsFilter.vue +47 -0
  25. package/core/client/components/collection/KItemsSorter.vue +42 -0
  26. package/core/client/components/collection/KScrollDown.vue +2 -2
  27. package/core/client/components/collection/KSearchFilterControl.vue +3 -2
  28. package/core/client/components/collection/KSorter.vue +33 -37
  29. package/core/client/components/collection/KTagsFilterControl.vue +14 -40
  30. package/core/client/components/collection/KTagsFilterView.vue +10 -45
  31. package/core/client/components/collection/KTimeFilterControl.vue +6 -7
  32. package/core/client/components/collection/KTimeFilterView.vue +13 -22
  33. package/core/client/components/collection/KTimeLine.vue +18 -9
  34. package/core/client/components/form/KColorField.vue +13 -6
  35. package/core/client/components/form/KColorScaleField.vue +7 -12
  36. package/core/client/components/form/KFileField.vue +118 -89
  37. package/core/client/components/form/KForm.vue +30 -18
  38. package/core/client/components/form/KIconField.vue +4 -1
  39. package/core/client/components/form/KNumberField.vue +9 -2
  40. package/core/client/components/form/KSelectField.vue +1 -4
  41. package/core/client/components/form/KTagField.vue +229 -0
  42. package/core/client/components/form/KTextField.vue +4 -0
  43. package/core/client/components/form/KTextareaField.vue +3 -1
  44. package/core/client/components/input/KShapePicker.vue +3 -3
  45. package/core/client/components/layout/KFab.vue +32 -20
  46. package/core/client/components/layout/KPage.vue +11 -6
  47. package/core/client/components/layout/KWindow.vue +6 -1
  48. package/core/client/components/media/index.js +2 -6
  49. package/core/client/components/menu/KMenu.vue +12 -10
  50. package/core/client/components/menu/KSubMenu.vue +12 -12
  51. package/core/client/components/messages/KMessageCard.vue +13 -12
  52. package/core/client/components/messages/KMessageComposer.vue +13 -9
  53. package/core/client/components/messages/KMessagesTimeLine.vue +16 -8
  54. package/core/client/components/tags/KTagFilter.vue +99 -0
  55. package/core/client/components/tags/KTagItem.vue +65 -0
  56. package/core/client/components/tags/KTagManager.vue +198 -0
  57. package/core/client/components/tags/KTagSelection.vue +82 -0
  58. package/core/client/components/time/KDate.vue +3 -17
  59. package/core/client/components/time/KDateTime.vue +1 -1
  60. package/core/client/components/time/KTime.vue +0 -4
  61. package/core/client/composables/collection-filter.js +41 -2
  62. package/core/client/composables/collection.js +3 -3
  63. package/core/client/composables/index.js +1 -0
  64. package/core/client/composables/pwa.js +13 -0
  65. package/core/client/composables/session.js +7 -8
  66. package/core/client/composables/user.js +36 -0
  67. package/core/client/directives/index.js +1 -0
  68. package/core/client/directives/v-drop-file.js +174 -0
  69. package/core/client/document.js +2 -1
  70. package/core/client/exporter.js +17 -3
  71. package/core/client/i18n/core_en.json +34 -7
  72. package/core/client/i18n/core_fr.json +36 -9
  73. package/core/client/i18n.js +26 -11
  74. package/core/client/layout.js +5 -5
  75. package/core/client/mixins/mixin.base-activity.js +8 -5
  76. package/core/client/mixins/mixin.base-editor.js +2 -1
  77. package/core/client/mixins/mixin.base-field.js +3 -2
  78. package/core/client/mixins/mixin.base-item.js +12 -10
  79. package/core/client/mixins/mixin.service.js +3 -1
  80. package/core/client/platform.js +0 -3
  81. package/core/client/readers/reader.json.js +2 -2
  82. package/core/client/utils/index.js +2 -0
  83. package/core/client/utils/utils.collection.js +6 -6
  84. package/core/client/utils/utils.colors.js +473 -173
  85. package/core/client/utils/utils.files.js +19 -0
  86. package/core/client/utils/utils.locale.js +13 -17
  87. package/core/client/utils/utils.services.js +27 -0
  88. package/core/client/utils/utils.shapes.js +2 -2
  89. package/core/client/utils/utils.tags.js +17 -0
  90. package/core/client/utils/utils.tours.js +31 -0
  91. package/core/common/permissions.js +3 -0
  92. package/core/common/schemas/tags.update.json +35 -0
  93. package/core/common/schemas/users.update-profile.json +1 -1
  94. package/core/common/utils.js +5 -5
  95. package/coverage/core/api/application.js.html +464 -464
  96. package/coverage/core/api/authentication.js.html +219 -351
  97. package/coverage/core/api/db.js.html +194 -209
  98. package/coverage/core/api/hooks/hooks.authentication.js.html +208 -34
  99. package/coverage/core/api/hooks/hooks.authorisations.js.html +717 -432
  100. package/coverage/core/api/hooks/hooks.groups.js.html +52 -52
  101. package/coverage/core/api/hooks/hooks.logger.js.html +43 -43
  102. package/coverage/core/api/hooks/hooks.model.js.html +300 -312
  103. package/coverage/core/api/hooks/hooks.organisations.js.html +264 -264
  104. package/coverage/core/api/hooks/hooks.push.js.html +107 -119
  105. package/coverage/core/api/hooks/hooks.query.js.html +279 -279
  106. package/coverage/core/api/hooks/hooks.schemas.js.html +135 -135
  107. package/coverage/core/api/hooks/hooks.service.js.html +28 -28
  108. package/coverage/core/api/hooks/hooks.storage.js.html +7 -7
  109. package/coverage/core/api/hooks/hooks.users.js.html +478 -205
  110. package/coverage/core/api/hooks/index.html +132 -102
  111. package/coverage/core/api/hooks/index.js.html +19 -13
  112. package/coverage/core/api/index.html +69 -54
  113. package/coverage/core/api/index.js.html +25 -25
  114. package/coverage/core/api/marshall.js.html +127 -127
  115. package/coverage/core/api/models/groups.model.mongodb.js.html +26 -26
  116. package/coverage/core/api/models/index.html +66 -21
  117. package/coverage/core/api/models/messages.model.mongodb.js.html +27 -39
  118. package/coverage/core/api/models/organisations.model.mongodb.js.html +16 -16
  119. package/coverage/core/api/models/tags.model.mongodb.js.html +30 -30
  120. package/coverage/core/api/models/users.model.mongodb.js.html +11 -11
  121. package/coverage/core/api/services/account/account.hooks.js.html +46 -46
  122. package/coverage/core/api/services/account/account.service.js.html +139 -139
  123. package/coverage/core/api/services/account/index.html +22 -22
  124. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  125. package/coverage/core/api/services/authorisations/authorisations.service.js.html +230 -221
  126. package/coverage/core/api/services/authorisations/index.html +20 -20
  127. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  128. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  129. package/coverage/core/api/services/databases/index.html +1 -1
  130. package/coverage/core/api/services/groups/groups.hooks.js.html +72 -72
  131. package/coverage/core/api/services/groups/index.html +21 -21
  132. package/coverage/core/api/services/import-export/import-export.hooks.js.html +76 -76
  133. package/coverage/core/api/services/import-export/import-export.service.js.html +32 -32
  134. package/coverage/core/api/services/import-export/index.html +32 -32
  135. package/coverage/core/api/services/index.html +21 -21
  136. package/coverage/core/api/services/index.js.html +195 -171
  137. package/coverage/core/api/services/mailer/index.html +32 -32
  138. package/coverage/core/api/services/mailer/mailer.hooks.js.html +80 -80
  139. package/coverage/core/api/services/mailer/mailer.service.js.html +32 -32
  140. package/coverage/core/api/services/messages/index.html +21 -21
  141. package/coverage/core/api/services/messages/messages.hooks.js.html +76 -94
  142. package/coverage/core/api/services/organisations/index.html +32 -32
  143. package/coverage/core/api/services/organisations/organisations.hooks.js.html +72 -72
  144. package/coverage/core/api/services/organisations/organisations.service.js.html +163 -163
  145. package/coverage/core/api/services/push/index.html +32 -32
  146. package/coverage/core/api/services/push/push.hooks.js.html +80 -80
  147. package/coverage/core/api/services/push/push.service.js.html +34 -34
  148. package/coverage/core/api/services/storage/index.html +29 -29
  149. package/coverage/core/api/services/storage/storage.hooks.js.html +80 -80
  150. package/coverage/core/api/services/storage/storage.service.js.html +37 -37
  151. package/coverage/core/api/services/tags/index.html +21 -21
  152. package/coverage/core/api/services/tags/tags.hooks.js.html +72 -72
  153. package/coverage/core/api/services/users/index.html +12 -27
  154. package/coverage/core/api/services/users/users.hooks.js.html +84 -87
  155. package/coverage/core/api/utils.js.html +1 -1
  156. package/coverage/core/common/errors.js.html +2 -2
  157. package/coverage/core/common/index.html +32 -47
  158. package/coverage/core/common/index.js.html +11 -11
  159. package/coverage/core/common/permissions.js.html +579 -264
  160. package/coverage/core/common/schema.js.html +26 -26
  161. package/coverage/core/common/utils.js.html +59 -65
  162. package/coverage/index.html +286 -256
  163. package/coverage/lcov-report/core/api/application.js.html +464 -464
  164. package/coverage/lcov-report/core/api/authentication.js.html +219 -351
  165. package/coverage/lcov-report/core/api/db.js.html +194 -209
  166. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +208 -34
  167. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +717 -432
  168. package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +52 -52
  169. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +43 -43
  170. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +300 -312
  171. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +264 -264
  172. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +107 -119
  173. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +279 -279
  174. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +135 -135
  175. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +28 -28
  176. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +7 -7
  177. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +478 -205
  178. package/coverage/lcov-report/core/api/hooks/index.html +132 -102
  179. package/coverage/lcov-report/core/api/hooks/index.js.html +19 -13
  180. package/coverage/lcov-report/core/api/index.html +69 -54
  181. package/coverage/lcov-report/core/api/index.js.html +25 -25
  182. package/coverage/lcov-report/core/api/marshall.js.html +127 -127
  183. package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +26 -26
  184. package/coverage/lcov-report/core/api/models/index.html +66 -21
  185. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +27 -39
  186. package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +16 -16
  187. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +30 -30
  188. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +11 -11
  189. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +46 -46
  190. package/coverage/lcov-report/core/api/services/account/account.service.js.html +139 -139
  191. package/coverage/lcov-report/core/api/services/account/index.html +22 -22
  192. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  193. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +230 -221
  194. package/coverage/lcov-report/core/api/services/authorisations/index.html +20 -20
  195. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  196. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  197. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  198. package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +72 -72
  199. package/coverage/lcov-report/core/api/services/groups/index.html +21 -21
  200. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +76 -76
  201. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +32 -32
  202. package/coverage/lcov-report/core/api/services/import-export/index.html +32 -32
  203. package/coverage/lcov-report/core/api/services/index.html +21 -21
  204. package/coverage/lcov-report/core/api/services/index.js.html +195 -171
  205. package/coverage/lcov-report/core/api/services/mailer/index.html +32 -32
  206. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +80 -80
  207. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +32 -32
  208. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  209. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +76 -94
  210. package/coverage/lcov-report/core/api/services/organisations/index.html +32 -32
  211. package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +72 -72
  212. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +163 -163
  213. package/coverage/lcov-report/core/api/services/push/index.html +32 -32
  214. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +80 -80
  215. package/coverage/lcov-report/core/api/services/push/push.service.js.html +34 -34
  216. package/coverage/lcov-report/core/api/services/storage/index.html +29 -29
  217. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +80 -80
  218. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +37 -37
  219. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  220. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +72 -72
  221. package/coverage/lcov-report/core/api/services/users/index.html +12 -27
  222. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +84 -87
  223. package/coverage/lcov-report/core/api/utils.js.html +1 -1
  224. package/coverage/lcov-report/core/common/errors.js.html +2 -2
  225. package/coverage/lcov-report/core/common/index.html +32 -47
  226. package/coverage/lcov-report/core/common/index.js.html +11 -11
  227. package/coverage/lcov-report/core/common/permissions.js.html +579 -264
  228. package/coverage/lcov-report/core/common/schema.js.html +26 -26
  229. package/coverage/lcov-report/core/common/utils.js.html +59 -65
  230. package/coverage/lcov-report/index.html +286 -256
  231. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +257 -353
  232. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +218 -218
  233. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +810 -795
  234. package/coverage/lcov-report/map/api/hooks/index.html +54 -54
  235. package/coverage/lcov-report/map/api/hooks/index.js.html +16 -16
  236. package/coverage/lcov-report/map/api/index.html +32 -32
  237. package/coverage/lcov-report/map/api/index.js.html +46 -46
  238. package/coverage/lcov-report/map/api/marshall.js.html +72 -72
  239. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +24 -24
  240. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +27 -69
  241. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +80 -80
  242. package/coverage/lcov-report/map/api/models/index.html +54 -69
  243. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +26 -26
  244. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +136 -136
  245. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +343 -343
  246. package/coverage/lcov-report/map/api/services/alerts/index.html +32 -32
  247. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +160 -178
  248. package/coverage/lcov-report/map/api/services/catalog/index.html +21 -21
  249. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  250. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  251. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +114 -183
  252. package/coverage/lcov-report/map/api/services/features/features.service.js.html +56 -359
  253. package/coverage/lcov-report/map/api/services/features/index.html +31 -31
  254. package/coverage/lcov-report/map/api/services/index.html +21 -21
  255. package/coverage/lcov-report/map/api/services/index.js.html +258 -495
  256. package/coverage/lcov-report/map/api/services/projects/index.html +21 -21
  257. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +237 -237
  258. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
  259. package/coverage/lcov-report/map/common/errors.js.html +16 -16
  260. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +267 -270
  261. package/coverage/lcov-report/map/common/grid.js.html +554 -554
  262. package/coverage/lcov-report/map/common/index.html +158 -158
  263. package/coverage/lcov-report/map/common/index.js.html +68 -68
  264. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +73 -73
  265. package/coverage/lcov-report/map/common/moment-utils.js.html +18 -18
  266. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +484 -484
  267. package/coverage/lcov-report/map/common/opendap-utils.js.html +353 -353
  268. package/coverage/lcov-report/map/common/permissions.js.html +36 -42
  269. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +59 -59
  270. package/coverage/lcov-report/map/common/tms-utils.js.html +6 -6
  271. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +190 -190
  272. package/coverage/lcov-report/map/common/wcs-utils.js.html +339 -339
  273. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +345 -345
  274. package/coverage/lcov-report/map/common/wfs-utils.js.html +11 -11
  275. package/coverage/lcov-report/map/common/wms-utils.js.html +8 -8
  276. package/coverage/lcov-report/map/common/wmts-utils.js.html +7 -7
  277. package/coverage/lcov.info +7793 -8564
  278. package/coverage/map/api/hooks/hooks.catalog.js.html +257 -353
  279. package/coverage/map/api/hooks/hooks.features.js.html +218 -218
  280. package/coverage/map/api/hooks/hooks.query.js.html +810 -795
  281. package/coverage/map/api/hooks/index.html +54 -54
  282. package/coverage/map/api/hooks/index.js.html +16 -16
  283. package/coverage/map/api/index.html +32 -32
  284. package/coverage/map/api/index.js.html +46 -46
  285. package/coverage/map/api/marshall.js.html +72 -72
  286. package/coverage/map/api/models/alerts.model.mongodb.js.html +24 -24
  287. package/coverage/map/api/models/catalog.model.mongodb.js.html +27 -69
  288. package/coverage/map/api/models/features.model.mongodb.js.html +80 -80
  289. package/coverage/map/api/models/index.html +54 -69
  290. package/coverage/map/api/models/projects.model.mongodb.js.html +26 -26
  291. package/coverage/map/api/services/alerts/alerts.hooks.js.html +136 -136
  292. package/coverage/map/api/services/alerts/alerts.service.js.html +343 -343
  293. package/coverage/map/api/services/alerts/index.html +32 -32
  294. package/coverage/map/api/services/catalog/catalog.hooks.js.html +160 -178
  295. package/coverage/map/api/services/catalog/index.html +21 -21
  296. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  297. package/coverage/map/api/services/daptiles/index.html +1 -1
  298. package/coverage/map/api/services/features/features.hooks.js.html +114 -183
  299. package/coverage/map/api/services/features/features.service.js.html +56 -359
  300. package/coverage/map/api/services/features/index.html +31 -31
  301. package/coverage/map/api/services/index.html +21 -21
  302. package/coverage/map/api/services/index.js.html +258 -495
  303. package/coverage/map/api/services/projects/index.html +21 -21
  304. package/coverage/map/api/services/projects/projects.hooks.js.html +237 -237
  305. package/coverage/map/common/dynamic-grid-source.js.html +68 -68
  306. package/coverage/map/common/errors.js.html +16 -16
  307. package/coverage/map/common/geotiff-grid-source.js.html +267 -270
  308. package/coverage/map/common/grid.js.html +554 -554
  309. package/coverage/map/common/index.html +158 -158
  310. package/coverage/map/common/index.js.html +68 -68
  311. package/coverage/map/common/meteo-model-grid-source.js.html +73 -73
  312. package/coverage/map/common/moment-utils.js.html +18 -18
  313. package/coverage/map/common/opendap-grid-source.js.html +484 -484
  314. package/coverage/map/common/opendap-utils.js.html +353 -353
  315. package/coverage/map/common/permissions.js.html +36 -42
  316. package/coverage/map/common/time-based-grid-source.js.html +59 -59
  317. package/coverage/map/common/tms-utils.js.html +6 -6
  318. package/coverage/map/common/wcs-grid-source.js.html +190 -190
  319. package/coverage/map/common/wcs-utils.js.html +339 -339
  320. package/coverage/map/common/weacast-grid-source.js.html +345 -345
  321. package/coverage/map/common/wfs-utils.js.html +11 -11
  322. package/coverage/map/common/wms-utils.js.html +8 -8
  323. package/coverage/map/common/wmts-utils.js.html +7 -7
  324. package/coverage/tmp/coverage-151166-1723543324307-0.json +1 -0
  325. package/coverage/tmp/coverage-151178-1723543324283-0.json +1 -0
  326. package/coverage/tmp/coverage-151189-1723543324271-0.json +1 -0
  327. package/coverage/tmp/coverage-151201-1723543324248-0.json +1 -0
  328. package/coverage/tmp/coverage-151208-1723543324227-0.json +1 -0
  329. package/extras/configs/panes.top.js +33 -11
  330. package/extras/configs/stickies.js +26 -16
  331. package/extras/configs/widgets.left.js +13 -1
  332. package/extras/libs/jsts.min.js +8 -0
  333. package/{test/client/core/account.js → extras/tests/core/account.mjs} +4 -4
  334. package/extras/tests/core/api.mjs +114 -0
  335. package/{test/client/core/collection.js → extras/tests/core/collection.mjs} +8 -8
  336. package/{test/client/core/dialogs.js → extras/tests/core/dialogs.mjs} +1 -1
  337. package/extras/tests/core/index.mjs +9 -0
  338. package/{test/client/core/layout.js → extras/tests/core/layout.mjs} +7 -3
  339. package/{test/client/core/runner.js → extras/tests/core/runner.mjs} +3 -3
  340. package/{test/client/core/screens.js → extras/tests/core/screens.mjs} +1 -1
  341. package/{test/client/core/utils.js → extras/tests/core/utils.mjs} +79 -26
  342. package/extras/tests/index.mjs +4 -0
  343. package/{test/client/map/api.js → extras/tests/map/api.mjs} +1 -1
  344. package/{test/client/map/catalog.js → extras/tests/map/catalog.mjs} +18 -18
  345. package/{test/client/map/controls.js → extras/tests/map/controls.mjs} +3 -3
  346. package/extras/tests/map/index.mjs +5 -0
  347. package/{test/client/map/time.js → extras/tests/map/time.mjs} +3 -3
  348. package/{test/client/map/utils.js → extras/tests/map/utils.mjs} +6 -5
  349. package/extras/tours/fab.js +36 -0
  350. package/extras/tours/layout.js +49 -0
  351. package/extras/tours/pane.left.js +78 -0
  352. package/extras/tours/pane.right.js +145 -0
  353. package/extras/tours/pane.top.js +239 -0
  354. package/map/api/config/layers.cjs +28 -13
  355. package/map/api/hooks/hooks.query.js +12 -7
  356. package/map/api/models/catalog.model.mongodb.js +17 -6
  357. package/map/api/services/catalog/catalog.hooks.js +1 -1
  358. package/map/api/services/index.js +18 -1
  359. package/map/client/cesium/utils/utils.cesium.js +25 -65
  360. package/map/client/cesium/utils/utils.features.js +1 -0
  361. package/map/client/cesium/utils/utils.geojson.js +1 -0
  362. package/map/client/cesium/utils/utils.style.js +7 -6
  363. package/map/client/components/KFeatureEditor.vue +3 -3
  364. package/map/client/components/KFeaturesChart.vue +4 -4
  365. package/map/client/components/KFeaturesFilterEditor.vue +19 -13
  366. package/map/client/components/KFeaturesFilterManager.vue +7 -4
  367. package/map/client/components/KFeaturesTable.vue +2 -2
  368. package/map/client/components/KLayerEditor.vue +6 -6
  369. package/map/client/components/KMeasureTool.vue +2 -1
  370. package/map/client/components/catalog/KBaseLayersSelector.vue +1 -1
  371. package/map/client/components/catalog/KCategoryItem.vue +15 -1
  372. package/map/client/components/catalog/KConnectLayer.vue +2 -2
  373. package/map/client/components/catalog/KCreateView.vue +3 -2
  374. package/map/client/components/catalog/KFilteredLayerItem.vue +26 -6
  375. package/map/client/components/catalog/KImportLayer.vue +6 -3
  376. package/map/client/components/catalog/KLayerCategories.vue +6 -6
  377. package/map/client/components/catalog/KLayerItem.vue +12 -2
  378. package/map/client/components/catalog/KLayersList.vue +180 -0
  379. package/map/client/components/catalog/KLayersPanel.vue +146 -36
  380. package/map/client/components/catalog/KLayersSelector.vue +96 -48
  381. package/map/client/components/catalog/KProjectEditor.vue +0 -9
  382. package/map/client/components/catalog/KProjectSelector.vue +3 -2
  383. package/map/client/components/catalog/KProjectsPanel.vue +23 -8
  384. package/map/client/components/catalog/KViewsPanel.vue +18 -8
  385. package/map/client/components/catalog/KWeatherLayersSelector.vue +3 -3
  386. package/map/client/components/form/KDirectionField.vue +3 -6
  387. package/map/client/components/form/KLayerCategoryField.vue +2 -2
  388. package/map/client/components/form/KOwsServiceField.vue +25 -24
  389. package/map/client/components/form/KSelectLayersField.vue +4 -4
  390. package/map/client/components/form/KSelectViewsField.vue +4 -4
  391. package/map/client/components/legend/KLayerLegend.vue +11 -2
  392. package/map/client/components/legend/KLegend.vue +44 -51
  393. package/map/client/components/location/KLocationCardSection.vue +6 -7
  394. package/map/client/components/location/KLocationMap.vue +23 -13
  395. package/map/client/components/stickies/KPosition.vue +5 -0
  396. package/map/client/components/stickies/KZoomControl.vue +70 -0
  397. package/map/client/components/styles/KLayerStyleAction.vue +59 -12
  398. package/map/client/components/styles/KStyleEditor.vue +71 -8
  399. package/map/client/components/styles/KStyleEditorSection.vue +82 -33
  400. package/map/client/components/styles/KStyleManager.vue +119 -59
  401. package/map/client/components/styles/KStylePreview.vue +9 -25
  402. package/map/client/components/styles/KStylePreviewItem.vue +22 -1
  403. package/map/client/components/tools/KSearchTool.vue +1 -1
  404. package/map/client/components/widget/KElevationProfile.vue +20 -17
  405. package/map/client/components/widget/KInformationBox.vue +5 -5
  406. package/map/client/components/widget/KMapillaryViewer.vue +2 -1
  407. package/map/client/components/widget/KTimeSeries.vue +11 -9
  408. package/map/client/globe.js +2 -0
  409. package/map/client/i18n/map_en.json +30 -7
  410. package/map/client/i18n/map_fr.json +30 -7
  411. package/map/client/leaflet/GradientPath.js +61 -24
  412. package/map/client/leaflet/ShapeMarker.js +12 -5
  413. package/map/client/leaflet/TiledMeshLayer.js +3 -3
  414. package/map/client/leaflet/utils/utils.geojson.js +66 -8
  415. package/map/client/leaflet/utils/utils.style.js +14 -15
  416. package/map/client/mixins/globe/mixin.base-globe.js +190 -34
  417. package/map/client/mixins/globe/mixin.file-layers.js +3 -0
  418. package/map/client/mixins/globe/mixin.geojson-layers.js +179 -31
  419. package/map/client/mixins/globe/mixin.opendap-layers.js +2 -1
  420. package/map/client/mixins/globe/mixin.style.js +23 -1
  421. package/map/client/mixins/globe/mixin.tooltip.js +14 -2
  422. package/map/client/mixins/map/mixin.base-map.js +156 -58
  423. package/map/client/mixins/map/mixin.edit-layers.js +18 -15
  424. package/map/client/mixins/map/mixin.geojson-layers.js +181 -106
  425. package/map/client/mixins/map/mixin.heatmap-layers.js +3 -2
  426. package/map/client/mixins/map/mixin.map-activity.js +6 -1
  427. package/map/client/mixins/map/mixin.mapillary-layers.js +2 -1
  428. package/map/client/mixins/map/mixin.pmtiles-layers.js +3 -3
  429. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +3 -2
  430. package/map/client/mixins/map/mixin.tiled-wind-layers.js +3 -2
  431. package/map/client/mixins/mixin.activity.js +199 -55
  432. package/map/client/mixins/mixin.context.js +11 -11
  433. package/map/client/mixins/mixin.feature-service.js +11 -9
  434. package/map/client/mixins/mixin.weacast.js +5 -3
  435. package/map/client/readers/reader.geojson.js +3 -1
  436. package/map/client/utils/utils.capture.js +3 -3
  437. package/map/client/utils/utils.catalog.js +9 -5
  438. package/map/client/utils/utils.features.js +120 -54
  439. package/map/client/utils/utils.js +25 -10
  440. package/map/client/utils/utils.layers.js +148 -24
  441. package/map/client/utils/utils.location.js +26 -9
  442. package/map/client/utils/utils.schema.js +2 -1
  443. package/map/client/utils/utils.style.js +53 -9
  444. package/map/common/geotiff-grid-source.js +1 -3
  445. package/map/common/opendap-utils.js +0 -1
  446. package/map/common/tms-utils.js +0 -1
  447. package/map/common/wcs-utils.js +0 -1
  448. package/map/common/wfs-utils.js +0 -1
  449. package/map/common/wms-utils.js +7 -1
  450. package/map/common/wmts-utils.js +0 -1
  451. package/package.json +12 -12
  452. package/scripts/init_runner.sh +3 -3
  453. package/scripts/kash/CHANGELOG.md +27 -0
  454. package/scripts/kash/kash.sh +556 -237
  455. package/scripts/kash/scripts/run_tests.sh +44 -5
  456. package/scripts/setup_workspace.sh +23 -13
  457. package/test/api/core/config/default.cjs +2 -1
  458. package/test/api/core/tags.test.js +62 -0
  459. package/test/api/core/test-log-2024-04-22.log +84 -0
  460. package/test/api/core/{test-log-2025-02-05.log → test-log-2024-04-23.log} +3 -3
  461. package/test/api/core/test-log-2024-08-13.log +3 -0
  462. package/test/api/map/config/default.cjs +2 -1
  463. package/test/api/map/config/layers.json +9 -0
  464. package/test/api/map/data/openradiation.json +13811 -0
  465. package/test/api/map/grid-sources.test.js +1 -3
  466. package/test/api/map/index.test.js +60 -1
  467. package/test/api/map/style.test.js +30 -1
  468. package/test/api/map/test-log-2025-03-08.log +0 -0
  469. package/test.api.js +1 -1
  470. package/vite/App.vue +18 -0
  471. package/vite/AppWithGlobe.vue +84 -0
  472. package/vite/GlobeActivity.vue +58 -0
  473. package/vite/MapActivity.vue +63 -0
  474. package/vite/MapActivityWithGlobe.vue +63 -0
  475. package/vite/README.md +169 -0
  476. package/vite/config.js +221 -0
  477. package/vite/index_with_globe.html +50 -0
  478. package/vite/index_with_map.html +50 -0
  479. package/vite/package.json +173 -0
  480. package/vite/quasar.variables.scss +17 -0
  481. package/vite/vite.config.js +166 -0
  482. package/vite/yarn.lock +11641 -0
  483. package/core/client/components/media/KImageViewer.vue +0 -68
  484. package/core/client/components/media/KMarkdownViewer.vue +0 -55
  485. package/core/client/components/media/KMediaBrowser.vue +0 -301
  486. package/coverage/core/api/services/users/users.service.js.html +0 -100
  487. package/coverage/core/common/utils.offline.js.html +0 -199
  488. package/coverage/lcov-report/core/api/services/users/users.service.js.html +0 -100
  489. package/coverage/lcov-report/core/common/utils.offline.js.html +0 -199
  490. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +0 -112
  491. package/coverage/lcov-report/map/api/services/styles/index.html +0 -116
  492. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +0 -196
  493. package/coverage/map/api/models/styles.model.mongodb.js.html +0 -112
  494. package/coverage/map/api/services/styles/index.html +0 -116
  495. package/coverage/map/api/services/styles/styles.hooks.js.html +0 -196
  496. package/coverage/tmp/coverage-151198-1753351220086-0.json +0 -1
  497. package/coverage/tmp/coverage-151210-1753351220070-0.json +0 -1
  498. package/coverage/tmp/coverage-151221-1753351129816-0.json +0 -1
  499. package/coverage/tmp/coverage-151233-1753351129803-0.json +0 -1
  500. package/coverage/tmp/coverage-151240-1753351129770-0.json +0 -1
  501. package/coverage/tmp/coverage-151307-1753351220058-0.json +0 -1
  502. package/coverage/tmp/coverage-151319-1753351220044-0.json +0 -1
  503. package/coverage/tmp/coverage-151326-1753351220010-0.json +0 -1
  504. package/extras/tours/core/account-profile.js +0 -32
  505. package/extras/tours/core/account.js +0 -143
  506. package/extras/tours/core/add-member.js +0 -75
  507. package/extras/tours/core/add-tag.js +0 -13
  508. package/extras/tours/core/create-group.js +0 -19
  509. package/extras/tours/core/create-organisation.js +0 -19
  510. package/extras/tours/core/create-tag.js +0 -26
  511. package/extras/tours/core/edit-member-role.js +0 -13
  512. package/extras/tours/core/groups.js +0 -65
  513. package/extras/tours/core/join-group.js +0 -13
  514. package/extras/tours/core/login.js +0 -41
  515. package/extras/tours/core/members.js +0 -108
  516. package/extras/tours/core/register.js +0 -61
  517. package/extras/tours/core/send-reset-password.js +0 -14
  518. package/extras/tours/core/tags.js +0 -65
  519. package/extras/tours/map/catalog-panel.js +0 -112
  520. package/extras/tours/map/fab.js +0 -26
  521. package/extras/tours/map/navigation-bar.js +0 -187
  522. package/extras/tours/map/side-nav.js +0 -36
  523. package/test/api/core/test-log-2025-05-21.log +0 -15
  524. package/test/api/core/test-log-2025-06-25.log +0 -9
  525. package/test/api/core/test-log-2025-07-24.log +0 -44
  526. package/test/api/map/test-log-2025-05-27.log +0 -13
  527. package/test/api/map/test-log-2025-06-23.log +0 -7
  528. package/test/api/map/test-log-2025-07-24.log +0 -11
  529. package/test/client/core/api.js +0 -361
  530. package/test/client/core/index.js +0 -9
  531. package/test/client/index.js +0 -4
  532. package/test/client/map/index.js +0 -5
  533. package/test.client.js +0 -1
  534. /package/{test/client/core/time.js → extras/tests/core/time.mjs} +0 -0
  535. /package/extras/tours/{map/add-layer.js → add-layer.js} +0 -0
  536. /package/extras/tours/{map/catalog-categories.js → catalog-categories.js} +0 -0
  537. /package/extras/tours/{map/connect-layer.js → connect-layer.js} +0 -0
  538. /package/extras/tours/{map/create-layer.js → create-layer.js} +0 -0
  539. /package/extras/tours/{map/create-view.js → create-view.js} +0 -0
  540. /package/extras/tours/{map/import-layer.js → import-layer.js} +0 -0
  541. /package/extras/tours/{map/timeline.js → pane.bottom.js} +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">96.4% </span>
26
+ <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>161/167</span>
28
+ <span class='fraction'>0/167</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">90.9% </span>
33
+ <span class="strong">0% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>10/11</span>
35
+ <span class='fraction'>0/1</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">83.33% </span>
40
+ <span class="strong">0% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>5/6</span>
42
+ <span class='fraction'>0/1</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">96.4% </span>
47
+ <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>161/167</span>
49
+ <span class='fraction'>0/167</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 high'></div>
64
+ <div class='status-line low'></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>
@@ -230,340 +230,340 @@
230
230
  <a name='L165'></a><a href='#L165'>165</a>
231
231
  <a name='L166'></a><a href='#L166'>166</a>
232
232
  <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
234
- <span class="cline-any cline-yes">1x</span>
235
- <span class="cline-any cline-yes">1x</span>
236
- <span class="cline-any cline-yes">1x</span>
237
- <span class="cline-any cline-yes">1x</span>
238
- <span class="cline-any cline-yes">1x</span>
239
- <span class="cline-any cline-yes">1x</span>
240
- <span class="cline-any cline-yes">1x</span>
241
- <span class="cline-any cline-yes">1x</span>
242
- <span class="cline-any cline-yes">1x</span>
243
- <span class="cline-any cline-yes">1x</span>
244
- <span class="cline-any cline-yes">1x</span>
245
- <span class="cline-any cline-yes">1x</span>
246
- <span class="cline-any cline-yes">1x</span>
247
- <span class="cline-any cline-no">&nbsp;</span>
248
- <span class="cline-any cline-no">&nbsp;</span>
249
- <span class="cline-any cline-no">&nbsp;</span>
250
- <span class="cline-any cline-no">&nbsp;</span>
251
- <span class="cline-any cline-no">&nbsp;</span>
252
- <span class="cline-any cline-no">&nbsp;</span>
253
- <span class="cline-any cline-yes">1x</span>
254
- <span class="cline-any cline-yes">1x</span>
255
- <span class="cline-any cline-yes">1x</span>
256
- <span class="cline-any cline-yes">1x</span>
257
- <span class="cline-any cline-yes">1x</span>
258
- <span class="cline-any cline-yes">1x</span>
259
- <span class="cline-any cline-yes">1x</span>
260
- <span class="cline-any cline-yes">1x</span>
261
- <span class="cline-any cline-yes">1x</span>
262
- <span class="cline-any cline-yes">1x</span>
263
- <span class="cline-any cline-yes">1x</span>
264
- <span class="cline-any cline-yes">1x</span>
265
- <span class="cline-any cline-yes">1x</span>
266
- <span class="cline-any cline-yes">1x</span>
267
- <span class="cline-any cline-yes">1x</span>
268
- <span class="cline-any cline-yes">1x</span>
269
- <span class="cline-any cline-yes">1x</span>
270
- <span class="cline-any cline-yes">1x</span>
271
- <span class="cline-any cline-yes">1x</span>
272
- <span class="cline-any cline-yes">1x</span>
273
- <span class="cline-any cline-yes">1x</span>
274
- <span class="cline-any cline-yes">1x</span>
275
- <span class="cline-any cline-yes">1x</span>
276
- <span class="cline-any cline-yes">1x</span>
277
- <span class="cline-any cline-yes">1x</span>
278
- <span class="cline-any cline-yes">1x</span>
279
- <span class="cline-any cline-yes">1x</span>
280
- <span class="cline-any cline-yes">1x</span>
281
- <span class="cline-any cline-yes">1x</span>
282
- <span class="cline-any cline-yes">1x</span>
283
- <span class="cline-any cline-yes">1x</span>
284
- <span class="cline-any cline-yes">1x</span>
285
- <span class="cline-any cline-yes">1x</span>
286
- <span class="cline-any cline-yes">1x</span>
287
- <span class="cline-any cline-yes">1x</span>
288
- <span class="cline-any cline-yes">1x</span>
289
- <span class="cline-any cline-yes">1x</span>
290
- <span class="cline-any cline-yes">1x</span>
291
- <span class="cline-any cline-yes">1x</span>
292
- <span class="cline-any cline-yes">1x</span>
293
- <span class="cline-any cline-yes">2x</span>
294
- <span class="cline-any cline-yes">2x</span>
295
- <span class="cline-any cline-yes">2x</span>
296
- <span class="cline-any cline-yes">2x</span>
297
- <span class="cline-any cline-yes">1x</span>
298
- <span class="cline-any cline-yes">1x</span>
299
- <span class="cline-any cline-yes">1x</span>
300
- <span class="cline-any cline-yes">1x</span>
301
- <span class="cline-any cline-yes">1x</span>
302
- <span class="cline-any cline-yes">1x</span>
303
- <span class="cline-any cline-yes">1x</span>
304
- <span class="cline-any cline-yes">1x</span>
305
- <span class="cline-any cline-yes">1x</span>
306
- <span class="cline-any cline-yes">1x</span>
307
- <span class="cline-any cline-yes">1x</span>
308
- <span class="cline-any cline-yes">1x</span>
309
- <span class="cline-any cline-yes">1x</span>
310
- <span class="cline-any cline-yes">1x</span>
311
- <span class="cline-any cline-yes">1x</span>
312
- <span class="cline-any cline-yes">1x</span>
313
- <span class="cline-any cline-yes">1x</span>
314
- <span class="cline-any cline-yes">1x</span>
315
- <span class="cline-any cline-yes">1x</span>
316
- <span class="cline-any cline-yes">1x</span>
317
- <span class="cline-any cline-yes">1x</span>
318
- <span class="cline-any cline-yes">1x</span>
319
- <span class="cline-any cline-yes">1x</span>
320
- <span class="cline-any cline-yes">1x</span>
321
- <span class="cline-any cline-yes">1x</span>
322
- <span class="cline-any cline-yes">1x</span>
323
- <span class="cline-any cline-yes">1x</span>
324
- <span class="cline-any cline-yes">1x</span>
325
- <span class="cline-any cline-yes">1x</span>
326
- <span class="cline-any cline-yes">1x</span>
327
- <span class="cline-any cline-yes">1x</span>
328
- <span class="cline-any cline-yes">1x</span>
329
- <span class="cline-any cline-yes">1x</span>
330
- <span class="cline-any cline-yes">1x</span>
331
- <span class="cline-any cline-yes">1x</span>
332
- <span class="cline-any cline-yes">1x</span>
333
- <span class="cline-any cline-yes">1x</span>
334
- <span class="cline-any cline-yes">1x</span>
335
- <span class="cline-any cline-yes">1x</span>
336
- <span class="cline-any cline-yes">1x</span>
337
- <span class="cline-any cline-yes">1x</span>
338
- <span class="cline-any cline-yes">1x</span>
339
- <span class="cline-any cline-yes">1x</span>
340
- <span class="cline-any cline-yes">1x</span>
341
- <span class="cline-any cline-yes">1x</span>
342
- <span class="cline-any cline-yes">1x</span>
343
- <span class="cline-any cline-yes">1x</span>
344
- <span class="cline-any cline-yes">1x</span>
345
- <span class="cline-any cline-yes">1x</span>
346
- <span class="cline-any cline-yes">1x</span>
347
- <span class="cline-any cline-yes">1x</span>
348
- <span class="cline-any cline-yes">1x</span>
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
- <span class="cline-any cline-yes">1x</span>
363
- <span class="cline-any cline-yes">1x</span>
364
- <span class="cline-any cline-yes">1x</span>
365
- <span class="cline-any cline-yes">1x</span>
366
- <span class="cline-any cline-yes">1x</span>
367
- <span class="cline-any cline-yes">1x</span>
368
- <span class="cline-any cline-yes">1x</span>
369
- <span class="cline-any cline-yes">1x</span>
370
- <span class="cline-any cline-yes">1x</span>
371
- <span class="cline-any cline-yes">1x</span>
372
- <span class="cline-any cline-yes">1x</span>
373
- <span class="cline-any cline-yes">1x</span>
374
- <span class="cline-any cline-yes">1x</span>
375
- <span class="cline-any cline-yes">1x</span>
376
- <span class="cline-any cline-yes">1x</span>
377
- <span class="cline-any cline-yes">1x</span>
378
- <span class="cline-any cline-yes">1x</span>
379
- <span class="cline-any cline-yes">1x</span>
380
- <span class="cline-any cline-yes">1x</span>
381
- <span class="cline-any cline-yes">1x</span>
382
- <span class="cline-any cline-yes">1x</span>
383
- <span class="cline-any cline-yes">1x</span>
384
- <span class="cline-any cline-yes">1x</span>
385
- <span class="cline-any cline-yes">1x</span>
386
- <span class="cline-any cline-yes">1x</span>
387
- <span class="cline-any cline-yes">1x</span>
388
- <span class="cline-any cline-yes">1x</span>
389
- <span class="cline-any cline-yes">1x</span>
390
- <span class="cline-any cline-yes">1x</span>
391
- <span class="cline-any cline-yes">1x</span>
392
- <span class="cline-any cline-yes">1x</span>
393
- <span class="cline-any cline-yes">1x</span>
394
- <span class="cline-any cline-yes">1x</span>
395
- <span class="cline-any cline-yes">1x</span>
396
- <span class="cline-any cline-yes">1x</span>
397
- <span class="cline-any cline-yes">1x</span>
398
- <span class="cline-any cline-yes">1x</span>
399
- <span class="cline-any cline-yes">1x</span>
400
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
401
- import fetch from 'node-fetch'
402
- import xml2js from 'xml2js'
403
- import { buildUrl } from '../../core/common/index.js'
404
- &nbsp;
405
- // https://www.opengeospatial.org/standards/wcs
406
- &nbsp;
407
- export function fetchAsJson (query, headers = {}) {
408
- return fetch(query, { redirect: 'follow', headers })
409
- .then(response =&gt; response.text())
410
- .then(txt =&gt; xml2js.parseStringPromise(txt, { tagNameProcessors: [xml2js.processors.stripPrefix] }))
411
- }
412
- &nbsp;
413
- export <span class="fstat-no" title="function not covered" >async function GetCapabilities (url, searchParams = {}, headers = {}) {</span>
233
+ <a name='L168'></a><a href='#L168'>168</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
234
+ <span class="cline-any cline-no">&nbsp;</span>
235
+ <span class="cline-any cline-no">&nbsp;</span>
236
+ <span class="cline-any cline-no">&nbsp;</span>
237
+ <span class="cline-any cline-no">&nbsp;</span>
238
+ <span class="cline-any cline-no">&nbsp;</span>
239
+ <span class="cline-any cline-no">&nbsp;</span>
240
+ <span class="cline-any cline-no">&nbsp;</span>
241
+ <span class="cline-any cline-no">&nbsp;</span>
242
+ <span class="cline-any cline-no">&nbsp;</span>
243
+ <span class="cline-any cline-no">&nbsp;</span>
244
+ <span class="cline-any cline-no">&nbsp;</span>
245
+ <span class="cline-any cline-no">&nbsp;</span>
246
+ <span class="cline-any cline-no">&nbsp;</span>
247
+ <span class="cline-any cline-no">&nbsp;</span>
248
+ <span class="cline-any cline-no">&nbsp;</span>
249
+ <span class="cline-any cline-no">&nbsp;</span>
250
+ <span class="cline-any cline-no">&nbsp;</span>
251
+ <span class="cline-any cline-no">&nbsp;</span>
252
+ <span class="cline-any cline-no">&nbsp;</span>
253
+ <span class="cline-any cline-no">&nbsp;</span>
254
+ <span class="cline-any cline-no">&nbsp;</span>
255
+ <span class="cline-any cline-no">&nbsp;</span>
256
+ <span class="cline-any cline-no">&nbsp;</span>
257
+ <span class="cline-any cline-no">&nbsp;</span>
258
+ <span class="cline-any cline-no">&nbsp;</span>
259
+ <span class="cline-any cline-no">&nbsp;</span>
260
+ <span class="cline-any cline-no">&nbsp;</span>
261
+ <span class="cline-any cline-no">&nbsp;</span>
262
+ <span class="cline-any cline-no">&nbsp;</span>
263
+ <span class="cline-any cline-no">&nbsp;</span>
264
+ <span class="cline-any cline-no">&nbsp;</span>
265
+ <span class="cline-any cline-no">&nbsp;</span>
266
+ <span class="cline-any cline-no">&nbsp;</span>
267
+ <span class="cline-any cline-no">&nbsp;</span>
268
+ <span class="cline-any cline-no">&nbsp;</span>
269
+ <span class="cline-any cline-no">&nbsp;</span>
270
+ <span class="cline-any cline-no">&nbsp;</span>
271
+ <span class="cline-any cline-no">&nbsp;</span>
272
+ <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-no">&nbsp;</span>
274
+ <span class="cline-any cline-no">&nbsp;</span>
275
+ <span class="cline-any cline-no">&nbsp;</span>
276
+ <span class="cline-any cline-no">&nbsp;</span>
277
+ <span class="cline-any cline-no">&nbsp;</span>
278
+ <span class="cline-any cline-no">&nbsp;</span>
279
+ <span class="cline-any cline-no">&nbsp;</span>
280
+ <span class="cline-any cline-no">&nbsp;</span>
281
+ <span class="cline-any cline-no">&nbsp;</span>
282
+ <span class="cline-any cline-no">&nbsp;</span>
283
+ <span class="cline-any cline-no">&nbsp;</span>
284
+ <span class="cline-any cline-no">&nbsp;</span>
285
+ <span class="cline-any cline-no">&nbsp;</span>
286
+ <span class="cline-any cline-no">&nbsp;</span>
287
+ <span class="cline-any cline-no">&nbsp;</span>
288
+ <span class="cline-any cline-no">&nbsp;</span>
289
+ <span class="cline-any cline-no">&nbsp;</span>
290
+ <span class="cline-any cline-no">&nbsp;</span>
291
+ <span class="cline-any cline-no">&nbsp;</span>
292
+ <span class="cline-any cline-no">&nbsp;</span>
293
+ <span class="cline-any cline-no">&nbsp;</span>
294
+ <span class="cline-any cline-no">&nbsp;</span>
295
+ <span class="cline-any cline-no">&nbsp;</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-no">&nbsp;</span>
299
+ <span class="cline-any cline-no">&nbsp;</span>
300
+ <span class="cline-any cline-no">&nbsp;</span>
301
+ <span class="cline-any cline-no">&nbsp;</span>
302
+ <span class="cline-any cline-no">&nbsp;</span>
303
+ <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-no">&nbsp;</span>
305
+ <span class="cline-any cline-no">&nbsp;</span>
306
+ <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>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</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
+ <span class="cline-any cline-no">&nbsp;</span>
336
+ <span class="cline-any cline-no">&nbsp;</span>
337
+ <span class="cline-any cline-no">&nbsp;</span>
338
+ <span class="cline-any cline-no">&nbsp;</span>
339
+ <span class="cline-any cline-no">&nbsp;</span>
340
+ <span class="cline-any cline-no">&nbsp;</span>
341
+ <span class="cline-any cline-no">&nbsp;</span>
342
+ <span class="cline-any cline-no">&nbsp;</span>
343
+ <span class="cline-any cline-no">&nbsp;</span>
344
+ <span class="cline-any cline-no">&nbsp;</span>
345
+ <span class="cline-any cline-no">&nbsp;</span>
346
+ <span class="cline-any cline-no">&nbsp;</span>
347
+ <span class="cline-any cline-no">&nbsp;</span>
348
+ <span class="cline-any cline-no">&nbsp;</span>
349
+ <span class="cline-any cline-no">&nbsp;</span>
350
+ <span class="cline-any cline-no">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
353
+ <span class="cline-any cline-no">&nbsp;</span>
354
+ <span class="cline-any cline-no">&nbsp;</span>
355
+ <span class="cline-any cline-no">&nbsp;</span>
356
+ <span class="cline-any cline-no">&nbsp;</span>
357
+ <span class="cline-any cline-no">&nbsp;</span>
358
+ <span class="cline-any cline-no">&nbsp;</span>
359
+ <span class="cline-any cline-no">&nbsp;</span>
360
+ <span class="cline-any cline-no">&nbsp;</span>
361
+ <span class="cline-any cline-no">&nbsp;</span>
362
+ <span class="cline-any cline-no">&nbsp;</span>
363
+ <span class="cline-any cline-no">&nbsp;</span>
364
+ <span class="cline-any cline-no">&nbsp;</span>
365
+ <span class="cline-any cline-no">&nbsp;</span>
366
+ <span class="cline-any cline-no">&nbsp;</span>
367
+ <span class="cline-any cline-no">&nbsp;</span>
368
+ <span class="cline-any cline-no">&nbsp;</span>
369
+ <span class="cline-any cline-no">&nbsp;</span>
370
+ <span class="cline-any cline-no">&nbsp;</span>
371
+ <span class="cline-any cline-no">&nbsp;</span>
372
+ <span class="cline-any cline-no">&nbsp;</span>
373
+ <span class="cline-any cline-no">&nbsp;</span>
374
+ <span class="cline-any cline-no">&nbsp;</span>
375
+ <span class="cline-any cline-no">&nbsp;</span>
376
+ <span class="cline-any cline-no">&nbsp;</span>
377
+ <span class="cline-any cline-no">&nbsp;</span>
378
+ <span class="cline-any cline-no">&nbsp;</span>
379
+ <span class="cline-any cline-no">&nbsp;</span>
380
+ <span class="cline-any cline-no">&nbsp;</span>
381
+ <span class="cline-any cline-no">&nbsp;</span>
382
+ <span class="cline-any cline-no">&nbsp;</span>
383
+ <span class="cline-any cline-no">&nbsp;</span>
384
+ <span class="cline-any cline-no">&nbsp;</span>
385
+ <span class="cline-any cline-no">&nbsp;</span>
386
+ <span class="cline-any cline-no">&nbsp;</span>
387
+ <span class="cline-any cline-no">&nbsp;</span>
388
+ <span class="cline-any cline-no">&nbsp;</span>
389
+ <span class="cline-any cline-no">&nbsp;</span>
390
+ <span class="cline-any cline-no">&nbsp;</span>
391
+ <span class="cline-any cline-no">&nbsp;</span>
392
+ <span class="cline-any cline-no">&nbsp;</span>
393
+ <span class="cline-any cline-no">&nbsp;</span>
394
+ <span class="cline-any cline-no">&nbsp;</span>
395
+ <span class="cline-any cline-no">&nbsp;</span>
396
+ <span class="cline-any cline-no">&nbsp;</span>
397
+ <span class="cline-any cline-no">&nbsp;</span>
398
+ <span class="cline-any cline-no">&nbsp;</span>
399
+ <span class="cline-any cline-no">&nbsp;</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import _ from 'lodash'</span></span></span>
401
+ <span class="cstat-no" title="statement not covered" >import fetch from 'node-fetch'</span>
402
+ <span class="cstat-no" title="statement not covered" >import xml2js from 'xml2js'</span>
403
+ <span class="cstat-no" title="statement not covered" >import { buildUrl } from '../../core/common/index.js'</span>
404
+ <span class="cstat-no" title="statement not covered" ></span>
405
+ <span class="cstat-no" title="statement not covered" >// https://www.opengeospatial.org/standards/wcs</span>
406
+ <span class="cstat-no" title="statement not covered" ></span>
407
+ <span class="cstat-no" title="statement not covered" >export function fetchAsJson (query) {</span>
408
+ <span class="cstat-no" title="statement not covered" > return fetch(query, { redirect: 'follow' })</span>
409
+ <span class="cstat-no" title="statement not covered" > .then(response =&gt; response.text())</span>
410
+ <span class="cstat-no" title="statement not covered" > .then(txt =&gt; xml2js.parseStringPromise(txt, { tagNameProcessors: [xml2js.processors.stripPrefix] }))</span>
411
+ <span class="cstat-no" title="statement not covered" >}</span>
412
+ <span class="cstat-no" title="statement not covered" ></span>
413
+ <span class="cstat-no" title="statement not covered" >export async function GetCapabilities (url, searchParams = {}) {</span>
414
414
  <span class="cstat-no" title="statement not covered" > const query = buildUrl(url, Object.assign({</span>
415
415
  <span class="cstat-no" title="statement not covered" > SERVICE: 'WCS',</span>
416
416
  <span class="cstat-no" title="statement not covered" > REQUEST: 'GetCapabilities'</span>
417
417
  <span class="cstat-no" title="statement not covered" > }, searchParams))</span>
418
- <span class="cstat-no" title="statement not covered" > return fetchAsJson(query, headers)</span>
418
+ <span class="cstat-no" title="statement not covered" > return fetchAsJson(query)</span>
419
419
  <span class="cstat-no" title="statement not covered" >}</span>
420
- &nbsp;
421
- export async function DescribeCoverage (url, version, coverage, searchParams = {}, headers = {}) {
422
- const query = buildUrl(url, Object.assign({
423
- SERVICE: 'WCS',
424
- VERSION: version,
425
- REQUEST: 'DescribeCoverage',
426
- COVERAGE: coverage
427
- }, searchParams))
428
- return fetchAsJson(query, headers)
429
- }
430
- &nbsp;
431
- export async function GetCoverage (abort, url, version, coverage, format, bbox, width, height, searchParams = {}, headers = {}) {
432
- const query = buildUrl(url, Object.assign({
433
- SERVICE: 'WCS',
434
- VERSION: version,
435
- REQUEST: 'GetCoverage',
436
- COVERAGE: coverage,
437
- CRS: 'EPSG:4326',
438
- BBOX: `${bbox.join(',')}`,
439
- WIDTH: width,
440
- HEIGHT: height,
441
- FORMAT: format
442
- }, searchParams))
443
- return fetch(query, { method: 'get', signal: abort, headers })
444
- // using a Blob is problematic with node.js since there's no support for it
445
- // instead use an ArrayBuffer
446
- // .then(response =&gt; response.blob())
447
- .then(response =&gt; response.arrayBuffer())
448
- }
449
- &nbsp;
450
- export function GetCoverageSpatialBounds (coverage) {
451
- // 1.0.0
452
- // CoverageDescription / CoverageOffering / lonLatEnvelope
453
- const envelope = _.get(coverage, 'CoverageDescription.CoverageOffering[0].lonLatEnvelope[0].pos', null)
454
- if (!envelope) <span class="branch-0 cbranch-no" title="branch not covered" >{ return null }</span>
455
- // assume lat long &amp; deg &amp; srs = 4326
456
- // TODO: check it
457
- const lats = []
458
- const lons = []
459
- for (const p of envelope) {
460
- const lonLat = p.split(' ')
461
- lons.push(parseFloat(lonLat[0]))
462
- lats.push(parseFloat(lonLat[1]))
463
- }
464
- const minLatLon = [Math.min(...lats), Math.min(...lons)]
465
- const maxLatLon = [Math.max(...lats), Math.max(...lons)]
466
- return [minLatLon[0], minLatLon[1], maxLatLon[0], maxLatLon[1]]
467
- }
468
- &nbsp;
469
- export function GetSupportedFormats (coverage) {
470
- // 1.0.0
471
- // CoverageDescription / CoverageOffering / supportedFormats
472
- const root = _.get(coverage, 'CoverageDescription.CoverageOffering[0].supportedFormats[0]', null)
473
- // const nativ = _.get(root, '$.nativeFormat', null)
474
- const formats = _.get(root, 'formats')
475
- // TODO: put native format as first entry
476
- // MapServer nativeFormat='geotiff' but this is not listed in
477
- // formats list ...
478
- /*
479
- if (nativ &amp;&amp; formats) {
480
- }
481
- */
482
- return formats
483
- }
484
- &nbsp;
485
- /*
486
- export function makeGetCapabilitiesQuery(url) {
487
- return `${url}?SERVICE=WCS&amp;VERSION=2.0.1&amp;REQUEST=GetCapabilities`
488
- }
489
- &nbsp;
490
- export function makeDescribeCoverageQuery(url, coverage) {
491
- return `${url}?SERVICE=WCS&amp;VERSION=2.0.1&amp;REQUEST=DescribeCoverage&amp;COVERAGEID=${coverage}`
492
- }
493
- &nbsp;
494
- export function makeGetCoverageQuery (url, coverage, format, subsets, scaleSizes) {
495
- let query = `${url}?SERVICE=WCS&amp;VERSION=2.0.1&amp;
496
- REQUEST=GetCoverage&amp;COVERAGEID=${coverage}&amp;FORMAT=${format}`
497
- for (const subset of subsets) {
498
- query += `&amp;SUBSET=${subset.axis}(${subset.low},${subset.high})`
499
- }
500
- if (scaleSizes) {
501
- query += `&amp;SCALESIZE=${scaleSizes[0].axis}(${scaleSizes[0].size})`
502
- for (let i = 1; i &lt; scaleSizes.length; ++i) {
503
- query += `,${scaleSizes[i].axis}(${scaleSizes[i].size})`
504
- }
505
- }
506
- return query
507
- }
508
- &nbsp;
509
- export async function GetCapabilities (url) {
510
- const query = makeGetCapabilitiesQuery(url)
511
- return fetch(query)
512
- .then(response =&gt; response.text())
513
- .then(txt =&gt; xml2js.parseStringPromise(txt))
514
- }
515
- &nbsp;
516
- export async function DescribeCoverage (url, coverage) {
517
- const query = makeDescribeCoverageQuery(url, coverage)
518
- return fetch(query)
519
- .then(response =&gt; response.text())
520
- .then(txt =&gt; xml2js.parseStringPromise(txt))
521
- }
522
- &nbsp;
523
- export async function GetCoverage (url, coverage, format, bbox, width, height, axisNames) {
524
- const subsets = [
525
- { axis: axisNames[0], low: bbox[0], high: bbox[2] }
526
- , { axis: axisNames[1], low: bbox[1], high: bbox[3] } ]
527
- const scaleSizes = [
528
- { axis: axisNames[0], size: height }
529
- , { axis: axisNames[1], size: width } ]
530
- const query = makeGetCoverageQuery(url, coverage, format, subsets, scaleSizes)
531
- return fetch(query)
532
- .then(response =&gt; response.blob())
533
- }
534
- &nbsp;
535
- export function GetSupportedFormats (capabilities) {
536
- // 2.0.1
537
- // wcs:Capabilities / wcs:ServiceMetadata / wcs:formatSupported
538
- return _.get(capabilities, 'wcs:Capabilities.wcs:ServiceMetadata[0].wcs:formatSupported', null)
539
- }
540
- &nbsp;
541
- export function GetOfferedCoverages (capabilities) {
542
- // 2.0.1
543
- // wcs:Capabilities / wcs:Contents / wcs:CoverageSummary / wcs:CoverageId
544
- const summary = _.get(capabilities, 'wcs:Capabilities.wcs:Contents[0].wcs:CoverageSummary')
545
- if (!summary)
546
- return null
547
- return summary.map(node =&gt; _.get(node, 'wcs:CoverageId[0]'))
548
- }
549
- &nbsp;
550
- export function GetCoverageSpatialBounds (coverage) {
551
- // 2.0.1
552
- // wcs:CoverageDescriptions / gml:boundedBy / gml:Envelope
553
- const envelope = _.get(coverage, 'wcs:CoverageDescriptions.wcs:CoverageDescription[0].gml:boundedBy[0].gml:Envelope[0]')
554
- if (!envelope)
555
- return null
556
- // assume lat long &amp; deg &amp; srs = 4326
557
- // TODO: check it
558
- const lowerCorner = _.get(envelope, 'gml:lowerCorner[0]', null)
559
- const upperCorner = _.get(envelope, 'gml:upperCorner[0]', null)
560
- if (!lowerCorner || !upperCorner)
561
- return null
562
- const minLatLon = lowerCorner.split(' ').map(val =&gt; parseFloat(val))
563
- const maxLatLon = upperCorner.split(' ').map(val =&gt; parseFloat(val))
564
- return [minLatLon[0], minLatLon[1], maxLatLon[0], maxLatLon[1]]
565
- }
566
- */
420
+ <span class="cstat-no" title="statement not covered" ></span>
421
+ <span class="cstat-no" title="statement not covered" >export async function DescribeCoverage (url, version, coverage, searchParams = {}) {</span>
422
+ <span class="cstat-no" title="statement not covered" > const query = buildUrl(url, Object.assign({</span>
423
+ <span class="cstat-no" title="statement not covered" > SERVICE: 'WCS',</span>
424
+ <span class="cstat-no" title="statement not covered" > VERSION: version,</span>
425
+ <span class="cstat-no" title="statement not covered" > REQUEST: 'DescribeCoverage',</span>
426
+ <span class="cstat-no" title="statement not covered" > COVERAGE: coverage</span>
427
+ <span class="cstat-no" title="statement not covered" > }, searchParams))</span>
428
+ <span class="cstat-no" title="statement not covered" > return fetchAsJson(query)</span>
429
+ <span class="cstat-no" title="statement not covered" >}</span>
430
+ <span class="cstat-no" title="statement not covered" ></span>
431
+ <span class="cstat-no" title="statement not covered" >export async function GetCoverage (abort, url, version, coverage, format, bbox, width, height, searchParams = {}) {</span>
432
+ <span class="cstat-no" title="statement not covered" > const query = buildUrl(url, Object.assign({</span>
433
+ <span class="cstat-no" title="statement not covered" > SERVICE: 'WCS',</span>
434
+ <span class="cstat-no" title="statement not covered" > VERSION: version,</span>
435
+ <span class="cstat-no" title="statement not covered" > REQUEST: 'GetCoverage',</span>
436
+ <span class="cstat-no" title="statement not covered" > COVERAGE: coverage,</span>
437
+ <span class="cstat-no" title="statement not covered" > CRS: 'EPSG:4326',</span>
438
+ <span class="cstat-no" title="statement not covered" > BBOX: `${bbox.join(',')}`,</span>
439
+ <span class="cstat-no" title="statement not covered" > WIDTH: width,</span>
440
+ <span class="cstat-no" title="statement not covered" > HEIGHT: height,</span>
441
+ <span class="cstat-no" title="statement not covered" > FORMAT: format</span>
442
+ <span class="cstat-no" title="statement not covered" > }, searchParams))</span>
443
+ <span class="cstat-no" title="statement not covered" > return fetch(query, { method: 'get', signal: abort })</span>
444
+ <span class="cstat-no" title="statement not covered" > // using a Blob is problematic with node.js since there's no support for it</span>
445
+ <span class="cstat-no" title="statement not covered" > // instead use an ArrayBuffer</span>
446
+ <span class="cstat-no" title="statement not covered" > // .then(response =&gt; response.blob())</span>
447
+ <span class="cstat-no" title="statement not covered" > .then(response =&gt; response.arrayBuffer())</span>
448
+ <span class="cstat-no" title="statement not covered" >}</span>
449
+ <span class="cstat-no" title="statement not covered" ></span>
450
+ <span class="cstat-no" title="statement not covered" >export function GetCoverageSpatialBounds (coverage) {</span>
451
+ <span class="cstat-no" title="statement not covered" > // 1.0.0</span>
452
+ <span class="cstat-no" title="statement not covered" > // CoverageDescription / CoverageOffering / lonLatEnvelope</span>
453
+ <span class="cstat-no" title="statement not covered" > const envelope = _.get(coverage, 'CoverageDescription.CoverageOffering[0].lonLatEnvelope[0].pos', null)</span>
454
+ <span class="cstat-no" title="statement not covered" > if (!envelope) { return null }</span>
455
+ <span class="cstat-no" title="statement not covered" > // assume lat long &amp; deg &amp; srs = 4326</span>
456
+ <span class="cstat-no" title="statement not covered" > // TODO: check it</span>
457
+ <span class="cstat-no" title="statement not covered" > const lats = []</span>
458
+ <span class="cstat-no" title="statement not covered" > const lons = []</span>
459
+ <span class="cstat-no" title="statement not covered" > for (const p of envelope) {</span>
460
+ <span class="cstat-no" title="statement not covered" > const lonLat = p.split(' ')</span>
461
+ <span class="cstat-no" title="statement not covered" > lons.push(parseFloat(lonLat[0]))</span>
462
+ <span class="cstat-no" title="statement not covered" > lats.push(parseFloat(lonLat[1]))</span>
463
+ <span class="cstat-no" title="statement not covered" > }</span>
464
+ <span class="cstat-no" title="statement not covered" > const minLatLon = [Math.min(...lats), Math.min(...lons)]</span>
465
+ <span class="cstat-no" title="statement not covered" > const maxLatLon = [Math.max(...lats), Math.max(...lons)]</span>
466
+ <span class="cstat-no" title="statement not covered" > return [minLatLon[0], minLatLon[1], maxLatLon[0], maxLatLon[1]]</span>
467
+ <span class="cstat-no" title="statement not covered" >}</span>
468
+ <span class="cstat-no" title="statement not covered" ></span>
469
+ <span class="cstat-no" title="statement not covered" >export function GetSupportedFormats (coverage) {</span>
470
+ <span class="cstat-no" title="statement not covered" > // 1.0.0</span>
471
+ <span class="cstat-no" title="statement not covered" > // CoverageDescription / CoverageOffering / supportedFormats</span>
472
+ <span class="cstat-no" title="statement not covered" > const root = _.get(coverage, 'CoverageDescription.CoverageOffering[0].supportedFormats[0]', null)</span>
473
+ <span class="cstat-no" title="statement not covered" > // const nativ = _.get(root, '$.nativeFormat', null)</span>
474
+ <span class="cstat-no" title="statement not covered" > const formats = _.get(root, 'formats')</span>
475
+ <span class="cstat-no" title="statement not covered" > // TODO: put native format as first entry</span>
476
+ <span class="cstat-no" title="statement not covered" > // MapServer nativeFormat='geotiff' but this is not listed in</span>
477
+ <span class="cstat-no" title="statement not covered" > // formats list ...</span>
478
+ <span class="cstat-no" title="statement not covered" > /*</span>
479
+ <span class="cstat-no" title="statement not covered" > if (nativ &amp;&amp; formats) {</span>
480
+ <span class="cstat-no" title="statement not covered" > }</span>
481
+ <span class="cstat-no" title="statement not covered" > */</span>
482
+ <span class="cstat-no" title="statement not covered" > return formats</span>
483
+ <span class="cstat-no" title="statement not covered" >}</span>
484
+ <span class="cstat-no" title="statement not covered" ></span>
485
+ <span class="cstat-no" title="statement not covered" >/*</span>
486
+ <span class="cstat-no" title="statement not covered" >export function makeGetCapabilitiesQuery(url) {</span>
487
+ <span class="cstat-no" title="statement not covered" > return `${url}?SERVICE=WCS&amp;VERSION=2.0.1&amp;REQUEST=GetCapabilities`</span>
488
+ <span class="cstat-no" title="statement not covered" >}</span>
489
+ <span class="cstat-no" title="statement not covered" ></span>
490
+ <span class="cstat-no" title="statement not covered" >export function makeDescribeCoverageQuery(url, coverage) {</span>
491
+ <span class="cstat-no" title="statement not covered" > return `${url}?SERVICE=WCS&amp;VERSION=2.0.1&amp;REQUEST=DescribeCoverage&amp;COVERAGEID=${coverage}`</span>
492
+ <span class="cstat-no" title="statement not covered" >}</span>
493
+ <span class="cstat-no" title="statement not covered" ></span>
494
+ <span class="cstat-no" title="statement not covered" >export function makeGetCoverageQuery (url, coverage, format, subsets, scaleSizes) {</span>
495
+ <span class="cstat-no" title="statement not covered" > let query = `${url}?SERVICE=WCS&amp;VERSION=2.0.1&amp;</span>
496
+ <span class="cstat-no" title="statement not covered" >REQUEST=GetCoverage&amp;COVERAGEID=${coverage}&amp;FORMAT=${format}`</span>
497
+ <span class="cstat-no" title="statement not covered" > for (const subset of subsets) {</span>
498
+ <span class="cstat-no" title="statement not covered" > query += `&amp;SUBSET=${subset.axis}(${subset.low},${subset.high})`</span>
499
+ <span class="cstat-no" title="statement not covered" > }</span>
500
+ <span class="cstat-no" title="statement not covered" > if (scaleSizes) {</span>
501
+ <span class="cstat-no" title="statement not covered" > query += `&amp;SCALESIZE=${scaleSizes[0].axis}(${scaleSizes[0].size})`</span>
502
+ <span class="cstat-no" title="statement not covered" > for (let i = 1; i &lt; scaleSizes.length; ++i) {</span>
503
+ <span class="cstat-no" title="statement not covered" > query += `,${scaleSizes[i].axis}(${scaleSizes[i].size})`</span>
504
+ <span class="cstat-no" title="statement not covered" > }</span>
505
+ <span class="cstat-no" title="statement not covered" > }</span>
506
+ <span class="cstat-no" title="statement not covered" > return query</span>
507
+ <span class="cstat-no" title="statement not covered" >}</span>
508
+ <span class="cstat-no" title="statement not covered" ></span>
509
+ <span class="cstat-no" title="statement not covered" >export async function GetCapabilities (url) {</span>
510
+ <span class="cstat-no" title="statement not covered" > const query = makeGetCapabilitiesQuery(url)</span>
511
+ <span class="cstat-no" title="statement not covered" > return fetch(query)</span>
512
+ <span class="cstat-no" title="statement not covered" > .then(response =&gt; response.text())</span>
513
+ <span class="cstat-no" title="statement not covered" > .then(txt =&gt; xml2js.parseStringPromise(txt))</span>
514
+ <span class="cstat-no" title="statement not covered" >}</span>
515
+ <span class="cstat-no" title="statement not covered" ></span>
516
+ <span class="cstat-no" title="statement not covered" >export async function DescribeCoverage (url, coverage) {</span>
517
+ <span class="cstat-no" title="statement not covered" > const query = makeDescribeCoverageQuery(url, coverage)</span>
518
+ <span class="cstat-no" title="statement not covered" > return fetch(query)</span>
519
+ <span class="cstat-no" title="statement not covered" > .then(response =&gt; response.text())</span>
520
+ <span class="cstat-no" title="statement not covered" > .then(txt =&gt; xml2js.parseStringPromise(txt))</span>
521
+ <span class="cstat-no" title="statement not covered" >}</span>
522
+ <span class="cstat-no" title="statement not covered" ></span>
523
+ <span class="cstat-no" title="statement not covered" >export async function GetCoverage (url, coverage, format, bbox, width, height, axisNames) {</span>
524
+ <span class="cstat-no" title="statement not covered" > const subsets = [</span>
525
+ <span class="cstat-no" title="statement not covered" > { axis: axisNames[0], low: bbox[0], high: bbox[2] }</span>
526
+ <span class="cstat-no" title="statement not covered" > , { axis: axisNames[1], low: bbox[1], high: bbox[3] } ]</span>
527
+ <span class="cstat-no" title="statement not covered" > const scaleSizes = [</span>
528
+ <span class="cstat-no" title="statement not covered" > { axis: axisNames[0], size: height }</span>
529
+ <span class="cstat-no" title="statement not covered" > , { axis: axisNames[1], size: width } ]</span>
530
+ <span class="cstat-no" title="statement not covered" > const query = makeGetCoverageQuery(url, coverage, format, subsets, scaleSizes)</span>
531
+ <span class="cstat-no" title="statement not covered" > return fetch(query)</span>
532
+ <span class="cstat-no" title="statement not covered" > .then(response =&gt; response.blob())</span>
533
+ <span class="cstat-no" title="statement not covered" >}</span>
534
+ <span class="cstat-no" title="statement not covered" ></span>
535
+ <span class="cstat-no" title="statement not covered" >export function GetSupportedFormats (capabilities) {</span>
536
+ <span class="cstat-no" title="statement not covered" > // 2.0.1</span>
537
+ <span class="cstat-no" title="statement not covered" > // wcs:Capabilities / wcs:ServiceMetadata / wcs:formatSupported</span>
538
+ <span class="cstat-no" title="statement not covered" > return _.get(capabilities, 'wcs:Capabilities.wcs:ServiceMetadata[0].wcs:formatSupported', null)</span>
539
+ <span class="cstat-no" title="statement not covered" >}</span>
540
+ <span class="cstat-no" title="statement not covered" ></span>
541
+ <span class="cstat-no" title="statement not covered" >export function GetOfferedCoverages (capabilities) {</span>
542
+ <span class="cstat-no" title="statement not covered" > // 2.0.1</span>
543
+ <span class="cstat-no" title="statement not covered" > // wcs:Capabilities / wcs:Contents / wcs:CoverageSummary / wcs:CoverageId</span>
544
+ <span class="cstat-no" title="statement not covered" > const summary = _.get(capabilities, 'wcs:Capabilities.wcs:Contents[0].wcs:CoverageSummary')</span>
545
+ <span class="cstat-no" title="statement not covered" > if (!summary)</span>
546
+ <span class="cstat-no" title="statement not covered" > return null</span>
547
+ <span class="cstat-no" title="statement not covered" > return summary.map(node =&gt; _.get(node, 'wcs:CoverageId[0]'))</span>
548
+ <span class="cstat-no" title="statement not covered" >}</span>
549
+ <span class="cstat-no" title="statement not covered" ></span>
550
+ <span class="cstat-no" title="statement not covered" >export function GetCoverageSpatialBounds (coverage) {</span>
551
+ <span class="cstat-no" title="statement not covered" > // 2.0.1</span>
552
+ <span class="cstat-no" title="statement not covered" > // wcs:CoverageDescriptions / gml:boundedBy / gml:Envelope</span>
553
+ <span class="cstat-no" title="statement not covered" > const envelope = _.get(coverage, 'wcs:CoverageDescriptions.wcs:CoverageDescription[0].gml:boundedBy[0].gml:Envelope[0]')</span>
554
+ <span class="cstat-no" title="statement not covered" > if (!envelope)</span>
555
+ <span class="cstat-no" title="statement not covered" > return null</span>
556
+ <span class="cstat-no" title="statement not covered" > // assume lat long &amp; deg &amp; srs = 4326</span>
557
+ <span class="cstat-no" title="statement not covered" > // TODO: check it</span>
558
+ <span class="cstat-no" title="statement not covered" > const lowerCorner = _.get(envelope, 'gml:lowerCorner[0]', null)</span>
559
+ <span class="cstat-no" title="statement not covered" > const upperCorner = _.get(envelope, 'gml:upperCorner[0]', null)</span>
560
+ <span class="cstat-no" title="statement not covered" > if (!lowerCorner || !upperCorner)</span>
561
+ <span class="cstat-no" title="statement not covered" > return null</span>
562
+ <span class="cstat-no" title="statement not covered" > const minLatLon = lowerCorner.split(' ').map(val =&gt; parseFloat(val))</span>
563
+ <span class="cstat-no" title="statement not covered" > const maxLatLon = upperCorner.split(' ').map(val =&gt; parseFloat(val))</span>
564
+ <span class="cstat-no" title="statement not covered" > return [minLatLon[0], minLatLon[1], maxLatLon[0], maxLatLon[1]]</span>
565
+ <span class="cstat-no" title="statement not covered" >}</span>
566
+ <span class="cstat-no" title="statement not covered" >*/</span>
567
567
  &nbsp;</pre></td></tr></table></pre>
568
568
 
569
569
  <div class='push'></div><!-- for sticky footer -->
@@ -571,7 +571,7 @@ export function GetCoverageSpatialBounds (coverage) {
571
571
  <div class='footer quiet pad2 space-top1 center small'>
572
572
  Code coverage generated by
573
573
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
574
- at 2025-07-24T10:00:20.508Z
574
+ at 2024-08-13T10:02:04.872Z
575
575
  </div>
576
576
  <script src="../../prettify.js"></script>
577
577
  <script>