@jetshop/ui 5.13.12-0 → 5.14.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 (557) hide show
  1. package/Accordion/Accordion.d.ts +33 -33
  2. package/Accordion/Accordion.js +58 -58
  3. package/Accordion/Accordion.test.js +73 -73
  4. package/Accordion/__doc_utils__/AccordionHeader.js +12 -12
  5. package/Auth/FormFields/CountriesInput.d.ts +16 -14
  6. package/Auth/FormFields/CountriesInput.js +27 -27
  7. package/Auth/FormFields/CountriesInput.js.map +1 -1
  8. package/Auth/LogInBehavior.d.ts +22 -22
  9. package/Auth/LogInBehavior.js +23 -23
  10. package/Auth/LogInFormProvider.d.ts +7 -7
  11. package/Auth/LogInFormProvider.js +70 -70
  12. package/Auth/LogOut.d.ts +10 -10
  13. package/Auth/LogOut.js +23 -23
  14. package/Auth/logInValidator.d.ts +8 -8
  15. package/Auth/logInValidator.js +15 -15
  16. package/Breadcrumbs/Breadcrumbs.d.ts +14 -14
  17. package/Breadcrumbs/Breadcrumbs.js +83 -83
  18. package/Breadcrumbs/getParentsOrCanonicalRoute.d.ts +3 -3
  19. package/Breadcrumbs/getParentsOrCanonicalRoute.js +13 -13
  20. package/Breadcrumbs/index.d.ts +1 -1
  21. package/Breadcrumbs/index.js +1 -1
  22. package/Breakpoints.d.ts +12 -12
  23. package/Breakpoints.js +35 -35
  24. package/Button/Button.d.ts +14 -14
  25. package/Button/Button.js +59 -59
  26. package/Button/OutlineButton.d.ts +4 -4
  27. package/Button/OutlineButton.js +9 -9
  28. package/Button/SecondaryButton.d.ts +3 -3
  29. package/Button/SecondaryButton.js +8 -8
  30. package/Button/TrendButton.d.ts +3 -3
  31. package/Button/TrendButton.js +7 -7
  32. package/Button/index.d.ts +4 -4
  33. package/Button/index.js +4 -4
  34. package/CategoryLink.d.ts +9 -9
  35. package/CategoryLink.js +42 -42
  36. package/ChannelSelector/ChannelListItem.d.ts +10 -10
  37. package/ChannelSelector/ChannelListItem.js +50 -50
  38. package/ChannelSelector/ChannelListItem.test.js +85 -85
  39. package/ChannelSelector/ChannelSelector.d.ts +63 -63
  40. package/ChannelSelector/ChannelSelector.js +79 -79
  41. package/ChannelSelector/ChannelSelector.test.js +167 -167
  42. package/ChannelSelector/ChannelSelectorButtons.d.ts +3 -3
  43. package/ChannelSelector/ChannelSelectorButtons.js +19 -19
  44. package/ChannelSelector/Channels.d.ts +17 -17
  45. package/ChannelSelector/Channels.js +11 -11
  46. package/ChannelSelector/Channels.test.js +90 -90
  47. package/ChannelSelector/LargeSelector.d.ts +3 -3
  48. package/ChannelSelector/LargeSelector.js +66 -66
  49. package/ChannelSelector/MiniSelector.d.ts +4 -4
  50. package/ChannelSelector/MiniSelector.js +57 -57
  51. package/ChannelSelector/Region.d.ts +28 -28
  52. package/ChannelSelector/Region.js +20 -20
  53. package/ChannelSelector/Region.test.js +37 -37
  54. package/ChannelSelector/exampleChannels.js +577 -577
  55. package/ChannelSelector/groupBy.d.ts +7 -7
  56. package/ChannelSelector/groupBy.js +15 -15
  57. package/ChannelSelector/groupBy.test.js +42 -42
  58. package/Checkbox/Checkbox.d.ts +10 -10
  59. package/Checkbox/Checkbox.js +68 -68
  60. package/Checkbox/CheckboxGroup.d.ts +23 -23
  61. package/Checkbox/CheckboxGroup.js +21 -21
  62. package/Checkbox/index.d.ts +2 -2
  63. package/Checkbox/index.js +2 -2
  64. package/ContentPageLink.d.ts +9 -9
  65. package/ContentPageLink.js +36 -36
  66. package/ContentRenderer.d.ts +9 -9
  67. package/ContentRenderer.js +35 -35
  68. package/DropdownMenu/Button.d.ts +7 -7
  69. package/DropdownMenu/Button.js +31 -31
  70. package/DropdownMenu/DropdownMenu.d.ts +21 -21
  71. package/DropdownMenu/DropdownMenu.js +71 -71
  72. package/DropdownMenu/Item.d.ts +13 -13
  73. package/DropdownMenu/Item.js +47 -47
  74. package/DropdownMenu/Items.d.ts +16 -16
  75. package/DropdownMenu/Items.js +52 -52
  76. package/DropdownMenu/index.d.ts +4 -4
  77. package/DropdownMenu/index.js +4 -4
  78. package/ErrorBoundary/Generic.d.ts +17 -17
  79. package/ErrorBoundary/Generic.js +68 -68
  80. package/ErrorBoundary/PassThrough.d.ts +3 -3
  81. package/ErrorBoundary/PassThrough.js +6 -6
  82. package/Gallery/Gallery.d.ts +39 -39
  83. package/Gallery/Gallery.js +121 -121
  84. package/Gallery/constructGallery.d.ts +15 -15
  85. package/Gallery/constructGallery.js +40 -40
  86. package/Image/B2BImage.d.ts +50 -50
  87. package/Image/B2BImage.js +52 -52
  88. package/Image/BaseImage.d.ts +39 -39
  89. package/Image/BaseImage.js +191 -191
  90. package/Image/Fallback.d.ts +5 -5
  91. package/Image/Fallback.js +3 -3
  92. package/Image/FlightImage.d.ts +52 -52
  93. package/Image/FlightImage.js +57 -57
  94. package/Image/FlightImage.test.js +277 -277
  95. package/Image/Image.d.ts +2 -2
  96. package/Image/Image.js +2 -2
  97. package/Image/index.d.ts +1 -1
  98. package/Image/index.js +1 -1
  99. package/Image/useConstructImage.d.ts +46 -46
  100. package/Image/useConstructImage.js +96 -96
  101. package/Image/utils/aspectRatioToFraction.d.ts +2 -2
  102. package/Image/utils/aspectRatioToFraction.js +10 -10
  103. package/Image/utils/getFullUrl.d.ts +6 -6
  104. package/Image/utils/getFullUrl.js +17 -17
  105. package/Image/utils/getImageWidth.d.ts +1 -1
  106. package/Image/utils/getImageWidth.js +11 -11
  107. package/Image/utils/getImageWidths.d.ts +2 -2
  108. package/Image/utils/getImageWidths.js +13 -13
  109. package/Image/utils/getLQIP.d.ts +8 -8
  110. package/Image/utils/getLQIP.js +19 -19
  111. package/Image/utils/getLargestSize.d.ts +7 -7
  112. package/Image/utils/getLargestSize.js +16 -16
  113. package/Image/utils/getSizeForBreakpoint.d.ts +2 -2
  114. package/Image/utils/getSizeForBreakpoint.js +15 -15
  115. package/Image/utils/getSizesMap.d.ts +2 -2
  116. package/Image/utils/getSizesMap.js +21 -21
  117. package/Image/utils/getSmallestSize.d.ts +2 -2
  118. package/Image/utils/getSmallestSize.js +11 -11
  119. package/Image/utils/getSrcSetFromWidths.d.ts +10 -10
  120. package/Image/utils/getSrcSetFromWidths.js +8 -8
  121. package/Image/utils/getSrcWithParams.d.ts +3 -3
  122. package/Image/utils/getSrcWithParams.js +28 -28
  123. package/Image/utils/paddingForAspectRatio.d.ts +1 -1
  124. package/Image/utils/paddingForAspectRatio.js +5 -5
  125. package/Image/utils/remToPx.d.ts +1 -1
  126. package/Image/utils/remToPx.js +1 -1
  127. package/Image/utils/sizeToNumber.d.ts +2 -2
  128. package/Image/utils/sizeToNumber.js +26 -26
  129. package/Input/Input.d.ts +6 -6
  130. package/Input/Input.js +44 -44
  131. package/Input/index.d.ts +3 -3
  132. package/Input/index.js +3 -3
  133. package/JetshopText.d.ts +3 -3
  134. package/JetshopText.js +11 -11
  135. package/Loading/LoadingBar.d.ts +8 -8
  136. package/Loading/LoadingBar.js +57 -57
  137. package/Loading/LoadingLine.d.ts +31 -31
  138. package/Loading/LoadingLine.js +25 -25
  139. package/Loading/LoadingLine.test.js +18 -18
  140. package/Loading/NetworkStatusNotifier.d.ts +2 -2
  141. package/Loading/NetworkStatusNotifier.js +3 -3
  142. package/Menu/GetMoreSubcategoriesQuery.gql +25 -25
  143. package/Menu/MenuContainer.d.ts +28 -28
  144. package/Menu/MenuContainer.js +45 -45
  145. package/Menu/MenuContainer.test.js +245 -245
  146. package/Menu/RecursiveTree.d.ts +28 -28
  147. package/Menu/RecursiveTree.js +90 -90
  148. package/Menu/RecursiveTree.test.js +416 -416
  149. package/Modal/Drawer/Drawer.d.ts +11 -11
  150. package/Modal/Drawer/Drawer.js +30 -30
  151. package/Modal/Drawer/DrawerTarget.d.ts +6 -6
  152. package/Modal/Drawer/DrawerTarget.js +11 -11
  153. package/Modal/Drawer/DrawerTarget.test.js +92 -92
  154. package/Modal/Drawer/DrawerTrigger.d.ts +11 -11
  155. package/Modal/Drawer/DrawerTrigger.js +15 -15
  156. package/Modal/Drawer/DrawerTrigger.test.js +51 -51
  157. package/Modal/Drawer/index.d.ts +3 -3
  158. package/Modal/Drawer/index.js +3 -3
  159. package/Modal/Flyout/FlyoutTarget.d.ts +10 -10
  160. package/Modal/Flyout/FlyoutTarget.js +14 -14
  161. package/Modal/Flyout/FlyoutTarget.test.js +84 -84
  162. package/Modal/Flyout/FlyoutTrigger.d.ts +15 -15
  163. package/Modal/Flyout/FlyoutTrigger.js +17 -17
  164. package/Modal/Flyout/FlyoutTrigger.test.js +72 -72
  165. package/Modal/Flyout/index.d.ts +2 -2
  166. package/Modal/Flyout/index.js +2 -2
  167. package/Modal/ModalContext.d.ts +26 -26
  168. package/Modal/ModalContext.js +8 -8
  169. package/Modal/ModalProvider.d.ts +5 -5
  170. package/Modal/ModalProvider.js +82 -82
  171. package/Modal/ModalProvider.test.js +26 -26
  172. package/Modal/ModalRoot.d.ts +3 -3
  173. package/Modal/ModalRoot.js +43 -43
  174. package/Modal/ModalRoot.test.js +80 -80
  175. package/Modal/ModalTrigger.d.ts +9 -9
  176. package/Modal/ModalTrigger.js +8 -8
  177. package/Modal/__test_utils__/getComponentWithModalContext.js +29 -29
  178. package/Pagination/Pagination.d.ts +7 -7
  179. package/Pagination/Pagination.js +22 -22
  180. package/Pagination/PaginationBehaviour.d.ts +52 -52
  181. package/Pagination/PaginationBehaviour.js +67 -67
  182. package/Pagination/index.d.ts +2 -2
  183. package/Pagination/index.js +2 -2
  184. package/Pagination/usePagination.d.ts +15 -15
  185. package/Pagination/usePagination.js +45 -45
  186. package/PreOrderDateSelector/PreOrderDateSelector.d.ts +20 -20
  187. package/PreOrderDateSelector/PreOrderDateSelector.js +73 -73
  188. package/PreOrderDateSelector/index.d.ts +2 -2
  189. package/PreOrderDateSelector/index.js +2 -2
  190. package/Price/Currency.d.ts +9 -9
  191. package/Price/Currency.js +10 -10
  192. package/Price/Price.d.ts +29 -28
  193. package/Price/Price.js +35 -34
  194. package/Price/Price.js.map +1 -1
  195. package/Price/index.d.ts +1 -1
  196. package/Price/index.js +1 -1
  197. package/ProductLink.d.ts +21 -21
  198. package/ProductLink.js +81 -81
  199. package/ProductList/Badges.d.ts +6 -6
  200. package/ProductList/Badges.js +55 -55
  201. package/ProductList/GridProduct.d.ts +24 -24
  202. package/ProductList/GridProduct.js +57 -57
  203. package/ProductList/ProductGrid.d.ts +16 -16
  204. package/ProductList/ProductGrid.js +29 -29
  205. package/ProductList/ProductImage.d.ts +12 -12
  206. package/ProductList/ProductImage.js +20 -20
  207. package/ProductSpecifications/ProductSpecifications.d.ts +8 -8
  208. package/ProductSpecifications/ProductSpecifications.js +77 -77
  209. package/ScrollRestorationHandler/ScrollRestorationHandler.d.ts +8 -8
  210. package/ScrollRestorationHandler/ScrollRestorationHandler.js +16 -16
  211. package/ScrollRestorationHandler/ScrollRestorationHandler.test.js +75 -75
  212. package/ScrollRestorationHandler/index.d.ts +1 -1
  213. package/ScrollRestorationHandler/index.js +1 -1
  214. package/ScrollRestorationHandler/isInIgnoredRouteTypes.d.ts +6 -6
  215. package/ScrollRestorationHandler/isInIgnoredRouteTypes.js +7 -7
  216. package/ScrollRestorationHandler/useScrollRestore.d.ts +7 -7
  217. package/ScrollRestorationHandler/useScrollRestore.js +19 -19
  218. package/Search/AutocompleteQuery.gql +10 -10
  219. package/Search/SearchAutoCompleteContainer.d.ts +45 -45
  220. package/Search/SearchAutoCompleteContainer.js +171 -171
  221. package/Search/SearchAutoCompleteContainer.test.js +460 -460
  222. package/Search/SearchField.d.ts +15 -15
  223. package/Search/SearchField.js +96 -96
  224. package/Search/SearchPage/PageOf.d.ts +5 -5
  225. package/Search/SearchPage/PageOf.js +6 -6
  226. package/Search/SearchPage/SearchMeta.d.ts +16 -16
  227. package/Search/SearchPage/SearchMeta.js +19 -19
  228. package/Search/SearchPage/SearchPageBehaviour.d.ts +19 -19
  229. package/Search/SearchPage/SearchPageBehaviour.js +66 -66
  230. package/Search/SuggestedTerm.d.ts +16 -16
  231. package/Search/SuggestedTerm.js +34 -34
  232. package/Search/index.d.ts +1 -1
  233. package/Search/index.js +1 -1
  234. package/Select/Components.d.ts +28 -28
  235. package/Select/Components.js +90 -90
  236. package/Select/SelectComponents/Quantity.d.ts +5 -5
  237. package/Select/SelectComponents/Quantity.js +7 -7
  238. package/Select/index.d.ts +5 -5
  239. package/Select/index.js +1 -1
  240. package/SortOrder/SortOrder.d.ts +16 -16
  241. package/SortOrder/SortOrder.js +31 -31
  242. package/SortOrder/SortOrderDropdown.d.ts +9 -9
  243. package/SortOrder/SortOrderDropdown.js +24 -24
  244. package/SortOrder/SortOrderList.d.ts +7 -7
  245. package/SortOrder/SortOrderList.js +16 -16
  246. package/StartPageRenderer/StartPageRenderer.d.ts +17 -17
  247. package/StartPageRenderer/StartPageRenderer.js +51 -51
  248. package/StartPageRenderer/index.d.ts +1 -1
  249. package/StartPageRenderer/index.js +1 -1
  250. package/Stock/StockStatusContainer.d.ts +16 -16
  251. package/Stock/StockStatusContainer.js +39 -39
  252. package/Stock/__tests__/StockStatusContainer.test.js +65 -65
  253. package/Text/Text.d.ts +11 -11
  254. package/Text/Text.js +21 -21
  255. package/Text/index.d.ts +3 -3
  256. package/Text/index.js +3 -3
  257. package/Theme/createTheme.d.ts +16 -16
  258. package/Theme/createTheme.js +4 -4
  259. package/Theme/cssReset.d.ts +1 -1
  260. package/Theme/cssReset.js +159 -159
  261. package/Theme/normalizeCss.d.ts +1 -1
  262. package/Theme/normalizeCss.js +356 -356
  263. package/Theme/sanitizeCss.d.ts +1 -1
  264. package/Theme/sanitizeCss.js +571 -571
  265. package/WindowGrid/WindowGrid.d.ts +11 -11
  266. package/WindowGrid/WindowGrid.js +57 -57
  267. package/WindowGrid/index.d.ts +1 -1
  268. package/WindowGrid/index.js +1 -1
  269. package/WindowGrid/useResizeObserver.d.ts +8 -8
  270. package/WindowGrid/useResizeObserver.js +13 -13
  271. package/WindowGrid/useScrollWithWindow.d.ts +12 -12
  272. package/WindowGrid/useScrollWithWindow.js +38 -38
  273. package/dependencies.d.ts +98 -98
  274. package/fuzzySearch/fuzzySearch.d.ts +8 -8
  275. package/fuzzySearch/fuzzySearch.js +42 -42
  276. package/fuzzySearch/index.d.ts +1 -1
  277. package/fuzzySearch/index.js +1 -1
  278. package/global.d.ts +1 -1
  279. package/hooks/index.d.ts +2 -2
  280. package/hooks/index.js +2 -2
  281. package/hooks/useOnClickOutside.d.ts +6 -6
  282. package/hooks/useOnClickOutside.js +16 -16
  283. package/hooks/useOnEsc.d.ts +4 -4
  284. package/hooks/useOnEsc.js +16 -16
  285. package/package.json +1 -1
  286. package/setupTests.js +2 -2
  287. package/svg/flags/ad.svg +150 -150
  288. package/svg/flags/ae.svg +6 -6
  289. package/svg/flags/af.svg +81 -81
  290. package/svg/flags/ag.svg +14 -14
  291. package/svg/flags/ai.svg +767 -767
  292. package/svg/flags/al.svg +5 -5
  293. package/svg/flags/am.svg +5 -5
  294. package/svg/flags/ao.svg +13 -13
  295. package/svg/flags/aq.svg +6 -6
  296. package/svg/flags/ar.svg +31 -31
  297. package/svg/flags/as.svg +33 -33
  298. package/svg/flags/at.svg +6 -6
  299. package/svg/flags/au.svg +9 -9
  300. package/svg/flags/aw.svg +186 -186
  301. package/svg/flags/ax.svg +18 -18
  302. package/svg/flags/az.svg +8 -8
  303. package/svg/flags/ba.svg +12 -12
  304. package/svg/flags/bb.svg +6 -6
  305. package/svg/flags/bd.svg +4 -4
  306. package/svg/flags/be.svg +7 -7
  307. package/svg/flags/bf.svg +7 -7
  308. package/svg/flags/bg.svg +7 -7
  309. package/svg/flags/bh.svg +11 -11
  310. package/svg/flags/bi.svg +15 -15
  311. package/svg/flags/bj.svg +14 -14
  312. package/svg/flags/bl.svg +7 -7
  313. package/svg/flags/bm.svg +98 -98
  314. package/svg/flags/bn.svg +36 -36
  315. package/svg/flags/bo.svg +676 -676
  316. package/svg/flags/bq.svg +5 -5
  317. package/svg/flags/br.svg +45 -45
  318. package/svg/flags/bs.svg +13 -13
  319. package/svg/flags/bt.svg +89 -89
  320. package/svg/flags/bv.svg +13 -13
  321. package/svg/flags/bw.svg +7 -7
  322. package/svg/flags/by.svg +20 -20
  323. package/svg/flags/bz.svg +145 -145
  324. package/svg/flags/ca.svg +4 -4
  325. package/svg/flags/cc.svg +19 -19
  326. package/svg/flags/cd.svg +5 -5
  327. package/svg/flags/cf.svg +15 -15
  328. package/svg/flags/cg.svg +12 -12
  329. package/svg/flags/ch.svg +9 -9
  330. package/svg/flags/ci.svg +7 -7
  331. package/svg/flags/ck.svg +9 -9
  332. package/svg/flags/cl.svg +13 -13
  333. package/svg/flags/cm.svg +15 -15
  334. package/svg/flags/cn.svg +11 -11
  335. package/svg/flags/co.svg +7 -7
  336. package/svg/flags/cr.svg +7 -7
  337. package/svg/flags/cu.svg +13 -13
  338. package/svg/flags/cv.svg +13 -13
  339. package/svg/flags/cw.svg +14 -14
  340. package/svg/flags/cx.svg +15 -15
  341. package/svg/flags/cy.svg +6 -6
  342. package/svg/flags/cz.svg +12 -12
  343. package/svg/flags/de.svg +5 -5
  344. package/svg/flags/dj.svg +13 -13
  345. package/svg/flags/dk.svg +5 -5
  346. package/svg/flags/dm.svg +152 -152
  347. package/svg/flags/do.svg +6745 -6745
  348. package/svg/flags/dz.svg +5 -5
  349. package/svg/flags/ec.svg +138 -138
  350. package/svg/flags/ee.svg +7 -7
  351. package/svg/flags/eg.svg +38 -38
  352. package/svg/flags/eh.svg +15 -15
  353. package/svg/flags/er.svg +8 -8
  354. package/svg/flags/es-ct.svg +4 -4
  355. package/svg/flags/es.svg +544 -544
  356. package/svg/flags/et.svg +14 -14
  357. package/svg/flags/eu.svg +28 -28
  358. package/svg/flags/fi.svg +5 -5
  359. package/svg/flags/fj.svg +120 -120
  360. package/svg/flags/fk.svg +89 -89
  361. package/svg/flags/fm.svg +11 -11
  362. package/svg/flags/fo.svg +12 -12
  363. package/svg/flags/fr.svg +7 -7
  364. package/svg/flags/ga.svg +7 -7
  365. package/svg/flags/gb-eng.svg +5 -5
  366. package/svg/flags/gb-nir.svg +131 -131
  367. package/svg/flags/gb-sct.svg +4 -4
  368. package/svg/flags/gb-wls.svg +9 -9
  369. package/svg/flags/gb.svg +15 -15
  370. package/svg/flags/gd.svg +27 -27
  371. package/svg/flags/ge.svg +6 -6
  372. package/svg/flags/gf.svg +5 -5
  373. package/svg/flags/gg.svg +9 -9
  374. package/svg/flags/gh.svg +6 -6
  375. package/svg/flags/gi.svg +32 -32
  376. package/svg/flags/gl.svg +4 -4
  377. package/svg/flags/gm.svg +14 -14
  378. package/svg/flags/gn.svg +7 -7
  379. package/svg/flags/gp.svg +7 -7
  380. package/svg/flags/gq.svg +23 -23
  381. package/svg/flags/gr.svg +22 -22
  382. package/svg/flags/gs.svg +201 -201
  383. package/svg/flags/gt.svg +204 -204
  384. package/svg/flags/gu.svg +39 -39
  385. package/svg/flags/gw.svg +13 -13
  386. package/svg/flags/gy.svg +9 -9
  387. package/svg/flags/hk.svg +30 -30
  388. package/svg/flags/hm.svg +9 -9
  389. package/svg/flags/hn.svg +18 -18
  390. package/svg/flags/hr.svg +58 -58
  391. package/svg/flags/ht.svg +116 -116
  392. package/svg/flags/hu.svg +7 -7
  393. package/svg/flags/id.svg +6 -6
  394. package/svg/flags/ie.svg +7 -7
  395. package/svg/flags/il.svg +14 -14
  396. package/svg/flags/im.svg +36 -36
  397. package/svg/flags/in.svg +25 -25
  398. package/svg/flags/io.svg +138 -138
  399. package/svg/flags/iq.svg +10 -10
  400. package/svg/flags/ir.svg +219 -219
  401. package/svg/flags/is.svg +12 -12
  402. package/svg/flags/it.svg +7 -7
  403. package/svg/flags/je.svg +31 -31
  404. package/svg/flags/jm.svg +8 -8
  405. package/svg/flags/jo.svg +16 -16
  406. package/svg/flags/jp.svg +11 -11
  407. package/svg/flags/ke.svg +23 -23
  408. package/svg/flags/kg.svg +15 -15
  409. package/svg/flags/kh.svg +61 -61
  410. package/svg/flags/ki.svg +36 -36
  411. package/svg/flags/km.svg +16 -16
  412. package/svg/flags/kn.svg +14 -14
  413. package/svg/flags/kp.svg +15 -15
  414. package/svg/flags/kr.svg +24 -24
  415. package/svg/flags/kw.svg +13 -13
  416. package/svg/flags/ky.svg +63 -63
  417. package/svg/flags/kz.svg +23 -23
  418. package/svg/flags/la.svg +12 -12
  419. package/svg/flags/lb.svg +15 -15
  420. package/svg/flags/lc.svg +8 -8
  421. package/svg/flags/li.svg +43 -43
  422. package/svg/flags/lk.svg +22 -22
  423. package/svg/flags/lr.svg +14 -14
  424. package/svg/flags/ls.svg +8 -8
  425. package/svg/flags/lt.svg +7 -7
  426. package/svg/flags/lu.svg +5 -5
  427. package/svg/flags/lv.svg +6 -6
  428. package/svg/flags/ly.svg +13 -13
  429. package/svg/flags/ma.svg +4 -4
  430. package/svg/flags/mc.svg +6 -6
  431. package/svg/flags/md.svg +70 -70
  432. package/svg/flags/me.svg +116 -116
  433. package/svg/flags/mf.svg +7 -7
  434. package/svg/flags/mg.svg +7 -7
  435. package/svg/flags/mh.svg +7 -7
  436. package/svg/flags/mk.svg +5 -5
  437. package/svg/flags/ml.svg +7 -7
  438. package/svg/flags/mm.svg +16 -16
  439. package/svg/flags/mn.svg +13 -13
  440. package/svg/flags/mo.svg +9 -9
  441. package/svg/flags/mp.svg +86 -86
  442. package/svg/flags/mq.svg +7 -7
  443. package/svg/flags/mr.svg +6 -6
  444. package/svg/flags/ms.svg +39 -39
  445. package/svg/flags/mt.svg +49 -49
  446. package/svg/flags/mu.svg +8 -8
  447. package/svg/flags/mv.svg +6 -6
  448. package/svg/flags/mw.svg +10 -10
  449. package/svg/flags/mx.svg +382 -382
  450. package/svg/flags/my.svg +15 -15
  451. package/svg/flags/mz.svg +21 -21
  452. package/svg/flags/na.svg +16 -16
  453. package/svg/flags/nc.svg +7 -7
  454. package/svg/flags/ne.svg +6 -6
  455. package/svg/flags/nf.svg +9 -9
  456. package/svg/flags/ng.svg +6 -6
  457. package/svg/flags/ni.svg +129 -129
  458. package/svg/flags/nl.svg +7 -7
  459. package/svg/flags/no.svg +7 -7
  460. package/svg/flags/np.svg +14 -14
  461. package/svg/flags/nr.svg +12 -12
  462. package/svg/flags/nu.svg +26 -26
  463. package/svg/flags/nz.svg +41 -41
  464. package/svg/flags/om.svg +115 -115
  465. package/svg/flags/pa.svg +14 -14
  466. package/svg/flags/pe.svg +244 -244
  467. package/svg/flags/pf.svg +19 -19
  468. package/svg/flags/pg.svg +9 -9
  469. package/svg/flags/ph.svg +13 -13
  470. package/svg/flags/pk.svg +15 -15
  471. package/svg/flags/pl.svg +6 -6
  472. package/svg/flags/pm.svg +7 -7
  473. package/svg/flags/pn.svg +62 -62
  474. package/svg/flags/pr.svg +13 -13
  475. package/svg/flags/ps.svg +15 -15
  476. package/svg/flags/pt.svg +57 -57
  477. package/svg/flags/pw.svg +11 -11
  478. package/svg/flags/py.svg +157 -157
  479. package/svg/flags/qa.svg +4 -4
  480. package/svg/flags/re.svg +7 -7
  481. package/svg/flags/ro.svg +7 -7
  482. package/svg/flags/rs.svg +292 -292
  483. package/svg/flags/ru.svg +7 -7
  484. package/svg/flags/rw.svg +13 -13
  485. package/svg/flags/sa.svg +26 -26
  486. package/svg/flags/sb.svg +13 -13
  487. package/svg/flags/sc.svg +14 -14
  488. package/svg/flags/sd.svg +13 -13
  489. package/svg/flags/se.svg +16 -16
  490. package/svg/flags/sg.svg +13 -13
  491. package/svg/flags/sh.svg +74 -74
  492. package/svg/flags/si.svg +18 -18
  493. package/svg/flags/sj.svg +7 -7
  494. package/svg/flags/sk.svg +9 -9
  495. package/svg/flags/sl.svg +7 -7
  496. package/svg/flags/sm.svg +91 -91
  497. package/svg/flags/sn.svg +8 -8
  498. package/svg/flags/so.svg +11 -11
  499. package/svg/flags/sr.svg +6 -6
  500. package/svg/flags/ss.svg +8 -8
  501. package/svg/flags/st.svg +16 -16
  502. package/svg/flags/sv.svg +606 -606
  503. package/svg/flags/sx.svg +56 -56
  504. package/svg/flags/sy.svg +6 -6
  505. package/svg/flags/sz.svg +45 -45
  506. package/svg/flags/tc.svg +67 -67
  507. package/svg/flags/td.svg +7 -7
  508. package/svg/flags/tf.svg +15 -15
  509. package/svg/flags/tg.svg +14 -14
  510. package/svg/flags/th.svg +7 -7
  511. package/svg/flags/tj.svg +22 -22
  512. package/svg/flags/tk.svg +5 -5
  513. package/svg/flags/tl.svg +13 -13
  514. package/svg/flags/tm.svg +206 -206
  515. package/svg/flags/tn.svg +13 -13
  516. package/svg/flags/to.svg +10 -10
  517. package/svg/flags/tr.svg +8 -8
  518. package/svg/flags/tt.svg +5 -5
  519. package/svg/flags/tv.svg +27 -27
  520. package/svg/flags/tw.svg +14 -14
  521. package/svg/flags/tz.svg +13 -13
  522. package/svg/flags/ua.svg +6 -6
  523. package/svg/flags/ug.svg +30 -30
  524. package/svg/flags/um.svg +15 -15
  525. package/svg/flags/un.svg +16 -16
  526. package/svg/flags/us.svg +10 -10
  527. package/svg/flags/uy.svg +28 -28
  528. package/svg/flags/uz.svg +30 -30
  529. package/svg/flags/va.svg +479 -479
  530. package/svg/flags/vc.svg +8 -8
  531. package/svg/flags/ve.svg +26 -26
  532. package/svg/flags/vg.svg +127 -127
  533. package/svg/flags/vi.svg +28 -28
  534. package/svg/flags/vn.svg +11 -11
  535. package/svg/flags/vu.svg +18 -18
  536. package/svg/flags/wf.svg +7 -7
  537. package/svg/flags/ws.svg +7 -7
  538. package/svg/flags/ye.svg +7 -7
  539. package/svg/flags/yt.svg +7 -7
  540. package/svg/flags/za.svg +17 -17
  541. package/svg/flags/zm.svg +27 -27
  542. package/svg/flags/zw.svg +21 -21
  543. package/test-utils/mock-response/product-status.js +44 -44
  544. package/utils/breakpoints.d.ts +23 -23
  545. package/utils/breakpoints.js +89 -89
  546. package/utils/callAllEventHandlers.d.ts +5 -5
  547. package/utils/callAllEventHandlers.js +8 -8
  548. package/utils/text.d.ts +1 -1
  549. package/utils/text.js +22 -22
  550. package/utils/theme.d.ts +3 -3
  551. package/utils/theme.js +4 -4
  552. package/utils/useHoverIntent.d.ts +10 -10
  553. package/utils/useHoverIntent.js +77 -77
  554. package/utils/usePropsOfType.d.ts +11 -11
  555. package/utils/usePropsOfType.js +17 -17
  556. package/withFlightUI.d.ts +17 -17
  557. package/withFlightUI.js +19 -19
@@ -1,460 +1,460 @@
1
- import renderWithRouter from '@jetshop/core/test-utils/renderWithRouter';
2
- import React from 'react';
3
- import { MockedProvider } from '@apollo/react-testing';
4
- import { Route, Switch } from 'react-router';
5
- import {
6
- cleanup,
7
- fireEvent,
8
- wait,
9
- waitForElement
10
- } from '@testing-library/react';
11
- import SearchAutoCompleteContainer from './SearchAutoCompleteContainer';
12
- import AutocompleteQuery from './AutocompleteQuery.gql';
13
- import { ShopConfigContext } from '@jetshop/core/components/ConfigProvider';
14
-
15
- describe('SearchFieldBehaviour', () => {
16
- it('renders child as fn with args', () => {
17
- const { renderArg } = setup();
18
- expect(renderArg).toMatchSnapshot();
19
- });
20
-
21
- it('allows an initialValue to be set via props', async () => {
22
- const { renderArg } = setup({ initialValue: 'howdy neighbour' });
23
-
24
- expect(renderArg.term).toBe('howdy neighbour');
25
- });
26
-
27
- it('updates term param to match the input field value', () => {
28
- const { input, renderArg } = setup();
29
-
30
- fireEvent.change(input, { target: { value: 'boots' } });
31
-
32
- expect(renderArg.term).toBe('boots');
33
- });
34
-
35
- it('updates the debouncedTerm after a delay', async () => {
36
- // This also tests that the state isn't updated after the component unmounts
37
- // — we'd receive a warning from React
38
- const { input, renderArg } = setup();
39
-
40
- fireEvent.change(input, { target: { value: 'cats' } });
41
-
42
- await wait(() => expect(renderArg.debouncedTerm).toEqual('cats'));
43
- });
44
-
45
- it('executes search and returns results after debouncedTerm is set', async () => {
46
- const { input, childrenSpy, renderArg } = setup();
47
-
48
- fireEvent.change(input, { target: { value: 'autoc' } });
49
-
50
- await wait(() => expect(renderArg.debouncedTerm).toEqual('autoc'));
51
-
52
- // The child fn should have been called with loading set to true at some
53
- // point after the query was made
54
- await wait(() =>
55
- expect(childrenSpy).toHaveBeenCalledWith(
56
- expect.objectContaining({
57
- loading: true
58
- })
59
- )
60
- );
61
-
62
- // Wait for loading to finish
63
- await wait(() =>
64
- expect(childrenSpy).toHaveBeenLastCalledWith(
65
- expect.objectContaining({
66
- loading: false
67
- })
68
- )
69
- );
70
-
71
- // and then it should be called again with the actual results
72
- expect(childrenSpy).lastCalledWith(
73
- expect.objectContaining({
74
- loading: false,
75
- result: {
76
- products: {
77
- result: expect.arrayContaining([
78
- expect.objectContaining({
79
- id: 123
80
- }),
81
- expect.objectContaining({
82
- id: 321
83
- })
84
- ])
85
- }
86
- }
87
- })
88
- );
89
-
90
- fireEvent.change(input, { target: { value: 'autocomplet' } });
91
-
92
- await wait(() => expect(renderArg.debouncedTerm).toEqual('autocomplet'));
93
-
94
- expect(childrenSpy).toHaveBeenLastCalledWith(
95
- expect.objectContaining({
96
- result: {
97
- products: {
98
- result: expect.arrayContaining([
99
- expect.objectContaining({
100
- id: 123
101
- }),
102
- expect.not.objectContaining({
103
- id: 321
104
- })
105
- ])
106
- }
107
- }
108
- })
109
- );
110
- });
111
-
112
- it('updates the isDirty param when the input is dirty', async () => {
113
- const { childrenSpy, input, renderArg } = setup();
114
-
115
- expect(childrenSpy).toHaveBeenCalledTimes(1);
116
-
117
- expect(renderArg.isDirty).toBe(false);
118
- fireEvent.change(input, { target: { value: 'mock' } });
119
- expect(childrenSpy).toHaveBeenCalledTimes(2);
120
- expect(renderArg.isDirty).toBe(true);
121
-
122
- fireEvent.change(input, { target: { value: '' } });
123
- expect(renderArg.isDirty).toBe(false);
124
- });
125
-
126
- it('correctly sets isDirty if the initialValue prop is used', () => {
127
- const { input, renderArg } = setup({ initialValue: 'howdy' });
128
-
129
- expect(renderArg.isDirty).toBe(false);
130
- fireEvent.change(input, { target: { value: 'boots' } });
131
- expect(renderArg.isDirty).toBe(true);
132
- // An empty string is 'dirty' if initialValue is not an empty string…
133
- fireEvent.change(input, { target: { value: '' } });
134
- expect(renderArg.isDirty).toBe(true);
135
- fireEvent.change(input, { target: { value: 'howdy' } });
136
- expect(renderArg.isDirty).toBe(false);
137
- });
138
-
139
- it('automatically focuses the input on mount if `focusOnLoad` is set', () => {
140
- const { input } = setup();
141
- expect(input).not.toHaveFocus();
142
-
143
- cleanup();
144
-
145
- const { input: focusedInput } = setup({ focusOnLoad: true });
146
- expect(focusedInput).toHaveFocus();
147
- });
148
-
149
- it('accepts a custom onBlur event on getInputProps', async () => {
150
- const mockBlurFn = jest.fn();
151
- const { input } = setup({}, null, {
152
- getInputPropsOptions: { onBlur: mockBlurFn }
153
- });
154
-
155
- fireEvent.focus(input);
156
- await wait();
157
- fireEvent.blur(input);
158
-
159
- expect(mockBlurFn).toHaveBeenCalledTimes(1);
160
- });
161
-
162
- it('accepts a custom onFocus event on getInputProps', () => {
163
- const mockFocusFn = jest.fn();
164
- const { input } = setup({}, null, {
165
- getInputPropsOptions: { onFocus: mockFocusFn }
166
- });
167
-
168
- fireEvent.focus(input);
169
-
170
- expect(mockFocusFn).toHaveBeenCalledTimes(1);
171
- });
172
-
173
- it('provides the inputs ref via render props ', () => {
174
- const { input, renderArg } = setup();
175
-
176
- expect(renderArg.inputRef).toEqual(
177
- expect.objectContaining({
178
- current: input
179
- })
180
- );
181
- });
182
-
183
- it('allows focus to be controlled via render prop `updateFocus`', () => {
184
- const { input, renderArg } = setup();
185
-
186
- fireEvent.focus(input);
187
- renderArg.updateFocus('blur');
188
- expect(input).not.toHaveFocus();
189
- renderArg.updateFocus('focus');
190
- expect(input).toHaveFocus();
191
- });
192
-
193
- describe('`isOpen` render prop fn', () => {
194
- test('is true when the search field has focus', () => {
195
- const { input, renderArg } = setup();
196
-
197
- fireEvent.focus(input);
198
-
199
- expect(renderArg.isOpen).toBe(true);
200
- });
201
-
202
- test('is true when the search field has focus', () => {
203
- const { input, renderArg } = setup();
204
-
205
- fireEvent.focus(input);
206
-
207
- expect(renderArg.isOpen).toBe(true);
208
- });
209
-
210
- test('is false when the search field does not have focus', () => {
211
- const { input, renderArg } = setup();
212
-
213
- expect(renderArg.isOpen).toBe(false);
214
-
215
- fireEvent.focus(input);
216
- fireEvent.blur(input);
217
- expect(renderArg.isOpen).toBe(false);
218
- });
219
-
220
- test('is true when the search field loses focus and the `term` has changed', async () => {
221
- const { input, renderArg } = setup();
222
-
223
- fireEvent.focus(input);
224
- fireEvent.change(input, { target: { value: 'bootsandcats' } });
225
- fireEvent.blur(input);
226
- await wait();
227
- expect(renderArg.isOpen).toBe(true);
228
- });
229
- });
230
-
231
- describe('registers cancel button behaviour on the element using `getCancelProps()`', () => {
232
- test('that clears the input value when clicked', () => {
233
- const { input, cancel, renderArg } = setup();
234
-
235
- fireEvent.change(input, { target: { value: 'boots' } });
236
- expect(renderArg.term).toBe('boots');
237
-
238
- fireEvent.click(cancel);
239
-
240
- expect(renderArg.term).toBe('');
241
- });
242
-
243
- test('that accepts onClick handlers passed in to it', () => {
244
- const mockClickFn = jest.fn();
245
- const { cancel } = setup({}, null, {
246
- getCancelPropsOptions: { onClick: mockClickFn }
247
- });
248
-
249
- fireEvent.click(cancel);
250
-
251
- expect(mockClickFn).toHaveBeenCalledTimes(1);
252
- });
253
- });
254
-
255
- describe('triggers a full search', () => {
256
- test('when pressing enter key', async () => {
257
- const { input, getByText } = setup();
258
- fireEvent.focus(input);
259
- fireEvent.change(input, { target: { value: 'boots' } });
260
-
261
- fireEvent.keyDown(input, { key: 'Enter' });
262
-
263
- await waitForElement(() => getByText('you searched for ?term=boots'));
264
- });
265
- test('when clicking button with `triggerSearch` bound', async () => {
266
- const { input, submit, getByText } = setup();
267
- fireEvent.focus(input);
268
- fireEvent.change(input, { target: { value: 'boots' } });
269
-
270
- fireEvent.click(submit);
271
-
272
- await waitForElement(() => getByText('you searched for ?term=boots'));
273
- });
274
- test('with the value passed to `triggerSearch` if one is given', async () => {
275
- const { input, submit, getByText } = setup({}, null, {
276
- getSubmitOpts: 'search this!'
277
- });
278
- fireEvent.focus(input);
279
- fireEvent.change(input, { target: { value: 'boots' } });
280
-
281
- fireEvent.click(submit);
282
-
283
- await waitForElement(() => getByText(/search this!/i));
284
- });
285
- test('sets `isOpen` to false when triggering a full search', async () => {
286
- const { input, renderArg } = setup();
287
- fireEvent.change(input, { target: { value: 'boots' } });
288
- fireEvent.focus(input);
289
- expect(renderArg.isOpen).toBe(true);
290
- fireEvent.keyDown(input, { key: 'Enter' });
291
- expect(renderArg.isOpen).toBe(false);
292
- });
293
- });
294
-
295
- it('calls passed onCancel cb when search is cancelled', () => {
296
- const mockCancelCb = jest.fn();
297
- const { input, cancel } = setup({ onCancel: mockCancelCb });
298
-
299
- fireEvent.change(input, { target: { value: 'hello' } });
300
- fireEvent.click(cancel);
301
-
302
- expect(mockCancelCb).toHaveBeenCalledTimes(1);
303
- });
304
-
305
- it('calls passed onSubmit cb when search is submitted', () => {
306
- const mockSubmitFn = jest.fn();
307
- const { input, submit } = setup({ onSubmit: mockSubmitFn });
308
-
309
- fireEvent.change(input, { target: { value: 'hello' } });
310
- fireEvent.click(submit);
311
-
312
- expect(mockSubmitFn).toHaveBeenCalledTimes(1);
313
-
314
- fireEvent.change(input, { target: { value: 'wow' } });
315
- fireEvent.focus(input);
316
- fireEvent.keyDown(input, { key: 'Enter' });
317
-
318
- expect(mockSubmitFn).toHaveBeenCalledTimes(2);
319
- });
320
- });
321
-
322
- const mocks = [
323
- {
324
- request: {
325
- query: AutocompleteQuery,
326
- variables: {
327
- term: 'autoc'
328
- }
329
- },
330
- result: {
331
- data: {
332
- searchAutoComplete: {
333
- products: {
334
- result: [
335
- {
336
- name: 'autocomplete',
337
- id: 123,
338
- articleNumber: 123,
339
- primaryRoute: {
340
- id: 4353,
341
- slug: 'autocompleted-product',
342
- path: '/product/autocompleted-product'
343
- }
344
- },
345
- {
346
- name: 'autocomputed',
347
- id: 321,
348
- articleNumber: 321,
349
- primaryRoute: {
350
- id: 2737,
351
- slug: 'autocomputed-product',
352
- path: '/product/autocomputed-product'
353
- }
354
- }
355
- ]
356
- }
357
- }
358
- }
359
- }
360
- },
361
- {
362
- request: {
363
- query: AutocompleteQuery,
364
- variables: {
365
- term: 'autocomplet'
366
- }
367
- },
368
- result: {
369
- data: {
370
- searchAutoComplete: {
371
- products: {
372
- result: [
373
- {
374
- name: 'autocomplete',
375
- id: 123,
376
- articleNumber: 123,
377
- primaryRoute: {
378
- id: 345343,
379
- slug: 'autocompleted-product',
380
- path: '/product/autocompleted-product'
381
- }
382
- }
383
- ]
384
- }
385
- }
386
- }
387
- }
388
- }
389
- ];
390
-
391
- function setup(
392
- containerProps = {},
393
- renderFn,
394
- {
395
- getInputPropsOptions = {},
396
- getCancelPropsOptions = {},
397
- getSubmitOpts = undefined
398
- } = {}
399
- ) {
400
- const renderArg = {};
401
-
402
- const childrenSpy = jest.fn(controllerArg => {
403
- Object.assign(renderArg, controllerArg);
404
-
405
- if (typeof renderFn === 'function') return renderFn(controllerArg);
406
-
407
- return (
408
- <>
409
- <input
410
- data-testid="default-input-field"
411
- {...controllerArg.getInputProps(getInputPropsOptions)}
412
- />
413
- <button
414
- data-testid="cancel-button"
415
- {...controllerArg.getCancelProps(getCancelPropsOptions)}
416
- >
417
- Cancel
418
- </button>
419
- <button
420
- data-testid="submit-button"
421
- onClick={() => renderArg.triggerSearch(getSubmitOpts)}
422
- >
423
- Submit
424
- </button>
425
- <Switch>
426
- <Route
427
- path="/search"
428
- component={props => {
429
- return <div>you searched for {props.location.search}</div>;
430
- }}
431
- />
432
- </Switch>
433
- </>
434
- );
435
- });
436
-
437
- const utils = renderWithRouter(
438
- <ShopConfigContext.Provider
439
- value={{ routes: { search: { path: '/search' } } }}
440
- >
441
- <MockedProvider mocks={mocks} addTypename={false}>
442
- <SearchAutoCompleteContainer
443
- autocompleteQuery={AutocompleteQuery}
444
- {...containerProps}
445
- >
446
- {childrenSpy}
447
- </SearchAutoCompleteContainer>
448
- </MockedProvider>
449
- </ShopConfigContext.Provider>
450
- );
451
-
452
- return {
453
- ...utils,
454
- input: utils.queryByTestId('default-input-field'),
455
- cancel: utils.queryByTestId('cancel-button'),
456
- submit: utils.queryByTestId('submit-button'),
457
- childrenSpy,
458
- renderArg
459
- };
460
- }
1
+ import renderWithRouter from '@jetshop/core/test-utils/renderWithRouter';
2
+ import React from 'react';
3
+ import { MockedProvider } from '@apollo/react-testing';
4
+ import { Route, Switch } from 'react-router';
5
+ import {
6
+ cleanup,
7
+ fireEvent,
8
+ wait,
9
+ waitForElement
10
+ } from '@testing-library/react';
11
+ import SearchAutoCompleteContainer from './SearchAutoCompleteContainer';
12
+ import AutocompleteQuery from './AutocompleteQuery.gql';
13
+ import { ShopConfigContext } from '@jetshop/core/components/ConfigProvider';
14
+
15
+ describe('SearchFieldBehaviour', () => {
16
+ it('renders child as fn with args', () => {
17
+ const { renderArg } = setup();
18
+ expect(renderArg).toMatchSnapshot();
19
+ });
20
+
21
+ it('allows an initialValue to be set via props', async () => {
22
+ const { renderArg } = setup({ initialValue: 'howdy neighbour' });
23
+
24
+ expect(renderArg.term).toBe('howdy neighbour');
25
+ });
26
+
27
+ it('updates term param to match the input field value', () => {
28
+ const { input, renderArg } = setup();
29
+
30
+ fireEvent.change(input, { target: { value: 'boots' } });
31
+
32
+ expect(renderArg.term).toBe('boots');
33
+ });
34
+
35
+ it('updates the debouncedTerm after a delay', async () => {
36
+ // This also tests that the state isn't updated after the component unmounts
37
+ // — we'd receive a warning from React
38
+ const { input, renderArg } = setup();
39
+
40
+ fireEvent.change(input, { target: { value: 'cats' } });
41
+
42
+ await wait(() => expect(renderArg.debouncedTerm).toEqual('cats'));
43
+ });
44
+
45
+ it('executes search and returns results after debouncedTerm is set', async () => {
46
+ const { input, childrenSpy, renderArg } = setup();
47
+
48
+ fireEvent.change(input, { target: { value: 'autoc' } });
49
+
50
+ await wait(() => expect(renderArg.debouncedTerm).toEqual('autoc'));
51
+
52
+ // The child fn should have been called with loading set to true at some
53
+ // point after the query was made
54
+ await wait(() =>
55
+ expect(childrenSpy).toHaveBeenCalledWith(
56
+ expect.objectContaining({
57
+ loading: true
58
+ })
59
+ )
60
+ );
61
+
62
+ // Wait for loading to finish
63
+ await wait(() =>
64
+ expect(childrenSpy).toHaveBeenLastCalledWith(
65
+ expect.objectContaining({
66
+ loading: false
67
+ })
68
+ )
69
+ );
70
+
71
+ // and then it should be called again with the actual results
72
+ expect(childrenSpy).lastCalledWith(
73
+ expect.objectContaining({
74
+ loading: false,
75
+ result: {
76
+ products: {
77
+ result: expect.arrayContaining([
78
+ expect.objectContaining({
79
+ id: 123
80
+ }),
81
+ expect.objectContaining({
82
+ id: 321
83
+ })
84
+ ])
85
+ }
86
+ }
87
+ })
88
+ );
89
+
90
+ fireEvent.change(input, { target: { value: 'autocomplet' } });
91
+
92
+ await wait(() => expect(renderArg.debouncedTerm).toEqual('autocomplet'));
93
+
94
+ expect(childrenSpy).toHaveBeenLastCalledWith(
95
+ expect.objectContaining({
96
+ result: {
97
+ products: {
98
+ result: expect.arrayContaining([
99
+ expect.objectContaining({
100
+ id: 123
101
+ }),
102
+ expect.not.objectContaining({
103
+ id: 321
104
+ })
105
+ ])
106
+ }
107
+ }
108
+ })
109
+ );
110
+ });
111
+
112
+ it('updates the isDirty param when the input is dirty', async () => {
113
+ const { childrenSpy, input, renderArg } = setup();
114
+
115
+ expect(childrenSpy).toHaveBeenCalledTimes(1);
116
+
117
+ expect(renderArg.isDirty).toBe(false);
118
+ fireEvent.change(input, { target: { value: 'mock' } });
119
+ expect(childrenSpy).toHaveBeenCalledTimes(2);
120
+ expect(renderArg.isDirty).toBe(true);
121
+
122
+ fireEvent.change(input, { target: { value: '' } });
123
+ expect(renderArg.isDirty).toBe(false);
124
+ });
125
+
126
+ it('correctly sets isDirty if the initialValue prop is used', () => {
127
+ const { input, renderArg } = setup({ initialValue: 'howdy' });
128
+
129
+ expect(renderArg.isDirty).toBe(false);
130
+ fireEvent.change(input, { target: { value: 'boots' } });
131
+ expect(renderArg.isDirty).toBe(true);
132
+ // An empty string is 'dirty' if initialValue is not an empty string…
133
+ fireEvent.change(input, { target: { value: '' } });
134
+ expect(renderArg.isDirty).toBe(true);
135
+ fireEvent.change(input, { target: { value: 'howdy' } });
136
+ expect(renderArg.isDirty).toBe(false);
137
+ });
138
+
139
+ it('automatically focuses the input on mount if `focusOnLoad` is set', () => {
140
+ const { input } = setup();
141
+ expect(input).not.toHaveFocus();
142
+
143
+ cleanup();
144
+
145
+ const { input: focusedInput } = setup({ focusOnLoad: true });
146
+ expect(focusedInput).toHaveFocus();
147
+ });
148
+
149
+ it('accepts a custom onBlur event on getInputProps', async () => {
150
+ const mockBlurFn = jest.fn();
151
+ const { input } = setup({}, null, {
152
+ getInputPropsOptions: { onBlur: mockBlurFn }
153
+ });
154
+
155
+ fireEvent.focus(input);
156
+ await wait();
157
+ fireEvent.blur(input);
158
+
159
+ expect(mockBlurFn).toHaveBeenCalledTimes(1);
160
+ });
161
+
162
+ it('accepts a custom onFocus event on getInputProps', () => {
163
+ const mockFocusFn = jest.fn();
164
+ const { input } = setup({}, null, {
165
+ getInputPropsOptions: { onFocus: mockFocusFn }
166
+ });
167
+
168
+ fireEvent.focus(input);
169
+
170
+ expect(mockFocusFn).toHaveBeenCalledTimes(1);
171
+ });
172
+
173
+ it('provides the inputs ref via render props ', () => {
174
+ const { input, renderArg } = setup();
175
+
176
+ expect(renderArg.inputRef).toEqual(
177
+ expect.objectContaining({
178
+ current: input
179
+ })
180
+ );
181
+ });
182
+
183
+ it('allows focus to be controlled via render prop `updateFocus`', () => {
184
+ const { input, renderArg } = setup();
185
+
186
+ fireEvent.focus(input);
187
+ renderArg.updateFocus('blur');
188
+ expect(input).not.toHaveFocus();
189
+ renderArg.updateFocus('focus');
190
+ expect(input).toHaveFocus();
191
+ });
192
+
193
+ describe('`isOpen` render prop fn', () => {
194
+ test('is true when the search field has focus', () => {
195
+ const { input, renderArg } = setup();
196
+
197
+ fireEvent.focus(input);
198
+
199
+ expect(renderArg.isOpen).toBe(true);
200
+ });
201
+
202
+ test('is true when the search field has focus', () => {
203
+ const { input, renderArg } = setup();
204
+
205
+ fireEvent.focus(input);
206
+
207
+ expect(renderArg.isOpen).toBe(true);
208
+ });
209
+
210
+ test('is false when the search field does not have focus', () => {
211
+ const { input, renderArg } = setup();
212
+
213
+ expect(renderArg.isOpen).toBe(false);
214
+
215
+ fireEvent.focus(input);
216
+ fireEvent.blur(input);
217
+ expect(renderArg.isOpen).toBe(false);
218
+ });
219
+
220
+ test('is true when the search field loses focus and the `term` has changed', async () => {
221
+ const { input, renderArg } = setup();
222
+
223
+ fireEvent.focus(input);
224
+ fireEvent.change(input, { target: { value: 'bootsandcats' } });
225
+ fireEvent.blur(input);
226
+ await wait();
227
+ expect(renderArg.isOpen).toBe(true);
228
+ });
229
+ });
230
+
231
+ describe('registers cancel button behaviour on the element using `getCancelProps()`', () => {
232
+ test('that clears the input value when clicked', () => {
233
+ const { input, cancel, renderArg } = setup();
234
+
235
+ fireEvent.change(input, { target: { value: 'boots' } });
236
+ expect(renderArg.term).toBe('boots');
237
+
238
+ fireEvent.click(cancel);
239
+
240
+ expect(renderArg.term).toBe('');
241
+ });
242
+
243
+ test('that accepts onClick handlers passed in to it', () => {
244
+ const mockClickFn = jest.fn();
245
+ const { cancel } = setup({}, null, {
246
+ getCancelPropsOptions: { onClick: mockClickFn }
247
+ });
248
+
249
+ fireEvent.click(cancel);
250
+
251
+ expect(mockClickFn).toHaveBeenCalledTimes(1);
252
+ });
253
+ });
254
+
255
+ describe('triggers a full search', () => {
256
+ test('when pressing enter key', async () => {
257
+ const { input, getByText } = setup();
258
+ fireEvent.focus(input);
259
+ fireEvent.change(input, { target: { value: 'boots' } });
260
+
261
+ fireEvent.keyDown(input, { key: 'Enter' });
262
+
263
+ await waitForElement(() => getByText('you searched for ?term=boots'));
264
+ });
265
+ test('when clicking button with `triggerSearch` bound', async () => {
266
+ const { input, submit, getByText } = setup();
267
+ fireEvent.focus(input);
268
+ fireEvent.change(input, { target: { value: 'boots' } });
269
+
270
+ fireEvent.click(submit);
271
+
272
+ await waitForElement(() => getByText('you searched for ?term=boots'));
273
+ });
274
+ test('with the value passed to `triggerSearch` if one is given', async () => {
275
+ const { input, submit, getByText } = setup({}, null, {
276
+ getSubmitOpts: 'search this!'
277
+ });
278
+ fireEvent.focus(input);
279
+ fireEvent.change(input, { target: { value: 'boots' } });
280
+
281
+ fireEvent.click(submit);
282
+
283
+ await waitForElement(() => getByText(/search this!/i));
284
+ });
285
+ test('sets `isOpen` to false when triggering a full search', async () => {
286
+ const { input, renderArg } = setup();
287
+ fireEvent.change(input, { target: { value: 'boots' } });
288
+ fireEvent.focus(input);
289
+ expect(renderArg.isOpen).toBe(true);
290
+ fireEvent.keyDown(input, { key: 'Enter' });
291
+ expect(renderArg.isOpen).toBe(false);
292
+ });
293
+ });
294
+
295
+ it('calls passed onCancel cb when search is cancelled', () => {
296
+ const mockCancelCb = jest.fn();
297
+ const { input, cancel } = setup({ onCancel: mockCancelCb });
298
+
299
+ fireEvent.change(input, { target: { value: 'hello' } });
300
+ fireEvent.click(cancel);
301
+
302
+ expect(mockCancelCb).toHaveBeenCalledTimes(1);
303
+ });
304
+
305
+ it('calls passed onSubmit cb when search is submitted', () => {
306
+ const mockSubmitFn = jest.fn();
307
+ const { input, submit } = setup({ onSubmit: mockSubmitFn });
308
+
309
+ fireEvent.change(input, { target: { value: 'hello' } });
310
+ fireEvent.click(submit);
311
+
312
+ expect(mockSubmitFn).toHaveBeenCalledTimes(1);
313
+
314
+ fireEvent.change(input, { target: { value: 'wow' } });
315
+ fireEvent.focus(input);
316
+ fireEvent.keyDown(input, { key: 'Enter' });
317
+
318
+ expect(mockSubmitFn).toHaveBeenCalledTimes(2);
319
+ });
320
+ });
321
+
322
+ const mocks = [
323
+ {
324
+ request: {
325
+ query: AutocompleteQuery,
326
+ variables: {
327
+ term: 'autoc'
328
+ }
329
+ },
330
+ result: {
331
+ data: {
332
+ searchAutoComplete: {
333
+ products: {
334
+ result: [
335
+ {
336
+ name: 'autocomplete',
337
+ id: 123,
338
+ articleNumber: 123,
339
+ primaryRoute: {
340
+ id: 4353,
341
+ slug: 'autocompleted-product',
342
+ path: '/product/autocompleted-product'
343
+ }
344
+ },
345
+ {
346
+ name: 'autocomputed',
347
+ id: 321,
348
+ articleNumber: 321,
349
+ primaryRoute: {
350
+ id: 2737,
351
+ slug: 'autocomputed-product',
352
+ path: '/product/autocomputed-product'
353
+ }
354
+ }
355
+ ]
356
+ }
357
+ }
358
+ }
359
+ }
360
+ },
361
+ {
362
+ request: {
363
+ query: AutocompleteQuery,
364
+ variables: {
365
+ term: 'autocomplet'
366
+ }
367
+ },
368
+ result: {
369
+ data: {
370
+ searchAutoComplete: {
371
+ products: {
372
+ result: [
373
+ {
374
+ name: 'autocomplete',
375
+ id: 123,
376
+ articleNumber: 123,
377
+ primaryRoute: {
378
+ id: 345343,
379
+ slug: 'autocompleted-product',
380
+ path: '/product/autocompleted-product'
381
+ }
382
+ }
383
+ ]
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+ ];
390
+
391
+ function setup(
392
+ containerProps = {},
393
+ renderFn,
394
+ {
395
+ getInputPropsOptions = {},
396
+ getCancelPropsOptions = {},
397
+ getSubmitOpts = undefined
398
+ } = {}
399
+ ) {
400
+ const renderArg = {};
401
+
402
+ const childrenSpy = jest.fn(controllerArg => {
403
+ Object.assign(renderArg, controllerArg);
404
+
405
+ if (typeof renderFn === 'function') return renderFn(controllerArg);
406
+
407
+ return (
408
+ <>
409
+ <input
410
+ data-testid="default-input-field"
411
+ {...controllerArg.getInputProps(getInputPropsOptions)}
412
+ />
413
+ <button
414
+ data-testid="cancel-button"
415
+ {...controllerArg.getCancelProps(getCancelPropsOptions)}
416
+ >
417
+ Cancel
418
+ </button>
419
+ <button
420
+ data-testid="submit-button"
421
+ onClick={() => renderArg.triggerSearch(getSubmitOpts)}
422
+ >
423
+ Submit
424
+ </button>
425
+ <Switch>
426
+ <Route
427
+ path="/search"
428
+ component={props => {
429
+ return <div>you searched for {props.location.search}</div>;
430
+ }}
431
+ />
432
+ </Switch>
433
+ </>
434
+ );
435
+ });
436
+
437
+ const utils = renderWithRouter(
438
+ <ShopConfigContext.Provider
439
+ value={{ routes: { search: { path: '/search' } } }}
440
+ >
441
+ <MockedProvider mocks={mocks} addTypename={false}>
442
+ <SearchAutoCompleteContainer
443
+ autocompleteQuery={AutocompleteQuery}
444
+ {...containerProps}
445
+ >
446
+ {childrenSpy}
447
+ </SearchAutoCompleteContainer>
448
+ </MockedProvider>
449
+ </ShopConfigContext.Provider>
450
+ );
451
+
452
+ return {
453
+ ...utils,
454
+ input: utils.queryByTestId('default-input-field'),
455
+ cancel: utils.queryByTestId('cancel-button'),
456
+ submit: utils.queryByTestId('submit-button'),
457
+ childrenSpy,
458
+ renderArg
459
+ };
460
+ }