@swisspost/internet-header 1.7.1 → 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 (315) 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-5d5afa10.js → klp-widget.controller-413d85e1.js} +785 -1049
  4. package/dist/cjs/klp-widget.controller-413d85e1.js.map +1 -0
  5. package/dist/cjs/{language.service-56d68ec3.js → language.service-4954855f.js} +17 -2
  6. package/dist/cjs/language.service-4954855f.js.map +1 -0
  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 +9 -10
  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 +31 -32
  16. package/dist/cjs/post-main-navigation.cjs.entry.js.map +1 -1
  17. package/dist/cjs/post-meta-navigation.cjs.entry.js +6 -6
  18. package/dist/cjs/post-meta-navigation.cjs.entry.js.map +1 -1
  19. package/dist/cjs/post-search.cjs.entry.js +63 -38
  20. package/dist/cjs/post-search.cjs.entry.js.map +1 -1
  21. package/dist/cjs/post-skiplinks.cjs.entry.js +6 -6
  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 +9 -9
  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 +32 -24
  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/i18n/translations.js +15 -0
  38. package/dist/collection/assets/i18n/translations.js.map +1 -1
  39. package/dist/collection/assets/js/klp-login-widget.js +1 -2
  40. package/dist/collection/collection-manifest.json +2 -2
  41. package/dist/collection/components/post-internet-breadcrumbs/components/middle-dropdown.component.js +1 -1
  42. package/dist/collection/components/post-internet-breadcrumbs/components/middle-dropdown.component.js.map +1 -1
  43. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.css +113 -58
  44. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.js +1 -1
  45. package/dist/collection/components/post-internet-breadcrumbs/post-internet-breadcrumbs.js.map +1 -1
  46. package/dist/collection/components/post-internet-footer/post-internet-footer.css +78 -44
  47. package/dist/collection/components/post-internet-header/post-internet-header.css +68 -44
  48. package/dist/collection/components/post-internet-header/post-internet-header.js +2 -1
  49. package/dist/collection/components/post-internet-header/post-internet-header.js.map +1 -1
  50. package/dist/collection/components/post-klp-login-widget/post-klp-login-widget.css +68 -46
  51. package/dist/collection/components/post-language-switch/components/post-language-switch-list.js +2 -2
  52. package/dist/collection/components/post-language-switch/components/post-language-switch-list.js.map +1 -1
  53. package/dist/collection/components/post-language-switch/post-language-switch.css +79 -53
  54. package/dist/collection/components/post-logo/post-logo.css +68 -44
  55. package/dist/collection/components/post-main-navigation/components/level-one-action.component.js +2 -1
  56. package/dist/collection/components/post-main-navigation/components/level-one-action.component.js.map +1 -1
  57. package/dist/collection/components/post-main-navigation/post-main-navigation.css +73 -48
  58. package/dist/collection/components/post-main-navigation/post-main-navigation.js +25 -27
  59. package/dist/collection/components/post-main-navigation/post-main-navigation.js.map +1 -1
  60. package/dist/collection/components/post-meta-navigation/post-meta-navigation.css +72 -48
  61. package/dist/collection/components/post-meta-navigation/post-meta-navigation.js +3 -3
  62. package/dist/collection/components/post-meta-navigation/post-meta-navigation.js.map +1 -1
  63. package/dist/collection/components/post-search/post-search.css +162 -90
  64. package/dist/collection/components/post-search/post-search.js +2 -2
  65. package/dist/collection/components/post-search/post-search.js.map +1 -1
  66. package/dist/collection/components/post-skiplinks/post-skiplinks.css +1 -0
  67. package/dist/collection/components/post-skiplinks/post-skiplinks.js +1 -1
  68. package/dist/collection/components/post-skiplinks/post-skiplinks.js.map +1 -1
  69. package/dist/collection/services/config.service.spec.js +274 -0
  70. package/dist/collection/services/config.service.spec.js.map +1 -0
  71. package/dist/collection/services/route.service.js +11 -3
  72. package/dist/collection/services/route.service.js.map +1 -1
  73. package/dist/collection/services/route.service.spec.js +109 -0
  74. package/dist/collection/services/route.service.spec.js.map +1 -0
  75. package/dist/collection/services/search/coveo.service.js +18 -10
  76. package/dist/collection/services/search/coveo.service.js.map +1 -1
  77. package/dist/collection/services/search/parcel.service.js +18 -8
  78. package/dist/collection/services/search/parcel.service.js.map +1 -1
  79. package/dist/collection/services/search/places.service.js +20 -13
  80. package/dist/collection/services/search/places.service.js.map +1 -1
  81. package/dist/collection/services/search/search.service.spec.js +49 -0
  82. package/dist/collection/services/search/search.service.spec.js.map +1 -0
  83. package/dist/collection/utils/utils.spec.js +11 -0
  84. package/dist/collection/utils/utils.spec.js.map +1 -0
  85. package/dist/components/klp-widget.controller.js +784 -1048
  86. package/dist/components/klp-widget.controller.js.map +1 -1
  87. package/dist/components/language.service.js +15 -0
  88. package/dist/components/language.service.js.map +1 -1
  89. package/dist/components/post-klp-login-widget2.js +1 -1
  90. package/dist/components/post-klp-login-widget2.js.map +1 -1
  91. package/dist/components/post-language-switch2.js +4 -5
  92. package/dist/components/post-language-switch2.js.map +1 -1
  93. package/dist/components/post-logo2.js +1 -1
  94. package/dist/components/post-logo2.js.map +1 -1
  95. package/dist/components/post-main-navigation2.js +27 -28
  96. package/dist/components/post-main-navigation2.js.map +1 -1
  97. package/dist/components/post-meta-navigation2.js +4 -4
  98. package/dist/components/post-meta-navigation2.js.map +1 -1
  99. package/dist/components/post-search2.js +59 -34
  100. package/dist/components/post-search2.js.map +1 -1
  101. package/dist/components/post-skiplinks2.js +2 -2
  102. package/dist/components/post-skiplinks2.js.map +1 -1
  103. package/dist/components/store.js.map +1 -1
  104. package/dist/components/swisspost-internet-breadcrumbs.js +4 -4
  105. package/dist/components/swisspost-internet-breadcrumbs.js.map +1 -1
  106. package/dist/components/swisspost-internet-footer.js +1 -1
  107. package/dist/components/swisspost-internet-footer.js.map +1 -1
  108. package/dist/components/swisspost-internet-header.js +28 -20
  109. package/dist/components/swisspost-internet-header.js.map +1 -1
  110. package/dist/esm/{index-35186c69.js → index-2aa4bc9f.js} +4 -3
  111. package/dist/esm/index-2aa4bc9f.js.map +1 -0
  112. package/dist/esm/{klp-widget.controller-9f7e3c54.js → klp-widget.controller-1b2db6e7.js} +785 -1049
  113. package/dist/esm/klp-widget.controller-1b2db6e7.js.map +1 -0
  114. package/dist/esm/{language.service-74bc1f43.js → language.service-c0f81273.js} +17 -2
  115. package/dist/esm/language.service-c0f81273.js.map +1 -0
  116. package/dist/esm/loader.js +3 -3
  117. package/dist/esm/loader.js.map +1 -1
  118. package/dist/esm/polyfills/core-js.js +0 -0
  119. package/dist/esm/polyfills/dom.js +0 -0
  120. package/dist/esm/polyfills/es5-html-element.js +0 -0
  121. package/dist/esm/polyfills/index.js +0 -0
  122. package/dist/esm/polyfills/system.js +0 -0
  123. package/dist/esm/post-klp-login-widget.entry.js +5 -5
  124. package/dist/esm/post-klp-login-widget.entry.js.map +1 -1
  125. package/dist/esm/post-language-switch.entry.js +9 -10
  126. package/dist/esm/post-language-switch.entry.js.map +1 -1
  127. package/dist/esm/post-logo.entry.js +3 -3
  128. package/dist/esm/post-logo.entry.js.map +1 -1
  129. package/dist/esm/post-main-navigation.entry.js +31 -32
  130. package/dist/esm/post-main-navigation.entry.js.map +1 -1
  131. package/dist/esm/post-meta-navigation.entry.js +6 -6
  132. package/dist/esm/post-meta-navigation.entry.js.map +1 -1
  133. package/dist/esm/post-search.entry.js +63 -38
  134. package/dist/esm/post-search.entry.js.map +1 -1
  135. package/dist/esm/post-skiplinks.entry.js +6 -6
  136. package/dist/esm/post-skiplinks.entry.js.map +1 -1
  137. package/dist/esm/{store-b78e2d3b.js → store-d5165a8f.js} +2 -2
  138. package/dist/esm/{store-b78e2d3b.js.map → store-d5165a8f.js.map} +1 -1
  139. package/dist/esm/{svg-icon.component-7bac7397.js → svg-icon.component-02f233c7.js} +2 -2
  140. package/dist/esm/{svg-icon.component-7bac7397.js.map → svg-icon.component-02f233c7.js.map} +1 -1
  141. package/dist/esm/{svg-sprite.component-f319da57.js → svg-sprite.component-1f13a769.js} +2 -2
  142. package/dist/esm/{svg-sprite.component-f319da57.js.map → svg-sprite.component-1f13a769.js.map} +1 -1
  143. package/dist/esm/swisspost-internet-breadcrumbs.entry.js +9 -9
  144. package/dist/esm/swisspost-internet-breadcrumbs.entry.js.map +1 -1
  145. package/dist/esm/swisspost-internet-footer.entry.js +4 -4
  146. package/dist/esm/swisspost-internet-footer.entry.js.map +1 -1
  147. package/dist/esm/swisspost-internet-header.entry.js +32 -24
  148. package/dist/esm/swisspost-internet-header.entry.js.map +1 -1
  149. package/dist/esm/swisspost-internet-header.js +3 -3
  150. package/dist/esm/swisspost-internet-header.js.map +1 -1
  151. package/dist/esm-es5/{index-35186c69.js → index-2aa4bc9f.js} +2 -2
  152. package/dist/esm-es5/index-2aa4bc9f.js.map +1 -0
  153. package/dist/esm-es5/klp-widget.controller-1b2db6e7.js +13 -0
  154. package/dist/esm-es5/klp-widget.controller-1b2db6e7.js.map +1 -0
  155. package/dist/esm-es5/language.service-c0f81273.js +2 -0
  156. package/dist/esm-es5/language.service-c0f81273.js.map +1 -0
  157. package/dist/esm-es5/loader.js +1 -1
  158. package/dist/esm-es5/loader.js.map +1 -1
  159. package/dist/esm-es5/post-klp-login-widget.entry.js +1 -1
  160. package/dist/esm-es5/post-klp-login-widget.entry.js.map +1 -1
  161. package/dist/esm-es5/post-language-switch.entry.js +1 -1
  162. package/dist/esm-es5/post-language-switch.entry.js.map +1 -1
  163. package/dist/esm-es5/post-logo.entry.js +1 -1
  164. package/dist/esm-es5/post-logo.entry.js.map +1 -1
  165. package/dist/esm-es5/post-main-navigation.entry.js +1 -1
  166. package/dist/esm-es5/post-main-navigation.entry.js.map +1 -1
  167. package/dist/esm-es5/post-meta-navigation.entry.js +1 -1
  168. package/dist/esm-es5/post-meta-navigation.entry.js.map +1 -1
  169. package/dist/esm-es5/post-search.entry.js +1 -1
  170. package/dist/esm-es5/post-search.entry.js.map +1 -1
  171. package/dist/esm-es5/post-skiplinks.entry.js +1 -1
  172. package/dist/esm-es5/post-skiplinks.entry.js.map +1 -1
  173. package/dist/esm-es5/{store-b78e2d3b.js → store-d5165a8f.js} +2 -2
  174. package/dist/esm-es5/{store-b78e2d3b.js.map → store-d5165a8f.js.map} +1 -1
  175. package/dist/esm-es5/svg-icon.component-02f233c7.js +2 -0
  176. package/dist/esm-es5/{svg-sprite.component-f319da57.js → svg-sprite.component-1f13a769.js} +2 -2
  177. package/dist/esm-es5/swisspost-internet-breadcrumbs.entry.js +3 -3
  178. package/dist/esm-es5/swisspost-internet-breadcrumbs.entry.js.map +1 -1
  179. package/dist/esm-es5/swisspost-internet-footer.entry.js +1 -1
  180. package/dist/esm-es5/swisspost-internet-footer.entry.js.map +1 -1
  181. package/dist/esm-es5/swisspost-internet-header.entry.js +1 -1
  182. package/dist/esm-es5/swisspost-internet-header.entry.js.map +1 -1
  183. package/dist/esm-es5/swisspost-internet-header.js +1 -1
  184. package/dist/esm-es5/swisspost-internet-header.js.map +1 -1
  185. package/dist/swisspost-internet-header/p-04cf4eeb.system.entry.js +2 -0
  186. package/dist/swisspost-internet-header/{p-055f51f2.system.entry.js.map → p-04cf4eeb.system.entry.js.map} +1 -1
  187. package/dist/swisspost-internet-header/p-0af4e3e8.entry.js +2 -0
  188. package/dist/swisspost-internet-header/{p-6a22a9c3.entry.js.map → p-0af4e3e8.entry.js.map} +1 -1
  189. package/dist/swisspost-internet-header/p-18a3b952.system.entry.js +2 -0
  190. package/dist/swisspost-internet-header/p-18a3b952.system.entry.js.map +1 -0
  191. package/dist/swisspost-internet-header/p-1a2a0045.system.entry.js +2 -0
  192. package/dist/swisspost-internet-header/p-1a2a0045.system.entry.js.map +1 -0
  193. package/dist/swisspost-internet-header/p-25872a84.system.entry.js +2 -0
  194. package/dist/swisspost-internet-header/{p-02bb40cf.system.entry.js.map → p-25872a84.system.entry.js.map} +1 -1
  195. package/dist/swisspost-internet-header/p-2824a296.entry.js +7 -0
  196. package/dist/swisspost-internet-header/{p-3f72b002.entry.js.map → p-2824a296.entry.js.map} +1 -1
  197. package/dist/swisspost-internet-header/p-30592816.system.js +13 -0
  198. package/dist/swisspost-internet-header/p-30592816.system.js.map +1 -0
  199. package/dist/swisspost-internet-header/p-34205e78.entry.js +2 -0
  200. package/dist/swisspost-internet-header/p-34205e78.entry.js.map +1 -0
  201. package/dist/swisspost-internet-header/p-47b1ef62.entry.js +2 -0
  202. package/dist/swisspost-internet-header/{p-5e5d587a.entry.js.map → p-47b1ef62.entry.js.map} +1 -1
  203. package/dist/swisspost-internet-header/p-5ecd4ac6.entry.js +2 -0
  204. package/dist/swisspost-internet-header/p-5ecd4ac6.entry.js.map +1 -0
  205. package/dist/swisspost-internet-header/p-6492c505.js +13 -0
  206. package/dist/swisspost-internet-header/p-6492c505.js.map +1 -0
  207. package/dist/swisspost-internet-header/{p-3819c4ce.system.js → p-65e18d30.system.js} +2 -2
  208. package/dist/swisspost-internet-header/{p-3819c4ce.system.js.map → p-65e18d30.system.js.map} +1 -1
  209. package/dist/swisspost-internet-header/{p-4d015bfc.system.js → p-70805f8f.system.js} +2 -2
  210. package/dist/swisspost-internet-header/{p-91035a2a.system.js → p-77394e93.system.js} +2 -2
  211. package/dist/swisspost-internet-header/p-7d4ecdb6.entry.js +2 -0
  212. package/dist/swisspost-internet-header/p-7d4ecdb6.entry.js.map +1 -0
  213. package/dist/swisspost-internet-header/p-809e69c8.entry.js +2 -0
  214. package/dist/swisspost-internet-header/{p-b9bcb22a.entry.js.map → p-809e69c8.entry.js.map} +1 -1
  215. package/dist/swisspost-internet-header/p-94d45cc5.system.entry.js +2 -0
  216. package/dist/swisspost-internet-header/{p-996a552e.system.entry.js.map → p-94d45cc5.system.entry.js.map} +1 -1
  217. package/dist/swisspost-internet-header/p-97793474.entry.js +2 -0
  218. package/dist/swisspost-internet-header/p-97793474.entry.js.map +1 -0
  219. package/dist/swisspost-internet-header/p-99eafc12.js +2 -0
  220. package/dist/swisspost-internet-header/p-99eafc12.js.map +1 -0
  221. package/dist/swisspost-internet-header/{p-e2db30e1.js → p-9a8f9281.js} +2 -2
  222. package/dist/swisspost-internet-header/{p-22e64bf2.js → p-b7feee8d.js} +2 -2
  223. package/dist/swisspost-internet-header/{p-22e64bf2.js.map → p-b7feee8d.js.map} +1 -1
  224. package/dist/swisspost-internet-header/p-bad10ea9.system.entry.js +7 -0
  225. package/dist/swisspost-internet-header/{p-8f34abed.system.entry.js.map → p-bad10ea9.system.entry.js.map} +1 -1
  226. package/dist/swisspost-internet-header/p-bf3dac2f.system.entry.js +2 -0
  227. package/dist/swisspost-internet-header/p-bf3dac2f.system.entry.js.map +1 -0
  228. package/dist/swisspost-internet-header/p-c72e824c.entry.js +2 -0
  229. package/dist/swisspost-internet-header/p-c72e824c.entry.js.map +1 -0
  230. package/dist/swisspost-internet-header/p-c96ad7d6.entry.js +2 -0
  231. package/dist/swisspost-internet-header/p-c96ad7d6.entry.js.map +1 -0
  232. package/dist/swisspost-internet-header/p-c9cf2e49.system.entry.js +2 -0
  233. package/dist/swisspost-internet-header/p-c9cf2e49.system.entry.js.map +1 -0
  234. package/dist/swisspost-internet-header/p-ce02164e.system.js +2 -0
  235. package/dist/swisspost-internet-header/p-ce02164e.system.js.map +1 -0
  236. package/dist/swisspost-internet-header/{p-2945db6c.js → p-d8b954a1.js} +3 -3
  237. package/dist/swisspost-internet-header/p-d8b954a1.js.map +1 -0
  238. package/dist/swisspost-internet-header/p-e415699e.system.entry.js +2 -0
  239. package/dist/swisspost-internet-header/p-e415699e.system.entry.js.map +1 -0
  240. package/dist/swisspost-internet-header/p-e75bba89.js +2 -0
  241. package/dist/swisspost-internet-header/p-eef407b0.system.entry.js +2 -0
  242. package/dist/swisspost-internet-header/p-eef407b0.system.entry.js.map +1 -0
  243. package/dist/swisspost-internet-header/{p-5e9ba287.system.js → p-f5935384.system.js} +2 -2
  244. package/dist/swisspost-internet-header/p-f5935384.system.js.map +1 -0
  245. package/dist/swisspost-internet-header/{p-49fe20ff.system.js → p-f70ab166.system.js} +2 -2
  246. package/dist/swisspost-internet-header/{p-49fe20ff.system.js.map → p-f70ab166.system.js.map} +1 -1
  247. package/dist/swisspost-internet-header/swisspost-internet-header.css +1 -1
  248. package/dist/swisspost-internet-header/swisspost-internet-header.esm.js +1 -1
  249. package/dist/swisspost-internet-header/swisspost-internet-header.esm.js.map +1 -1
  250. package/dist/swisspost-internet-header/swisspost-internet-header.js +1 -1
  251. package/dist/types/assets/i18n/translations.d.ts +15 -0
  252. package/dist/types/components/post-main-navigation/post-main-navigation.d.ts +2 -8
  253. package/dist/types/services/language.service.d.ts +19 -1
  254. package/package.json +29 -29
  255. package/dist/cjs/index-92e9d4f8.js.map +0 -1
  256. package/dist/cjs/klp-widget.controller-5d5afa10.js.map +0 -1
  257. package/dist/cjs/language.service-56d68ec3.js.map +0 -1
  258. package/dist/esm/index-35186c69.js.map +0 -1
  259. package/dist/esm/klp-widget.controller-9f7e3c54.js.map +0 -1
  260. package/dist/esm/language.service-74bc1f43.js.map +0 -1
  261. package/dist/esm-es5/index-35186c69.js.map +0 -1
  262. package/dist/esm-es5/klp-widget.controller-9f7e3c54.js +0 -27
  263. package/dist/esm-es5/klp-widget.controller-9f7e3c54.js.map +0 -1
  264. package/dist/esm-es5/language.service-74bc1f43.js +0 -2
  265. package/dist/esm-es5/language.service-74bc1f43.js.map +0 -1
  266. package/dist/esm-es5/svg-icon.component-7bac7397.js +0 -2
  267. package/dist/swisspost-internet-header/p-02bb40cf.system.entry.js +0 -2
  268. package/dist/swisspost-internet-header/p-055f51f2.system.entry.js +0 -2
  269. package/dist/swisspost-internet-header/p-21ef11a4.entry.js +0 -2
  270. package/dist/swisspost-internet-header/p-21ef11a4.entry.js.map +0 -1
  271. package/dist/swisspost-internet-header/p-2945db6c.js.map +0 -1
  272. package/dist/swisspost-internet-header/p-2fd2c574.system.entry.js +0 -2
  273. package/dist/swisspost-internet-header/p-2fd2c574.system.entry.js.map +0 -1
  274. package/dist/swisspost-internet-header/p-30335ce0.system.entry.js +0 -2
  275. package/dist/swisspost-internet-header/p-30335ce0.system.entry.js.map +0 -1
  276. package/dist/swisspost-internet-header/p-32fe68f0.js +0 -2
  277. package/dist/swisspost-internet-header/p-3f72b002.entry.js +0 -7
  278. package/dist/swisspost-internet-header/p-5e5d587a.entry.js +0 -2
  279. package/dist/swisspost-internet-header/p-5e9ba287.system.js.map +0 -1
  280. package/dist/swisspost-internet-header/p-6032d37e.entry.js +0 -2
  281. package/dist/swisspost-internet-header/p-6032d37e.entry.js.map +0 -1
  282. package/dist/swisspost-internet-header/p-6a22a9c3.entry.js +0 -2
  283. package/dist/swisspost-internet-header/p-6df0c486.entry.js +0 -2
  284. package/dist/swisspost-internet-header/p-6df0c486.entry.js.map +0 -1
  285. package/dist/swisspost-internet-header/p-73b6ce0d.system.entry.js +0 -2
  286. package/dist/swisspost-internet-header/p-73b6ce0d.system.entry.js.map +0 -1
  287. package/dist/swisspost-internet-header/p-8bd39c64.js +0 -2
  288. package/dist/swisspost-internet-header/p-8bd39c64.js.map +0 -1
  289. package/dist/swisspost-internet-header/p-8f34abed.system.entry.js +0 -7
  290. package/dist/swisspost-internet-header/p-996a552e.system.entry.js +0 -2
  291. package/dist/swisspost-internet-header/p-9efee6d6.system.entry.js +0 -2
  292. package/dist/swisspost-internet-header/p-9efee6d6.system.entry.js.map +0 -1
  293. package/dist/swisspost-internet-header/p-ad7071ea.system.js +0 -27
  294. package/dist/swisspost-internet-header/p-ad7071ea.system.js.map +0 -1
  295. package/dist/swisspost-internet-header/p-b9bcb22a.entry.js +0 -2
  296. package/dist/swisspost-internet-header/p-c24585eb.entry.js +0 -2
  297. package/dist/swisspost-internet-header/p-c24585eb.entry.js.map +0 -1
  298. package/dist/swisspost-internet-header/p-c435e138.entry.js +0 -2
  299. package/dist/swisspost-internet-header/p-c435e138.entry.js.map +0 -1
  300. package/dist/swisspost-internet-header/p-cce32859.entry.js +0 -2
  301. package/dist/swisspost-internet-header/p-cce32859.entry.js.map +0 -1
  302. package/dist/swisspost-internet-header/p-f0396178.system.entry.js +0 -2
  303. package/dist/swisspost-internet-header/p-f0396178.system.entry.js.map +0 -1
  304. package/dist/swisspost-internet-header/p-f4f5ca86.system.js +0 -2
  305. package/dist/swisspost-internet-header/p-f4f5ca86.system.js.map +0 -1
  306. package/dist/swisspost-internet-header/p-f62f50ce.system.entry.js +0 -2
  307. package/dist/swisspost-internet-header/p-f62f50ce.system.entry.js.map +0 -1
  308. package/dist/swisspost-internet-header/p-fefa1082.js +0 -27
  309. package/dist/swisspost-internet-header/p-fefa1082.js.map +0 -1
  310. /package/dist/esm-es5/{svg-icon.component-7bac7397.js.map → svg-icon.component-02f233c7.js.map} +0 -0
  311. /package/dist/esm-es5/{svg-sprite.component-f319da57.js.map → svg-sprite.component-1f13a769.js.map} +0 -0
  312. /package/dist/swisspost-internet-header/{p-4d015bfc.system.js.map → p-70805f8f.system.js.map} +0 -0
  313. /package/dist/swisspost-internet-header/{p-91035a2a.system.js.map → p-77394e93.system.js.map} +0 -0
  314. /package/dist/swisspost-internet-header/{p-e2db30e1.js.map → p-9a8f9281.js.map} +0 -0
  315. /package/dist/swisspost-internet-header/{p-32fe68f0.js.map → p-e75bba89.js.map} +0 -0
@@ -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"]}
@@ -1,4 +1,5 @@
1
1
  import { state } from '../../data/store';
2
+ let parcelController;
2
3
  // https://www.post.ch/api/trackandtrace?id=99.00.306600.01004883
3
4
  // Track and trace URL
4
5
  export const getTrackAndTraceApiUrl = (id) => {
@@ -29,14 +30,23 @@ export const isParcel = async (query, searchConfig) => {
29
30
  export const getParcelInfo = async (query, { redirectPattern }) => {
30
31
  const trackingNrPattern = new RegExp(redirectPattern);
31
32
  if (trackingNrPattern.test(query)) {
32
- try {
33
- const trackAndTraceReqest = await fetch(getTrackAndTraceApiUrl(query));
34
- const trackAndTraceResult = await trackAndTraceReqest.json();
35
- return Object.assign(Object.assign({}, trackAndTraceResult), { ok: trackAndTraceResult.ok === 'true' });
36
- }
37
- catch (error) {
38
- console.warn(`Could not check track and trace API due to error: ${error.message}`);
39
- }
33
+ const url = getTrackAndTraceApiUrl(query);
34
+ if (parcelController)
35
+ parcelController.abort();
36
+ parcelController = new AbortController();
37
+ return new Promise((resolve, reject) => {
38
+ fetch(url, { signal: parcelController.signal })
39
+ .then(response => response.json())
40
+ .then((trackAndTraceResult) => {
41
+ resolve(Object.assign(Object.assign({}, trackAndTraceResult), { ok: trackAndTraceResult.ok }));
42
+ })
43
+ .catch(error => {
44
+ if (error.name !== 'AbortError') {
45
+ console.error(`Could not check track and trace API due to error: ${error.message}`);
46
+ reject(error);
47
+ }
48
+ });
49
+ });
40
50
  }
41
51
  return { ok: false, timestamp: new Date().toDateString() };
42
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"parcel.service.js","sourceRoot":"","sources":["../../../../src/services/search/parcel.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIzC,iEAAiE;AAEjE,sBAAsB;AACtB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EAAU,EAAE,EAAE;EACnD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC;EACnC,OAAO,uBAAuB,IAAI,yBAAyB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,KAAa,EACb,EAAE,0BAA0B,EAAiB,EAC7C,EAAE;EACF,OAAO,0BAA0B,CAAC,OAAO,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAE,YAA2B,EAAoB,EAAE;EAC7F,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;EAC5D,OAAO,UAAU,CAAC,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,KAAa,EACb,EAAE,eAAe,EAAiB,EACN,EAAE;EAC9B,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC;EAEtD,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IACjC,IAAI;MACF,MAAM,mBAAmB,GAAG,MAAM,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;MACvE,MAAM,mBAAmB,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,CAAC;MAC7D,uCAAY,mBAAmB,KAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,KAAK,MAAM,IAAG;KAC1E;IAAC,OAAO,KAAK,EAAE;MACd,OAAO,CAAC,IAAI,CAAC,qDAAqD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;KACpF;GACF;EAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC;AAC7D,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,KAAa,EACb,YAA2B,EAC4B,EAAE;EACzD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;EAC5D,OAAO,UAAU,CAAC,EAAE;IAClB,CAAC,iCAAM,UAAU,KAAE,GAAG,EAAE,2BAA2B,CAAC,KAAK,EAAE,YAAY,CAAC,IACxE,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC","sourcesContent":["import { state } from '../../data/store';\nimport { ISearchConfig } from '../../models/header.model';\nimport { TrackAndTraceInfo } from '../../models/track-and-trace.model';\n\n// https://www.post.ch/api/trackandtrace?id=99.00.306600.01004883\n\n// Track and trace URL\nexport const getTrackAndTraceApiUrl = (id: string) => {\n const lang = state.currentLanguage;\n return `https://www.post.ch/${lang}/api/trackandtrace?id=${encodeURIComponent(id)}`;\n};\n\n// Get the redire\nexport const getTrackAndTraceRedirectUrl = (\n query: string,\n { packageTrackingRedirectUrl }: ISearchConfig,\n) => {\n return packageTrackingRedirectUrl.replace('{trackingNumber}', encodeURIComponent(query));\n};\n\n/**\n * Check whether a query is a tracking id\n *\n * @param query User query\n * @returns Boolean\n */\nexport const isParcel = async (query: string, searchConfig: ISearchConfig): Promise<boolean> => {\n const parcelInfo = await getParcelInfo(query, searchConfig);\n return parcelInfo.ok;\n};\n\n/**\n * Try to get parcel info from a query that is possibly a tracking id.\n * This is mainly used to check if a search should redirect to track&trace instead of the regular search.\n *\n * @param query User query that is possibly a tracking number\n * @returns Track and trace info\n */\nexport const getParcelInfo = async (\n query: string,\n { redirectPattern }: ISearchConfig,\n): Promise<TrackAndTraceInfo> => {\n const trackingNrPattern = new RegExp(redirectPattern);\n\n if (trackingNrPattern.test(query)) {\n try {\n const trackAndTraceReqest = await fetch(getTrackAndTraceApiUrl(query));\n const trackAndTraceResult = await trackAndTraceReqest.json();\n return { ...trackAndTraceResult, ok: trackAndTraceResult.ok === 'true' };\n } catch (error) {\n console.warn(`Could not check track and trace API due to error: ${error.message}`);\n }\n }\n\n return { ok: false, timestamp: new Date().toDateString() };\n};\n\n/**\n * Get parcel info if query is a parcel or null\n *\n * @param query Parcel id\n * @returns Parcel info and a redirect url or null if not a parcel\n */\nexport const getParcelSuggestion = async (\n query: string,\n searchConfig: ISearchConfig,\n): Promise<(TrackAndTraceInfo & { url: string }) | null> => {\n const parcelInfo = await getParcelInfo(query, searchConfig);\n return parcelInfo.ok\n ? { ...parcelInfo, url: getTrackAndTraceRedirectUrl(query, searchConfig) }\n : null;\n};\n"]}
1
+ {"version":3,"file":"parcel.service.js","sourceRoot":"","sources":["../../../../src/services/search/parcel.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIzC,IAAI,gBAAiC,CAAC;AAEtC,iEAAiE;AAEjE,sBAAsB;AACtB,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EAAU,EAAE,EAAE;EACnD,MAAM,IAAI,GAAG,KAAK,CAAC,eAAe,CAAC;EACnC,OAAO,uBAAuB,IAAI,yBAAyB,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC;AACtF,CAAC,CAAC;AAEF,iBAAiB;AACjB,MAAM,CAAC,MAAM,2BAA2B,GAAG,CACzC,KAAa,EACb,EAAE,0BAA0B,EAAiB,EAC7C,EAAE;EACF,OAAO,0BAA0B,CAAC,OAAO,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAAE,KAAa,EAAE,YAA2B,EAAoB,EAAE;EAC7F,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;EAC5D,OAAO,UAAU,CAAC,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAChC,KAAa,EACb,EAAE,eAAe,EAAiB,EACN,EAAE;EAC9B,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC;EAEtD,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;IACjC,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,gBAAgB;MAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC;IAC/C,gBAAgB,GAAG,IAAI,eAAe,EAAE,CAAC;IAEzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;MACrC,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,EAAE,CAAC;SAC5C,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;SACjC,IAAI,CAAC,CAAC,mBAAsC,EAAE,EAAE;QAC/C,OAAO,iCAAM,mBAAmB,KAAE,EAAE,EAAE,mBAAmB,CAAC,EAAE,IAAG,CAAC;MAClE,CAAC,CAAC;SACD,KAAK,CAAC,KAAK,CAAC,EAAE;QACb,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE;UAC/B,OAAO,CAAC,KAAK,CAAC,qDAAqD,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;UACpF,MAAM,CAAC,KAAK,CAAC,CAAC;SACf;MACH,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;GACJ;EAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC;AAC7D,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,KAAa,EACb,YAA2B,EAC4B,EAAE;EACzD,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;EAC5D,OAAO,UAAU,CAAC,EAAE;IAClB,CAAC,iCAAM,UAAU,KAAE,GAAG,EAAE,2BAA2B,CAAC,KAAK,EAAE,YAAY,CAAC,IACxE,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC","sourcesContent":["import { state } from '../../data/store';\nimport { ISearchConfig } from '../../models/header.model';\nimport { TrackAndTraceInfo } from '../../models/track-and-trace.model';\n\nlet parcelController: AbortController;\n\n// https://www.post.ch/api/trackandtrace?id=99.00.306600.01004883\n\n// Track and trace URL\nexport const getTrackAndTraceApiUrl = (id: string) => {\n const lang = state.currentLanguage;\n return `https://www.post.ch/${lang}/api/trackandtrace?id=${encodeURIComponent(id)}`;\n};\n\n// Get the redire\nexport const getTrackAndTraceRedirectUrl = (\n query: string,\n { packageTrackingRedirectUrl }: ISearchConfig,\n) => {\n return packageTrackingRedirectUrl.replace('{trackingNumber}', encodeURIComponent(query));\n};\n\n/**\n * Check whether a query is a tracking id\n *\n * @param query User query\n * @returns Boolean\n */\nexport const isParcel = async (query: string, searchConfig: ISearchConfig): Promise<boolean> => {\n const parcelInfo = await getParcelInfo(query, searchConfig);\n return parcelInfo.ok;\n};\n\n/**\n * Try to get parcel info from a query that is possibly a tracking id.\n * This is mainly used to check if a search should redirect to track&trace instead of the regular search.\n *\n * @param query User query that is possibly a tracking number\n * @returns Track and trace info\n */\nexport const getParcelInfo = async (\n query: string,\n { redirectPattern }: ISearchConfig,\n): Promise<TrackAndTraceInfo> => {\n const trackingNrPattern = new RegExp(redirectPattern);\n\n if (trackingNrPattern.test(query)) {\n const url = getTrackAndTraceApiUrl(query);\n\n if (parcelController) parcelController.abort();\n parcelController = new AbortController();\n\n return new Promise((resolve, reject) => {\n fetch(url, { signal: parcelController.signal })\n .then(response => response.json())\n .then((trackAndTraceResult: TrackAndTraceInfo) => {\n resolve({ ...trackAndTraceResult, ok: trackAndTraceResult.ok });\n })\n .catch(error => {\n if (error.name !== 'AbortError') {\n console.error(`Could not check track and trace API due to error: ${error.message}`);\n reject(error);\n }\n });\n });\n }\n\n return { ok: false, timestamp: new Date().toDateString() };\n};\n\n/**\n * Get parcel info if query is a parcel or null\n *\n * @param query Parcel id\n * @returns Parcel info and a redirect url or null if not a parcel\n */\nexport const getParcelSuggestion = async (\n query: string,\n searchConfig: ISearchConfig,\n): Promise<(TrackAndTraceInfo & { url: string }) | null> => {\n const parcelInfo = await getParcelInfo(query, searchConfig);\n return parcelInfo.ok\n ? { ...parcelInfo, url: getTrackAndTraceRedirectUrl(query, searchConfig) }\n : null;\n};\n"]}
@@ -1,6 +1,7 @@
1
1
  import { state } from '../../data/store';
2
2
  import { gisAPIUrl, placesUrl } from './places.settings';
3
3
  import { hardNormalize } from './search-utilities';
4
+ let placesController;
4
5
  /**
5
6
  * Query the Gis API for locations and localities (pois)
6
7
  *
@@ -16,19 +17,25 @@ export const queryPlaces = async (query) => {
16
17
  lang: state.currentLanguage,
17
18
  limit: 7,
18
19
  }).reduce((s, [k, v], i) => `${s}${i === 0 ? '?' : '&'}${k}=${v}`, '');
19
- const geocoderUrl = `${gisAPIUrl}/Geocode${searchParameters}`;
20
- try {
21
- const geocodeResponse = await fetch(geocoderUrl);
22
- const geocodeJSON = (await geocodeResponse.json());
23
- if (!geocodeJSON.ok) {
24
- throw new Error(geocodeJSON.info);
25
- }
26
- return geocodeJSON.locations;
27
- }
28
- catch (error) {
29
- console.error('Fetching places failed. Did you add "places.post.ch" to your connect-src content security policy?');
30
- throw error;
31
- }
20
+ const url = `${gisAPIUrl}/Geocode${searchParameters}`;
21
+ if (placesController)
22
+ placesController.abort();
23
+ placesController = new AbortController();
24
+ return new Promise((resolve, reject) => {
25
+ fetch(url, { signal: placesController.signal })
26
+ .then(response => response.json())
27
+ .then((geocodeJSON) => {
28
+ if (!geocodeJSON.ok)
29
+ throw new Error(geocodeJSON.info);
30
+ resolve(geocodeJSON.locations);
31
+ })
32
+ .catch(error => {
33
+ if (error.name !== 'AbortError') {
34
+ console.error(`Fetching places failed, ${error}\nDid you add "places.post.ch" to your connect-src content security policy?`);
35
+ reject(error);
36
+ }
37
+ });
38
+ });
32
39
  };
33
40
  /**
34
41
  * Try to highlight place suggestions
@@ -1 +1 @@
1
- {"version":3,"file":"places.service.js","sourceRoot":"","sources":["../../../../src/services/search/places.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,KAAa,EAA8B,EAAE;EAC7E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;IACtB,OAAO,EAAE,CAAC;GACX;EAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC;IACtC,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC;IAChC,IAAI,EAAE,KAAK,CAAC,eAAe;IAC3B,KAAK,EAAE,CAAC;GACT,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;EAEvE,MAAM,WAAW,GAAG,GAAG,SAAS,WAAW,gBAAgB,EAAE,CAAC;EAE9D,IAAI;IACF,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,CAAC,MAAM,eAAe,CAAC,IAAI,EAAE,CAAoB,CAAC;IACtE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE;MACnB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KACnC;IACD,OAAO,WAAW,CAAC,SAAS,CAAC;GAC9B;EAAC,OAAO,KAAK,EAAE;IACd,OAAO,CAAC,KAAK,CACX,mGAAmG,CACpG,CAAC;IACF,MAAM,KAAK,CAAC;GACb;AACH,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAyB,EAAE,KAAa,EAAE,EAAE;EAChF,IAAI,KAAK,KAAK,SAAS;IAAE,OAAO,KAAK,CAAC;EAEtC,gCAAgC;EAChC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;EACvC,MAAM,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;EAC/B,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;EAE1C,IAAI,YAAY,GAAG,CAAC,EAAE;IACpB,OAAO,KAAK,CAAC;GACd;EAED,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,KAAK,CAAC,SAAS,CAC3D,YAAY,EACZ,YAAY,GAAG,KAAK,CAAC,MAAM,CAC5B,IAAI,KAAK,CAAC,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;AACpE,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAyB,EAAU,EAAE;EAChE,IAAI,GAAW,CAAC;EAEhB,IAAI,QAAQ,CAAC,EAAE,EAAE;IACf,GAAG,GAAG,GAAG,SAAS,IAAI,KAAK,CAAC,eAAe,IAAI,QAAQ,CAAC,EAAE,SAAS,CAAC;GACrE;OAAM;IACL,GAAG,GAAG,GAAG,SAAS,kBAAkB,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;GACzE;EAED,OAAO,GAAG,CAAC;AACb,CAAC,CAAC","sourcesContent":["import { state } from '../../data/store';\nimport { GeocodeLocation, GeocodeResponse } from '../../models/geocode.model';\nimport { gisAPIUrl, placesUrl } from './places.settings';\nimport { hardNormalize } from './search-utilities';\n\n/**\n * Query the Gis API for locations and localities (pois)\n *\n * @param query User input string\n * @returns\n */\nexport const queryPlaces = async (query: string): Promise<GeocodeLocation[]> => {\n if (query.length === 0) {\n return [];\n }\n\n const searchParameters = Object.entries({\n query: encodeURIComponent(query),\n lang: state.currentLanguage,\n limit: 7,\n }).reduce((s, [k, v], i) => `${s}${i === 0 ? '?' : '&'}${k}=${v}`, '');\n\n const geocoderUrl = `${gisAPIUrl}/Geocode${searchParameters}`;\n\n try {\n const geocodeResponse = await fetch(geocoderUrl);\n const geocodeJSON = (await geocodeResponse.json()) as GeocodeResponse;\n if (!geocodeJSON.ok) {\n throw new Error(geocodeJSON.info);\n }\n return geocodeJSON.locations;\n } catch (error) {\n console.error(\n 'Fetching places failed. Did you add \"places.post.ch\" to your connect-src content security policy?',\n );\n throw error;\n }\n};\n\n/**\n * Try to highlight place suggestions\n * Limitation: accented chars are not handled by this basic function\n *\n * @param query Search term\n * @param place Name of the suggested place\n * @returns\n */\nexport const highlightPlacesString = (query: string | undefined, place: string) => {\n if (query === undefined) return place;\n\n // Strip accents from the string\n const reference = hardNormalize(place);\n const q = hardNormalize(query);\n const indexOfQuery = reference.indexOf(q);\n\n if (indexOfQuery < 0) {\n return place;\n }\n\n return `${place.substring(0, indexOfQuery)}{${place.substring(\n indexOfQuery,\n indexOfQuery + query.length,\n )}}${place.substring(indexOfQuery + query.length, place.length)}`;\n};\n\n/**\n * Get the deeplink to any location found via geocoder\n *\n * @param location A location from the Gis API Geocode endpoint\n * @returns\n */\nexport const getPlacesUrl = (location: GeocodeLocation): string => {\n let url: string;\n\n if (location.id) {\n url = `${placesUrl}/${state.currentLanguage}/${location.id}/detail`;\n } else {\n url = `${placesUrl}?preselecttext=${encodeURIComponent(location.name)}`;\n }\n\n return url;\n};\n"]}
1
+ {"version":3,"file":"places.service.js","sourceRoot":"","sources":["../../../../src/services/search/places.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { state } from '../../data/store';\nimport { GeocodeLocation, GeocodeResponse } from '../../models/geocode.model';\nimport { gisAPIUrl, placesUrl } from './places.settings';\nimport { hardNormalize } from './search-utilities';\n\nlet placesController: AbortController;\n\n/**\n * Query the Gis API for locations and localities (pois)\n *\n * @param query User input string\n * @returns\n */\nexport const queryPlaces = async (query: string): Promise<GeocodeLocation[]> => {\n if (query.length === 0) {\n return [];\n }\n\n const searchParameters = Object.entries({\n query: encodeURIComponent(query),\n lang: state.currentLanguage,\n limit: 7,\n }).reduce((s, [k, v], i) => `${s}${i === 0 ? '?' : '&'}${k}=${v}`, '');\n\n const url = `${gisAPIUrl}/Geocode${searchParameters}`;\n\n if (placesController) placesController.abort();\n placesController = new AbortController();\n\n return new Promise((resolve, reject) => {\n fetch(url, { signal: placesController.signal })\n .then(response => response.json())\n .then((geocodeJSON: GeocodeResponse) => {\n if (!geocodeJSON.ok) throw new Error(geocodeJSON.info);\n resolve(geocodeJSON.locations);\n })\n .catch(error => {\n if (error.name !== 'AbortError') {\n console.error(\n `Fetching places failed, ${error}\\nDid you add \"places.post.ch\" to your connect-src content security policy?`,\n );\n reject(error);\n }\n });\n });\n};\n\n/**\n * Try to highlight place suggestions\n * Limitation: accented chars are not handled by this basic function\n *\n * @param query Search term\n * @param place Name of the suggested place\n * @returns\n */\nexport const highlightPlacesString = (query: string | undefined, place: string) => {\n if (query === undefined) return place;\n\n // Strip accents from the string\n const reference = hardNormalize(place);\n const q = hardNormalize(query);\n const indexOfQuery = reference.indexOf(q);\n\n if (indexOfQuery < 0) {\n return place;\n }\n\n return `${place.substring(0, indexOfQuery)}{${place.substring(\n indexOfQuery,\n indexOfQuery + query.length,\n )}}${place.substring(indexOfQuery + query.length, place.length)}`;\n};\n\n/**\n * Get the deeplink to any location found via geocoder\n *\n * @param location A location from the Gis API Geocode endpoint\n * @returns\n */\nexport const getPlacesUrl = (location: GeocodeLocation): string => {\n let url: string;\n\n if (location.id) {\n url = `${placesUrl}/${state.currentLanguage}/${location.id}/detail`;\n } else {\n url = `${placesUrl}?preselecttext=${encodeURIComponent(location.name)}`;\n }\n\n return url;\n};\n"]}
@@ -0,0 +1,49 @@
1
+ import { equalizeArrays } from './search.service';
2
+ describe('search.service.ts', () => {
3
+ it('proportionally fills the suggestions array with max. 7 items', () => {
4
+ const a1 = [1, 2, 3];
5
+ const a2 = ['a', 'b', 'c', 'd'];
6
+ const r = equalizeArrays(a1, a2);
7
+ expect(r).toStrictEqual([
8
+ [1, 2, 3],
9
+ ['a', 'b', 'c', 'd'],
10
+ ]);
11
+ });
12
+ it('proportionally fills the suggestions array with max. 7 items when there are more than four per array', () => {
13
+ const a1 = [1, 2, 3, 4, 5, 6, 7, 8];
14
+ const a2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
15
+ const r = equalizeArrays(a1, a2);
16
+ expect(r).toStrictEqual([
17
+ [1, 2, 3],
18
+ ['a', 'b', 'c', 'd'],
19
+ ]);
20
+ });
21
+ it('proportionally fills the suggestions array with items from arr 2', () => {
22
+ const a1 = [1, 2];
23
+ const a2 = ['a', 'b', 'c', 'd', 'e'];
24
+ const r = equalizeArrays(a1, a2);
25
+ expect(r).toStrictEqual([
26
+ [1, 2],
27
+ ['a', 'b', 'c', 'd', 'e'],
28
+ ]);
29
+ });
30
+ it('proportionally fills the suggestions array with items from arr1', () => {
31
+ const a1 = [1, 2, 3, 4, 5];
32
+ const a2 = ['a', 'b'];
33
+ const r = equalizeArrays(a1, a2);
34
+ expect(r).toStrictEqual([
35
+ [1, 2, 3, 4, 5],
36
+ ['a', 'b'],
37
+ ]);
38
+ });
39
+ it('does not slice if there are not enough items', () => {
40
+ const a1 = [1, 2];
41
+ const a2 = ['a', 'b'];
42
+ const r = equalizeArrays(a1, a2);
43
+ expect(r).toStrictEqual([
44
+ [1, 2],
45
+ ['a', 'b'],
46
+ ]);
47
+ });
48
+ });
49
+ //# sourceMappingURL=search.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.service.spec.js","sourceRoot":"","sources":["../../../../src/services/search/search.service.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { equalizeArrays } from './search.service';\n\ndescribe('search.service.ts', () => {\n it('proportionally fills the suggestions array with max. 7 items', () => {\n const a1 = [1, 2, 3];\n const a2 = ['a', 'b', 'c', 'd'];\n const r = equalizeArrays(a1, a2);\n expect(r).toStrictEqual([\n [1, 2, 3],\n ['a', 'b', 'c', 'd'],\n ]);\n });\n\n it('proportionally fills the suggestions array with max. 7 items when there are more than four per array', () => {\n const a1 = [1, 2, 3, 4, 5, 6, 7, 8];\n const a2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];\n const r = equalizeArrays(a1, a2);\n expect(r).toStrictEqual([\n [1, 2, 3],\n ['a', 'b', 'c', 'd'],\n ]);\n });\n\n it('proportionally fills the suggestions array with items from arr 2', () => {\n const a1 = [1, 2];\n const a2 = ['a', 'b', 'c', 'd', 'e'];\n const r = equalizeArrays(a1, a2);\n expect(r).toStrictEqual([\n [1, 2],\n ['a', 'b', 'c', 'd', 'e'],\n ]);\n });\n\n it('proportionally fills the suggestions array with items from arr1', () => {\n const a1 = [1, 2, 3, 4, 5];\n const a2 = ['a', 'b'];\n const r = equalizeArrays(a1, a2);\n expect(r).toStrictEqual([\n [1, 2, 3, 4, 5],\n ['a', 'b'],\n ]);\n });\n\n it('does not slice if there are not enough items', () => {\n const a1 = [1, 2];\n const a2 = ['a', 'b'];\n const r = equalizeArrays(a1, a2);\n expect(r).toStrictEqual([\n [1, 2],\n ['a', 'b'],\n ]);\n });\n});\n"]}
@@ -0,0 +1,11 @@
1
+ import { uniqueId } from './utils';
2
+ describe('utils', () => {
3
+ describe('uniqueId', () => {
4
+ it('generates a (sequential) unique id', () => {
5
+ expect(uniqueId()).toEqual('1');
6
+ expect(uniqueId('prefix-')).toEqual('prefix-2');
7
+ expect(uniqueId()).toEqual('3');
8
+ });
9
+ });
10
+ });
11
+ //# sourceMappingURL=utils.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.spec.js","sourceRoot":"","sources":["../../../src/utils/utils.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;EACrB,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;MAC5C,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;MAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;MAChD,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { uniqueId } from './utils';\n\ndescribe('utils', () => {\n describe('uniqueId', () => {\n it('generates a (sequential) unique id', () => {\n expect(uniqueId()).toEqual('1');\n expect(uniqueId('prefix-')).toEqual('prefix-2');\n expect(uniqueId()).toEqual('3');\n });\n });\n});\n"]}