creevey 0.9.0-beta.20 → 0.9.0-beta.22

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 (475) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +5 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/client/addon/components/Addon.d.ts +8 -0
  6. package/dist/client/addon/components/Addon.js +57 -0
  7. package/dist/client/addon/components/Addon.js.map +1 -0
  8. package/{lib/types → dist}/client/addon/components/Icons.d.ts +0 -1
  9. package/dist/client/addon/components/Icons.js +18 -0
  10. package/dist/client/addon/components/Icons.js.map +1 -0
  11. package/{lib/types → dist}/client/addon/components/Panel.d.ts +1 -2
  12. package/dist/client/addon/components/Panel.js +32 -0
  13. package/dist/client/addon/components/Panel.js.map +1 -0
  14. package/{lib/types → dist}/client/addon/components/TestSelect.d.ts +1 -2
  15. package/dist/client/addon/components/TestSelect.js +33 -0
  16. package/dist/client/addon/components/TestSelect.js.map +1 -0
  17. package/dist/client/addon/components/Tools.d.ts +6 -0
  18. package/dist/client/addon/components/Tools.js +89 -0
  19. package/dist/client/addon/components/Tools.js.map +1 -0
  20. package/{lib/types/client/addon/Manager.d.ts → dist/client/addon/controller.d.ts} +8 -7
  21. package/dist/client/addon/controller.js +208 -0
  22. package/dist/client/addon/controller.js.map +1 -0
  23. package/dist/client/addon/decorator.js +6 -0
  24. package/dist/client/addon/decorator.js.map +1 -0
  25. package/dist/client/addon/index.d.ts +2 -0
  26. package/dist/client/addon/index.js +19 -0
  27. package/dist/client/addon/index.js.map +1 -0
  28. package/dist/client/addon/manager.js +41 -0
  29. package/dist/client/addon/manager.js.map +1 -0
  30. package/dist/client/addon/preset.js +6 -0
  31. package/dist/client/addon/preset.js.map +1 -0
  32. package/dist/client/addon/preview.js +8 -0
  33. package/dist/client/addon/preview.js.map +1 -0
  34. package/dist/client/addon/readyForCapture.js +7 -0
  35. package/dist/client/addon/readyForCapture.js.map +1 -0
  36. package/{lib/types → dist}/client/addon/utils.d.ts +1 -1
  37. package/dist/client/addon/utils.js +27 -0
  38. package/dist/client/addon/utils.js.map +1 -0
  39. package/{lib/types → dist}/client/addon/withCreevey.d.ts +3 -3
  40. package/dist/client/addon/withCreevey.js +286 -0
  41. package/dist/client/addon/withCreevey.js.map +1 -0
  42. package/{lib/types → dist}/client/shared/components/ImagesView/BlendView.d.ts +2 -2
  43. package/dist/client/shared/components/ImagesView/BlendView.js +74 -0
  44. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -0
  45. package/dist/client/shared/components/ImagesView/ImagesView.d.ts +9 -0
  46. package/dist/client/shared/components/ImagesView/ImagesView.js +43 -0
  47. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -0
  48. package/{lib/types → dist}/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
  49. package/dist/client/shared/components/ImagesView/SideBySideView.js +121 -0
  50. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -0
  51. package/{lib/types → dist}/client/shared/components/ImagesView/SlideView.d.ts +2 -2
  52. package/dist/client/shared/components/ImagesView/SlideView.js +136 -0
  53. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -0
  54. package/{lib/types → dist}/client/shared/components/ImagesView/SwapView.d.ts +2 -2
  55. package/dist/client/shared/components/ImagesView/SwapView.js +72 -0
  56. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -0
  57. package/{lib/types/client/shared/components/ImagesView/ImagesView.d.ts → dist/client/shared/components/ImagesView/common.d.ts} +1 -11
  58. package/dist/client/shared/components/ImagesView/common.js +14 -0
  59. package/dist/client/shared/components/ImagesView/common.js.map +1 -0
  60. package/dist/client/shared/components/ImagesView/index.d.ts +5 -0
  61. package/dist/client/shared/components/ImagesView/index.js +14 -0
  62. package/dist/client/shared/components/ImagesView/index.js.map +1 -0
  63. package/{lib/types → dist}/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
  64. package/dist/client/shared/components/PageFooter/PageFooter.js +25 -0
  65. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -0
  66. package/{lib/types → dist}/client/shared/components/PageFooter/Paging.d.ts +1 -2
  67. package/dist/client/shared/components/PageFooter/Paging.js +68 -0
  68. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -0
  69. package/{lib/types → dist}/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
  70. package/dist/client/shared/components/PageHeader/ImagePreview.js +61 -0
  71. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -0
  72. package/{lib/types → dist}/client/shared/components/PageHeader/PageHeader.d.ts +2 -5
  73. package/dist/client/shared/components/PageHeader/PageHeader.js +86 -0
  74. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -0
  75. package/{lib/types → dist}/client/shared/components/ResultsPage.d.ts +3 -5
  76. package/dist/client/shared/components/ResultsPage.js +95 -0
  77. package/dist/client/shared/components/ResultsPage.js.map +1 -0
  78. package/{lib/types → dist}/client/shared/creeveyClientApi.d.ts +1 -1
  79. package/dist/client/shared/creeveyClientApi.js +53 -0
  80. package/dist/client/shared/creeveyClientApi.js.map +1 -0
  81. package/{lib/types → dist}/client/shared/helpers.d.ts +3 -3
  82. package/dist/client/shared/helpers.js +381 -0
  83. package/dist/client/shared/helpers.js.map +1 -0
  84. package/{lib/types → dist}/client/shared/viewMode.d.ts +1 -1
  85. package/dist/client/shared/viewMode.js +11 -0
  86. package/dist/client/shared/viewMode.js.map +1 -0
  87. package/dist/client/web/202.js +1 -0
  88. package/dist/client/web/270.js +43 -0
  89. package/dist/client/web/752.js +1 -0
  90. package/{lib/types → dist}/client/web/CreeveyApp.d.ts +2 -3
  91. package/dist/client/web/CreeveyApp.js +130 -0
  92. package/dist/client/web/CreeveyApp.js.map +1 -0
  93. package/{lib/types → dist}/client/web/CreeveyContext.d.ts +1 -1
  94. package/dist/client/web/CreeveyContext.js +17 -0
  95. package/dist/client/web/CreeveyContext.js.map +1 -0
  96. package/dist/client/web/CreeveyLoader.d.ts +3 -0
  97. package/dist/client/web/CreeveyLoader.js +52 -0
  98. package/dist/client/web/CreeveyLoader.js.map +1 -0
  99. package/{lib/types → dist}/client/web/CreeveyView/SideBar/Checkbox.d.ts +2 -2
  100. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +86 -0
  101. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -0
  102. package/{lib/types → dist}/client/web/CreeveyView/SideBar/Search.d.ts +0 -1
  103. package/dist/client/web/CreeveyView/SideBar/Search.js +125 -0
  104. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -0
  105. package/{lib/types → dist}/client/web/CreeveyView/SideBar/SideBar.d.ts +2 -2
  106. package/dist/client/web/CreeveyView/SideBar/SideBar.js +101 -0
  107. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -0
  108. package/{lib/types → dist}/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +2 -3
  109. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +113 -0
  110. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -0
  111. package/{lib/types → dist}/client/web/CreeveyView/SideBar/SuiteLink.d.ts +14 -14
  112. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +108 -0
  113. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -0
  114. package/{lib/types → dist}/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -2
  115. package/dist/client/web/CreeveyView/SideBar/TestLink.js +63 -0
  116. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -0
  117. package/{lib/types → dist}/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
  118. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +52 -0
  119. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -0
  120. package/{lib/types → dist}/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -3
  121. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +74 -0
  122. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -0
  123. package/{lib/types → dist}/client/web/CreeveyView/SideBar/Toggle.d.ts +0 -1
  124. package/dist/client/web/CreeveyView/SideBar/Toggle.js +69 -0
  125. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -0
  126. package/dist/client/web/CreeveyView/SideBar/index.d.ts +1 -0
  127. package/dist/client/web/CreeveyView/SideBar/index.js +6 -0
  128. package/dist/client/web/CreeveyView/SideBar/index.js.map +1 -0
  129. package/{lib/types → dist}/client/web/KeyboardEventsContext.d.ts +4 -4
  130. package/dist/client/web/KeyboardEventsContext.js +116 -0
  131. package/dist/client/web/KeyboardEventsContext.js.map +1 -0
  132. package/{lib/types → dist}/client/web/index.d.ts +1 -1
  133. package/{lib/cjs → dist}/client/web/index.html +12 -3
  134. package/dist/client/web/index.js +75 -0
  135. package/dist/client/web/index.js.map +1 -0
  136. package/dist/client/web/main.js +79 -0
  137. package/dist/creevey.d.ts +1 -0
  138. package/dist/creevey.js +52 -0
  139. package/dist/creevey.js.map +1 -0
  140. package/dist/index.d.ts +5 -0
  141. package/dist/index.js +24 -0
  142. package/dist/index.js.map +1 -0
  143. package/{lib/types → dist}/server/config.d.ts +1 -1
  144. package/dist/server/config.js +86 -0
  145. package/dist/server/config.js.map +1 -0
  146. package/{lib/types → dist}/server/docker.d.ts +2 -2
  147. package/dist/server/docker.js +122 -0
  148. package/dist/server/docker.js.map +1 -0
  149. package/{lib/types → dist}/server/index.d.ts +1 -1
  150. package/dist/server/index.js +47 -0
  151. package/dist/server/index.js.map +1 -0
  152. package/{lib/types → dist}/server/logger.d.ts +2 -2
  153. package/dist/server/logger.js +25 -0
  154. package/dist/server/logger.js.map +1 -0
  155. package/{lib/types → dist}/server/master/api.d.ts +1 -1
  156. package/dist/server/master/api.js +50 -0
  157. package/dist/server/master/api.js.map +1 -0
  158. package/dist/server/master/index.d.ts +3 -0
  159. package/dist/server/master/index.js +110 -0
  160. package/dist/server/master/index.js.map +1 -0
  161. package/{lib/types → dist}/server/master/master.d.ts +2 -2
  162. package/dist/server/master/master.js +40 -0
  163. package/dist/server/master/master.js.map +1 -0
  164. package/{lib/types → dist}/server/master/pool.d.ts +1 -2
  165. package/dist/server/master/pool.js +186 -0
  166. package/dist/server/master/pool.js.map +1 -0
  167. package/{lib/types → dist}/server/master/runner.d.ts +3 -8
  168. package/dist/server/master/runner.js +172 -0
  169. package/dist/server/master/runner.js.map +1 -0
  170. package/dist/server/master/server.d.ts +2 -0
  171. package/dist/server/master/server.js +114 -0
  172. package/dist/server/master/server.js.map +1 -0
  173. package/{lib/types → dist}/server/messages.d.ts +1 -4
  174. package/dist/server/messages.js +222 -0
  175. package/dist/server/messages.js.map +1 -0
  176. package/{lib/types → dist}/server/selenium/browser.d.ts +1 -1
  177. package/dist/server/selenium/browser.js +634 -0
  178. package/dist/server/selenium/browser.js.map +1 -0
  179. package/dist/server/selenium/index.d.ts +2 -0
  180. package/dist/server/selenium/index.js +19 -0
  181. package/dist/server/selenium/index.js.map +1 -0
  182. package/{lib/types → dist}/server/selenium/selenoid.d.ts +1 -1
  183. package/dist/server/selenium/selenoid.js +120 -0
  184. package/dist/server/selenium/selenoid.js.map +1 -0
  185. package/{lib/types → dist}/server/stories.d.ts +2 -7
  186. package/dist/server/stories.js +92 -0
  187. package/dist/server/stories.js.map +1 -0
  188. package/dist/server/storybook/providers/browser.d.ts +2 -0
  189. package/dist/server/storybook/providers/browser.js +60 -0
  190. package/dist/server/storybook/providers/browser.js.map +1 -0
  191. package/dist/server/storybook/providers/hybrid.d.ts +2 -0
  192. package/dist/server/storybook/providers/hybrid.js +59 -0
  193. package/dist/server/storybook/providers/hybrid.js.map +1 -0
  194. package/dist/server/telemetry.js +196 -0
  195. package/dist/server/telemetry.js.map +1 -0
  196. package/{lib/types → dist}/server/testsFiles/parser.d.ts +2 -6
  197. package/dist/server/testsFiles/parser.js +50 -0
  198. package/dist/server/testsFiles/parser.js.map +1 -0
  199. package/dist/server/update.d.ts +2 -0
  200. package/dist/server/update.js +53 -0
  201. package/dist/server/update.js.map +1 -0
  202. package/{lib/types → dist}/server/utils.d.ts +10 -9
  203. package/dist/server/utils.js +157 -0
  204. package/dist/server/utils.js.map +1 -0
  205. package/{lib/types → dist}/server/worker/chai-image.d.ts +1 -2
  206. package/dist/server/worker/chai-image.js +113 -0
  207. package/dist/server/worker/chai-image.js.map +1 -0
  208. package/{lib/types → dist}/server/worker/helpers.d.ts +1 -1
  209. package/dist/server/worker/helpers.js +57 -0
  210. package/dist/server/worker/helpers.js.map +1 -0
  211. package/dist/server/worker/index.d.ts +1 -0
  212. package/dist/server/worker/index.js +6 -0
  213. package/dist/server/worker/index.js.map +1 -0
  214. package/dist/server/worker/reporter.js +130 -0
  215. package/dist/server/worker/reporter.js.map +1 -0
  216. package/dist/server/worker/worker.d.ts +4 -0
  217. package/dist/server/worker/worker.js +213 -0
  218. package/dist/server/worker/worker.js.map +1 -0
  219. package/{lib/types → dist}/shared/index.d.ts +1 -1
  220. package/dist/shared/index.js +77 -0
  221. package/dist/shared/index.js.map +1 -0
  222. package/dist/shared/serializeRegExp.js +25 -0
  223. package/dist/shared/serializeRegExp.js.map +1 -0
  224. package/{lib/types → dist}/types.d.ts +48 -71
  225. package/dist/types.js +61 -0
  226. package/dist/types.js.map +1 -0
  227. package/docs/config.md +1 -4
  228. package/docs/tests.md +3 -3
  229. package/manager/package.json +3 -0
  230. package/package.json +76 -103
  231. package/preset/README.md +3 -0
  232. package/preset/package.json +3 -0
  233. package/preview/README.md +3 -0
  234. package/preview/package.json +3 -0
  235. package/src/cli.ts +3 -0
  236. package/src/client/addon/components/Addon.tsx +53 -0
  237. package/src/client/addon/components/Icons.tsx +28 -0
  238. package/src/client/addon/components/Panel.tsx +53 -0
  239. package/src/client/addon/components/TestSelect.tsx +48 -0
  240. package/src/client/addon/components/Tools.tsx +93 -0
  241. package/src/client/addon/controller.ts +224 -0
  242. package/src/client/addon/decorator.ts +3 -0
  243. package/src/client/addon/index.ts +2 -0
  244. package/src/client/addon/manager.ts +44 -0
  245. package/{lib/esm/client/addon/preset.js → src/client/addon/preset.ts} +2 -1
  246. package/src/client/addon/preview.ts +7 -0
  247. package/src/client/addon/readyForCapture.ts +9 -0
  248. package/src/client/addon/utils.tsx +24 -0
  249. package/src/client/addon/withCreevey.ts +326 -0
  250. package/src/client/shared/components/ImagesView/BlendView.tsx +71 -0
  251. package/src/client/shared/components/ImagesView/ImagesView.tsx +62 -0
  252. package/src/client/shared/components/ImagesView/SideBySideView.tsx +139 -0
  253. package/{lib/esm/client/shared/components/ImagesView/SlideView.js → src/client/shared/components/ImagesView/SlideView.tsx} +78 -75
  254. package/src/client/shared/components/ImagesView/SwapView.tsx +81 -0
  255. package/src/client/shared/components/ImagesView/common.ts +23 -0
  256. package/src/client/shared/components/ImagesView/index.ts +5 -0
  257. package/src/client/shared/components/PageFooter/PageFooter.tsx +44 -0
  258. package/src/client/shared/components/PageFooter/Paging.tsx +105 -0
  259. package/src/client/shared/components/PageHeader/ImagePreview.tsx +82 -0
  260. package/src/client/shared/components/PageHeader/PageHeader.tsx +123 -0
  261. package/src/client/shared/components/ResultsPage.tsx +135 -0
  262. package/src/client/shared/creeveyClientApi.ts +64 -0
  263. package/src/client/shared/helpers.ts +422 -0
  264. package/src/client/shared/viewMode.ts +10 -0
  265. package/src/client/web/CreeveyApp.tsx +177 -0
  266. package/src/client/web/CreeveyContext.tsx +20 -0
  267. package/src/client/web/CreeveyLoader.tsx +56 -0
  268. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +118 -0
  269. package/src/client/web/CreeveyView/SideBar/Search.tsx +140 -0
  270. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +125 -0
  271. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +138 -0
  272. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +118 -0
  273. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +67 -0
  274. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +58 -0
  275. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +105 -0
  276. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +85 -0
  277. package/src/client/web/CreeveyView/SideBar/index.ts +1 -0
  278. package/src/client/web/KeyboardEventsContext.tsx +121 -0
  279. package/{lib/esm → src}/client/web/index.html +12 -3
  280. package/src/client/web/index.tsx +63 -0
  281. package/src/creevey.ts +47 -0
  282. package/src/index.ts +4 -0
  283. package/src/server/config.ts +83 -0
  284. package/src/server/docker.ts +136 -0
  285. package/src/server/index.ts +51 -0
  286. package/{lib/esm/server/logger.js → src/server/logger.ts} +8 -6
  287. package/src/server/master/api.ts +55 -0
  288. package/src/server/master/index.ts +111 -0
  289. package/src/server/master/master.ts +47 -0
  290. package/src/server/master/pool.ts +203 -0
  291. package/src/server/master/runner.ts +189 -0
  292. package/src/server/master/server.ts +124 -0
  293. package/src/server/messages.ts +273 -0
  294. package/src/server/selenium/browser.ts +834 -0
  295. package/src/server/selenium/index.ts +2 -0
  296. package/src/server/selenium/selenoid.ts +154 -0
  297. package/src/server/stories.ts +133 -0
  298. package/src/server/storybook/providers/browser.ts +58 -0
  299. package/src/server/storybook/providers/hybrid.ts +70 -0
  300. package/src/server/telemetry.ts +212 -0
  301. package/src/server/testsFiles/parser.ts +62 -0
  302. package/src/server/update.ts +74 -0
  303. package/src/server/utils.ts +206 -0
  304. package/src/server/worker/chai-image.ts +147 -0
  305. package/src/server/worker/helpers.ts +61 -0
  306. package/src/server/worker/index.ts +1 -0
  307. package/src/server/worker/reporter.ts +170 -0
  308. package/src/server/worker/worker.ts +234 -0
  309. package/src/shared/index.ts +76 -0
  310. package/src/shared/serializeRegExp.ts +26 -0
  311. package/src/types.ts +500 -0
  312. package/types/chai.d.ts +0 -1
  313. package/types/global.d.ts +1 -1
  314. package/types/mocha.d.ts +1 -1
  315. package/.yarn/install-state.gz +0 -0
  316. package/addon/package.json +0 -5
  317. package/jest.config.js +0 -6
  318. package/lib/cjs/cli.js +0 -6
  319. package/lib/cjs/client/addon/Manager.js +0 -192
  320. package/lib/cjs/client/addon/components/Addon.js +0 -48
  321. package/lib/cjs/client/addon/components/Icons.js +0 -40
  322. package/lib/cjs/client/addon/components/Panel.js +0 -59
  323. package/lib/cjs/client/addon/components/TestSelect.js +0 -52
  324. package/lib/cjs/client/addon/components/Tools.js +0 -84
  325. package/lib/cjs/client/addon/decorator.js +0 -8
  326. package/lib/cjs/client/addon/index.js +0 -27
  327. package/lib/cjs/client/addon/preset.js +0 -8
  328. package/lib/cjs/client/addon/preview.js +0 -11
  329. package/lib/cjs/client/addon/readyForCapture.js +0 -9
  330. package/lib/cjs/client/addon/register.js +0 -57
  331. package/lib/cjs/client/addon/utils.js +0 -34
  332. package/lib/cjs/client/addon/withCreevey.js +0 -272
  333. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +0 -75
  334. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +0 -76
  335. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +0 -139
  336. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +0 -151
  337. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +0 -79
  338. package/lib/cjs/client/shared/components/ImagesView/index.js +0 -40
  339. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +0 -43
  340. package/lib/cjs/client/shared/components/PageFooter/Paging.js +0 -77
  341. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +0 -86
  342. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +0 -100
  343. package/lib/cjs/client/shared/components/ResultsPage.js +0 -116
  344. package/lib/cjs/client/shared/creeveyClientApi.js +0 -66
  345. package/lib/cjs/client/shared/helpers.js +0 -357
  346. package/lib/cjs/client/shared/viewMode.js +0 -13
  347. package/lib/cjs/client/web/192.js +0 -1
  348. package/lib/cjs/client/web/632.js +0 -43
  349. package/lib/cjs/client/web/794.js +0 -1
  350. package/lib/cjs/client/web/main.js +0 -79
  351. package/lib/cjs/creevey.js +0 -56
  352. package/lib/cjs/index.js +0 -47
  353. package/lib/cjs/server/config.js +0 -76
  354. package/lib/cjs/server/docker.js +0 -124
  355. package/lib/cjs/server/index.js +0 -58
  356. package/lib/cjs/server/logger.js +0 -34
  357. package/lib/cjs/server/master/api.js +0 -58
  358. package/lib/cjs/server/master/index.js +0 -122
  359. package/lib/cjs/server/master/master.js +0 -42
  360. package/lib/cjs/server/master/pool.js +0 -163
  361. package/lib/cjs/server/master/runner.js +0 -254
  362. package/lib/cjs/server/master/server.js +0 -110
  363. package/lib/cjs/server/messages.js +0 -218
  364. package/lib/cjs/server/selenium/browser.js +0 -644
  365. package/lib/cjs/server/selenium/index.js +0 -27
  366. package/lib/cjs/server/selenium/selenoid.js +0 -148
  367. package/lib/cjs/server/stories.js +0 -148
  368. package/lib/cjs/server/storybook/providers/browser.js +0 -64
  369. package/lib/cjs/server/storybook/providers/hybrid.js +0 -63
  370. package/lib/cjs/server/telemetry.js +0 -167
  371. package/lib/cjs/server/testsFiles/parser.js +0 -56
  372. package/lib/cjs/server/testsFiles/register.js +0 -42
  373. package/lib/cjs/server/update.js +0 -62
  374. package/lib/cjs/server/utils.js +0 -144
  375. package/lib/cjs/server/worker/chai-image.js +0 -116
  376. package/lib/cjs/server/worker/helpers.js +0 -59
  377. package/lib/cjs/server/worker/index.js +0 -13
  378. package/lib/cjs/server/worker/reporter.js +0 -93
  379. package/lib/cjs/server/worker/worker.js +0 -238
  380. package/lib/cjs/shared/index.js +0 -87
  381. package/lib/cjs/shared/serializeRegExp.js +0 -34
  382. package/lib/cjs/types.js +0 -65
  383. package/lib/esm/cli.js +0 -4
  384. package/lib/esm/client/addon/Manager.js +0 -185
  385. package/lib/esm/client/addon/components/Addon.js +0 -39
  386. package/lib/esm/client/addon/components/Icons.js +0 -31
  387. package/lib/esm/client/addon/components/Panel.js +0 -51
  388. package/lib/esm/client/addon/components/TestSelect.js +0 -45
  389. package/lib/esm/client/addon/components/Tools.js +0 -75
  390. package/lib/esm/client/addon/decorator.js +0 -2
  391. package/lib/esm/client/addon/index.js +0 -2
  392. package/lib/esm/client/addon/preview.js +0 -5
  393. package/lib/esm/client/addon/readyForCapture.js +0 -3
  394. package/lib/esm/client/addon/register.js +0 -49
  395. package/lib/esm/client/addon/utils.js +0 -27
  396. package/lib/esm/client/addon/withCreevey.js +0 -263
  397. package/lib/esm/client/shared/components/ImagesView/BlendView.js +0 -67
  398. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +0 -67
  399. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +0 -131
  400. package/lib/esm/client/shared/components/ImagesView/SwapView.js +0 -71
  401. package/lib/esm/client/shared/components/ImagesView/index.js +0 -5
  402. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +0 -36
  403. package/lib/esm/client/shared/components/PageFooter/Paging.js +0 -70
  404. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +0 -79
  405. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +0 -92
  406. package/lib/esm/client/shared/components/ResultsPage.js +0 -107
  407. package/lib/esm/client/shared/creeveyClientApi.js +0 -60
  408. package/lib/esm/client/shared/helpers.js +0 -327
  409. package/lib/esm/client/shared/viewMode.js +0 -6
  410. package/lib/esm/client/web/192.js +0 -1
  411. package/lib/esm/client/web/632.js +0 -43
  412. package/lib/esm/client/web/794.js +0 -1
  413. package/lib/esm/client/web/main.js +0 -79
  414. package/lib/esm/client/web/main.js.LICENSE.txt +0 -34
  415. package/lib/esm/creevey.js +0 -53
  416. package/lib/esm/index.js +0 -4
  417. package/lib/esm/server/config.js +0 -66
  418. package/lib/esm/server/docker.js +0 -115
  419. package/lib/esm/server/index.js +0 -50
  420. package/lib/esm/server/master/api.js +0 -51
  421. package/lib/esm/server/master/index.js +0 -115
  422. package/lib/esm/server/master/master.js +0 -33
  423. package/lib/esm/server/master/pool.js +0 -154
  424. package/lib/esm/server/master/runner.js +0 -246
  425. package/lib/esm/server/master/server.js +0 -103
  426. package/lib/esm/server/messages.js +0 -200
  427. package/lib/esm/server/selenium/browser.js +0 -631
  428. package/lib/esm/server/selenium/index.js +0 -2
  429. package/lib/esm/server/selenium/selenoid.js +0 -140
  430. package/lib/esm/server/stories.js +0 -139
  431. package/lib/esm/server/storybook/providers/browser.js +0 -56
  432. package/lib/esm/server/storybook/providers/hybrid.js +0 -53
  433. package/lib/esm/server/telemetry.js +0 -160
  434. package/lib/esm/server/testsFiles/parser.js +0 -44
  435. package/lib/esm/server/testsFiles/register.js +0 -34
  436. package/lib/esm/server/update.js +0 -53
  437. package/lib/esm/server/utils.js +0 -125
  438. package/lib/esm/server/worker/chai-image.js +0 -109
  439. package/lib/esm/server/worker/helpers.js +0 -53
  440. package/lib/esm/server/worker/index.js +0 -1
  441. package/lib/esm/server/worker/reporter.js +0 -84
  442. package/lib/esm/server/worker/worker.js +0 -231
  443. package/lib/esm/shared/index.js +0 -77
  444. package/lib/esm/shared/serializeRegExp.js +0 -24
  445. package/lib/esm/types.js +0 -47
  446. package/lib/types/cli.d.ts +0 -1
  447. package/lib/types/client/addon/components/Addon.d.ts +0 -9
  448. package/lib/types/client/addon/components/Tools.d.ts +0 -7
  449. package/lib/types/client/addon/index.d.ts +0 -2
  450. package/lib/types/client/addon/register.d.ts +0 -3
  451. package/lib/types/client/shared/components/ImagesView/index.d.ts +0 -5
  452. package/lib/types/client/web/CreeveyLoader.d.ts +0 -3
  453. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +0 -1
  454. package/lib/types/index.d.ts +0 -6
  455. package/lib/types/server/master/index.d.ts +0 -3
  456. package/lib/types/server/master/server.d.ts +0 -2
  457. package/lib/types/server/selenium/index.d.ts +0 -2
  458. package/lib/types/server/storybook/providers/browser.d.ts +0 -2
  459. package/lib/types/server/storybook/providers/hybrid.d.ts +0 -2
  460. package/lib/types/server/testsFiles/register.d.ts +0 -2
  461. package/lib/types/server/update.d.ts +0 -2
  462. package/lib/types/server/worker/index.d.ts +0 -1
  463. package/lib/types/server/worker/worker.d.ts +0 -4
  464. package/types/babel__register.d.ts +0 -1
  465. package/types/event-source-polyfill.d.ts +0 -6
  466. /package/{lib/types → dist}/client/addon/decorator.d.ts +0 -0
  467. /package/{lib/types/creevey.d.ts → dist/client/addon/manager.d.ts} +0 -0
  468. /package/{lib/types → dist}/client/addon/preset.d.ts +0 -0
  469. /package/{lib/types → dist}/client/addon/preview.d.ts +0 -0
  470. /package/{lib/types → dist}/client/addon/readyForCapture.d.ts +0 -0
  471. /package/{lib/cjs → dist}/client/web/main.js.LICENSE.txt +0 -0
  472. /package/{lib/types → dist}/server/telemetry.d.ts +0 -0
  473. /package/{lib/types → dist}/server/worker/reporter.d.ts +0 -0
  474. /package/{lib/types → dist}/shared/serializeRegExp.d.ts +0 -0
  475. /package/{addon → manager}/README.md +0 -0
@@ -1,125 +0,0 @@
1
- import { createWriteStream, existsSync, readFileSync, readdirSync, unlink } from 'fs';
2
- import cluster from 'cluster';
3
- import { isDefined, noop, isFunction } from '../types';
4
- import { emitShutdownMessage, sendShutdownMessage } from './messages';
5
- import findCacheDir from 'find-cache-dir';
6
- import { get } from 'https';
7
- export const isShuttingDown = {
8
- current: false
9
- };
10
- export const LOCALHOST_REGEXP = /(localhost|127\.0\.0\.1)/i;
11
- export const extensions = ['.js', '.jsx', '.ts', '.tsx'];
12
- export const skipOptionKeys = ['in', 'kinds', 'stories', 'tests', 'reason'];
13
- function matchBy(pattern, value) {
14
- return typeof pattern == 'string' && pattern == value || Array.isArray(pattern) && pattern.includes(value) || pattern instanceof RegExp && pattern.test(value) || !isDefined(pattern);
15
- }
16
- export function shouldSkip(browser, meta, skipOptions, test) {
17
- if (typeof skipOptions != 'object') {
18
- return skipOptions;
19
- }
20
- for (const skipKey in skipOptions) {
21
- const reason = shouldSkipByOption(browser, meta, skipOptions[skipKey], skipKey, test);
22
- if (reason) return reason;
23
- }
24
- return false;
25
- }
26
- export function shouldSkipByOption(browser, meta, skipOption, reason, test) {
27
- if (Array.isArray(skipOption)) {
28
- for (const skip of skipOption) {
29
- const result = shouldSkipByOption(browser, meta, skip, reason, test);
30
- if (result) return result;
31
- }
32
- return false;
33
- }
34
- const {
35
- in: browsers,
36
- kinds,
37
- stories,
38
- tests
39
- } = skipOption;
40
- const {
41
- kind,
42
- story
43
- } = meta;
44
- const skipByBrowser = matchBy(browsers, browser);
45
- const skipByKind = matchBy(kinds, kind);
46
- const skipByStory = matchBy(stories, story);
47
- const skipByTest = !isDefined(test) || matchBy(tests, test);
48
- return skipByBrowser && skipByKind && skipByStory && skipByTest && reason;
49
- }
50
- export async function shutdownWorkers() {
51
- isShuttingDown.current = true;
52
- await Promise.all(Object.values(cluster.workers ?? {}).filter(isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
53
- const timeout = setTimeout(() => worker.kill(), 10000);
54
- worker.on('exit', () => {
55
- clearTimeout(timeout);
56
- resolve();
57
- });
58
- sendShutdownMessage(worker);
59
- })));
60
- emitShutdownMessage();
61
- }
62
- export function shutdown() {
63
- // eslint-disable-next-line no-process-exit
64
- process.exit();
65
- }
66
- export function getCreeveyCache() {
67
- return findCacheDir({
68
- name: 'creevey',
69
- cwd: __dirname
70
- });
71
- }
72
- export async function runSequence(seq, predicate) {
73
- for (const fn of seq) {
74
- if (predicate()) await fn();
75
- }
76
- }
77
- export function testsToImages(tests) {
78
- return new Set([].concat(...tests.filter(isDefined).map(({
79
- browser,
80
- testName,
81
- storyPath,
82
- results
83
- }) => {
84
- var _results$slice$;
85
- return Object.keys((results === null || results === void 0 || (_results$slice$ = results.slice(-1)[0]) === null || _results$slice$ === void 0 ? void 0 : _results$slice$.images) ?? {}).map(image => `${[...storyPath, testName, browser, browser == image ? undefined : image].filter(isDefined).join('/')}.png`);
86
- })));
87
- }
88
-
89
- // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
90
- export const isInsideDocker = existsSync('/proc/1/cgroup') && /docker/.test(readFileSync('/proc/1/cgroup', 'utf8'));
91
- export const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => get(downloadUrl, response => {
92
- if (response.statusCode == 302) {
93
- const {
94
- location
95
- } = response.headers;
96
- if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
97
- return resolve(downloadBinary(location, destination));
98
- }
99
- if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
100
- const fileStream = createWriteStream(destination);
101
- response.pipe(fileStream);
102
- fileStream.on('finish', () => {
103
- fileStream.close();
104
- resolve();
105
- });
106
- fileStream.on('error', error => {
107
- unlink(destination, noop);
108
- reject(error);
109
- });
110
- }));
111
- export function removeProps(obj, propPath) {
112
- const [prop, ...restPath] = propPath;
113
- if (restPath.length > 0) {
114
- if (typeof prop == 'string') obj[prop] && removeProps(obj[prop], restPath);
115
- if (isFunction(prop)) Object.keys(obj).filter(prop).forEach(key => obj[key] && removeProps(obj[key], restPath));
116
- } else {
117
- if (typeof prop == 'string') delete obj[prop];
118
- if (isFunction(prop)) Object.keys(obj).filter(prop).forEach(key => delete obj[key]);
119
- }
120
- }
121
- export function readDirRecursive(dirPath) {
122
- return [].concat(...readdirSync(dirPath, {
123
- withFileTypes: true
124
- }).map(dirent => dirent.isDirectory() ? readDirRecursive(`${dirPath}/${dirent.name}`) : [`${dirPath}/${dirent.name}`]));
125
- }
@@ -1,109 +0,0 @@
1
- import { PNG } from 'pngjs';
2
- import pixelmatch from 'pixelmatch';
3
- function normalizeImageSize(image, width, height) {
4
- const normalizedImage = Buffer.alloc(4 * width * height);
5
- for (let y = 0; y < height; y++) {
6
- for (let x = 0; x < width; x++) {
7
- const i = (y * width + x) * 4;
8
- if (x < image.width && y < image.height) {
9
- const j = (y * image.width + x) * 4;
10
- normalizedImage[i + 0] = image.data[j + 0];
11
- normalizedImage[i + 1] = image.data[j + 1];
12
- normalizedImage[i + 2] = image.data[j + 2];
13
- normalizedImage[i + 3] = image.data[j + 3];
14
- } else {
15
- normalizedImage[i + 0] = 0;
16
- normalizedImage[i + 1] = 0;
17
- normalizedImage[i + 2] = 0;
18
- normalizedImage[i + 3] = 0;
19
- }
20
- }
21
- }
22
- return normalizedImage;
23
- }
24
- function hasDiffPixels(diff) {
25
- for (let i = 0; i < diff.length; i += 4) {
26
- if (diff[i + 0] == 255 && diff[i + 1] == 0 && diff[i + 2] == 0 && diff[i + 3] == 255) return true;
27
- }
28
- return false;
29
- }
30
- function compareImages(expect, actual, diffOptions) {
31
- const expectImage = PNG.sync.read(expect);
32
- const actualImage = PNG.sync.read(actual);
33
- const width = Math.max(actualImage.width, expectImage.width);
34
- const height = Math.max(actualImage.height, expectImage.height);
35
- const diffImage = new PNG({
36
- width,
37
- height
38
- });
39
- let actualImageData = actualImage.data;
40
- if (actualImage.width < width || actualImage.height < height) {
41
- actualImageData = normalizeImageSize(actualImage, width, height);
42
- }
43
- let expectImageData = expectImage.data;
44
- if (expectImage.width < width || expectImage.height < height) {
45
- expectImageData = normalizeImageSize(expectImage, width, height);
46
- }
47
- pixelmatch(expectImageData, actualImageData, diffImage.data, width, height, diffOptions);
48
- return {
49
- isEqual: !hasDiffPixels(diffImage.data),
50
- diff: PNG.sync.write(diffImage)
51
- };
52
- }
53
- export default function (getExpected, diffOptions) {
54
- return function chaiImage({
55
- Assertion
56
- }, utils) {
57
- async function assertImage(actual, imageName) {
58
- let onCompare = () => Promise.resolve();
59
- let expected = await getExpected(imageName);
60
- if (!(expected instanceof Buffer) && expected != null) ({
61
- expected,
62
- onCompare
63
- } = expected);
64
- if (expected == null) {
65
- await onCompare(actual);
66
- return imageName ? `Expected image '${imageName}' does not exists` : 'Expected image does not exists';
67
- }
68
- if (actual.equals(expected)) return await onCompare(actual);
69
- const {
70
- isEqual,
71
- diff
72
- } = compareImages(expected, actual, diffOptions);
73
- if (isEqual) return await onCompare(actual);
74
- await onCompare(actual, expected, diff);
75
- return imageName ? `Expected image '${imageName}' to match` : 'Expected image to match';
76
- }
77
- utils.addMethod(Assertion.prototype, 'matchImage', async function matchImage(imageName) {
78
- const actual = utils.flag(this, 'object');
79
- const errorMessage = await assertImage(typeof actual == 'string' ? Buffer.from(actual, 'base64') : actual, imageName);
80
- if (errorMessage) {
81
- throw createImageError(imageName ? {
82
- [imageName]: errorMessage
83
- } : errorMessage);
84
- }
85
- });
86
- utils.addMethod(Assertion.prototype, 'matchImages', async function matchImages() {
87
- const errors = {};
88
- await Promise.all(Object.entries(utils.flag(this, 'object')).map(async ([imageName, imageOrBase64]) => {
89
- let errorMessage;
90
- try {
91
- errorMessage = await assertImage(typeof imageOrBase64 == 'string' ? Buffer.from(imageOrBase64, 'base64') : imageOrBase64, imageName);
92
- } catch (error) {
93
- errorMessage = error.stack;
94
- }
95
- if (errorMessage) {
96
- errors[imageName] = errorMessage;
97
- }
98
- }));
99
- if (Object.keys(errors).length > 0) {
100
- throw createImageError(errors);
101
- }
102
- });
103
- };
104
- }
105
- function createImageError(imageErrors) {
106
- const error = new Error('Expected image to match');
107
- error.images = imageErrors;
108
- return error;
109
- }
@@ -1,53 +0,0 @@
1
- import { Suite, Test } from 'mocha';
2
- import { isDefined } from '../../types';
3
- import { loadTestsFromStories } from '../stories';
4
- function findOrCreateSuite(name, parent) {
5
- const suite = parent.suites.find(({
6
- title
7
- }) => title == name) || new Suite(name, parent.ctx);
8
- if (!suite.parent) {
9
- suite.parent = parent;
10
- parent.addSuite(suite);
11
- }
12
- return suite;
13
- }
14
- function createTest(name, fn, skip = false) {
15
- const test = new Test(name, skip ? undefined : fn);
16
- test.pending = Boolean(skip);
17
- // NOTE Can't define skip reason in mocha https://github.com/mochajs/mocha/issues/2026
18
- test.skipReason = skip;
19
- return test;
20
- }
21
- function addTest(rootSuite, test) {
22
- const [testName, ...suitePath] = [...test.storyPath, test.testName].reverse().filter(isDefined);
23
- const suite = suitePath.reduceRight((subSuite, suiteName) => findOrCreateSuite(suiteName, subSuite), rootSuite);
24
- const mochaTest = createTest(testName, test.fn, test.skip);
25
- suite.addTest(mochaTest);
26
- mochaTest.ctx = Object.setPrototypeOf({
27
- id: test.id,
28
- story: test.story
29
- }, suite.ctx);
30
- return mochaTest;
31
- }
32
- function removeTestOrSuite(testOrSuite) {
33
- const {
34
- parent
35
- } = testOrSuite;
36
- if (!parent) return;
37
- if (testOrSuite instanceof Test) parent.tests = parent.tests.filter(test => test != testOrSuite);
38
- if (testOrSuite instanceof Suite) parent.suites = parent.suites.filter(suite => suite != testOrSuite);
39
- if (parent.tests.length == 0 && parent.suites.length == 0) removeTestOrSuite(parent);
40
- }
41
- export async function addTestsFromStories(rootSuite, config, {
42
- browser,
43
- ...options
44
- }) {
45
- const mochaTestsById = new Map();
46
- const tests = await loadTestsFromStories([browser], listener => config.storiesProvider(config, options, listener), testsDiff => Object.entries(testsDiff).forEach(([id, newTest]) => {
47
- const oldTest = mochaTestsById.get(id);
48
- mochaTestsById.delete(id);
49
- if (oldTest) removeTestOrSuite(oldTest);
50
- if (newTest) mochaTestsById.set(id, addTest(rootSuite, newTest));
51
- }));
52
- Object.values(tests).filter(isDefined).forEach(test => mochaTestsById.set(test.id, addTest(rootSuite, test)));
53
- }
@@ -1 +0,0 @@
1
- export { default } from './worker';
@@ -1,84 +0,0 @@
1
- import chalk from 'chalk';
2
- import { reporters } from 'mocha';
3
- import prefix from 'loglevel-plugin-prefix';
4
- import { isDefined, isImageError } from '../../types';
5
- import { getLogger } from '../logger';
6
- const testLevels = {
7
- INFO: chalk.green('PASS'),
8
- WARN: chalk.yellow('START'),
9
- ERROR: chalk.red('FAIL')
10
- };
11
- export class CreeveyReporter extends reporters.Base {
12
- // TODO Output in better way, like vitest, maybe
13
- constructor(runner, options) {
14
- super(runner);
15
- const {
16
- sessionId,
17
- topLevelSuite
18
- } = options.reporterOptions;
19
- const testLogger = getLogger(topLevelSuite);
20
- prefix.apply(testLogger, {
21
- format(level) {
22
- return `${testLevels[level]} => (${topLevelSuite}:${chalk.gray(sessionId)})`;
23
- }
24
- });
25
- runner.on('test', test => testLogger.warn(chalk.cyan(test.titlePath().join('/'))));
26
- runner.on('pass', test => testLogger.info(chalk.cyan(test.titlePath().join('/'))));
27
- runner.on('fail', (test, error) => testLogger.error(chalk.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${chalk.bold(imageName ?? topLevelSuite)}:${error}`, error => `${error.stack ?? error.message}`).join('\n ')));
28
- }
29
- }
30
- export class TeamcityReporter extends reporters.Base {
31
- constructor(runner, options) {
32
- super(runner);
33
- const topLevelSuite = this.escape(options.reporterOptions.topLevelSuite);
34
- const reporterOptions = options.reporterOptions;
35
- runner.on('suite', suite => suite.root ? console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`) : console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`));
36
- runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`));
37
- runner.on('fail', (test, error) => {
38
- Object.entries(reporterOptions.images).forEach(([name, image]) => {
39
- if (!image) return;
40
- const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/');
41
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
42
- const {
43
- error,
44
- ...rest
45
- } = image;
46
- Object.values(rest).filter(isDefined).forEach(fileName => {
47
- console.log(`##teamcity[publishArtifacts '${reporterOptions.reportDir}/${filePath}/${fileName} => report/${filePath}']`);
48
- console.log(`##teamcity[testMetadata testName='${this.escape(test.title)}' type='image' value='report/${filePath}/${fileName}' flowId='${process.pid}']`);
49
- });
50
- });
51
-
52
- // Output failed test as passed due TC don't support retry mechanic
53
- // https://teamcity-support.jetbrains.com/hc/en-us/community/posts/207216829-Count-test-as-successful-if-at-least-one-try-is-successful?page=1#community_comment_207394125
54
-
55
- reporterOptions.willRetry ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`);
56
- });
57
- runner.on('pending', test => console.log(`##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(typeof test.skipReason == 'boolean' ? test.title : test.skipReason)}' flowId='${process.pid}']`));
58
- runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`));
59
- runner.on('suite end', suite => suite.root || console.log(`##teamcity[testSuiteFinished name='${this.escape(suite.title)}' flowId='${process.pid}']`));
60
- runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`));
61
- }
62
- escape = str => {
63
- if (!str) return '';
64
- return str.toString()
65
- // eslint-disable-next-line no-control-regex
66
- .replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'");
67
- };
68
- }
69
- function getErrors(error, imageErrorToString, errorToString) {
70
- const errors = [];
71
- if (!(error instanceof Error)) {
72
- errors.push(error);
73
- } else if (!isImageError(error)) {
74
- errors.push(errorToString(error));
75
- } else if (typeof error.images == 'string') {
76
- errors.push(imageErrorToString(error.images));
77
- } else {
78
- const imageErrors = error.images;
79
- Object.keys(imageErrors).forEach(imageName => {
80
- errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
81
- });
82
- }
83
- return errors;
84
- }
@@ -1,231 +0,0 @@
1
- import { promisify } from 'util';
2
- import fs from 'fs';
3
- import path from 'path';
4
- import chai from 'chai';
5
- import chalk from 'chalk';
6
- import Mocha from 'mocha';
7
- import { Key, until } from 'selenium-webdriver';
8
- import { isImageError } from '../../types';
9
- import { subscribeOn, emitTestMessage, emitWorkerMessage } from '../messages';
10
- import chaiImage from './chai-image';
11
- import { closeBrowser, getBrowser, switchStory } from '../selenium';
12
- import { CreeveyReporter, TeamcityReporter } from './reporter';
13
- import { addTestsFromStories } from './helpers';
14
- import { logger } from '../logger';
15
- const statAsync = promisify(fs.stat);
16
- const readdirAsync = promisify(fs.readdir);
17
- const readFileAsync = promisify(fs.readFile);
18
- const writeFileAsync = promisify(fs.writeFile);
19
- const mkdirAsync = promisify(fs.mkdir);
20
- async function getStat(filePath) {
21
- try {
22
- return await statAsync(filePath);
23
- } catch (error) {
24
- if (typeof error == 'object' && error && error.code === 'ENOENT') {
25
- return null;
26
- }
27
- throw error;
28
- }
29
- }
30
- async function getLastImageNumber(imageDir, imageName) {
31
- const actualImagesRegexp = new RegExp(`${imageName}-actual-(\\d+)\\.png`);
32
- try {
33
- return (await readdirAsync(imageDir)).map(filename => filename.replace(actualImagesRegexp, '$1')).map(Number).filter(x => !isNaN(x)).sort((a, b) => b - a)[0] ?? 0;
34
- } catch (_error) {
35
- return 0;
36
- }
37
- }
38
-
39
- // FIXME browser options hotfix
40
- export default async function worker(config, options) {
41
- var _await$browser$getSes;
42
- let retries = 0;
43
- let images = {};
44
- let error = undefined;
45
- const screenshots = [];
46
- const testScope = [];
47
- function runHandler(failures) {
48
- if (failures > 0 && (error || Object.values(images).some(image => (image === null || image === void 0 ? void 0 : image.error) != null))) {
49
- const isTimeout = hasTimeout(error) || Object.values(images).some(image => hasTimeout(image === null || image === void 0 ? void 0 : image.error));
50
- const payload = {
51
- status: 'failed',
52
- images,
53
- error
54
- };
55
- isTimeout ? emitWorkerMessage({
56
- type: 'error',
57
- payload: {
58
- error: error ?? 'Unknown error'
59
- }
60
- }) : emitTestMessage({
61
- type: 'end',
62
- payload
63
- });
64
- } else {
65
- emitTestMessage({
66
- type: 'end',
67
- payload: {
68
- status: 'success',
69
- images
70
- }
71
- });
72
- }
73
- }
74
- async function saveImages(imageDir, images) {
75
- await mkdirAsync(imageDir, {
76
- recursive: true
77
- });
78
- for (const {
79
- name,
80
- data
81
- } of images) {
82
- await writeFileAsync(path.join(imageDir, name), data);
83
- }
84
- }
85
- async function getExpected(assertImageName) {
86
- // context => [kind, story, test, browser]
87
- // rootSuite -> kindSuite -> storyTest -> [browsers.png]
88
- // rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
89
- const testPath = [...testScope];
90
- const imageName = assertImageName ?? testPath.pop();
91
- const imagesMeta = [];
92
- const reportImageDir = path.join(config.reportDir, ...testPath);
93
- const imageNumber = (await getLastImageNumber(reportImageDir, imageName)) + 1;
94
- const actualImageName = `${imageName}-actual-${imageNumber}.png`;
95
- const image = images[imageName] = images[imageName] ?? {
96
- actual: actualImageName
97
- };
98
- const onCompare = async (actual, expect, diff) => {
99
- imagesMeta.push({
100
- name: image.actual,
101
- data: actual
102
- });
103
- if (diff && expect) {
104
- image.expect = `${imageName}-expect-${imageNumber}.png`;
105
- image.diff = `${imageName}-diff-${imageNumber}.png`;
106
- imagesMeta.push({
107
- name: image.expect,
108
- data: expect
109
- });
110
- imagesMeta.push({
111
- name: image.diff,
112
- data: diff
113
- });
114
- }
115
- if (options.saveReport) {
116
- await saveImages(reportImageDir, imagesMeta);
117
- }
118
- };
119
- const expectImageDir = path.join(config.screenDir, ...testPath);
120
- const expectImageStat = await getStat(path.join(expectImageDir, `${imageName}.png`));
121
- if (!expectImageStat) return {
122
- expected: null,
123
- onCompare
124
- };
125
- const expected = await readFileAsync(path.join(expectImageDir, `${imageName}.png`));
126
- return {
127
- expected,
128
- onCompare
129
- };
130
- }
131
- const mochaOptions = {
132
- timeout: 30000,
133
- reporter: process.env.TEAMCITY_VERSION ? TeamcityReporter : options.reporter || CreeveyReporter,
134
- reporterOptions: {
135
- reportDir: config.reportDir,
136
- topLevelSuite: options.browser,
137
- get willRetry() {
138
- return retries < config.maxRetries;
139
- },
140
- get images() {
141
- return images;
142
- },
143
- get sessionId() {
144
- return sessionId;
145
- }
146
- }
147
- };
148
- const mocha = new Mocha(mochaOptions);
149
- mocha.cleanReferencesAfterRun(false);
150
- chai.use(chaiImage(getExpected, config.diffOptions));
151
- if ((await getBrowser(config, options)) == null) return;
152
- await addTestsFromStories(mocha.suite, config, {
153
- browser: options.browser,
154
- watch: options.ui,
155
- debug: options.debug,
156
- port: options.port
157
- });
158
- try {
159
- var _await$getBrowser;
160
- await ((_await$getBrowser = await getBrowser(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
161
- } catch (_) {
162
- await closeBrowser();
163
- }
164
- const browser = await getBrowser(config, options);
165
- const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
166
- if (browser == null) return;
167
- if (options.debug) {
168
- const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
169
- logger.debug(`${options.browser}:${chalk.gray(sessionId)}`, 'current url', chalk.magenta(url));
170
- }), 10 * 1000);
171
- subscribeOn('shutdown', () => clearInterval(interval));
172
- }
173
- mocha.suite.beforeAll(function () {
174
- this.config = config;
175
- this.browser = browser;
176
- this.until = until;
177
- this.keys = Key;
178
- this.expect = chai.expect;
179
- this.browserName = options.browser;
180
- this.testScope = testScope;
181
- this.screenshots = screenshots;
182
- });
183
- mocha.suite.beforeEach(switchStory);
184
- if (options.trace) {
185
- mocha.suite.afterEach(async function () {
186
- const types = await (browser === null || browser === void 0 ? void 0 : browser.manage().logs().getAvailableLogTypes());
187
- for (const type of types ?? []) {
188
- const logs = await (browser === null || browser === void 0 ? void 0 : browser.manage().logs().get(type));
189
- logs.forEach(log => {
190
- var _this$currentTest;
191
- return logger.trace(sessionId, (_this$currentTest = this.currentTest) === null || _this$currentTest === void 0 ? void 0 : _this$currentTest.titlePath().join('/'), log.toJSON());
192
- });
193
- }
194
- });
195
- }
196
- subscribeOn('test', message => {
197
- if (message.type != 'start') return;
198
- const test = message.payload;
199
- const testPath = test.path.join(' ').replace(/[|\\{}()[\]^$+*?.-]/g, '\\$&');
200
- images = {};
201
- error = undefined;
202
- retries = test.retries;
203
- mocha.grep(new RegExp(`^${testPath}$`));
204
- const runner = mocha.run(runHandler);
205
-
206
- // TODO How handle browser corruption?
207
- runner.on('fail', (_test, reason) => {
208
- if (!(reason instanceof Error)) {
209
- error = reason;
210
- } else if (!isImageError(reason)) {
211
- error = reason.stack ?? reason.message;
212
- } else if (typeof reason.images == 'string') {
213
- const image = images[testScope.slice(-1)[0]];
214
- if (image) image.error = reason.images;
215
- } else {
216
- const imageErrors = reason.images;
217
- Object.keys(imageErrors).forEach(imageName => {
218
- const image = images[imageName];
219
- if (image) image.error = imageErrors[imageName];
220
- });
221
- }
222
- });
223
- });
224
- logger.info(`${options.browser}:${chalk.gray(sessionId)} is ready`);
225
- emitWorkerMessage({
226
- type: 'ready'
227
- });
228
- }
229
- function hasTimeout(str) {
230
- return str != null && str.toLowerCase().includes('timeout');
231
- }
@@ -1,77 +0,0 @@
1
- import { mapValues, mergeWith, cloneDeepWith } from 'lodash';
2
- import { deserializeRegExp, isSerializedRegExp, isRegExp, serializeRegExp } from './serializeRegExp';
3
-
4
- // NOTE: Copy-paste from storybook/api
5
- export const combineParameters = function () {
6
- for (var _len = arguments.length, parameterSets = new Array(_len), _key = 0; _key < _len; _key++) {
7
- parameterSets[_key] = arguments[_key];
8
- }
9
- return (
10
- // eslint-disable-next-line @typescript-eslint/no-unsafe-return
11
- mergeWith({}, ...parameterSets, (_, srcValue) => {
12
- // Treat arrays as scalars:
13
- if (Array.isArray(srcValue)) return srcValue;
14
- return undefined;
15
- })
16
- );
17
- };
18
-
19
- // NOTE: Copy-paste from storybook/api
20
- export const denormalizeStoryParameters = _ref => {
21
- let {
22
- globalParameters,
23
- kindParameters,
24
- stories
25
- } = _ref;
26
- return mapValues(stories, storyData => ({
27
- ...storyData,
28
- parameters: combineParameters(globalParameters, kindParameters[storyData.kind] ?? {}, storyData.parameters)
29
- }));
30
- };
31
- export const serializeRawStories = stories => {
32
- return mapValues(stories, storyData => {
33
- const creevey = storyData.parameters.creevey;
34
- if (creevey?.skip) {
35
- return {
36
- ...storyData,
37
- parameters: {
38
- ...storyData.parameters,
39
- creevey: {
40
- ...creevey,
41
- skip: cloneDeepWith(creevey.skip, value => {
42
- if (isRegExp(value)) {
43
- return serializeRegExp(value);
44
- }
45
- return undefined;
46
- })
47
- }
48
- }
49
- };
50
- }
51
- return storyData;
52
- });
53
- };
54
- export const deserializeRawStories = stories => {
55
- return mapValues(stories, deserializeStory);
56
- };
57
- export const deserializeStory = story => {
58
- const creevey = story.parameters.creevey;
59
- if (creevey?.skip) {
60
- return {
61
- ...story,
62
- parameters: {
63
- ...story.parameters,
64
- creevey: {
65
- ...creevey,
66
- skip: cloneDeepWith(creevey.skip, value => {
67
- if (isSerializedRegExp(value)) {
68
- return deserializeRegExp(value);
69
- }
70
- return undefined;
71
- })
72
- }
73
- }
74
- };
75
- }
76
- return story;
77
- };