@wdio/image-comparison-core 1.0.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 (416) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/LICENSE +21 -0
  3. package/README.md +12 -0
  4. package/assets/ios/ipadair4th.ipadair5th-bottom.png +0 -0
  5. package/assets/ios/ipadair4th.ipadair5th-top.png +0 -0
  6. package/assets/ios/ipadmini6th-bottom.png +0 -0
  7. package/assets/ios/ipadmini6th-top.png +0 -0
  8. package/assets/ios/ipadpro11-bottom.png +0 -0
  9. package/assets/ios/ipadpro11-top.png +0 -0
  10. package/assets/ios/ipadpro129-bottom.png +0 -0
  11. package/assets/ios/ipadpro129-top.png +0 -0
  12. package/assets/ios/iphone11promax-bottom.png +0 -0
  13. package/assets/ios/iphone11promax-top.png +0 -0
  14. package/assets/ios/iphone12.iphone12pro-top.png +0 -0
  15. package/assets/ios/iphone12.iphone12pro.iphone13.iphone13pro.iphone14-bottom.png +0 -0
  16. package/assets/ios/iphone12mini-top.png +0 -0
  17. package/assets/ios/iphone12mini.iphone13mini-bottom.png +0 -0
  18. package/assets/ios/iphone12promax-top.png +0 -0
  19. package/assets/ios/iphone12promax.iphone13promax.iphone14plus-bottom.png +0 -0
  20. package/assets/ios/iphone13.iphone13pro.iphone14-top.png +0 -0
  21. package/assets/ios/iphone13mini-top.png +0 -0
  22. package/assets/ios/iphone13promax.iphone14plus-top.png +0 -0
  23. package/assets/ios/iphone14pro-bottom.png +0 -0
  24. package/assets/ios/iphone14pro-top.png +0 -0
  25. package/assets/ios/iphone14promax-bottom.png +0 -0
  26. package/assets/ios/iphone14promax-top.png +0 -0
  27. package/assets/ios/iphone15-bottom.png +0 -0
  28. package/assets/ios/iphone15-top.png +0 -0
  29. package/assets/ios/iphonex.iphonexs.iphone11pro-bottom.png +0 -0
  30. package/assets/ios/iphonex.iphonexs.iphone11pro-top.png +0 -0
  31. package/assets/ios/iphonexr.iphone11-bottom.png +0 -0
  32. package/assets/ios/iphonexr.iphone11-top.png +0 -0
  33. package/assets/ios/iphonexsmax-bottom.png +0 -0
  34. package/assets/ios/iphonexsmax-top.png +0 -0
  35. package/dist/base.d.ts +18 -0
  36. package/dist/base.d.ts.map +1 -0
  37. package/dist/base.interfaces.d.ts +200 -0
  38. package/dist/base.interfaces.d.ts.map +1 -0
  39. package/dist/base.interfaces.js +1 -0
  40. package/dist/base.js +58 -0
  41. package/dist/base.test.d.ts +2 -0
  42. package/dist/base.test.d.ts.map +1 -0
  43. package/dist/base.test.js +45 -0
  44. package/dist/clientSideScripts/checkMetaTag.d.ts +2 -0
  45. package/dist/clientSideScripts/checkMetaTag.d.ts.map +1 -0
  46. package/dist/clientSideScripts/checkMetaTag.js +9 -0
  47. package/dist/clientSideScripts/checkMetaTag.test.d.ts +2 -0
  48. package/dist/clientSideScripts/checkMetaTag.test.d.ts.map +1 -0
  49. package/dist/clientSideScripts/checkMetaTag.test.js +25 -0
  50. package/dist/clientSideScripts/customCss.interfaces.d.ts +8 -0
  51. package/dist/clientSideScripts/customCss.interfaces.d.ts.map +1 -0
  52. package/dist/clientSideScripts/customCss.interfaces.js +1 -0
  53. package/dist/clientSideScripts/drawTabbableOnCanvas.d.ts +8 -0
  54. package/dist/clientSideScripts/drawTabbableOnCanvas.d.ts.map +1 -0
  55. package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.d.ts +4 -0
  56. package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.d.ts.map +1 -0
  57. package/dist/clientSideScripts/drawTabbableOnCanvas.interfaces.js +1 -0
  58. package/dist/clientSideScripts/drawTabbableOnCanvas.js +275 -0
  59. package/dist/clientSideScripts/drawTabbableOnCanvas.test.d.ts +2 -0
  60. package/dist/clientSideScripts/drawTabbableOnCanvas.test.d.ts.map +1 -0
  61. package/dist/clientSideScripts/drawTabbableOnCanvas.test.js +251 -0
  62. package/dist/clientSideScripts/elementPosition.interfaces.d.ts +3 -0
  63. package/dist/clientSideScripts/elementPosition.interfaces.d.ts.map +1 -0
  64. package/dist/clientSideScripts/elementPosition.interfaces.js +1 -0
  65. package/dist/clientSideScripts/getBoundingClientRect.d.ts +6 -0
  66. package/dist/clientSideScripts/getBoundingClientRect.d.ts.map +1 -0
  67. package/dist/clientSideScripts/getBoundingClientRect.js +12 -0
  68. package/dist/clientSideScripts/getBoundingClientRect.test.d.ts +2 -0
  69. package/dist/clientSideScripts/getBoundingClientRect.test.d.ts.map +1 -0
  70. package/dist/clientSideScripts/getBoundingClientRect.test.js +28 -0
  71. package/dist/clientSideScripts/getDocumentScrollHeight.d.ts +5 -0
  72. package/dist/clientSideScripts/getDocumentScrollHeight.d.ts.map +1 -0
  73. package/dist/clientSideScripts/getDocumentScrollHeight.js +48 -0
  74. package/dist/clientSideScripts/getDocumentScrollHeight.test.d.ts +2 -0
  75. package/dist/clientSideScripts/getDocumentScrollHeight.test.d.ts.map +1 -0
  76. package/dist/clientSideScripts/getDocumentScrollHeight.test.js +30 -0
  77. package/dist/clientSideScripts/getElementPositionTopDom.d.ts +6 -0
  78. package/dist/clientSideScripts/getElementPositionTopDom.d.ts.map +1 -0
  79. package/dist/clientSideScripts/getElementPositionTopDom.js +11 -0
  80. package/dist/clientSideScripts/getElementPositionTopDom.test.d.ts +2 -0
  81. package/dist/clientSideScripts/getElementPositionTopDom.test.d.ts.map +1 -0
  82. package/dist/clientSideScripts/getElementPositionTopDom.test.js +11 -0
  83. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.d.ts +14 -0
  84. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.d.ts.map +1 -0
  85. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.js +19 -0
  86. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.d.ts +2 -0
  87. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.d.ts.map +1 -0
  88. package/dist/clientSideScripts/getElementPositionTopScreenNativeMobile.test.js +52 -0
  89. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.d.ts +6 -0
  90. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.d.ts.map +1 -0
  91. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.js +17 -0
  92. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.d.ts +2 -0
  93. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.d.ts.map +1 -0
  94. package/dist/clientSideScripts/getMobileWebviewClickAndDimensions.test.js +47 -0
  95. package/dist/clientSideScripts/getScreenDimensions.d.ts +6 -0
  96. package/dist/clientSideScripts/getScreenDimensions.d.ts.map +1 -0
  97. package/dist/clientSideScripts/getScreenDimensions.js +104 -0
  98. package/dist/clientSideScripts/getScreenDimensions.test.d.ts +2 -0
  99. package/dist/clientSideScripts/getScreenDimensions.test.d.ts.map +1 -0
  100. package/dist/clientSideScripts/getScreenDimensions.test.js +161 -0
  101. package/dist/clientSideScripts/hideRemoveElements.d.ts +8 -0
  102. package/dist/clientSideScripts/hideRemoveElements.d.ts.map +1 -0
  103. package/dist/clientSideScripts/hideRemoveElements.js +60 -0
  104. package/dist/clientSideScripts/hideRemoveElements.test.d.ts +2 -0
  105. package/dist/clientSideScripts/hideRemoveElements.test.d.ts.map +1 -0
  106. package/dist/clientSideScripts/hideRemoveElements.test.js +199 -0
  107. package/dist/clientSideScripts/hideScrollbars.d.ts +9 -0
  108. package/dist/clientSideScripts/hideScrollbars.d.ts.map +1 -0
  109. package/dist/clientSideScripts/hideScrollbars.js +15 -0
  110. package/dist/clientSideScripts/hideScrollbars.test.d.ts +2 -0
  111. package/dist/clientSideScripts/hideScrollbars.test.d.ts.map +1 -0
  112. package/dist/clientSideScripts/hideScrollbars.test.js +12 -0
  113. package/dist/clientSideScripts/injectWebviewOverlay.d.ts +5 -0
  114. package/dist/clientSideScripts/injectWebviewOverlay.d.ts.map +1 -0
  115. package/dist/clientSideScripts/injectWebviewOverlay.js +35 -0
  116. package/dist/clientSideScripts/injectWebviewOverlay.test.d.ts +2 -0
  117. package/dist/clientSideScripts/injectWebviewOverlay.test.d.ts.map +1 -0
  118. package/dist/clientSideScripts/injectWebviewOverlay.test.js +74 -0
  119. package/dist/clientSideScripts/removeElementFromDom.d.ts +5 -0
  120. package/dist/clientSideScripts/removeElementFromDom.d.ts.map +1 -0
  121. package/dist/clientSideScripts/removeElementFromDom.js +9 -0
  122. package/dist/clientSideScripts/removeElementFromDom.test.d.ts +2 -0
  123. package/dist/clientSideScripts/removeElementFromDom.test.d.ts.map +1 -0
  124. package/dist/clientSideScripts/removeElementFromDom.test.js +43 -0
  125. package/dist/clientSideScripts/screenDimensions.interfaces.d.ts +96 -0
  126. package/dist/clientSideScripts/screenDimensions.interfaces.d.ts.map +1 -0
  127. package/dist/clientSideScripts/screenDimensions.interfaces.js +1 -0
  128. package/dist/clientSideScripts/scrollElementIntoView.d.ts +5 -0
  129. package/dist/clientSideScripts/scrollElementIntoView.d.ts.map +1 -0
  130. package/dist/clientSideScripts/scrollElementIntoView.js +31 -0
  131. package/dist/clientSideScripts/scrollElementIntoView.test.d.ts +2 -0
  132. package/dist/clientSideScripts/scrollElementIntoView.test.d.ts.map +1 -0
  133. package/dist/clientSideScripts/scrollElementIntoView.test.js +79 -0
  134. package/dist/clientSideScripts/scrollToPosition.d.ts +5 -0
  135. package/dist/clientSideScripts/scrollToPosition.d.ts.map +1 -0
  136. package/dist/clientSideScripts/scrollToPosition.js +25 -0
  137. package/dist/clientSideScripts/scrollToPosition.test.d.ts +2 -0
  138. package/dist/clientSideScripts/scrollToPosition.test.d.ts.map +1 -0
  139. package/dist/clientSideScripts/scrollToPosition.test.js +72 -0
  140. package/dist/clientSideScripts/setCustomCss.d.ts +6 -0
  141. package/dist/clientSideScripts/setCustomCss.d.ts.map +1 -0
  142. package/dist/clientSideScripts/setCustomCss.js +36 -0
  143. package/dist/clientSideScripts/setCustomCss.test.d.ts +2 -0
  144. package/dist/clientSideScripts/setCustomCss.test.d.ts.map +1 -0
  145. package/dist/clientSideScripts/setCustomCss.test.js +68 -0
  146. package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.d.ts +11 -0
  147. package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.d.ts.map +1 -0
  148. package/dist/clientSideScripts/statusAddressToolBarOffsets.interfaces.js +1 -0
  149. package/dist/clientSideScripts/toggleTextTransparency.d.ts +5 -0
  150. package/dist/clientSideScripts/toggleTextTransparency.d.ts.map +1 -0
  151. package/dist/clientSideScripts/toggleTextTransparency.js +16 -0
  152. package/dist/clientSideScripts/toggleTextTransparency.test.d.ts +2 -0
  153. package/dist/clientSideScripts/toggleTextTransparency.test.d.ts.map +1 -0
  154. package/dist/clientSideScripts/toggleTextTransparency.test.js +35 -0
  155. package/dist/clientSideScripts/waitForFonts.d.ts +8 -0
  156. package/dist/clientSideScripts/waitForFonts.d.ts.map +1 -0
  157. package/dist/clientSideScripts/waitForFonts.js +20 -0
  158. package/dist/clientSideScripts/waitForFonts.test.d.ts +2 -0
  159. package/dist/clientSideScripts/waitForFonts.test.d.ts.map +1 -0
  160. package/dist/clientSideScripts/waitForFonts.test.js +37 -0
  161. package/dist/commands/check.interfaces.d.ts +35 -0
  162. package/dist/commands/check.interfaces.d.ts.map +1 -0
  163. package/dist/commands/check.interfaces.js +1 -0
  164. package/dist/commands/checkAppElement.d.ts +7 -0
  165. package/dist/commands/checkAppElement.d.ts.map +1 -0
  166. package/dist/commands/checkAppElement.js +44 -0
  167. package/dist/commands/checkAppElement.test.d.ts +2 -0
  168. package/dist/commands/checkAppElement.test.d.ts.map +1 -0
  169. package/dist/commands/checkAppElement.test.js +241 -0
  170. package/dist/commands/checkAppScreen.d.ts +7 -0
  171. package/dist/commands/checkAppScreen.d.ts.map +1 -0
  172. package/dist/commands/checkAppScreen.js +73 -0
  173. package/dist/commands/checkAppScreen.test.d.ts +2 -0
  174. package/dist/commands/checkAppScreen.test.d.ts.map +1 -0
  175. package/dist/commands/checkAppScreen.test.js +295 -0
  176. package/dist/commands/checkElement.d.ts +7 -0
  177. package/dist/commands/checkElement.d.ts.map +1 -0
  178. package/dist/commands/checkElement.js +10 -0
  179. package/dist/commands/checkElement.test.d.ts +2 -0
  180. package/dist/commands/checkElement.test.d.ts.map +1 -0
  181. package/dist/commands/checkElement.test.js +66 -0
  182. package/dist/commands/checkFullPageScreen.d.ts +7 -0
  183. package/dist/commands/checkFullPageScreen.d.ts.map +1 -0
  184. package/dist/commands/checkFullPageScreen.js +56 -0
  185. package/dist/commands/checkFullPageScreen.test.d.ts +2 -0
  186. package/dist/commands/checkFullPageScreen.test.d.ts.map +1 -0
  187. package/dist/commands/checkFullPageScreen.test.js +259 -0
  188. package/dist/commands/checkScreen.d.ts +7 -0
  189. package/dist/commands/checkScreen.d.ts.map +1 -0
  190. package/dist/commands/checkScreen.js +10 -0
  191. package/dist/commands/checkScreen.test.d.ts +2 -0
  192. package/dist/commands/checkScreen.test.d.ts.map +1 -0
  193. package/dist/commands/checkScreen.test.js +62 -0
  194. package/dist/commands/checkTabbablePage.d.ts +7 -0
  195. package/dist/commands/checkTabbablePage.d.ts.map +1 -0
  196. package/dist/commands/checkTabbablePage.js +28 -0
  197. package/dist/commands/checkTabbablePage.test.d.ts +2 -0
  198. package/dist/commands/checkTabbablePage.test.d.ts.map +1 -0
  199. package/dist/commands/checkTabbablePage.test.js +200 -0
  200. package/dist/commands/checkWebElement.d.ts +7 -0
  201. package/dist/commands/checkWebElement.d.ts.map +1 -0
  202. package/dist/commands/checkWebElement.js +52 -0
  203. package/dist/commands/checkWebElement.test.d.ts +2 -0
  204. package/dist/commands/checkWebElement.test.d.ts.map +1 -0
  205. package/dist/commands/checkWebElement.test.js +278 -0
  206. package/dist/commands/checkWebScreen.d.ts +7 -0
  207. package/dist/commands/checkWebScreen.d.ts.map +1 -0
  208. package/dist/commands/checkWebScreen.js +50 -0
  209. package/dist/commands/checkWebScreen.test.d.ts +2 -0
  210. package/dist/commands/checkWebScreen.test.d.ts.map +1 -0
  211. package/dist/commands/checkWebScreen.test.js +227 -0
  212. package/dist/commands/element.interfaces.d.ts +27 -0
  213. package/dist/commands/element.interfaces.d.ts.map +1 -0
  214. package/dist/commands/element.interfaces.js +1 -0
  215. package/dist/commands/fullPage.interfaces.d.ts +38 -0
  216. package/dist/commands/fullPage.interfaces.d.ts.map +1 -0
  217. package/dist/commands/fullPage.interfaces.js +1 -0
  218. package/dist/commands/save.interfaces.d.ts +27 -0
  219. package/dist/commands/save.interfaces.d.ts.map +1 -0
  220. package/dist/commands/save.interfaces.js +1 -0
  221. package/dist/commands/saveAppElement.d.ts +7 -0
  222. package/dist/commands/saveAppElement.d.ts.map +1 -0
  223. package/dist/commands/saveAppElement.js +30 -0
  224. package/dist/commands/saveAppElement.test.d.ts +2 -0
  225. package/dist/commands/saveAppElement.test.d.ts.map +1 -0
  226. package/dist/commands/saveAppElement.test.js +199 -0
  227. package/dist/commands/saveAppScreen.d.ts +7 -0
  228. package/dist/commands/saveAppScreen.d.ts.map +1 -0
  229. package/dist/commands/saveAppScreen.js +43 -0
  230. package/dist/commands/saveAppScreen.test.d.ts +2 -0
  231. package/dist/commands/saveAppScreen.test.d.ts.map +1 -0
  232. package/dist/commands/saveAppScreen.test.js +221 -0
  233. package/dist/commands/saveElement.d.ts +7 -0
  234. package/dist/commands/saveElement.d.ts.map +1 -0
  235. package/dist/commands/saveElement.js +10 -0
  236. package/dist/commands/saveElement.test.d.ts +2 -0
  237. package/dist/commands/saveElement.test.d.ts.map +1 -0
  238. package/dist/commands/saveElement.test.js +62 -0
  239. package/dist/commands/saveFullPageScreen.d.ts +7 -0
  240. package/dist/commands/saveFullPageScreen.d.ts.map +1 -0
  241. package/dist/commands/saveFullPageScreen.js +60 -0
  242. package/dist/commands/saveFullPageScreen.test.d.ts +2 -0
  243. package/dist/commands/saveFullPageScreen.test.d.ts.map +1 -0
  244. package/dist/commands/saveFullPageScreen.test.js +293 -0
  245. package/dist/commands/saveScreen.d.ts +7 -0
  246. package/dist/commands/saveScreen.d.ts.map +1 -0
  247. package/dist/commands/saveScreen.js +10 -0
  248. package/dist/commands/saveScreen.test.d.ts +2 -0
  249. package/dist/commands/saveScreen.test.d.ts.map +1 -0
  250. package/dist/commands/saveScreen.test.js +47 -0
  251. package/dist/commands/saveTabbablePage.d.ts +7 -0
  252. package/dist/commands/saveTabbablePage.d.ts.map +1 -0
  253. package/dist/commands/saveTabbablePage.js +20 -0
  254. package/dist/commands/saveTabbablePage.test.d.ts +2 -0
  255. package/dist/commands/saveTabbablePage.test.d.ts.map +1 -0
  256. package/dist/commands/saveTabbablePage.test.js +74 -0
  257. package/dist/commands/saveWebElement.d.ts +7 -0
  258. package/dist/commands/saveWebElement.d.ts.map +1 -0
  259. package/dist/commands/saveWebElement.js +53 -0
  260. package/dist/commands/saveWebElement.test.d.ts +2 -0
  261. package/dist/commands/saveWebElement.test.d.ts.map +1 -0
  262. package/dist/commands/saveWebElement.test.js +253 -0
  263. package/dist/commands/saveWebScreen.d.ts +7 -0
  264. package/dist/commands/saveWebScreen.d.ts.map +1 -0
  265. package/dist/commands/saveWebScreen.js +48 -0
  266. package/dist/commands/saveWebScreen.test.d.ts +2 -0
  267. package/dist/commands/saveWebScreen.test.d.ts.map +1 -0
  268. package/dist/commands/saveWebScreen.test.js +222 -0
  269. package/dist/commands/screen.interfaces.d.ts +16 -0
  270. package/dist/commands/screen.interfaces.d.ts.map +1 -0
  271. package/dist/commands/screen.interfaces.js +1 -0
  272. package/dist/commands/tabbable.interfaces.d.ts +29 -0
  273. package/dist/commands/tabbable.interfaces.d.ts.map +1 -0
  274. package/dist/commands/tabbable.interfaces.js +1 -0
  275. package/dist/helpers/afterScreenshot.d.ts +7 -0
  276. package/dist/helpers/afterScreenshot.d.ts.map +1 -0
  277. package/dist/helpers/afterScreenshot.interfaces.d.ts +46 -0
  278. package/dist/helpers/afterScreenshot.interfaces.d.ts.map +1 -0
  279. package/dist/helpers/afterScreenshot.interfaces.js +1 -0
  280. package/dist/helpers/afterScreenshot.js +55 -0
  281. package/dist/helpers/afterScreenshot.test.d.ts +2 -0
  282. package/dist/helpers/afterScreenshot.test.d.ts.map +1 -0
  283. package/dist/helpers/afterScreenshot.test.js +241 -0
  284. package/dist/helpers/beforeScreenshot.d.ts +6 -0
  285. package/dist/helpers/beforeScreenshot.d.ts.map +1 -0
  286. package/dist/helpers/beforeScreenshot.interfaces.d.ts +15 -0
  287. package/dist/helpers/beforeScreenshot.interfaces.d.ts.map +1 -0
  288. package/dist/helpers/beforeScreenshot.interfaces.js +1 -0
  289. package/dist/helpers/beforeScreenshot.js +79 -0
  290. package/dist/helpers/beforeScreenshot.test.d.ts +2 -0
  291. package/dist/helpers/beforeScreenshot.test.d.ts.map +1 -0
  292. package/dist/helpers/beforeScreenshot.test.js +261 -0
  293. package/dist/helpers/compare.interfaces.d.ts +16 -0
  294. package/dist/helpers/compare.interfaces.d.ts.map +1 -0
  295. package/dist/helpers/compare.interfaces.js +1 -0
  296. package/dist/helpers/constants.d.ts +108 -0
  297. package/dist/helpers/constants.d.ts.map +1 -0
  298. package/dist/helpers/constants.interfaces.d.ts +30 -0
  299. package/dist/helpers/constants.interfaces.d.ts.map +1 -0
  300. package/dist/helpers/constants.interfaces.js +11 -0
  301. package/dist/helpers/constants.js +436 -0
  302. package/dist/helpers/options.d.ts +64 -0
  303. package/dist/helpers/options.d.ts.map +1 -0
  304. package/dist/helpers/options.interfaces.d.ts +363 -0
  305. package/dist/helpers/options.interfaces.d.ts.map +1 -0
  306. package/dist/helpers/options.interfaces.js +1 -0
  307. package/dist/helpers/options.js +184 -0
  308. package/dist/helpers/options.test.d.ts +2 -0
  309. package/dist/helpers/options.test.d.ts.map +1 -0
  310. package/dist/helpers/options.test.js +428 -0
  311. package/dist/helpers/utils.d.ts +134 -0
  312. package/dist/helpers/utils.d.ts.map +1 -0
  313. package/dist/helpers/utils.interfaces.d.ts +254 -0
  314. package/dist/helpers/utils.interfaces.d.ts.map +1 -0
  315. package/dist/helpers/utils.interfaces.js +1 -0
  316. package/dist/helpers/utils.js +566 -0
  317. package/dist/helpers/utils.test.d.ts +2 -0
  318. package/dist/helpers/utils.test.d.ts.map +1 -0
  319. package/dist/helpers/utils.test.js +900 -0
  320. package/dist/index.d.ts +26 -0
  321. package/dist/index.d.ts.map +1 -0
  322. package/dist/index.js +18 -0
  323. package/dist/methods/compareReport.interfaces.d.ts +109 -0
  324. package/dist/methods/compareReport.interfaces.d.ts.map +1 -0
  325. package/dist/methods/compareReport.interfaces.js +1 -0
  326. package/dist/methods/createCompareReport.d.ts +7 -0
  327. package/dist/methods/createCompareReport.d.ts.map +1 -0
  328. package/dist/methods/createCompareReport.js +61 -0
  329. package/dist/methods/createCompareReport.test.d.ts +2 -0
  330. package/dist/methods/createCompareReport.test.d.ts.map +1 -0
  331. package/dist/methods/createCompareReport.test.js +236 -0
  332. package/dist/methods/elementPosition.d.ts +18 -0
  333. package/dist/methods/elementPosition.d.ts.map +1 -0
  334. package/dist/methods/elementPosition.interfaces.d.ts +14 -0
  335. package/dist/methods/elementPosition.interfaces.d.ts.map +1 -0
  336. package/dist/methods/elementPosition.interfaces.js +1 -0
  337. package/dist/methods/elementPosition.js +34 -0
  338. package/dist/methods/images.d.ts +69 -0
  339. package/dist/methods/images.d.ts.map +1 -0
  340. package/dist/methods/images.executeImageCompare.test.d.ts +2 -0
  341. package/dist/methods/images.executeImageCompare.test.d.ts.map +1 -0
  342. package/dist/methods/images.executeImageCompare.test.js +770 -0
  343. package/dist/methods/images.interfaces.d.ts +214 -0
  344. package/dist/methods/images.interfaces.d.ts.map +1 -0
  345. package/dist/methods/images.interfaces.js +1 -0
  346. package/dist/methods/images.js +428 -0
  347. package/dist/methods/images.test.d.ts +2 -0
  348. package/dist/methods/images.test.d.ts.map +1 -0
  349. package/dist/methods/images.test.js +1465 -0
  350. package/dist/methods/instanceData.d.ts +6 -0
  351. package/dist/methods/instanceData.d.ts.map +1 -0
  352. package/dist/methods/instanceData.interfaces.d.ts +57 -0
  353. package/dist/methods/instanceData.interfaces.d.ts.map +1 -0
  354. package/dist/methods/instanceData.interfaces.js +1 -0
  355. package/dist/methods/instanceData.js +42 -0
  356. package/dist/methods/instanceData.test.d.ts +2 -0
  357. package/dist/methods/instanceData.test.d.ts.map +1 -0
  358. package/dist/methods/instanceData.test.js +224 -0
  359. package/dist/methods/processDiffPixels.d.ts +59 -0
  360. package/dist/methods/processDiffPixels.d.ts.map +1 -0
  361. package/dist/methods/processDiffPixels.js +242 -0
  362. package/dist/methods/processDiffPixels.test.d.ts +2 -0
  363. package/dist/methods/processDiffPixels.test.d.ts.map +1 -0
  364. package/dist/methods/processDiffPixels.test.js +122 -0
  365. package/dist/methods/rectangles.d.ts +51 -0
  366. package/dist/methods/rectangles.d.ts.map +1 -0
  367. package/dist/methods/rectangles.interfaces.d.ts +146 -0
  368. package/dist/methods/rectangles.interfaces.d.ts.map +1 -0
  369. package/dist/methods/rectangles.interfaces.js +1 -0
  370. package/dist/methods/rectangles.js +266 -0
  371. package/dist/methods/rectangles.test.d.ts +2 -0
  372. package/dist/methods/rectangles.test.d.ts.map +1 -0
  373. package/dist/methods/rectangles.test.js +853 -0
  374. package/dist/methods/screenshots.d.ts +37 -0
  375. package/dist/methods/screenshots.d.ts.map +1 -0
  376. package/dist/methods/screenshots.interfaces.d.ts +203 -0
  377. package/dist/methods/screenshots.interfaces.d.ts.map +1 -0
  378. package/dist/methods/screenshots.interfaces.js +1 -0
  379. package/dist/methods/screenshots.js +394 -0
  380. package/dist/methods/screenshots.test.d.ts +2 -0
  381. package/dist/methods/screenshots.test.d.ts.map +1 -0
  382. package/dist/methods/screenshots.test.js +656 -0
  383. package/dist/methods/takeElementScreenshots.d.ts +3 -0
  384. package/dist/methods/takeElementScreenshots.d.ts.map +1 -0
  385. package/dist/methods/takeElementScreenshots.js +104 -0
  386. package/dist/methods/takeElementScreenshots.test.d.ts +2 -0
  387. package/dist/methods/takeElementScreenshots.test.d.ts.map +1 -0
  388. package/dist/methods/takeElementScreenshots.test.js +314 -0
  389. package/dist/methods/takeFullPageScreenshots.d.ts +3 -0
  390. package/dist/methods/takeFullPageScreenshots.d.ts.map +1 -0
  391. package/dist/methods/takeFullPageScreenshots.js +56 -0
  392. package/dist/methods/takeFullPageScreenshots.test.d.ts +2 -0
  393. package/dist/methods/takeFullPageScreenshots.test.d.ts.map +1 -0
  394. package/dist/methods/takeFullPageScreenshots.test.js +72 -0
  395. package/dist/methods/takeWebScreenshots.d.ts +3 -0
  396. package/dist/methods/takeWebScreenshots.d.ts.map +1 -0
  397. package/dist/methods/takeWebScreenshots.js +41 -0
  398. package/dist/methods/takeWebScreenshots.test.d.ts +2 -0
  399. package/dist/methods/takeWebScreenshots.test.d.ts.map +1 -0
  400. package/dist/methods/takeWebScreenshots.test.js +149 -0
  401. package/dist/mocks/image.d.ts +4 -0
  402. package/dist/mocks/image.d.ts.map +1 -0
  403. package/dist/mocks/image.js +3 -0
  404. package/dist/mocks/mocks.d.ts +745 -0
  405. package/dist/mocks/mocks.d.ts.map +1 -0
  406. package/dist/mocks/mocks.js +392 -0
  407. package/dist/resemble/compare.interfaces.d.ts +136 -0
  408. package/dist/resemble/compare.interfaces.d.ts.map +1 -0
  409. package/dist/resemble/compare.interfaces.js +1 -0
  410. package/dist/resemble/compareImages.d.ts +3 -0
  411. package/dist/resemble/compareImages.d.ts.map +1 -0
  412. package/dist/resemble/compareImages.js +21 -0
  413. package/dist/resemble/resemble.jimp.cjs +981 -0
  414. package/dist/resemble/resemble.jimp.d.cts +46 -0
  415. package/dist/resemble/resemble.jimp.d.cts.map +1 -0
  416. package/package.json +47 -0
@@ -0,0 +1,214 @@
1
+ import type { RectanglesOutput } from './rectangles.interfaces.js';
2
+ import type { BaseCoordinates, BaseDeviceInfo, BaseDimensions, BaseImageCompareOptions, BaseMobileBlockOutOptions, Folders } from '../base.interfaces.js';
3
+ import type { TestContext } from './compareReport.interfaces.js';
4
+ import type { DeviceRectangles } from './rectangles.interfaces.js';
5
+ import type { WicElement } from 'src/index.js';
6
+ export interface ResizeDimensions {
7
+ /** The bottom margin */
8
+ bottom?: number;
9
+ /** The left margin */
10
+ left?: number;
11
+ /** The right margin */
12
+ right?: number;
13
+ /** The top margin */
14
+ top?: number;
15
+ }
16
+ export interface ExecuteImageCompare {
17
+ /** The options for image comparison */
18
+ options: ImageCompareOptions;
19
+ /** The test context */
20
+ testContext: TestContext;
21
+ /** Whether this is a viewport screenshot */
22
+ isViewPortScreenshot: boolean;
23
+ /** Whether this is a native context */
24
+ isNativeContext: boolean;
25
+ }
26
+ export interface ImageCompareOptions {
27
+ /** Optional ignore regions */
28
+ ignoreRegions?: RectanglesOutput[];
29
+ /** The device pixel ratio of the device */
30
+ devicePixelRatio: number;
31
+ /** The compare options */
32
+ compareOptions: {
33
+ wic: WicImageCompareOptions;
34
+ method: ScreenMethodImageCompareCompareOptions;
35
+ };
36
+ /** The device rectangles */
37
+ deviceRectangles: DeviceRectangles;
38
+ /** The name of the file */
39
+ fileName: string;
40
+ /** The folders object */
41
+ folderOptions: ImageCompareFolderOptions;
42
+ /** Is this an Android device */
43
+ isAndroid: boolean;
44
+ /** If this is a native web screenshot */
45
+ isAndroidNativeWebScreenshot: boolean;
46
+ }
47
+ export interface WicImageCompareOptions extends BaseImageCompareOptions, BaseMobileBlockOutOptions {
48
+ /** Create a json file with the diff data, this can be used to create a custom report. */
49
+ createJsonReportFiles: boolean;
50
+ /** The proximity of the diff pixels to determine if a diff pixel is part of a group,
51
+ * the higher the number the more pixels will be grouped, the lower the number the less pixels will be grouped due to accuracy.
52
+ * Default is 5 pixels */
53
+ diffPixelBoundingBoxProximity: number;
54
+ }
55
+ export interface DefaultImageCompareCompareOptions extends MethodImageCompareCompareOptions {
56
+ /** Block out array with x, y, width and height values */
57
+ blockOut?: RectanglesOutput[];
58
+ }
59
+ export interface ScreenMethodImageCompareCompareOptions extends DefaultImageCompareCompareOptions, MethodImageCompareCompareOptions {
60
+ /** Block out the side bar yes or no */
61
+ blockOutSideBar?: boolean;
62
+ /** Block out the status bar yes or no */
63
+ blockOutStatusBar?: boolean;
64
+ /** Block out the tool bar yes or no */
65
+ blockOutToolBar?: boolean;
66
+ }
67
+ export interface MethodImageCompareCompareOptions extends BaseImageCompareOptions {
68
+ /** Block out array with x, y, width and height values */
69
+ blockOut?: RectanglesOutput[];
70
+ /** Default false. If true, return percentage will be like 0.12345678, default is 0.12 */
71
+ rawMisMatchPercentage?: boolean;
72
+ }
73
+ export interface ImageCompareFolderOptions extends Folders {
74
+ /** Auto save image to baseline */
75
+ autoSaveBaseline: boolean;
76
+ /** The name of the browser */
77
+ browserName: string;
78
+ /** The name of the device */
79
+ deviceName: string;
80
+ /** Is the instance a mobile instance */
81
+ isMobile: boolean;
82
+ /** If the folder needs to have the instance name in it */
83
+ savePerInstance: boolean;
84
+ }
85
+ export interface ImageCompareResult {
86
+ /** The file name */
87
+ fileName: string;
88
+ folders: {
89
+ /** The actual folder and file name */
90
+ actual: string;
91
+ /** The baseline folder and file name */
92
+ baseline: string;
93
+ /** This following folder is optional and only if there is a mismatch
94
+ * The folder that holds the diffs and the file name */
95
+ diff?: string;
96
+ };
97
+ /** The mismatch percentage */
98
+ misMatchPercentage: number;
99
+ }
100
+ export interface Pixel extends BaseCoordinates {
101
+ }
102
+ export interface CroppedBase64Image extends Partial<BaseDeviceInfo> {
103
+ /** Whether to add iOS bezel corners */
104
+ addIOSBezelCorners: boolean;
105
+ /** The base64 image */
106
+ base64Image: string;
107
+ /** Whether this is a webdriver element screenshot */
108
+ isWebDriverElementScreenshot?: boolean;
109
+ /** Whether the image is in landscape mode */
110
+ isLandscape: boolean;
111
+ /** The rectangles */
112
+ rectangles: RectanglesOutput;
113
+ /** The resize dimensions */
114
+ resizeDimensions?: ResizeDimensions;
115
+ }
116
+ export interface RotateBase64ImageOptions {
117
+ /** The base64 image */
118
+ base64Image: string;
119
+ /** The degrees to rotate */
120
+ degrees: number;
121
+ }
122
+ export interface CropAndConvertToDataURL extends BaseDimensions {
123
+ /** Whether to add iOS bezel corners */
124
+ addIOSBezelCorners: boolean;
125
+ /** The base64 image */
126
+ base64Image: string;
127
+ /** The name of the device */
128
+ deviceName: string;
129
+ /** The device pixel ratio */
130
+ devicePixelRatio: number;
131
+ /** Whether this is an iOS device */
132
+ isIOS: boolean;
133
+ /** Whether the image is in landscape mode */
134
+ isLandscape: boolean;
135
+ /** The source x coordinate */
136
+ sourceX: number;
137
+ /** The source y coordinate */
138
+ sourceY: number;
139
+ }
140
+ export interface AdjustedAxis {
141
+ /** The length of the axis */
142
+ length: number;
143
+ /** The maximum dimension */
144
+ maxDimension: number;
145
+ /** The padding at the end */
146
+ paddingEnd: number;
147
+ /** The padding at the start */
148
+ paddingStart: number;
149
+ /** The start coordinate */
150
+ start: number;
151
+ /** The warning type */
152
+ warningType: 'WIDTH' | 'HEIGHT';
153
+ }
154
+ export interface DimensionsWarning {
155
+ /** The dimension */
156
+ dimension: number;
157
+ /** The maximum dimension */
158
+ maxDimension: number;
159
+ /** The position */
160
+ position: number;
161
+ /** The type of warning */
162
+ type: string;
163
+ }
164
+ export interface CheckBaselineImageExists {
165
+ /** The actual file path */
166
+ actualFilePath: string;
167
+ /** The baseline file path */
168
+ baselineFilePath: string;
169
+ /** Whether to auto save baseline */
170
+ autoSaveBaseline?: boolean;
171
+ /** Whether to update baseline */
172
+ updateBaseline?: boolean;
173
+ }
174
+ export interface RotatedImage {
175
+ /** Whether this is a webdriver element screenshot */
176
+ isWebDriverElementScreenshot: boolean;
177
+ /** Whether the image is in landscape mode */
178
+ isLandscape: boolean;
179
+ /** The base64 image */
180
+ base64Image: string;
181
+ }
182
+ export interface HandleIOSBezelCorners extends BaseDimensions {
183
+ /** Whether to add iOS bezel corners */
184
+ addIOSBezelCorners: boolean;
185
+ /** The name of the device */
186
+ deviceName: string;
187
+ /** The device pixel ratio */
188
+ devicePixelRatio: number;
189
+ /** The image */
190
+ image: any;
191
+ /** Whether the image is in landscape mode */
192
+ isLandscape: boolean;
193
+ }
194
+ export interface MakeFullPageBase64ImageOptions {
195
+ /** The device pixel ratio */
196
+ devicePixelRatio: number;
197
+ /** Whether the image is in landscape mode */
198
+ isLandscape: boolean;
199
+ }
200
+ export interface TakeResizedBase64ScreenshotOptions {
201
+ /** The browser instance */
202
+ browserInstance: WebdriverIO.Browser;
203
+ /** The element to take the screenshot of */
204
+ element: WicElement;
205
+ /** The device pixel ratio */
206
+ devicePixelRatio: number;
207
+ /** Whether the image is in landscape mode */
208
+ isIOS: boolean;
209
+ /** The resize dimensions */
210
+ resizeDimensions: ResizeDimensions;
211
+ }
212
+ export interface TakeBase64ElementScreenshotOptions extends TakeResizedBase64ScreenshotOptions {
213
+ }
214
+ //# sourceMappingURL=images.interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.interfaces.d.ts","sourceRoot":"","sources":["../../src/methods/images.interfaces.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,428 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { readFileSync, writeFileSync } from 'node:fs';
3
+ import { promises as fsPromises, constants } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { Jimp, JimpMime } from 'jimp';
6
+ import logger from '@wdio/logger';
7
+ import compareImages from '../resemble/compareImages.js';
8
+ import { calculateDprData, getIosBezelImageNames, getBase64ScreenshotSize, prepareComparisonFilePaths, updateVisualBaseline } from '../helpers/utils.js';
9
+ import { prepareIgnoreOptions } from '../helpers/options.js';
10
+ import { DEFAULT_RESIZE_DIMENSIONS, supportedIosBezelDevices } from '../helpers/constants.js';
11
+ import { isWdioElement, prepareIgnoreRectangles } from './rectangles.js';
12
+ import { generateAndSaveDiff } from './processDiffPixels.js';
13
+ import { createJsonReportIfNeeded } from './createCompareReport.js';
14
+ import { takeBase64Screenshot } from './screenshots.js';
15
+ const log = logger('@wdio/visual-service:@wdio/image-comparison-core:images');
16
+ /**
17
+ * Check if an image exists and return a boolean
18
+ */
19
+ export async function checkIfImageExists(filePath) {
20
+ try {
21
+ await fsPromises.access(filePath, constants.R_OK);
22
+ return true;
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ /**
29
+ * Remove the diff image if it exists
30
+ */
31
+ export async function removeDiffImageIfExists(diffFilePath) {
32
+ if (await checkIfImageExists(diffFilePath)) {
33
+ try {
34
+ await fsPromises.unlink(diffFilePath);
35
+ log.info(`Successfully removed the diff image before comparing at ${diffFilePath}`);
36
+ }
37
+ catch (error) {
38
+ throw new Error(`Could not remove the diff image. The following error was thrown: ${error}`);
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Check if the image exists and create a new baseline image if needed
44
+ */
45
+ export async function checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline = false, updateBaseline = false }) {
46
+ try {
47
+ if (updateBaseline || !(await checkIfImageExists(baselineFilePath))) {
48
+ throw new Error();
49
+ }
50
+ }
51
+ catch {
52
+ if (autoSaveBaseline || updateBaseline) {
53
+ try {
54
+ const autoSaveMessage = 'Autosaved the';
55
+ const updateBaselineMessage = 'Updated the actual';
56
+ const data = readFileSync(actualFilePath);
57
+ writeFileSync(baselineFilePath, data);
58
+ log.info('\x1b[33m%s\x1b[0m', `
59
+ #####################################################################################
60
+ INFO:
61
+ ${autoSaveBaseline ? autoSaveMessage : updateBaselineMessage} image to
62
+ ${baselineFilePath}
63
+ #####################################################################################`);
64
+ }
65
+ catch (error) {
66
+ throw new Error(`
67
+ #####################################################################################
68
+ Image could not be copied. The following error was thrown:
69
+ ${error}
70
+ #####################################################################################`);
71
+ }
72
+ }
73
+ else {
74
+ throw new Error(`
75
+ #####################################################################################
76
+ Baseline image not found, save the actual image manually to the baseline.
77
+ The image can be found here:
78
+ ${actualFilePath}
79
+ #####################################################################################`);
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * Get the rotated image if needed
85
+ */
86
+ export async function getRotatedImageIfNeeded({ isWebDriverElementScreenshot, isLandscape, base64Image }) {
87
+ const { height: screenshotHeight, width: screenshotWidth } = getBase64ScreenshotSize(base64Image);
88
+ const isRotated = !isWebDriverElementScreenshot && isLandscape && screenshotHeight > screenshotWidth;
89
+ return isRotated ? await rotateBase64Image({ base64Image, degrees: 90 }) : base64Image;
90
+ }
91
+ /**
92
+ * Log a warning when the crop goes out of the screen
93
+ */
94
+ export function logDimensionWarning({ dimension, maxDimension, position, type, }) {
95
+ log.warn('\x1b[33m%s\x1b[0m', `
96
+ #####################################################################################
97
+ THE RESIZE DIMENSION ${type}=${dimension} MADE THE CROPPING GO OUT OF THE SCREEN SIZE
98
+ RESULTING IN A ${type} CROP POSITION=${position}.
99
+ THIS HAS BEEN DEFAULTED TO '${['TOP', 'LEFT'].includes(type) ? 0 : maxDimension}'
100
+ #####################################################################################
101
+ `);
102
+ }
103
+ /**
104
+ * Get the adjusted axis
105
+ */
106
+ export function getAdjustedAxis({ length, maxDimension, paddingEnd, paddingStart, start, warningType, }) {
107
+ let adjustedStart = start - paddingStart;
108
+ let adjustedEnd = start + length + paddingEnd;
109
+ if (adjustedStart < 0) {
110
+ logDimensionWarning({
111
+ dimension: paddingStart,
112
+ maxDimension,
113
+ position: adjustedStart,
114
+ type: warningType === 'WIDTH' ? 'LEFT' : 'TOP',
115
+ });
116
+ adjustedStart = 0;
117
+ }
118
+ if (adjustedEnd > maxDimension) {
119
+ logDimensionWarning({
120
+ dimension: paddingEnd,
121
+ maxDimension,
122
+ position: adjustedEnd,
123
+ type: warningType === 'WIDTH' ? 'RIGHT' : 'BOTTOM',
124
+ });
125
+ adjustedEnd = maxDimension;
126
+ }
127
+ return [adjustedStart, adjustedEnd];
128
+ }
129
+ /**
130
+ * Handle the iOS bezel corners
131
+ */
132
+ export async function handleIOSBezelCorners({ addIOSBezelCorners, image, deviceName, devicePixelRatio, height, isLandscape, width, }) {
133
+ const normalizedDeviceName = deviceName.toLowerCase()
134
+ .replace(/([^A-Za-z0-9]|simulator|inch|(\d(st|nd|rd|th)) generation)/gi, '');
135
+ const isSupported = (normalizedDeviceName.includes('iphone') && supportedIosBezelDevices.includes(normalizedDeviceName)) ||
136
+ (normalizedDeviceName.includes('ipad') &&
137
+ supportedIosBezelDevices.includes(normalizedDeviceName) &&
138
+ (width / devicePixelRatio >= 1133 || height / devicePixelRatio >= 1133));
139
+ let isIosBezelError = false;
140
+ if (addIOSBezelCorners && isSupported) {
141
+ const { topImageName, bottomImageName } = getIosBezelImageNames(normalizedDeviceName);
142
+ if (topImageName && bottomImageName) {
143
+ const __filename = fileURLToPath(import.meta.url);
144
+ const __dirname = dirname(__filename);
145
+ const topImage = readFileSync(join(__dirname, '..', '..', 'assets', 'ios', `${topImageName}.png`), { encoding: 'base64' });
146
+ const bottomImage = readFileSync(join(__dirname, '..', '..', 'assets', 'ios', `${bottomImageName}.png`), { encoding: 'base64' });
147
+ const topBase64Image = isLandscape ? await rotateBase64Image({ base64Image: topImage, degrees: 90 }) : topImage;
148
+ const bottomBase64Image = isLandscape ? await rotateBase64Image({ base64Image: bottomImage, degrees: 90 }) : bottomImage;
149
+ image.composite(await Jimp.read(Buffer.from(topBase64Image, 'base64')), 0, 0);
150
+ image.composite(await Jimp.read(Buffer.from(bottomBase64Image, 'base64')), isLandscape ? width - getBase64ScreenshotSize(bottomImage).height : 0, isLandscape ? 0 : height - getBase64ScreenshotSize(bottomImage).height);
151
+ }
152
+ else {
153
+ isIosBezelError = true;
154
+ }
155
+ }
156
+ if (addIOSBezelCorners && !isSupported) {
157
+ isIosBezelError = true;
158
+ }
159
+ if (isIosBezelError) {
160
+ log.warn('\x1b[33m%s\x1b[0m', `
161
+ #####################################################################################
162
+ WARNING:
163
+ We could not find the bezel corners for the device '${deviceName}'.
164
+ The normalized device name is '${normalizedDeviceName}'
165
+ and couldn't be found in the supported devices:
166
+ ${supportedIosBezelDevices.join(', ')}
167
+ #####################################################################################
168
+ `);
169
+ }
170
+ }
171
+ /**
172
+ * Crop the image and convert it to a base64 image
173
+ */
174
+ export async function cropAndConvertToDataURL({ addIOSBezelCorners, base64Image, deviceName, devicePixelRatio, height, isIOS, isLandscape, sourceX, sourceY, width, }) {
175
+ const image = await Jimp.read(Buffer.from(base64Image, 'base64'));
176
+ const croppedImage = image.crop({ x: sourceX, y: sourceY, w: width, h: height });
177
+ if (isIOS) {
178
+ await handleIOSBezelCorners({ addIOSBezelCorners, image: croppedImage, deviceName, devicePixelRatio, height, isLandscape, width });
179
+ }
180
+ const base64CroppedImage = await croppedImage.getBase64(JimpMime.png);
181
+ return base64CroppedImage.replace(/^data:image\/png;base64,/, '');
182
+ }
183
+ /**
184
+ * Make a cropped image with Canvas
185
+ */
186
+ export async function makeCroppedBase64Image({ addIOSBezelCorners, base64Image, deviceName, devicePixelRatio, isWebDriverElementScreenshot = false, isIOS, isLandscape, rectangles, resizeDimensions = DEFAULT_RESIZE_DIMENSIONS, }) {
187
+ // Rotate the image if needed and get the screenshot size
188
+ const newBase64Image = await getRotatedImageIfNeeded({ isWebDriverElementScreenshot, isLandscape, base64Image });
189
+ const { height: screenshotHeight, width: screenshotWidth } = getBase64ScreenshotSize(base64Image);
190
+ // Determine/Get the size of the cropped screenshot and cut out dimensions
191
+ const { top, right, bottom, left } = { ...DEFAULT_RESIZE_DIMENSIONS, ...resizeDimensions };
192
+ const { height, width, x, y } = rectangles;
193
+ const [sourceXStart, sourceXEnd] = getAdjustedAxis({
194
+ length: width,
195
+ maxDimension: screenshotWidth,
196
+ paddingEnd: right,
197
+ paddingStart: left,
198
+ start: x,
199
+ warningType: 'WIDTH'
200
+ });
201
+ const [sourceYStart, sourceYEnd] = getAdjustedAxis({
202
+ length: height,
203
+ maxDimension: screenshotHeight,
204
+ paddingEnd: bottom,
205
+ paddingStart: top,
206
+ start: y,
207
+ warningType: 'HEIGHT',
208
+ });
209
+ // Create the canvas and draw the image on it
210
+ return cropAndConvertToDataURL({
211
+ addIOSBezelCorners,
212
+ base64Image: newBase64Image,
213
+ deviceName,
214
+ devicePixelRatio,
215
+ height: sourceYEnd - sourceYStart,
216
+ isIOS,
217
+ isLandscape,
218
+ sourceX: sourceXStart,
219
+ sourceY: sourceYStart,
220
+ width: sourceXEnd - sourceXStart,
221
+ });
222
+ }
223
+ /**
224
+ * Execute the image compare
225
+ */
226
+ export async function executeImageCompare({ isViewPortScreenshot, isNativeContext, options, testContext, }) {
227
+ // 1. Set some variables
228
+ const { devicePixelRatio, deviceRectangles, ignoreRegions = [], isAndroidNativeWebScreenshot, isAndroid, fileName, } = options;
229
+ const { actualFolder, autoSaveBaseline, baselineFolder, browserName, deviceName, diffFolder, isMobile, savePerInstance } = options.folderOptions;
230
+ const imageCompareOptions = { ...options.compareOptions.wic, ...options.compareOptions.method };
231
+ // 2. Create all needed folders and file paths
232
+ const filePaths = prepareComparisonFilePaths({
233
+ actualFolder,
234
+ baselineFolder,
235
+ diffFolder,
236
+ browserName,
237
+ deviceName,
238
+ isMobile,
239
+ savePerInstance,
240
+ fileName
241
+ });
242
+ const { actualFilePath, baselineFilePath, diffFilePath } = filePaths;
243
+ // 3a. Check if there is a baseline image, and determine if it needs to be auto saved or not
244
+ await checkBaselineImageExists({ actualFilePath, baselineFilePath, autoSaveBaseline });
245
+ // 3b. At this point we shouldn't have a diff image, so check if there is a diff image and remove it if it exists
246
+ await removeDiffImageIfExists(diffFilePath);
247
+ // 4. Prepare the compare
248
+ // 4a.Determine the ignore options
249
+ const ignore = prepareIgnoreOptions(imageCompareOptions);
250
+ // 4b. Determine the ignore rectangles for the block outs
251
+ const { ignoredBoxes } = prepareIgnoreRectangles({
252
+ blockOut: imageCompareOptions.blockOut ?? [],
253
+ ignoreRegions,
254
+ deviceRectangles,
255
+ devicePixelRatio,
256
+ isMobile,
257
+ isNativeContext,
258
+ isAndroid,
259
+ isAndroidNativeWebScreenshot,
260
+ isViewPortScreenshot,
261
+ imageCompareOptions: {
262
+ blockOutSideBar: imageCompareOptions.blockOutSideBar,
263
+ blockOutStatusBar: imageCompareOptions.blockOutStatusBar,
264
+ blockOutToolBar: imageCompareOptions.blockOutToolBar,
265
+ }
266
+ });
267
+ const compareOptions = {
268
+ ignore,
269
+ ...(ignoredBoxes.length > 0 ? { output: { ignoredBoxes } } : {}),
270
+ scaleToSameSize: imageCompareOptions.scaleImagesToSameSize,
271
+ };
272
+ // 5. Execute the compare and retrieve the data
273
+ const data = await compareImages(readFileSync(baselineFilePath), readFileSync(actualFilePath), compareOptions);
274
+ const rawMisMatchPercentage = data.rawMisMatchPercentage;
275
+ const reportMisMatchPercentage = imageCompareOptions.rawMisMatchPercentage
276
+ ? rawMisMatchPercentage
277
+ : Number(data.rawMisMatchPercentage.toFixed(3));
278
+ // 6. Generate and save the diff when there is a diff
279
+ const { diffBoundingBoxes, storeDiffs } = await generateAndSaveDiff(data, imageCompareOptions, ignoredBoxes, diffFilePath, rawMisMatchPercentage);
280
+ // 7. Create JSON report if requested
281
+ await createJsonReportIfNeeded({
282
+ boundingBoxes: {
283
+ diffBoundingBoxes,
284
+ ignoredBoxes,
285
+ },
286
+ data,
287
+ fileName,
288
+ filePaths,
289
+ devicePixelRatio,
290
+ imageCompareOptions,
291
+ testContext,
292
+ storeDiffs,
293
+ });
294
+ // 8. Handle visual baseline update
295
+ let finalReportMisMatchPercentage = reportMisMatchPercentage;
296
+ if (updateVisualBaseline()) {
297
+ await checkBaselineImageExists({
298
+ actualFilePath,
299
+ baselineFilePath,
300
+ updateBaseline: true
301
+ });
302
+ finalReportMisMatchPercentage = 0;
303
+ }
304
+ // 9. Return the comparison data
305
+ return imageCompareOptions.returnAllCompareData
306
+ ? {
307
+ fileName,
308
+ folders: {
309
+ actual: actualFilePath,
310
+ baseline: baselineFilePath,
311
+ ...(diffFilePath ? { diff: diffFilePath } : {}),
312
+ },
313
+ misMatchPercentage: finalReportMisMatchPercentage,
314
+ }
315
+ : finalReportMisMatchPercentage;
316
+ }
317
+ /**
318
+ * Make a full page image with Canvas
319
+ */
320
+ export async function makeFullPageBase64Image(screenshotsData, { devicePixelRatio, isLandscape }) {
321
+ const amountOfScreenshots = screenshotsData.data.length;
322
+ const { fullPageHeight: canvasHeight, fullPageWidth: canvasWidth } = screenshotsData;
323
+ const canvas = await new Jimp({ width: canvasWidth, height: canvasHeight });
324
+ // Load all the images
325
+ for (let i = 0; i < amountOfScreenshots; i++) {
326
+ const currentScreenshot = screenshotsData.data[i].screenshot;
327
+ const { height: screenshotHeight, width: screenshotWidth } = getBase64ScreenshotSize(currentScreenshot, devicePixelRatio);
328
+ const isRotated = isLandscape && screenshotHeight > screenshotWidth;
329
+ const newBase64Image = isRotated ? await rotateBase64Image({ base64Image: currentScreenshot, degrees: 90 }) : currentScreenshot;
330
+ const { canvasYPosition, imageHeight, imageWidth, imageXPosition, imageYPosition } = screenshotsData.data[i];
331
+ const image = await Jimp.read(Buffer.from(newBase64Image, 'base64'));
332
+ canvas.composite(image.crop({ x: imageXPosition, y: imageYPosition, w: imageWidth, h: imageHeight }), 0, canvasYPosition);
333
+ }
334
+ const base64FullPageImage = await canvas.getBase64(JimpMime.png);
335
+ return base64FullPageImage.replace(/^data:image\/png;base64,/, '');
336
+ }
337
+ /**
338
+ * Save the base64 image to a file
339
+ */
340
+ export async function saveBase64Image(base64Image, filePath) {
341
+ await fsPromises.mkdir(dirname(filePath), { recursive: true });
342
+ await fsPromises.writeFile(filePath, Buffer.from(base64Image, 'base64'));
343
+ }
344
+ /**
345
+ * Create a canvas with the ignore boxes if they are present
346
+ */
347
+ export async function addBlockOuts(screenshot, ignoredBoxes) {
348
+ const image = await Jimp.read(Buffer.from(screenshot, 'base64'));
349
+ // Loop over all ignored areas and add them to the current canvas
350
+ for (const ignoredBox of ignoredBoxes) {
351
+ const { right: ignoredBoxWidth, bottom: ignoredBoxHeight, left: x, top: y } = ignoredBox;
352
+ const ignoreCanvas = new Jimp({ width: ignoredBoxWidth - x, height: ignoredBoxHeight - y, color: '#39aa56' });
353
+ ignoreCanvas.opacity(0.5);
354
+ image.composite(ignoreCanvas, x, y);
355
+ }
356
+ const base64ImageWithBlockOuts = await image.getBase64(JimpMime.png);
357
+ return base64ImageWithBlockOuts.replace(/^data:image\/png;base64,/, '');
358
+ }
359
+ /**
360
+ * Rotate a base64 image
361
+ * Tnx to https://gist.github.com/Zyndoras/6897abdf53adbedf02564808aaab94db
362
+ */
363
+ export async function rotateBase64Image({ base64Image, degrees }) {
364
+ const image = await Jimp.read(Buffer.from(base64Image, 'base64'));
365
+ const rotatedImage = image.rotate(degrees);
366
+ const base64RotatedImage = await rotatedImage.getBase64(JimpMime.png);
367
+ return base64RotatedImage.replace(/^data:image\/png;base64,/, '');
368
+ }
369
+ /**
370
+ * Take a based64 screenshot of an element and resize it
371
+ */
372
+ export async function takeResizedBase64Screenshot({ browserInstance, element, devicePixelRatio, isIOS, resizeDimensions, }) {
373
+ const awaitedElement = await element;
374
+ if (!isWdioElement(awaitedElement)) {
375
+ log.info('awaitedElement = ', JSON.stringify(awaitedElement));
376
+ }
377
+ // Get the element position
378
+ const elementRegion = await browserInstance.getElementRect(awaitedElement.elementId);
379
+ // Create a screenshot
380
+ const base64Image = await takeBase64Screenshot(browserInstance);
381
+ // Crop it out with the correct dimensions
382
+ // Make the image smaller
383
+ // Provide the size of the image with the resizeDimensions on left, right, top and bottom
384
+ const resizedBase64Image = await makeCroppedBase64Image({
385
+ addIOSBezelCorners: false,
386
+ base64Image,
387
+ deviceName: '',
388
+ devicePixelRatio,
389
+ isIOS,
390
+ isLandscape: false,
391
+ rectangles: calculateDprData({
392
+ height: elementRegion.height,
393
+ width: elementRegion.width,
394
+ x: elementRegion.x,
395
+ y: elementRegion.y,
396
+ }, isIOS ? devicePixelRatio : 1),
397
+ resizeDimensions,
398
+ });
399
+ return resizedBase64Image;
400
+ }
401
+ /**
402
+ * Take a base64 screenshot of an element
403
+ */
404
+ export async function takeBase64ElementScreenshot({ browserInstance, element, devicePixelRatio, isIOS, resizeDimensions, }) {
405
+ const shouldTakeResizedScreenshot = (resizeDimensions.top !== DEFAULT_RESIZE_DIMENSIONS.top ||
406
+ resizeDimensions.right !== DEFAULT_RESIZE_DIMENSIONS.right ||
407
+ resizeDimensions.bottom !== DEFAULT_RESIZE_DIMENSIONS.bottom ||
408
+ resizeDimensions.left !== DEFAULT_RESIZE_DIMENSIONS.left);
409
+ if (!shouldTakeResizedScreenshot) {
410
+ try {
411
+ const awaitedElement = await element;
412
+ if (!isWdioElement(awaitedElement)) {
413
+ log.error(' takeBase64ElementScreenshot element is not a valid element because of ', JSON.stringify(awaitedElement));
414
+ }
415
+ return await awaitedElement.takeElementScreenshot(awaitedElement.elementId);
416
+ }
417
+ catch (error) {
418
+ log.error('Error taking an element screenshot with the default `element.takeElementScreenshot(elementId)` method:', error, ' We will retry with a resized screenshot');
419
+ }
420
+ }
421
+ return await takeResizedBase64Screenshot({
422
+ browserInstance,
423
+ element,
424
+ devicePixelRatio,
425
+ isIOS,
426
+ resizeDimensions,
427
+ });
428
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=images.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"images.test.d.ts","sourceRoot":"","sources":["../../src/methods/images.test.ts"],"names":[],"mappings":""}