@swisspost/internet-header 1.7.2 → 1.7.3-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/cjs/{index-92e9d4f8.js → index-0f01e1a4.js} +4 -3
  2. package/dist/cjs/index-0f01e1a4.js.map +1 -0
  3. package/dist/cjs/{klp-widget.controller-d23f72bb.js → klp-widget.controller-413d85e1.js} +2 -3
  4. package/dist/cjs/klp-widget.controller-413d85e1.js.map +1 -0
  5. package/dist/cjs/{language.service-dcd7bae3.js → language.service-4954855f.js} +2 -2
  6. package/dist/cjs/{language.service-dcd7bae3.js.map → language.service-4954855f.js.map} +1 -1
  7. package/dist/cjs/loader.cjs.js +2 -2
  8. package/dist/cjs/loader.cjs.js.map +1 -1
  9. package/dist/cjs/post-klp-login-widget.cjs.entry.js +5 -5
  10. package/dist/cjs/post-klp-login-widget.cjs.entry.js.map +1 -1
  11. package/dist/cjs/post-language-switch.cjs.entry.js +7 -7
  12. package/dist/cjs/post-language-switch.cjs.entry.js.map +1 -1
  13. package/dist/cjs/post-logo.cjs.entry.js +3 -3
  14. package/dist/cjs/post-logo.cjs.entry.js.map +1 -1
  15. package/dist/cjs/post-main-navigation.cjs.entry.js +17 -15
  16. package/dist/cjs/post-main-navigation.cjs.entry.js.map +1 -1
  17. package/dist/cjs/post-meta-navigation.cjs.entry.js +3 -3
  18. package/dist/cjs/post-meta-navigation.cjs.entry.js.map +1 -1
  19. package/dist/cjs/post-search.cjs.entry.js +61 -36
  20. package/dist/cjs/post-search.cjs.entry.js.map +1 -1
  21. package/dist/cjs/post-skiplinks.cjs.entry.js +5 -5
  22. package/dist/cjs/post-skiplinks.cjs.entry.js.map +1 -1
  23. package/dist/cjs/{store-638313d5.js → store-9d562808.js} +2 -2
  24. package/dist/cjs/{store-638313d5.js.map → store-9d562808.js.map} +1 -1
  25. package/dist/cjs/{svg-icon.component-f07628a9.js → svg-icon.component-f4cd45b0.js} +2 -2
  26. package/dist/cjs/{svg-icon.component-f07628a9.js.map → svg-icon.component-f4cd45b0.js.map} +1 -1
  27. package/dist/cjs/{svg-sprite.component-dc8e2e95.js → svg-sprite.component-e4b163ae.js} +2 -2
  28. package/dist/cjs/{svg-sprite.component-dc8e2e95.js.map → svg-sprite.component-e4b163ae.js.map} +1 -1
  29. package/dist/cjs/swisspost-internet-breadcrumbs.cjs.entry.js +6 -6
  30. package/dist/cjs/swisspost-internet-breadcrumbs.cjs.entry.js.map +1 -1
  31. package/dist/cjs/swisspost-internet-footer.cjs.entry.js +4 -4
  32. package/dist/cjs/swisspost-internet-footer.cjs.entry.js.map +1 -1
  33. package/dist/cjs/swisspost-internet-header.cjs.entry.js +28 -20
  34. package/dist/cjs/swisspost-internet-header.cjs.entry.js.map +1 -1
  35. package/dist/cjs/swisspost-internet-header.cjs.js +2 -2
  36. package/dist/cjs/swisspost-internet-header.cjs.js.map +1 -1
  37. package/dist/collection/assets/js/klp-login-widget.js +1 -2
  38. package/dist/collection/collection-manifest.json +2 -2
  39. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.css +113 -58
  40. package/dist/collection/components/post-internet-footer/post-internet-footer.css +78 -44
  41. package/dist/collection/components/post-internet-header/post-internet-header.css +68 -44
  42. package/dist/collection/components/post-klp-login-widget/post-klp-login-widget.css +68 -46
  43. package/dist/collection/components/post-language-switch/components/post-language-switch-list.js +1 -1
  44. package/dist/collection/components/post-language-switch/components/post-language-switch-list.js.map +1 -1
  45. package/dist/collection/components/post-language-switch/post-language-switch.css +79 -53
  46. package/dist/collection/components/post-logo/post-logo.css +68 -44
  47. package/dist/collection/components/post-main-navigation/post-main-navigation.css +73 -48
  48. package/dist/collection/components/post-main-navigation/post-main-navigation.js +11 -9
  49. package/dist/collection/components/post-main-navigation/post-main-navigation.js.map +1 -1
  50. package/dist/collection/components/post-meta-navigation/post-meta-navigation.css +72 -48
  51. package/dist/collection/components/post-search/post-search.css +162 -90
  52. package/dist/collection/components/post-skiplinks/post-skiplinks.css +1 -0
  53. package/dist/collection/services/config.service.spec.js +274 -0
  54. package/dist/collection/services/config.service.spec.js.map +1 -0
  55. package/dist/collection/services/route.service.js +11 -3
  56. package/dist/collection/services/route.service.js.map +1 -1
  57. package/dist/collection/services/route.service.spec.js +109 -0
  58. package/dist/collection/services/route.service.spec.js.map +1 -0
  59. package/dist/collection/services/search/coveo.service.js +18 -10
  60. package/dist/collection/services/search/coveo.service.js.map +1 -1
  61. package/dist/collection/services/search/parcel.service.js +18 -8
  62. package/dist/collection/services/search/parcel.service.js.map +1 -1
  63. package/dist/collection/services/search/places.service.js +20 -13
  64. package/dist/collection/services/search/places.service.js.map +1 -1
  65. package/dist/collection/services/search/search.service.spec.js +49 -0
  66. package/dist/collection/services/search/search.service.spec.js.map +1 -0
  67. package/dist/collection/utils/utils.spec.js +11 -0
  68. package/dist/collection/utils/utils.spec.js.map +1 -0
  69. package/dist/components/klp-widget.controller.js +1 -2
  70. package/dist/components/klp-widget.controller.js.map +1 -1
  71. package/dist/components/post-klp-login-widget2.js +1 -1
  72. package/dist/components/post-klp-login-widget2.js.map +1 -1
  73. package/dist/components/post-language-switch2.js +2 -2
  74. package/dist/components/post-language-switch2.js.map +1 -1
  75. package/dist/components/post-logo2.js +1 -1
  76. package/dist/components/post-logo2.js.map +1 -1
  77. package/dist/components/post-main-navigation2.js +12 -10
  78. package/dist/components/post-main-navigation2.js.map +1 -1
  79. package/dist/components/post-meta-navigation2.js +1 -1
  80. package/dist/components/post-meta-navigation2.js.map +1 -1
  81. package/dist/components/post-search2.js +57 -32
  82. package/dist/components/post-search2.js.map +1 -1
  83. package/dist/components/post-skiplinks2.js +1 -1
  84. package/dist/components/post-skiplinks2.js.map +1 -1
  85. package/dist/components/store.js.map +1 -1
  86. package/dist/components/swisspost-internet-breadcrumbs.js +1 -1
  87. package/dist/components/swisspost-internet-breadcrumbs.js.map +1 -1
  88. package/dist/components/swisspost-internet-footer.js +1 -1
  89. package/dist/components/swisspost-internet-footer.js.map +1 -1
  90. package/dist/components/swisspost-internet-header.js +23 -15
  91. package/dist/components/swisspost-internet-header.js.map +1 -1
  92. package/dist/esm/{index-35186c69.js → index-2aa4bc9f.js} +4 -3
  93. package/dist/esm/index-2aa4bc9f.js.map +1 -0
  94. package/dist/esm/{klp-widget.controller-945d9271.js → klp-widget.controller-1b2db6e7.js} +2 -3
  95. package/dist/esm/klp-widget.controller-1b2db6e7.js.map +1 -0
  96. package/dist/esm/{language.service-55e5ef74.js → language.service-c0f81273.js} +2 -2
  97. package/dist/esm/{language.service-55e5ef74.js.map → language.service-c0f81273.js.map} +1 -1
  98. package/dist/esm/loader.js +3 -3
  99. package/dist/esm/loader.js.map +1 -1
  100. package/dist/esm/polyfills/core-js.js +0 -0
  101. package/dist/esm/polyfills/dom.js +0 -0
  102. package/dist/esm/polyfills/es5-html-element.js +0 -0
  103. package/dist/esm/polyfills/index.js +0 -0
  104. package/dist/esm/polyfills/system.js +0 -0
  105. package/dist/esm/post-klp-login-widget.entry.js +5 -5
  106. package/dist/esm/post-klp-login-widget.entry.js.map +1 -1
  107. package/dist/esm/post-language-switch.entry.js +7 -7
  108. package/dist/esm/post-language-switch.entry.js.map +1 -1
  109. package/dist/esm/post-logo.entry.js +3 -3
  110. package/dist/esm/post-logo.entry.js.map +1 -1
  111. package/dist/esm/post-main-navigation.entry.js +17 -15
  112. package/dist/esm/post-main-navigation.entry.js.map +1 -1
  113. package/dist/esm/post-meta-navigation.entry.js +3 -3
  114. package/dist/esm/post-meta-navigation.entry.js.map +1 -1
  115. package/dist/esm/post-search.entry.js +61 -36
  116. package/dist/esm/post-search.entry.js.map +1 -1
  117. package/dist/esm/post-skiplinks.entry.js +5 -5
  118. package/dist/esm/post-skiplinks.entry.js.map +1 -1
  119. package/dist/esm/{store-b78e2d3b.js → store-d5165a8f.js} +2 -2
  120. package/dist/esm/{store-b78e2d3b.js.map → store-d5165a8f.js.map} +1 -1
  121. package/dist/esm/{svg-icon.component-7bac7397.js → svg-icon.component-02f233c7.js} +2 -2
  122. package/dist/esm/{svg-icon.component-7bac7397.js.map → svg-icon.component-02f233c7.js.map} +1 -1
  123. package/dist/esm/{svg-sprite.component-f319da57.js → svg-sprite.component-1f13a769.js} +2 -2
  124. package/dist/esm/{svg-sprite.component-f319da57.js.map → svg-sprite.component-1f13a769.js.map} +1 -1
  125. package/dist/esm/swisspost-internet-breadcrumbs.entry.js +6 -6
  126. package/dist/esm/swisspost-internet-breadcrumbs.entry.js.map +1 -1
  127. package/dist/esm/swisspost-internet-footer.entry.js +4 -4
  128. package/dist/esm/swisspost-internet-footer.entry.js.map +1 -1
  129. package/dist/esm/swisspost-internet-header.entry.js +28 -20
  130. package/dist/esm/swisspost-internet-header.entry.js.map +1 -1
  131. package/dist/esm/swisspost-internet-header.js +3 -3
  132. package/dist/esm/swisspost-internet-header.js.map +1 -1
  133. package/dist/esm-es5/{index-35186c69.js → index-2aa4bc9f.js} +2 -2
  134. package/dist/esm-es5/index-2aa4bc9f.js.map +1 -0
  135. package/dist/esm-es5/{klp-widget.controller-945d9271.js → klp-widget.controller-1b2db6e7.js} +2 -2
  136. package/dist/{swisspost-internet-header/p-b8d05765.system.js.map → esm-es5/klp-widget.controller-1b2db6e7.js.map} +1 -1
  137. package/dist/esm-es5/{language.service-55e5ef74.js → language.service-c0f81273.js} +2 -2
  138. package/dist/esm-es5/loader.js +1 -1
  139. package/dist/esm-es5/loader.js.map +1 -1
  140. package/dist/esm-es5/post-klp-login-widget.entry.js +1 -1
  141. package/dist/esm-es5/post-klp-login-widget.entry.js.map +1 -1
  142. package/dist/esm-es5/post-language-switch.entry.js +1 -1
  143. package/dist/esm-es5/post-language-switch.entry.js.map +1 -1
  144. package/dist/esm-es5/post-logo.entry.js +1 -1
  145. package/dist/esm-es5/post-logo.entry.js.map +1 -1
  146. package/dist/esm-es5/post-main-navigation.entry.js +1 -1
  147. package/dist/esm-es5/post-main-navigation.entry.js.map +1 -1
  148. package/dist/esm-es5/post-meta-navigation.entry.js +1 -1
  149. package/dist/esm-es5/post-meta-navigation.entry.js.map +1 -1
  150. package/dist/esm-es5/post-search.entry.js +1 -1
  151. package/dist/esm-es5/post-search.entry.js.map +1 -1
  152. package/dist/esm-es5/post-skiplinks.entry.js +1 -1
  153. package/dist/esm-es5/post-skiplinks.entry.js.map +1 -1
  154. package/dist/esm-es5/{store-b78e2d3b.js → store-d5165a8f.js} +2 -2
  155. package/dist/esm-es5/{store-b78e2d3b.js.map → store-d5165a8f.js.map} +1 -1
  156. package/dist/esm-es5/svg-icon.component-02f233c7.js +2 -0
  157. package/dist/esm-es5/{svg-sprite.component-f319da57.js → svg-sprite.component-1f13a769.js} +2 -2
  158. package/dist/esm-es5/swisspost-internet-breadcrumbs.entry.js +2 -2
  159. package/dist/esm-es5/swisspost-internet-breadcrumbs.entry.js.map +1 -1
  160. package/dist/esm-es5/swisspost-internet-footer.entry.js +1 -1
  161. package/dist/esm-es5/swisspost-internet-footer.entry.js.map +1 -1
  162. package/dist/esm-es5/swisspost-internet-header.entry.js +1 -1
  163. package/dist/esm-es5/swisspost-internet-header.entry.js.map +1 -1
  164. package/dist/esm-es5/swisspost-internet-header.js +1 -1
  165. package/dist/esm-es5/swisspost-internet-header.js.map +1 -1
  166. package/dist/swisspost-internet-header/p-04cf4eeb.system.entry.js +2 -0
  167. package/dist/swisspost-internet-header/{p-055f51f2.system.entry.js.map → p-04cf4eeb.system.entry.js.map} +1 -1
  168. package/dist/swisspost-internet-header/p-0af4e3e8.entry.js +2 -0
  169. package/dist/swisspost-internet-header/{p-6a22a9c3.entry.js.map → p-0af4e3e8.entry.js.map} +1 -1
  170. package/dist/swisspost-internet-header/p-18a3b952.system.entry.js +2 -0
  171. package/dist/swisspost-internet-header/p-18a3b952.system.entry.js.map +1 -0
  172. package/dist/swisspost-internet-header/p-1a2a0045.system.entry.js +2 -0
  173. package/dist/swisspost-internet-header/p-1a2a0045.system.entry.js.map +1 -0
  174. package/dist/swisspost-internet-header/p-25872a84.system.entry.js +2 -0
  175. package/dist/swisspost-internet-header/{p-02bb40cf.system.entry.js.map → p-25872a84.system.entry.js.map} +1 -1
  176. package/dist/swisspost-internet-header/p-2824a296.entry.js +7 -0
  177. package/dist/swisspost-internet-header/{p-30695393.entry.js.map → p-2824a296.entry.js.map} +1 -1
  178. package/dist/swisspost-internet-header/{p-b8d05765.system.js → p-30592816.system.js} +2 -2
  179. package/dist/{esm-es5/klp-widget.controller-945d9271.js.map → swisspost-internet-header/p-30592816.system.js.map} +1 -1
  180. package/dist/swisspost-internet-header/p-34205e78.entry.js +2 -0
  181. package/dist/swisspost-internet-header/p-34205e78.entry.js.map +1 -0
  182. package/dist/swisspost-internet-header/p-47b1ef62.entry.js +2 -0
  183. package/dist/swisspost-internet-header/{p-e95ed009.entry.js.map → p-47b1ef62.entry.js.map} +1 -1
  184. package/dist/swisspost-internet-header/p-5ecd4ac6.entry.js +2 -0
  185. package/dist/swisspost-internet-header/p-5ecd4ac6.entry.js.map +1 -0
  186. package/dist/swisspost-internet-header/{p-0d7864f3.js → p-6492c505.js} +2 -2
  187. package/dist/swisspost-internet-header/{p-0d7864f3.js.map → p-6492c505.js.map} +1 -1
  188. package/dist/swisspost-internet-header/{p-3819c4ce.system.js → p-65e18d30.system.js} +2 -2
  189. package/dist/swisspost-internet-header/{p-3819c4ce.system.js.map → p-65e18d30.system.js.map} +1 -1
  190. package/dist/swisspost-internet-header/{p-4d015bfc.system.js → p-70805f8f.system.js} +2 -2
  191. package/dist/swisspost-internet-header/{p-91035a2a.system.js → p-77394e93.system.js} +2 -2
  192. package/dist/swisspost-internet-header/p-7d4ecdb6.entry.js +2 -0
  193. package/dist/swisspost-internet-header/p-7d4ecdb6.entry.js.map +1 -0
  194. package/dist/swisspost-internet-header/p-809e69c8.entry.js +2 -0
  195. package/dist/swisspost-internet-header/{p-b9bcb22a.entry.js.map → p-809e69c8.entry.js.map} +1 -1
  196. package/dist/swisspost-internet-header/p-94d45cc5.system.entry.js +2 -0
  197. package/dist/swisspost-internet-header/{p-57f4eea0.system.entry.js.map → p-94d45cc5.system.entry.js.map} +1 -1
  198. package/dist/swisspost-internet-header/p-97793474.entry.js +2 -0
  199. package/dist/swisspost-internet-header/p-97793474.entry.js.map +1 -0
  200. package/dist/swisspost-internet-header/{p-6582303e.js → p-99eafc12.js} +2 -2
  201. package/dist/swisspost-internet-header/{p-e2db30e1.js → p-9a8f9281.js} +2 -2
  202. package/dist/swisspost-internet-header/{p-22e64bf2.js → p-b7feee8d.js} +2 -2
  203. package/dist/swisspost-internet-header/{p-22e64bf2.js.map → p-b7feee8d.js.map} +1 -1
  204. package/dist/swisspost-internet-header/p-bad10ea9.system.entry.js +7 -0
  205. package/dist/swisspost-internet-header/{p-4c9f1f1a.system.entry.js.map → p-bad10ea9.system.entry.js.map} +1 -1
  206. package/dist/swisspost-internet-header/{p-3df8cabd.system.entry.js → p-bf3dac2f.system.entry.js} +2 -2
  207. package/dist/swisspost-internet-header/p-bf3dac2f.system.entry.js.map +1 -0
  208. package/dist/swisspost-internet-header/p-c72e824c.entry.js +2 -0
  209. package/dist/swisspost-internet-header/p-c72e824c.entry.js.map +1 -0
  210. package/dist/swisspost-internet-header/p-c96ad7d6.entry.js +2 -0
  211. package/dist/swisspost-internet-header/{p-99228f51.entry.js.map → p-c96ad7d6.entry.js.map} +1 -1
  212. package/dist/swisspost-internet-header/p-c9cf2e49.system.entry.js +2 -0
  213. package/dist/swisspost-internet-header/{p-f349687c.system.entry.js.map → p-c9cf2e49.system.entry.js.map} +1 -1
  214. package/dist/swisspost-internet-header/{p-242b61d1.system.js → p-ce02164e.system.js} +2 -2
  215. package/dist/swisspost-internet-header/{p-2945db6c.js → p-d8b954a1.js} +3 -3
  216. package/dist/swisspost-internet-header/p-d8b954a1.js.map +1 -0
  217. package/dist/swisspost-internet-header/p-e415699e.system.entry.js +2 -0
  218. package/dist/swisspost-internet-header/p-e415699e.system.entry.js.map +1 -0
  219. package/dist/swisspost-internet-header/p-e75bba89.js +2 -0
  220. package/dist/swisspost-internet-header/p-eef407b0.system.entry.js +2 -0
  221. package/dist/swisspost-internet-header/p-eef407b0.system.entry.js.map +1 -0
  222. package/dist/swisspost-internet-header/{p-5e9ba287.system.js → p-f5935384.system.js} +2 -2
  223. package/dist/swisspost-internet-header/p-f5935384.system.js.map +1 -0
  224. package/dist/swisspost-internet-header/{p-49fe20ff.system.js → p-f70ab166.system.js} +2 -2
  225. package/dist/swisspost-internet-header/{p-49fe20ff.system.js.map → p-f70ab166.system.js.map} +1 -1
  226. package/dist/swisspost-internet-header/swisspost-internet-header.css +1 -1
  227. package/dist/swisspost-internet-header/swisspost-internet-header.esm.js +1 -1
  228. package/dist/swisspost-internet-header/swisspost-internet-header.esm.js.map +1 -1
  229. package/dist/swisspost-internet-header/swisspost-internet-header.js +1 -1
  230. package/dist/types/components/post-main-navigation/post-main-navigation.d.ts +2 -2
  231. package/package.json +26 -26
  232. package/dist/cjs/index-92e9d4f8.js.map +0 -1
  233. package/dist/cjs/klp-widget.controller-d23f72bb.js.map +0 -1
  234. package/dist/esm/index-35186c69.js.map +0 -1
  235. package/dist/esm/klp-widget.controller-945d9271.js.map +0 -1
  236. package/dist/esm-es5/index-35186c69.js.map +0 -1
  237. package/dist/esm-es5/svg-icon.component-7bac7397.js +0 -2
  238. package/dist/swisspost-internet-header/p-02bb40cf.system.entry.js +0 -2
  239. package/dist/swisspost-internet-header/p-055f51f2.system.entry.js +0 -2
  240. package/dist/swisspost-internet-header/p-1195cffa.entry.js +0 -2
  241. package/dist/swisspost-internet-header/p-1195cffa.entry.js.map +0 -1
  242. package/dist/swisspost-internet-header/p-1c0ba4e8.system.entry.js +0 -2
  243. package/dist/swisspost-internet-header/p-1c0ba4e8.system.entry.js.map +0 -1
  244. package/dist/swisspost-internet-header/p-2945db6c.js.map +0 -1
  245. package/dist/swisspost-internet-header/p-30695393.entry.js +0 -7
  246. package/dist/swisspost-internet-header/p-32fe68f0.js +0 -2
  247. package/dist/swisspost-internet-header/p-3462fe1c.entry.js +0 -2
  248. package/dist/swisspost-internet-header/p-3462fe1c.entry.js.map +0 -1
  249. package/dist/swisspost-internet-header/p-3cabcfa7.entry.js +0 -2
  250. package/dist/swisspost-internet-header/p-3cabcfa7.entry.js.map +0 -1
  251. package/dist/swisspost-internet-header/p-3df8cabd.system.entry.js.map +0 -1
  252. package/dist/swisspost-internet-header/p-4c9f1f1a.system.entry.js +0 -7
  253. package/dist/swisspost-internet-header/p-57f4eea0.system.entry.js +0 -2
  254. package/dist/swisspost-internet-header/p-5e9ba287.system.js.map +0 -1
  255. package/dist/swisspost-internet-header/p-6a22a9c3.entry.js +0 -2
  256. package/dist/swisspost-internet-header/p-73208b0d.system.entry.js +0 -2
  257. package/dist/swisspost-internet-header/p-73208b0d.system.entry.js.map +0 -1
  258. package/dist/swisspost-internet-header/p-96623613.system.entry.js +0 -2
  259. package/dist/swisspost-internet-header/p-96623613.system.entry.js.map +0 -1
  260. package/dist/swisspost-internet-header/p-99228f51.entry.js +0 -2
  261. package/dist/swisspost-internet-header/p-9a6083cb.entry.js +0 -2
  262. package/dist/swisspost-internet-header/p-9a6083cb.entry.js.map +0 -1
  263. package/dist/swisspost-internet-header/p-afdd23a8.system.entry.js +0 -2
  264. package/dist/swisspost-internet-header/p-afdd23a8.system.entry.js.map +0 -1
  265. package/dist/swisspost-internet-header/p-b9bcb22a.entry.js +0 -2
  266. package/dist/swisspost-internet-header/p-d5d1f301.entry.js +0 -2
  267. package/dist/swisspost-internet-header/p-d5d1f301.entry.js.map +0 -1
  268. package/dist/swisspost-internet-header/p-e95ed009.entry.js +0 -2
  269. package/dist/swisspost-internet-header/p-f349687c.system.entry.js +0 -2
  270. /package/dist/esm-es5/{language.service-55e5ef74.js.map → language.service-c0f81273.js.map} +0 -0
  271. /package/dist/esm-es5/{svg-icon.component-7bac7397.js.map → svg-icon.component-02f233c7.js.map} +0 -0
  272. /package/dist/esm-es5/{svg-sprite.component-f319da57.js.map → svg-sprite.component-1f13a769.js.map} +0 -0
  273. /package/dist/swisspost-internet-header/{p-4d015bfc.system.js.map → p-70805f8f.system.js.map} +0 -0
  274. /package/dist/swisspost-internet-header/{p-91035a2a.system.js.map → p-77394e93.system.js.map} +0 -0
  275. /package/dist/swisspost-internet-header/{p-6582303e.js.map → p-99eafc12.js.map} +0 -0
  276. /package/dist/swisspost-internet-header/{p-e2db30e1.js.map → p-9a8f9281.js.map} +0 -0
  277. /package/dist/swisspost-internet-header/{p-242b61d1.system.js.map → p-ce02164e.system.js.map} +0 -0
  278. /package/dist/swisspost-internet-header/{p-32fe68f0.js.map → p-e75bba89.js.map} +0 -0
@@ -0,0 +1,274 @@
1
+ import * as testConfigRaw from '../assets/config/test-configuration.json';
2
+ import { fetchConfig, generateConfigUrl, getLocalizedConfig, getLocalizedCustomConfig, isMobile, isValidProjectId, mergeOsFlyoutOverrides, setMainNavigationIds, } from './config.service';
3
+ const testConfig = testConfigRaw;
4
+ const customConfig = {
5
+ de: {
6
+ header: {
7
+ navMain: [
8
+ {
9
+ title: 'Meine Links (custom config)',
10
+ text: 'Meine Links',
11
+ flyout: [
12
+ {
13
+ title: 'Google',
14
+ linkList: [
15
+ { url: window.location.href, title: 'Google Maps', target: '_blank' },
16
+ { url: 'http://localhost:3333', title: 'Google Translate' },
17
+ { url: 'http://localhost:3333/aaa/bbb/ccc', title: 'Google Translate' },
18
+ ],
19
+ },
20
+ ],
21
+ },
22
+ ],
23
+ },
24
+ footer: {
25
+ block: {
26
+ title: 'Eigene Footer-Konfiguration',
27
+ links: [
28
+ { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },
29
+ { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },
30
+ { url: 'https://web.dev', text: 'web.dev', target: '_blank' },
31
+ { url: 'https://developer.mozilla.org', text: 'MDN Web Docs', target: '_blank' },
32
+ { url: 'https://getbootstrap.com', text: 'Bootstrap', target: '_blank' },
33
+ { url: 'https://google.com', text: 'Google', target: '_blank' },
34
+ { url: 'https://microsoft.com', text: 'Microsoft', target: '_blank' },
35
+ ],
36
+ },
37
+ },
38
+ },
39
+ en: {
40
+ footer: {
41
+ block: {
42
+ title: 'Custom footer config',
43
+ links: [
44
+ { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },
45
+ { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },
46
+ ],
47
+ },
48
+ },
49
+ },
50
+ };
51
+ const stringCustomConfig = JSON.stringify(customConfig);
52
+ describe('config.service.ts', () => {
53
+ global.fetch = jest.fn(() => {
54
+ return Promise.resolve({
55
+ json: () => Promise.resolve(testConfig),
56
+ });
57
+ });
58
+ describe('isMobile', () => {
59
+ it('checks the window width', () => {
60
+ global.innerWidth = 500;
61
+ expect(isMobile()).toBe(true);
62
+ global.innerWidth = 1500;
63
+ expect(isMobile()).toBe(false);
64
+ });
65
+ });
66
+ describe('isValidProjectId', () => {
67
+ it('Check if project id is valid', () => {
68
+ expect(isValidProjectId('test')).toBe(true);
69
+ expect(isValidProjectId('test123')).toBe(true);
70
+ expect(isValidProjectId('test-1')).toBe(true);
71
+ expect(isValidProjectId('test_1')).toBe(true);
72
+ expect(isValidProjectId('1test')).toBe(false);
73
+ expect(isValidProjectId(' test')).toBe(false);
74
+ expect(isValidProjectId('-test')).toBe(false);
75
+ expect(isValidProjectId('test-')).toBe(false);
76
+ expect(isValidProjectId('tes!t')).toBe(false);
77
+ expect(isValidProjectId('test.bla')).toBe(false);
78
+ expect(isValidProjectId('test,xy')).toBe(false);
79
+ expect(isValidProjectId('')).toBe(false);
80
+ });
81
+ });
82
+ describe('setMainNavigationIds', () => {
83
+ it('should replace all main nav ids with browser compatible ids and keep flyout_os', () => {
84
+ const base = [
85
+ { id: 123 },
86
+ { id: 'flyout_os' },
87
+ { id: '-11' },
88
+ { id: '%' },
89
+ ];
90
+ setMainNavigationIds(base);
91
+ expect(base).toEqual(expect.arrayContaining([
92
+ expect.objectContaining({
93
+ id: expect.stringMatching(/^main-nav-.+|^flyout_os$/gi),
94
+ }),
95
+ ]));
96
+ });
97
+ });
98
+ describe('getLocalizedCustomConfig', () => {
99
+ it('should parse the correct config', () => {
100
+ expect(typeof getLocalizedCustomConfig(stringCustomConfig, 'de')).toBe('object');
101
+ });
102
+ it('should return object if config lang is found', () => {
103
+ expect(typeof getLocalizedCustomConfig(customConfig, 'de')).toBe('object');
104
+ });
105
+ it('should return null if lang is not found in config', () => {
106
+ expect(getLocalizedCustomConfig(stringCustomConfig, 'kz')).toBe(undefined);
107
+ });
108
+ });
109
+ describe('generateConfigUrl', () => {
110
+ it('should return a test URL', () => {
111
+ expect(generateConfigUrl('test', 'int01')).toEqual('assets/config/test-configuration.json');
112
+ });
113
+ it('should return an int URL', () => {
114
+ expect(generateConfigUrl('topos', 'int01')).toEqual('https://int.post.ch/api/headerjs/Json?serviceid=topos&environment=int01');
115
+ });
116
+ it('should return prod by default', () => {
117
+ expect(generateConfigUrl('topos', 'prod')).toEqual('https://www.post.ch/api/headerjs/Json?serviceid=topos');
118
+ });
119
+ it('should reduce XSS risk', () => {
120
+ expect(generateConfigUrl('<script>alert()</script>', 'prod')).toEqual('https://www.post.ch/api/headerjs/Json?serviceid=%3Cscript%3Ealert()%3C%2Fscript%3E');
121
+ });
122
+ it('should work with upper case env', () => {
123
+ /* @ts-expect-error */
124
+ expect(generateConfigUrl('whatever', 'INT01')).toEqual('https://int.post.ch/api/headerjs/Json?serviceid=whatever&environment=int01');
125
+ });
126
+ });
127
+ describe('fetchConfig', () => {
128
+ it('should fetch config', async () => {
129
+ const res = await fetchConfig('test', 'int01');
130
+ expect(res).toEqual(testConfig);
131
+ expect(fetch).toHaveBeenCalledTimes(1);
132
+ });
133
+ });
134
+ describe('mergeOsFlyoutOverrides', () => {
135
+ it('should merge configs correctly', () => {
136
+ const newConfig = mergeOsFlyoutOverrides(testConfig.de, {
137
+ title: 'Test',
138
+ });
139
+ const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');
140
+ if (!osFlyout)
141
+ fail('osFlyout is undefined');
142
+ expect(osFlyout.title).toBe('Test');
143
+ });
144
+ it('should not overwrite function parameter', () => {
145
+ const newConfig = mergeOsFlyoutOverrides(testConfig.de, {
146
+ title: 'Test',
147
+ flyout: [
148
+ {
149
+ linkList: [
150
+ {
151
+ title: 'Additional link',
152
+ url: '/',
153
+ },
154
+ ],
155
+ },
156
+ ],
157
+ });
158
+ const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');
159
+ if (!osFlyout)
160
+ fail('osFlyout is undefined');
161
+ expect(osFlyout.flyout[0].linkList.length).toBe(2);
162
+ const newConfig2 = mergeOsFlyoutOverrides(testConfig.de, {
163
+ title: 'Test',
164
+ flyout: [
165
+ {
166
+ linkList: [
167
+ {
168
+ title: 'Additional link',
169
+ url: '/',
170
+ },
171
+ ],
172
+ },
173
+ ],
174
+ });
175
+ const osFlyout2 = newConfig2.find(nav => nav.id === 'flyout_os');
176
+ if (!osFlyout2)
177
+ fail('osFlyout is undefined');
178
+ expect(osFlyout2.flyout[0].linkList.length).toBe(2);
179
+ });
180
+ it('should extend os flyout with additional columns', () => {
181
+ const newConfig = mergeOsFlyoutOverrides(testConfig.de, {
182
+ title: 'Test',
183
+ flyout: [
184
+ {
185
+ linkList: [
186
+ {
187
+ title: 'Additional link',
188
+ url: '/',
189
+ },
190
+ ],
191
+ },
192
+ {
193
+ title: 'New column',
194
+ linkList: [
195
+ {
196
+ title: 'Link in new column',
197
+ url: '/',
198
+ },
199
+ ],
200
+ },
201
+ ],
202
+ });
203
+ const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');
204
+ if (!osFlyout)
205
+ fail('osFlyout is undefined');
206
+ expect(osFlyout.flyout.length).toBe(2);
207
+ });
208
+ });
209
+ describe('getLocalizedConfig', () => {
210
+ it('should get correct local config', async () => {
211
+ const config = await getLocalizedConfig({
212
+ projectId: 'test',
213
+ environment: 'int01',
214
+ language: 'de',
215
+ });
216
+ expect(config).toEqual(testConfig.de);
217
+ });
218
+ it('should modify the config correctly', async () => {
219
+ const config = await getLocalizedConfig({
220
+ projectId: 'test',
221
+ environment: 'int01',
222
+ language: 'de',
223
+ localizedCustomConfig: {
224
+ header: {
225
+ navMain: [
226
+ {
227
+ title: 'New Navmain',
228
+ flyout: [
229
+ {
230
+ title: 'New Navcol',
231
+ linkList: [
232
+ {
233
+ title: 'New Navlink',
234
+ url: '/',
235
+ },
236
+ ],
237
+ },
238
+ ],
239
+ },
240
+ ],
241
+ },
242
+ },
243
+ });
244
+ const [lastMainNav] = config.header.navMain.slice(-1);
245
+ expect(lastMainNav.title).toBe('New Navmain');
246
+ expect(lastMainNav.flyout.length).toBe(1);
247
+ });
248
+ it('should extend flyout_os', async () => {
249
+ const config = await getLocalizedConfig({
250
+ projectId: 'test',
251
+ environment: 'int01',
252
+ language: 'de',
253
+ osFlyoutOverrides: {
254
+ flyout: [
255
+ {
256
+ title: 'OS Extender',
257
+ linkList: [
258
+ {
259
+ title: 'Added link',
260
+ url: '/',
261
+ },
262
+ ],
263
+ },
264
+ ],
265
+ },
266
+ });
267
+ const osFlyout = config.header.navMain.find(nav => nav.id === 'flyout_os');
268
+ if (!osFlyout)
269
+ fail('osFlyout is undefined');
270
+ expect(osFlyout.flyout[0].linkList.length).toBe(2);
271
+ });
272
+ });
273
+ });
274
+ //# sourceMappingURL=config.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.service.spec.js","sourceRoot":"","sources":["../../../src/services/config.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { ICustomConfig, ILocalizedCustomConfig, IPortalConfig } from '../models/general.model';\nimport { NavMainEntity } from '../models/header.model';\nimport * as testConfigRaw from '../assets/config/test-configuration.json';\nimport {\n fetchConfig,\n generateConfigUrl,\n getLocalizedConfig,\n getLocalizedCustomConfig,\n isMobile,\n isValidProjectId,\n mergeOsFlyoutOverrides,\n setMainNavigationIds,\n} from './config.service';\n\nconst testConfig: IPortalConfig = testConfigRaw as IPortalConfig;\n\nconst customConfig = {\n de: {\n header: {\n navMain: [\n {\n title: 'Meine Links (custom config)',\n text: 'Meine Links',\n flyout: [\n {\n title: 'Google',\n linkList: [\n { url: window.location.href, title: 'Google Maps', target: '_blank' },\n { url: 'http://localhost:3333', title: 'Google Translate' },\n { url: 'http://localhost:3333/aaa/bbb/ccc', title: 'Google Translate' },\n ],\n },\n ],\n },\n ],\n },\n footer: {\n block: {\n title: 'Eigene Footer-Konfiguration',\n links: [\n { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },\n { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },\n { url: 'https://web.dev', text: 'web.dev', target: '_blank' },\n { url: 'https://developer.mozilla.org', text: 'MDN Web Docs', target: '_blank' },\n { url: 'https://getbootstrap.com', text: 'Bootstrap', target: '_blank' },\n { url: 'https://google.com', text: 'Google', target: '_blank' },\n { url: 'https://microsoft.com', text: 'Microsoft', target: '_blank' },\n ],\n },\n },\n },\n en: {\n footer: {\n block: {\n title: 'Custom footer config',\n links: [\n { url: 'https://fireship.io', text: 'Fireship.io', target: '_blank' },\n { url: 'https://css-tricks.com', text: 'CSS-Tricks', target: '_blank' },\n ],\n },\n },\n },\n};\nconst stringCustomConfig = JSON.stringify(customConfig);\n\ndescribe('config.service.ts', () => {\n global.fetch = jest.fn(() => {\n return Promise.resolve({\n json: () => Promise.resolve(testConfig),\n }) as Promise<Response>;\n });\n\n describe('isMobile', () => {\n it('checks the window width', () => {\n global.innerWidth = 500;\n expect(isMobile()).toBe(true);\n global.innerWidth = 1500;\n expect(isMobile()).toBe(false);\n });\n });\n\n describe('isValidProjectId', () => {\n it('Check if project id is valid', () => {\n expect(isValidProjectId('test')).toBe(true);\n expect(isValidProjectId('test123')).toBe(true);\n expect(isValidProjectId('test-1')).toBe(true);\n expect(isValidProjectId('test_1')).toBe(true);\n\n expect(isValidProjectId('1test')).toBe(false);\n\n expect(isValidProjectId(' test')).toBe(false);\n expect(isValidProjectId('-test')).toBe(false);\n expect(isValidProjectId('test-')).toBe(false);\n expect(isValidProjectId('tes!t')).toBe(false);\n expect(isValidProjectId('test.bla')).toBe(false);\n expect(isValidProjectId('test,xy')).toBe(false);\n expect(isValidProjectId('')).toBe(false);\n });\n });\n\n describe('setMainNavigationIds', () => {\n it('should replace all main nav ids with browser compatible ids and keep flyout_os', () => {\n const base = [\n { id: 123 },\n { id: 'flyout_os' },\n { id: '-11' },\n { id: '%' },\n ] as NavMainEntity[];\n setMainNavigationIds(base);\n expect(base).toEqual(\n expect.arrayContaining([\n expect.objectContaining({\n id: expect.stringMatching(/^main-nav-.+|^flyout_os$/gi),\n }),\n ]),\n );\n });\n });\n\n describe('getLocalizedCustomConfig', () => {\n it('should parse the correct config', () => {\n expect(typeof getLocalizedCustomConfig(stringCustomConfig, 'de')).toBe('object');\n });\n\n it('should return object if config lang is found', () => {\n expect(typeof getLocalizedCustomConfig(customConfig as ICustomConfig, 'de')).toBe('object');\n });\n\n it('should return null if lang is not found in config', () => {\n expect(getLocalizedCustomConfig(stringCustomConfig, 'kz')).toBe(undefined);\n });\n });\n\n describe('generateConfigUrl', () => {\n it('should return a test URL', () => {\n expect(generateConfigUrl('test', 'int01')).toEqual('assets/config/test-configuration.json');\n });\n\n it('should return an int URL', () => {\n expect(generateConfigUrl('topos', 'int01')).toEqual(\n 'https://int.post.ch/api/headerjs/Json?serviceid=topos&environment=int01',\n );\n });\n\n it('should return prod by default', () => {\n expect(generateConfigUrl('topos', 'prod')).toEqual(\n 'https://www.post.ch/api/headerjs/Json?serviceid=topos',\n );\n });\n\n it('should reduce XSS risk', () => {\n expect(generateConfigUrl('<script>alert()</script>', 'prod')).toEqual(\n 'https://www.post.ch/api/headerjs/Json?serviceid=%3Cscript%3Ealert()%3C%2Fscript%3E',\n );\n });\n\n it('should work with upper case env', () => {\n /* @ts-expect-error */\n expect(generateConfigUrl('whatever', 'INT01')).toEqual(\n 'https://int.post.ch/api/headerjs/Json?serviceid=whatever&environment=int01',\n );\n });\n });\n\n describe('fetchConfig', () => {\n it('should fetch config', async () => {\n const res = await fetchConfig('test', 'int01');\n expect(res).toEqual(testConfig);\n expect(fetch).toHaveBeenCalledTimes(1);\n });\n });\n\n describe('mergeOsFlyoutOverrides', () => {\n it('should merge configs correctly', () => {\n const newConfig = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n } as NavMainEntity);\n\n const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.title).toBe('Test');\n });\n\n it('should not overwrite function parameter', () => {\n const newConfig = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n flyout: [\n {\n linkList: [\n {\n title: 'Additional link',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity);\n\n const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.flyout[0].linkList.length).toBe(2);\n\n const newConfig2 = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n flyout: [\n {\n linkList: [\n {\n title: 'Additional link',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity);\n const osFlyout2 = newConfig2.find(nav => nav.id === 'flyout_os');\n if (!osFlyout2) fail('osFlyout is undefined');\n expect(osFlyout2.flyout[0].linkList.length).toBe(2);\n });\n\n it('should extend os flyout with additional columns', () => {\n const newConfig = mergeOsFlyoutOverrides(testConfig.de!, {\n title: 'Test',\n flyout: [\n {\n linkList: [\n {\n title: 'Additional link',\n url: '/',\n },\n ],\n },\n {\n title: 'New column',\n linkList: [\n {\n title: 'Link in new column',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity);\n\n const osFlyout = newConfig.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.flyout.length).toBe(2);\n });\n });\n\n describe('getLocalizedConfig', () => {\n it('should get correct local config', async () => {\n const config = await getLocalizedConfig({\n projectId: 'test',\n environment: 'int01',\n language: 'de',\n });\n expect(config).toEqual(testConfig.de);\n });\n\n it('should modify the config correctly', async () => {\n const config = await getLocalizedConfig({\n projectId: 'test',\n environment: 'int01',\n language: 'de',\n localizedCustomConfig: {\n header: {\n navMain: [\n {\n title: 'New Navmain',\n flyout: [\n {\n title: 'New Navcol',\n linkList: [\n {\n title: 'New Navlink',\n url: '/',\n },\n ],\n },\n ],\n },\n ],\n },\n } as ILocalizedCustomConfig,\n });\n\n const [lastMainNav] = config.header.navMain.slice(-1);\n\n expect(lastMainNav.title).toBe('New Navmain');\n expect(lastMainNav.flyout.length).toBe(1);\n });\n\n it('should extend flyout_os', async () => {\n const config = await getLocalizedConfig({\n projectId: 'test',\n environment: 'int01',\n language: 'de',\n osFlyoutOverrides: {\n flyout: [\n {\n title: 'OS Extender',\n linkList: [\n {\n title: 'Added link',\n url: '/',\n },\n ],\n },\n ],\n } as NavMainEntity,\n });\n const osFlyout = config.header.navMain.find(nav => nav.id === 'flyout_os');\n if (!osFlyout) fail('osFlyout is undefined');\n expect(osFlyout.flyout[0].linkList.length).toBe(2);\n });\n });\n});\n"]}
@@ -125,8 +125,10 @@ export const compareRoutes = (baseUrl, compareUrl, matchMode) => {
125
125
  if (!baseUrl || !compareUrl || baseUrl.origin !== compareUrl.origin) {
126
126
  return 0;
127
127
  }
128
+ const baseUrlPath = baseUrl.pathname.toLocaleLowerCase();
129
+ const compareUrlPath = compareUrl.pathname.toLocaleLowerCase();
128
130
  // Exact match, origin and pathname are the same
129
- if (baseUrl.pathname === compareUrl.pathname) {
131
+ if (baseUrlPath === compareUrlPath) {
130
132
  return Infinity;
131
133
  }
132
134
  // The basepath is longer than the comparison, a match is impossible
@@ -134,8 +136,14 @@ export const compareRoutes = (baseUrl, compareUrl, matchMode) => {
134
136
  return 0;
135
137
  }
136
138
  if (matchMode === 'auto') {
137
- const baseSegments = [baseUrl.origin, ...baseUrl.pathname.split('/').filter(x => !!x)];
138
- const compareSegments = [compareUrl.origin, ...compareUrl.pathname.split('/').filter(x => !!x)];
139
+ const baseSegments = [
140
+ baseUrl.origin.toLocaleLowerCase(),
141
+ ...baseUrlPath.split('/').filter(x => !!x),
142
+ ];
143
+ const compareSegments = [
144
+ compareUrl.origin.toLocaleLowerCase(),
145
+ ...compareUrlPath.split('/').filter(x => !!x),
146
+ ];
139
147
  const score = getSimilarityScore(baseSegments, compareSegments);
140
148
  // If only some segments match, but not the whole smaller array, it's not a match
141
149
  return Math.min(baseSegments.length, compareSegments.length) === score ? score : 0;
@@ -1 +1 @@
1
- {"version":3,"file":"route.service.js","sourceRoot":"","sources":["../../../src/services/route.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ActiveRouteProp } from '../models/general.model';\nimport { NavMainEntity, MainNavScoreList } from '../models/header.model';\n\n/**\n * Activate the current route based on the config and the match mode\n * @param config Main Navigation Config\n * @param activeRouteProp Match mode\n * @returns Modified Main Navigation Config\n */\nexport const markActiveRoute = (\n config: NavMainEntity[],\n activeRouteProp: ActiveRouteProp,\n): NavMainEntity[] => {\n // Don't highlight any route\n if (activeRouteProp === false) {\n return config;\n }\n\n // Set compare URL and check if activeRouteProp is valid\n let compareUrl: URL;\n config = resetOverrideConfig(config);\n\n if (activeRouteProp === 'auto' || activeRouteProp === 'exact') {\n // Check if an active route is already configured, set override to that and return\n if (hasActivePortalRoute(config)) {\n return resetActiveStateToPortalConfig(config);\n }\n\n compareUrl = new URL(window.location.href);\n } else {\n try {\n compareUrl = new URL(activeRouteProp, document.location.origin);\n } catch (error) {\n console.warn(\n `Active Route: ${activeRouteProp} is not a valid URL. Navigation highlighting has been disabled.`,\n );\n return config;\n }\n }\n\n const scoreList = compileScoreList(config, compareUrl, activeRouteProp);\n\n if (scoreList.length === 0) {\n // No match found or already active links defined\n return config;\n }\n\n const winnerPair = scoreList[0];\n winnerPair.main.isActiveOverride = true;\n if (winnerPair.sub) winnerPair.sub.isActiveOverride = true;\n\n return config;\n};\n\n/**\n * Check if the portal config set any active route\n * @param config Main navigation config\n * @returns True if portal set any route as active\n */\nexport const hasActivePortalRoute = (config: NavMainEntity[]): boolean => {\n return config.filter(nav => nav.isActive).length > 0;\n};\n\nexport const resetActiveStateToPortalConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: nav.isActive,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: link.isActive })),\n })),\n }));\n};\n\nconst resetOverrideConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: false,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: false })),\n })),\n }));\n};\n\n/**\n * Compile a list of scores based on the map mode, sorted in descending order\n * @param config Main Nav Config\n * @param compareUrl Current Browser URL or a custom URL\n * @param activeRouteProp Match mode\n * @returns A list of scored URLs if any matched\n */\nexport const compileScoreList = (\n config: NavMainEntity[],\n compareUrl: URL,\n activeRouteProp: ActiveRouteProp,\n): MainNavScoreList => {\n // Flag to check if the Portal set any active links or if there are any exact matches\n let hadAnyActiveLink = false;\n const scoreList: MainNavScoreList = [];\n\n config.forEach(mainNav => {\n if (hadAnyActiveLink || !mainNav) {\n return;\n }\n\n try {\n const score = compareRoutes(\n compareUrl,\n new URL(mainNav.url),\n activeRouteProp as 'auto' | 'exact',\n );\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n scoreList.push({ main: mainNav, score });\n }\n } catch {\n // Not a valid url, continue\n }\n\n // Loop through flyout links 2nd level\n if (mainNav.flyout.length) {\n mainNav.flyout.forEach(flyout => {\n if (flyout.linkList) {\n flyout.linkList.forEach(linklist => {\n // Don't override if any link is already active\n if (linklist.isActive && (activeRouteProp === 'auto' || activeRouteProp === 'exact')) {\n hadAnyActiveLink = true;\n return;\n }\n\n try {\n const url = new URL(linklist.url);\n const score = compareRoutes(compareUrl, url, activeRouteProp as 'auto' | 'exact');\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n\n // Push score\n scoreList.push({\n main: mainNav,\n sub: linklist,\n score,\n });\n }\n } catch {\n // Not a valid URL, continue\n }\n });\n }\n });\n }\n });\n\n return scoreList.sort((a, b) => b.score - a.score);\n};\n\n/**\n * Compare two URLs for similarity based on a match mode\n * @param baseUrl Browser URL\n * @param compareUrl Navigatgion URL\n * @param matchMode exact or auto matching\n * @returns Score\n */\nexport const compareRoutes = (\n baseUrl: URL,\n compareUrl: URL,\n matchMode?: 'auto' | 'exact',\n): number => {\n // One url is not defined or they don't share the same orign\n if (!baseUrl || !compareUrl || baseUrl.origin !== compareUrl.origin) {\n return 0;\n }\n\n // Exact match, origin and pathname are the same\n if (baseUrl.pathname === compareUrl.pathname) {\n return Infinity;\n }\n\n // The basepath is longer than the comparison, a match is impossible\n if (baseUrl.pathname.length < compareUrl.pathname.length) {\n return 0;\n }\n\n if (matchMode === 'auto') {\n const baseSegments = [baseUrl.origin, ...baseUrl.pathname.split('/').filter(x => !!x)];\n const compareSegments = [compareUrl.origin, ...compareUrl.pathname.split('/').filter(x => !!x)];\n\n const score = getSimilarityScore(baseSegments, compareSegments);\n\n // If only some segments match, but not the whole smaller array, it's not a match\n return Math.min(baseSegments.length, compareSegments.length) === score ? score : 0;\n }\n\n return 0;\n};\n\n/**\n * Check how many items in an array match\n * @param a Base array\n * @param b Compare array\n * @returns Score\n */\nexport const getSimilarityScore = (a: string[], b: string[]): number => {\n if (!a?.length || !b?.length) {\n return 0;\n }\n\n let i = 0;\n for (; i < Math.min(a.length, b.length); i++) {\n if (a[i] !== b[i]) {\n return 0;\n }\n }\n\n return i;\n};\n"]}
1
+ {"version":3,"file":"route.service.js","sourceRoot":"","sources":["../../../src/services/route.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { ActiveRouteProp } from '../models/general.model';\nimport { NavMainEntity, MainNavScoreList } from '../models/header.model';\n\n/**\n * Activate the current route based on the config and the match mode\n * @param config Main Navigation Config\n * @param activeRouteProp Match mode\n * @returns Modified Main Navigation Config\n */\nexport const markActiveRoute = (\n config: NavMainEntity[],\n activeRouteProp: ActiveRouteProp,\n): NavMainEntity[] => {\n // Don't highlight any route\n if (activeRouteProp === false) {\n return config;\n }\n\n // Set compare URL and check if activeRouteProp is valid\n let compareUrl: URL;\n config = resetOverrideConfig(config);\n\n if (activeRouteProp === 'auto' || activeRouteProp === 'exact') {\n // Check if an active route is already configured, set override to that and return\n if (hasActivePortalRoute(config)) {\n return resetActiveStateToPortalConfig(config);\n }\n\n compareUrl = new URL(window.location.href);\n } else {\n try {\n compareUrl = new URL(activeRouteProp, document.location.origin);\n } catch (error) {\n console.warn(\n `Active Route: ${activeRouteProp} is not a valid URL. Navigation highlighting has been disabled.`,\n );\n return config;\n }\n }\n\n const scoreList = compileScoreList(config, compareUrl, activeRouteProp);\n\n if (scoreList.length === 0) {\n // No match found or already active links defined\n return config;\n }\n\n const winnerPair = scoreList[0];\n winnerPair.main.isActiveOverride = true;\n if (winnerPair.sub) winnerPair.sub.isActiveOverride = true;\n\n return config;\n};\n\n/**\n * Check if the portal config set any active route\n * @param config Main navigation config\n * @returns True if portal set any route as active\n */\nexport const hasActivePortalRoute = (config: NavMainEntity[]): boolean => {\n return config.filter(nav => nav.isActive).length > 0;\n};\n\nexport const resetActiveStateToPortalConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: nav.isActive,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: link.isActive })),\n })),\n }));\n};\n\nconst resetOverrideConfig = (config: NavMainEntity[]): NavMainEntity[] => {\n return config.map(nav => ({\n ...nav,\n isActiveOverride: false,\n flyout: nav.flyout.map(flyout => ({\n ...flyout,\n linkList: flyout.linkList.map(link => ({ ...link, isActiveOverride: false })),\n })),\n }));\n};\n\n/**\n * Compile a list of scores based on the map mode, sorted in descending order\n * @param config Main Nav Config\n * @param compareUrl Current Browser URL or a custom URL\n * @param activeRouteProp Match mode\n * @returns A list of scored URLs if any matched\n */\nexport const compileScoreList = (\n config: NavMainEntity[],\n compareUrl: URL,\n activeRouteProp: ActiveRouteProp,\n): MainNavScoreList => {\n // Flag to check if the Portal set any active links or if there are any exact matches\n let hadAnyActiveLink = false;\n const scoreList: MainNavScoreList = [];\n\n config.forEach(mainNav => {\n if (hadAnyActiveLink || !mainNav) {\n return;\n }\n\n try {\n const score = compareRoutes(\n compareUrl,\n new URL(mainNav.url),\n activeRouteProp as 'auto' | 'exact',\n );\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n scoreList.push({ main: mainNav, score });\n }\n } catch {\n // Not a valid url, continue\n }\n\n // Loop through flyout links 2nd level\n if (mainNav.flyout.length) {\n mainNav.flyout.forEach(flyout => {\n if (flyout.linkList) {\n flyout.linkList.forEach(linklist => {\n // Don't override if any link is already active\n if (linklist.isActive && (activeRouteProp === 'auto' || activeRouteProp === 'exact')) {\n hadAnyActiveLink = true;\n return;\n }\n\n try {\n const url = new URL(linklist.url);\n const score = compareRoutes(compareUrl, url, activeRouteProp as 'auto' | 'exact');\n if (score > 0) {\n if (score === Infinity) hadAnyActiveLink = true;\n\n // Push score\n scoreList.push({\n main: mainNav,\n sub: linklist,\n score,\n });\n }\n } catch {\n // Not a valid URL, continue\n }\n });\n }\n });\n }\n });\n\n return scoreList.sort((a, b) => b.score - a.score);\n};\n\n/**\n * Compare two URLs for similarity based on a match mode\n * @param baseUrl Browser URL\n * @param compareUrl Navigatgion URL\n * @param matchMode exact or auto matching\n * @returns Score\n */\nexport const compareRoutes = (\n baseUrl: URL,\n compareUrl: URL,\n matchMode?: 'auto' | 'exact',\n): number => {\n // One url is not defined or they don't share the same orign\n if (!baseUrl || !compareUrl || baseUrl.origin !== compareUrl.origin) {\n return 0;\n }\n\n const baseUrlPath = baseUrl.pathname.toLocaleLowerCase();\n const compareUrlPath = compareUrl.pathname.toLocaleLowerCase();\n\n // Exact match, origin and pathname are the same\n if (baseUrlPath === compareUrlPath) {\n return Infinity;\n }\n\n // The basepath is longer than the comparison, a match is impossible\n if (baseUrl.pathname.length < compareUrl.pathname.length) {\n return 0;\n }\n\n if (matchMode === 'auto') {\n const baseSegments = [\n baseUrl.origin.toLocaleLowerCase(),\n ...baseUrlPath.split('/').filter(x => !!x),\n ];\n const compareSegments = [\n compareUrl.origin.toLocaleLowerCase(),\n ...compareUrlPath.split('/').filter(x => !!x),\n ];\n\n const score = getSimilarityScore(baseSegments, compareSegments);\n\n // If only some segments match, but not the whole smaller array, it's not a match\n return Math.min(baseSegments.length, compareSegments.length) === score ? score : 0;\n }\n\n return 0;\n};\n\n/**\n * Check how many items in an array match\n * @param a Base array\n * @param b Compare array\n * @returns Score\n */\nexport const getSimilarityScore = (a: string[], b: string[]): number => {\n if (!a?.length || !b?.length) {\n return 0;\n }\n\n let i = 0;\n for (; i < Math.min(a.length, b.length); i++) {\n if (a[i] !== b[i]) {\n return 0;\n }\n }\n\n return i;\n};\n"]}
@@ -0,0 +1,109 @@
1
+ import { compareRoutes, compileScoreList, getSimilarityScore, markActiveRoute, } from './route.service';
2
+ import * as testConfig from '../assets/config/test-configuration.json';
3
+ describe('route.service.ts', () => {
4
+ describe('getSimilarityScore', () => {
5
+ it('Computes the correct score', () => {
6
+ const score = getSimilarityScore(['a', 'b'], ['a', 'b', 'e']);
7
+ expect(score).toBe(2);
8
+ });
9
+ it('Returns infinite on an exact match', () => {
10
+ const score = getSimilarityScore(['a'], ['a']);
11
+ expect(score).toBe(1);
12
+ });
13
+ it('Returns 0 when nothing matches', () => {
14
+ const scores = [
15
+ getSimilarityScore(['a'], ['b']),
16
+ getSimilarityScore(['a', 'c'], ['b', 'c']),
17
+ getSimilarityScore([], ['a']),
18
+ getSimilarityScore(['a'], []),
19
+ // @ts-expect-error
20
+ getSimilarityScore(null, ['a']),
21
+ // @ts-expect-error
22
+ getSimilarityScore(undefined, ['a']),
23
+ getSimilarityScore([], []),
24
+ getSimilarityScore(['https://post.ch', 'wherever123'], ['https://post.ch', 'de', 'kundencenter', 'kundencenter']),
25
+ ];
26
+ expect(getSimilarityScore(['https://post.ch', 'wherever123'], ['https://post.ch', 'de', 'kundencenter', 'kundencenter'])).toBe(0);
27
+ for (let score of scores) {
28
+ expect(score).toBe(0);
29
+ }
30
+ });
31
+ });
32
+ describe('compareRoutes', () => {
33
+ const post = new URL('https://post.ch');
34
+ const letters = new URL('https://post.ch/briefe');
35
+ const deep = new URL('https://post.ch/briefe/inland');
36
+ const search = new URL('https://post.ch/briefe?q=search');
37
+ const hash = new URL('https://post.ch/briefe#hash');
38
+ const nope = new URL('https://post.de/briefe');
39
+ const upper = new URL('https://post.ch/Briefe');
40
+ it('Correctly scores routes in auto mode', () => {
41
+ // Left: current browser URL, right: URL in Nav
42
+ expect(compareRoutes(letters, post, 'auto')).toBe(1);
43
+ expect(compareRoutes(deep, letters, 'auto')).toBe(2);
44
+ expect(compareRoutes(search, letters, 'auto')).toBe(Infinity);
45
+ expect(compareRoutes(search, hash, 'auto')).toBe(Infinity);
46
+ expect(compareRoutes(letters, deep, 'auto')).toBe(0);
47
+ expect(compareRoutes(nope, letters, 'auto')).toBe(0);
48
+ expect(compareRoutes(letters, upper, 'auto')).toBe(Infinity);
49
+ expect(compareRoutes(deep, upper, 'auto')).toBe(2);
50
+ });
51
+ it('Correctly scores routes in exact mode', () => {
52
+ // Left: current browser URL, right: URL in Nav
53
+ expect(compareRoutes(post, letters)).toBe(0);
54
+ expect(compareRoutes(letters, deep)).toBe(0);
55
+ expect(compareRoutes(letters, search)).toBe(Infinity);
56
+ expect(compareRoutes(hash, search)).toBe(Infinity);
57
+ expect(compareRoutes(deep, letters)).toBe(0);
58
+ expect(compareRoutes(letters, nope)).toBe(0);
59
+ expect(compareRoutes(nope, letters)).toBe(0);
60
+ expect(compareRoutes(letters, nope, 'exact')).toBe(0);
61
+ expect(compareRoutes(letters, upper, 'exact')).toBe(Infinity);
62
+ });
63
+ it('Does not fail on invalid arguments', () => {
64
+ // @ts-expect-error
65
+ expect(compareRoutes(null, nope, 'auto')).toBe(0);
66
+ // @ts-expect-error
67
+ expect(compareRoutes(null, undefined, 'auto')).toBe(0);
68
+ // @ts-expect-error
69
+ expect(compareRoutes(post, nope, null)).toBe(0);
70
+ });
71
+ });
72
+ describe('compileScoreList', () => {
73
+ let config;
74
+ const fullMatch = new URL('https://post.ch/de/briefe-versenden/briefe-inland');
75
+ const noMatch = new URL('https://post.ch/wherever123');
76
+ const upper = new URL('https://post.ch/de/Briefe-versenden/BRIEFE-INLAND');
77
+ beforeEach(() => {
78
+ config = [...testConfig.de.header.navMain];
79
+ });
80
+ it('Returns a full match', () => {
81
+ const scorelist = compileScoreList(config, fullMatch, 'auto');
82
+ expect(scorelist[0].score).toBe(Infinity);
83
+ expect(scorelist[0].sub.title).toBe('Briefe Inland');
84
+ const scorelistUpper = compileScoreList(config, upper, 'auto');
85
+ expect(scorelistUpper[0].score).toBe(Infinity);
86
+ });
87
+ it('Returns a full match and only one entry', () => {
88
+ const scorelist = compileScoreList(config, fullMatch, 'exact');
89
+ expect(scorelist[0].score).toBe(Infinity);
90
+ expect(scorelist.length).toBe(1);
91
+ });
92
+ it('Returns no match', () => {
93
+ const scorelist = compileScoreList(config, noMatch, 'auto');
94
+ expect(scorelist.length).toBe(0);
95
+ });
96
+ });
97
+ describe('markActiveRoute', () => {
98
+ let config;
99
+ beforeEach(() => {
100
+ config = [...testConfig.de.header.navMain];
101
+ });
102
+ it('Correctly marks the active route', () => {
103
+ const markedConfig = markActiveRoute(config, 'https://post.ch/de/briefe-versenden/briefe-inland');
104
+ expect(markedConfig[0].isActiveOverride).toBe(true);
105
+ expect(markedConfig[0].flyout[0].linkList[0].isActiveOverride).toBe(true);
106
+ });
107
+ });
108
+ });
109
+ //# sourceMappingURL=route.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.service.spec.js","sourceRoot":"","sources":["../../../src/services/route.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n compareRoutes,\n compileScoreList,\n getSimilarityScore,\n markActiveRoute,\n} from './route.service';\nimport * as testConfig from '../assets/config/test-configuration.json';\nimport { NavMainEntity } from '../models/header.model';\n\ndescribe('route.service.ts', () => {\n describe('getSimilarityScore', () => {\n it('Computes the correct score', () => {\n const score = getSimilarityScore(['a', 'b'], ['a', 'b', 'e']);\n expect(score).toBe(2);\n });\n\n it('Returns infinite on an exact match', () => {\n const score = getSimilarityScore(['a'], ['a']);\n expect(score).toBe(1);\n });\n\n it('Returns 0 when nothing matches', () => {\n const scores = [\n getSimilarityScore(['a'], ['b']),\n getSimilarityScore(['a', 'c'], ['b', 'c']),\n getSimilarityScore([], ['a']),\n getSimilarityScore(['a'], []),\n // @ts-expect-error\n getSimilarityScore(null, ['a']),\n // @ts-expect-error\n getSimilarityScore(undefined, ['a']),\n getSimilarityScore([], []),\n getSimilarityScore(\n ['https://post.ch', 'wherever123'],\n ['https://post.ch', 'de', 'kundencenter', 'kundencenter'],\n ),\n ];\n\n expect(\n getSimilarityScore(\n ['https://post.ch', 'wherever123'],\n ['https://post.ch', 'de', 'kundencenter', 'kundencenter'],\n ),\n ).toBe(0);\n\n for (let score of scores) {\n expect(score).toBe(0);\n }\n });\n });\n\n describe('compareRoutes', () => {\n const post = new URL('https://post.ch');\n const letters = new URL('https://post.ch/briefe');\n const deep = new URL('https://post.ch/briefe/inland');\n const search = new URL('https://post.ch/briefe?q=search');\n const hash = new URL('https://post.ch/briefe#hash');\n const nope = new URL('https://post.de/briefe');\n const upper = new URL('https://post.ch/Briefe');\n\n it('Correctly scores routes in auto mode', () => {\n // Left: current browser URL, right: URL in Nav\n expect(compareRoutes(letters, post, 'auto')).toBe(1);\n expect(compareRoutes(deep, letters, 'auto')).toBe(2);\n expect(compareRoutes(search, letters, 'auto')).toBe(Infinity);\n expect(compareRoutes(search, hash, 'auto')).toBe(Infinity);\n expect(compareRoutes(letters, deep, 'auto')).toBe(0);\n expect(compareRoutes(nope, letters, 'auto')).toBe(0);\n expect(compareRoutes(letters, upper, 'auto')).toBe(Infinity);\n expect(compareRoutes(deep, upper, 'auto')).toBe(2);\n });\n\n it('Correctly scores routes in exact mode', () => {\n // Left: current browser URL, right: URL in Nav\n expect(compareRoutes(post, letters)).toBe(0);\n expect(compareRoutes(letters, deep)).toBe(0);\n expect(compareRoutes(letters, search)).toBe(Infinity);\n expect(compareRoutes(hash, search)).toBe(Infinity);\n expect(compareRoutes(deep, letters)).toBe(0);\n expect(compareRoutes(letters, nope)).toBe(0);\n expect(compareRoutes(nope, letters)).toBe(0);\n expect(compareRoutes(letters, nope, 'exact')).toBe(0);\n expect(compareRoutes(letters, upper, 'exact')).toBe(Infinity);\n });\n\n it('Does not fail on invalid arguments', () => {\n // @ts-expect-error\n expect(compareRoutes(null, nope, 'auto')).toBe(0);\n // @ts-expect-error\n expect(compareRoutes(null, undefined, 'auto')).toBe(0);\n // @ts-expect-error\n expect(compareRoutes(post, nope, null)).toBe(0);\n });\n });\n\n describe('compileScoreList', () => {\n let config: NavMainEntity[];\n const fullMatch = new URL('https://post.ch/de/briefe-versenden/briefe-inland');\n const noMatch = new URL('https://post.ch/wherever123');\n const upper = new URL('https://post.ch/de/Briefe-versenden/BRIEFE-INLAND');\n\n beforeEach(() => {\n config = [...testConfig.de.header.navMain] as NavMainEntity[];\n });\n\n it('Returns a full match', () => {\n const scorelist = compileScoreList(config, fullMatch, 'auto');\n expect(scorelist[0].score).toBe(Infinity);\n expect(scorelist[0].sub!.title).toBe('Briefe Inland');\n\n const scorelistUpper = compileScoreList(config, upper, 'auto');\n expect(scorelistUpper[0].score).toBe(Infinity);\n });\n\n it('Returns a full match and only one entry', () => {\n const scorelist = compileScoreList(config, fullMatch, 'exact');\n expect(scorelist[0].score).toBe(Infinity);\n expect(scorelist.length).toBe(1);\n });\n\n it('Returns no match', () => {\n const scorelist = compileScoreList(config, noMatch, 'auto');\n expect(scorelist.length).toBe(0);\n });\n });\n\n describe('markActiveRoute', () => {\n let config: NavMainEntity[];\n\n beforeEach(() => {\n config = [...testConfig.de.header.navMain] as NavMainEntity[];\n });\n\n it('Correctly marks the active route', () => {\n const markedConfig = markActiveRoute(\n config,\n 'https://post.ch/de/briefe-versenden/briefe-inland',\n );\n expect(markedConfig[0].isActiveOverride).toBe(true);\n expect(markedConfig[0].flyout[0].linkList[0].isActiveOverride).toBe(true);\n });\n });\n});\n"]}
@@ -1,6 +1,7 @@
1
1
  import { state } from '../../data/store';
2
2
  import { coveo } from './coveo.settings';
3
3
  import { getSearchPageUrl } from './search.service';
4
+ let suggestionsController;
4
5
  /**
5
6
  * Get suggestions from coveo
6
7
  * https://docs.coveo.com/en/1459/build-a-search-ui/get-query-suggestions#context-object
@@ -15,20 +16,27 @@ export const getCoveoSuggestions = async (query) => {
15
16
  const config = state.localizedConfig.header.search;
16
17
  const { token, organisation } = coveo.environment[state.environment];
17
18
  const url = `${coveo.url}?q=${query}&locale=${state.currentLanguage}&searchHub=${config.searchHubName}&pipeline=${config.searchPipelineName}&organizationId=${organisation}`;
18
- let coveoCompletions;
19
- try {
20
- const coveoResponse = await fetch(url, {
19
+ if (suggestionsController)
20
+ suggestionsController.abort();
21
+ suggestionsController = new AbortController();
22
+ return new Promise((resolve, reject) => {
23
+ fetch(url, {
24
+ signal: suggestionsController.signal,
21
25
  method: 'GET',
22
26
  headers: {
23
27
  Authorization: `Bearer ${token}`,
24
28
  },
29
+ })
30
+ .then(response => response.json())
31
+ .then((coveoJSON) => {
32
+ resolve(coveoJSON.completions.map(completion => (Object.assign(Object.assign({}, completion), { redirectUrl: getSearchPageUrl(completion.expression) }))));
33
+ })
34
+ .catch(error => {
35
+ if (error.name !== 'AbortError') {
36
+ console.error(`Fetching coveo suggestions failed, ${error}\nDid you add "*.coveo.com" to your connect-src content security policy and tried turning off your adblocker?`);
37
+ reject(error);
38
+ }
25
39
  });
26
- const coveoJSON = (await coveoResponse.json());
27
- coveoCompletions = coveoJSON.completions.map(completion => (Object.assign(Object.assign({}, completion), { redirectUrl: getSearchPageUrl(completion.expression) })));
28
- }
29
- catch (error) {
30
- console.error('Connection to coveo failed. Did you add "*.coveo.com" to your connect-src content security policy and tried turning off your adblocker?');
31
- }
32
- return coveoCompletions === undefined ? [] : coveoCompletions;
40
+ });
33
41
  };
34
42
  //# sourceMappingURL=coveo.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coveo.service.js","sourceRoot":"","sources":["../../../../src/services/search/coveo.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAa,EAA8B,EAAE;;EACrF,IAAI,CAAA,MAAA,MAAA,KAAK,CAAC,eAAe,0CAAE,MAAM,0CAAE,MAAM,MAAK,SAAS;IAAE,OAAO,EAAE,CAAC;EACnE,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;EACnD,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;EACrE,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,WAAW,KAAK,CAAC,eAAe,cAAc,MAAM,CAAC,aAAa,aAAa,MAAM,CAAC,kBAAkB,mBAAmB,YAAY,EAAE,CAAC;EAC7K,IAAI,gBAA+C,CAAC;EAEpD,IAAI;IACF,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;MACrC,MAAM,EAAE,KAAK;MACb,OAAO,EAAE;QACP,aAAa,EAAE,UAAU,KAAK,EAAE;OACjC;KACF,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,CAAkB,CAAC;IAChE,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,iCACtD,UAAU,KACb,WAAW,EAAE,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,IACpD,CAAC,CAAC;GACL;EAAC,OAAO,KAAK,EAAE;IACd,OAAO,CAAC,KAAK,CACX,yIAAyI,CAC1I,CAAC;GACH;EAED,OAAO,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;AAChE,CAAC,CAAC","sourcesContent":["import { state } from '../../data/store';\nimport { CoveoCompletion, CoveoResponse } from '../../models/coveo.model';\nimport { coveo } from './coveo.settings';\nimport { getSearchPageUrl } from './search.service';\n\n/**\n * Get suggestions from coveo\n * https://docs.coveo.com/en/1459/build-a-search-ui/get-query-suggestions#context-object\n *\n * @param query Search term\n * @returns\n */\nexport const getCoveoSuggestions = async (query: string): Promise<CoveoCompletion[]> => {\n if (state.localizedConfig?.header?.search === undefined) return [];\n const config = state.localizedConfig.header.search;\n const { token, organisation } = coveo.environment[state.environment];\n const url = `${coveo.url}?q=${query}&locale=${state.currentLanguage}&searchHub=${config.searchHubName}&pipeline=${config.searchPipelineName}&organizationId=${organisation}`;\n let coveoCompletions: CoveoCompletion[] | undefined;\n\n try {\n const coveoResponse = await fetch(url, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n const coveoJSON = (await coveoResponse.json()) as CoveoResponse;\n coveoCompletions = coveoJSON.completions.map(completion => ({\n ...completion,\n redirectUrl: getSearchPageUrl(completion.expression),\n }));\n } catch (error) {\n console.error(\n 'Connection to coveo failed. Did you add \"*.coveo.com\" to your connect-src content security policy and tried turning off your adblocker?',\n );\n }\n\n return coveoCompletions === undefined ? [] : coveoCompletions;\n};\n"]}
1
+ {"version":3,"file":"coveo.service.js","sourceRoot":"","sources":["../../../../src/services/search/coveo.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,IAAI,qBAAsC,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,KAAa,EAA8B,EAAE;;EACrF,IAAI,CAAA,MAAA,MAAA,KAAK,CAAC,eAAe,0CAAE,MAAM,0CAAE,MAAM,MAAK,SAAS;IAAE,OAAO,EAAE,CAAC;EACnE,MAAM,MAAM,GAAG,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC;EACnD,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;EACrE,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,WAAW,KAAK,CAAC,eAAe,cAAc,MAAM,CAAC,aAAa,aAAa,MAAM,CAAC,kBAAkB,mBAAmB,YAAY,EAAE,CAAC;EAE7K,IAAI,qBAAqB;IAAE,qBAAqB,CAAC,KAAK,EAAE,CAAC;EACzD,qBAAqB,GAAG,IAAI,eAAe,EAAE,CAAC;EAE9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACrC,KAAK,CAAC,GAAG,EAAE;MACT,MAAM,EAAE,qBAAqB,CAAC,MAAM;MACpC,MAAM,EAAE,KAAK;MACb,OAAO,EAAE;QACP,aAAa,EAAE,UAAU,KAAK,EAAE;OACjC;KACF,CAAC;OACC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;OACjC,IAAI,CAAC,CAAC,SAAwB,EAAE,EAAE;MACjC,OAAO,CACL,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,iCACnC,UAAU,KACb,WAAW,EAAE,gBAAgB,CAAC,UAAU,CAAC,UAAU,CAAC,IACpD,CAAC,CACJ,CAAC;IACJ,CAAC,CAAC;OACD,KAAK,CAAC,KAAK,CAAC,EAAE;MACb,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;QAC/B,OAAO,CAAC,KAAK,CACX,sCAAsC,KAAK,+GAA+G,CAC3J,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC;OACf;IACH,CAAC,CAAC,CAAC;EACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import { state } from '../../data/store';\nimport { CoveoCompletion, CoveoResponse } from '../../models/coveo.model';\nimport { coveo } from './coveo.settings';\nimport { getSearchPageUrl } from './search.service';\n\nlet suggestionsController: AbortController;\n\n/**\n * Get suggestions from coveo\n * https://docs.coveo.com/en/1459/build-a-search-ui/get-query-suggestions#context-object\n *\n * @param query Search term\n * @returns\n */\nexport const getCoveoSuggestions = async (query: string): Promise<CoveoCompletion[]> => {\n if (state.localizedConfig?.header?.search === undefined) return [];\n const config = state.localizedConfig.header.search;\n const { token, organisation } = coveo.environment[state.environment];\n const url = `${coveo.url}?q=${query}&locale=${state.currentLanguage}&searchHub=${config.searchHubName}&pipeline=${config.searchPipelineName}&organizationId=${organisation}`;\n\n if (suggestionsController) suggestionsController.abort();\n suggestionsController = new AbortController();\n\n return new Promise((resolve, reject) => {\n fetch(url, {\n signal: suggestionsController.signal,\n method: 'GET',\n headers: {\n Authorization: `Bearer ${token}`,\n },\n })\n .then(response => response.json())\n .then((coveoJSON: CoveoResponse) => {\n resolve(\n coveoJSON.completions.map(completion => ({\n ...completion,\n redirectUrl: getSearchPageUrl(completion.expression),\n })),\n );\n })\n .catch(error => {\n if (error.name !== 'AbortError') {\n console.error(\n `Fetching coveo suggestions failed, ${error}\\nDid you add \"*.coveo.com\" to your connect-src content security policy and tried turning off your adblocker?`,\n );\n reject(error);\n }\n });\n });\n};\n"]}