creevey 0.9.0-beta.20 → 0.9.0-beta.21

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 (477) 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 +84 -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 +9 -9
  203. package/dist/server/utils.js +142 -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/eslint.config.mjs +62 -0
  230. package/manager/package.json +3 -0
  231. package/package.json +76 -103
  232. package/preset/README.md +3 -0
  233. package/preset/package.json +3 -0
  234. package/preview/README.md +3 -0
  235. package/preview/package.json +3 -0
  236. package/src/cli.ts +3 -0
  237. package/src/client/addon/components/Addon.tsx +53 -0
  238. package/src/client/addon/components/Icons.tsx +28 -0
  239. package/src/client/addon/components/Panel.tsx +53 -0
  240. package/src/client/addon/components/TestSelect.tsx +48 -0
  241. package/src/client/addon/components/Tools.tsx +93 -0
  242. package/src/client/addon/controller.ts +224 -0
  243. package/src/client/addon/decorator.ts +3 -0
  244. package/src/client/addon/index.ts +2 -0
  245. package/src/client/addon/manager.ts +44 -0
  246. package/{lib/esm/client/addon/preset.js → src/client/addon/preset.ts} +2 -1
  247. package/src/client/addon/preview.ts +7 -0
  248. package/src/client/addon/readyForCapture.ts +9 -0
  249. package/src/client/addon/utils.tsx +24 -0
  250. package/src/client/addon/withCreevey.ts +326 -0
  251. package/src/client/shared/components/ImagesView/BlendView.tsx +71 -0
  252. package/src/client/shared/components/ImagesView/ImagesView.tsx +62 -0
  253. package/src/client/shared/components/ImagesView/SideBySideView.tsx +139 -0
  254. package/{lib/esm/client/shared/components/ImagesView/SlideView.js → src/client/shared/components/ImagesView/SlideView.tsx} +78 -75
  255. package/src/client/shared/components/ImagesView/SwapView.tsx +81 -0
  256. package/src/client/shared/components/ImagesView/common.ts +23 -0
  257. package/src/client/shared/components/ImagesView/index.ts +5 -0
  258. package/src/client/shared/components/PageFooter/PageFooter.tsx +44 -0
  259. package/src/client/shared/components/PageFooter/Paging.tsx +105 -0
  260. package/src/client/shared/components/PageHeader/ImagePreview.tsx +82 -0
  261. package/src/client/shared/components/PageHeader/PageHeader.tsx +123 -0
  262. package/src/client/shared/components/ResultsPage.tsx +135 -0
  263. package/src/client/shared/creeveyClientApi.ts +64 -0
  264. package/src/client/shared/helpers.ts +422 -0
  265. package/src/client/shared/viewMode.ts +10 -0
  266. package/src/client/web/CreeveyApp.tsx +177 -0
  267. package/src/client/web/CreeveyContext.tsx +20 -0
  268. package/src/client/web/CreeveyLoader.tsx +56 -0
  269. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +118 -0
  270. package/src/client/web/CreeveyView/SideBar/Search.tsx +140 -0
  271. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +125 -0
  272. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +138 -0
  273. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +118 -0
  274. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +67 -0
  275. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +58 -0
  276. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +105 -0
  277. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +85 -0
  278. package/src/client/web/CreeveyView/SideBar/index.ts +1 -0
  279. package/src/client/web/KeyboardEventsContext.tsx +121 -0
  280. package/{lib/esm → src}/client/web/index.html +12 -3
  281. package/src/client/web/index.tsx +63 -0
  282. package/src/creevey.ts +47 -0
  283. package/src/index.ts +4 -0
  284. package/src/server/config.ts +83 -0
  285. package/src/server/docker.ts +136 -0
  286. package/src/server/index.ts +51 -0
  287. package/{lib/esm/server/logger.js → src/server/logger.ts} +8 -6
  288. package/src/server/master/api.ts +55 -0
  289. package/src/server/master/index.ts +111 -0
  290. package/src/server/master/master.ts +47 -0
  291. package/src/server/master/pool.ts +203 -0
  292. package/src/server/master/runner.ts +189 -0
  293. package/src/server/master/server.ts +124 -0
  294. package/src/server/messages.ts +273 -0
  295. package/src/server/selenium/browser.ts +834 -0
  296. package/src/server/selenium/index.ts +2 -0
  297. package/src/server/selenium/selenoid.ts +154 -0
  298. package/src/server/stories.ts +133 -0
  299. package/src/server/storybook/providers/browser.ts +58 -0
  300. package/src/server/storybook/providers/hybrid.ts +70 -0
  301. package/src/server/telemetry.ts +212 -0
  302. package/src/server/testsFiles/parser.ts +60 -0
  303. package/src/server/update.ts +74 -0
  304. package/src/server/utils.ts +184 -0
  305. package/src/server/worker/chai-image.ts +147 -0
  306. package/src/server/worker/helpers.ts +61 -0
  307. package/src/server/worker/index.ts +1 -0
  308. package/src/server/worker/reporter.ts +170 -0
  309. package/src/server/worker/worker.ts +234 -0
  310. package/src/shared/index.ts +76 -0
  311. package/src/shared/serializeRegExp.ts +26 -0
  312. package/src/types.ts +500 -0
  313. package/types/chai.d.ts +0 -1
  314. package/types/global.d.ts +1 -1
  315. package/types/mocha.d.ts +1 -1
  316. package/webpack.config.mjs +46 -0
  317. package/.yarn/install-state.gz +0 -0
  318. package/addon/package.json +0 -5
  319. package/jest.config.js +0 -6
  320. package/lib/cjs/cli.js +0 -6
  321. package/lib/cjs/client/addon/Manager.js +0 -192
  322. package/lib/cjs/client/addon/components/Addon.js +0 -48
  323. package/lib/cjs/client/addon/components/Icons.js +0 -40
  324. package/lib/cjs/client/addon/components/Panel.js +0 -59
  325. package/lib/cjs/client/addon/components/TestSelect.js +0 -52
  326. package/lib/cjs/client/addon/components/Tools.js +0 -84
  327. package/lib/cjs/client/addon/decorator.js +0 -8
  328. package/lib/cjs/client/addon/index.js +0 -27
  329. package/lib/cjs/client/addon/preset.js +0 -8
  330. package/lib/cjs/client/addon/preview.js +0 -11
  331. package/lib/cjs/client/addon/readyForCapture.js +0 -9
  332. package/lib/cjs/client/addon/register.js +0 -57
  333. package/lib/cjs/client/addon/utils.js +0 -34
  334. package/lib/cjs/client/addon/withCreevey.js +0 -272
  335. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +0 -75
  336. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +0 -76
  337. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +0 -139
  338. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +0 -151
  339. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +0 -79
  340. package/lib/cjs/client/shared/components/ImagesView/index.js +0 -40
  341. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +0 -43
  342. package/lib/cjs/client/shared/components/PageFooter/Paging.js +0 -77
  343. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +0 -86
  344. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +0 -100
  345. package/lib/cjs/client/shared/components/ResultsPage.js +0 -116
  346. package/lib/cjs/client/shared/creeveyClientApi.js +0 -66
  347. package/lib/cjs/client/shared/helpers.js +0 -357
  348. package/lib/cjs/client/shared/viewMode.js +0 -13
  349. package/lib/cjs/client/web/192.js +0 -1
  350. package/lib/cjs/client/web/632.js +0 -43
  351. package/lib/cjs/client/web/794.js +0 -1
  352. package/lib/cjs/client/web/main.js +0 -79
  353. package/lib/cjs/creevey.js +0 -56
  354. package/lib/cjs/index.js +0 -47
  355. package/lib/cjs/server/config.js +0 -76
  356. package/lib/cjs/server/docker.js +0 -124
  357. package/lib/cjs/server/index.js +0 -58
  358. package/lib/cjs/server/logger.js +0 -34
  359. package/lib/cjs/server/master/api.js +0 -58
  360. package/lib/cjs/server/master/index.js +0 -122
  361. package/lib/cjs/server/master/master.js +0 -42
  362. package/lib/cjs/server/master/pool.js +0 -163
  363. package/lib/cjs/server/master/runner.js +0 -254
  364. package/lib/cjs/server/master/server.js +0 -110
  365. package/lib/cjs/server/messages.js +0 -218
  366. package/lib/cjs/server/selenium/browser.js +0 -644
  367. package/lib/cjs/server/selenium/index.js +0 -27
  368. package/lib/cjs/server/selenium/selenoid.js +0 -148
  369. package/lib/cjs/server/stories.js +0 -148
  370. package/lib/cjs/server/storybook/providers/browser.js +0 -64
  371. package/lib/cjs/server/storybook/providers/hybrid.js +0 -63
  372. package/lib/cjs/server/telemetry.js +0 -167
  373. package/lib/cjs/server/testsFiles/parser.js +0 -56
  374. package/lib/cjs/server/testsFiles/register.js +0 -42
  375. package/lib/cjs/server/update.js +0 -62
  376. package/lib/cjs/server/utils.js +0 -144
  377. package/lib/cjs/server/worker/chai-image.js +0 -116
  378. package/lib/cjs/server/worker/helpers.js +0 -59
  379. package/lib/cjs/server/worker/index.js +0 -13
  380. package/lib/cjs/server/worker/reporter.js +0 -93
  381. package/lib/cjs/server/worker/worker.js +0 -238
  382. package/lib/cjs/shared/index.js +0 -87
  383. package/lib/cjs/shared/serializeRegExp.js +0 -34
  384. package/lib/cjs/types.js +0 -65
  385. package/lib/esm/cli.js +0 -4
  386. package/lib/esm/client/addon/Manager.js +0 -185
  387. package/lib/esm/client/addon/components/Addon.js +0 -39
  388. package/lib/esm/client/addon/components/Icons.js +0 -31
  389. package/lib/esm/client/addon/components/Panel.js +0 -51
  390. package/lib/esm/client/addon/components/TestSelect.js +0 -45
  391. package/lib/esm/client/addon/components/Tools.js +0 -75
  392. package/lib/esm/client/addon/decorator.js +0 -2
  393. package/lib/esm/client/addon/index.js +0 -2
  394. package/lib/esm/client/addon/preview.js +0 -5
  395. package/lib/esm/client/addon/readyForCapture.js +0 -3
  396. package/lib/esm/client/addon/register.js +0 -49
  397. package/lib/esm/client/addon/utils.js +0 -27
  398. package/lib/esm/client/addon/withCreevey.js +0 -263
  399. package/lib/esm/client/shared/components/ImagesView/BlendView.js +0 -67
  400. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +0 -67
  401. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +0 -131
  402. package/lib/esm/client/shared/components/ImagesView/SwapView.js +0 -71
  403. package/lib/esm/client/shared/components/ImagesView/index.js +0 -5
  404. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +0 -36
  405. package/lib/esm/client/shared/components/PageFooter/Paging.js +0 -70
  406. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +0 -79
  407. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +0 -92
  408. package/lib/esm/client/shared/components/ResultsPage.js +0 -107
  409. package/lib/esm/client/shared/creeveyClientApi.js +0 -60
  410. package/lib/esm/client/shared/helpers.js +0 -327
  411. package/lib/esm/client/shared/viewMode.js +0 -6
  412. package/lib/esm/client/web/192.js +0 -1
  413. package/lib/esm/client/web/632.js +0 -43
  414. package/lib/esm/client/web/794.js +0 -1
  415. package/lib/esm/client/web/main.js +0 -79
  416. package/lib/esm/client/web/main.js.LICENSE.txt +0 -34
  417. package/lib/esm/creevey.js +0 -53
  418. package/lib/esm/index.js +0 -4
  419. package/lib/esm/server/config.js +0 -66
  420. package/lib/esm/server/docker.js +0 -115
  421. package/lib/esm/server/index.js +0 -50
  422. package/lib/esm/server/master/api.js +0 -51
  423. package/lib/esm/server/master/index.js +0 -115
  424. package/lib/esm/server/master/master.js +0 -33
  425. package/lib/esm/server/master/pool.js +0 -154
  426. package/lib/esm/server/master/runner.js +0 -246
  427. package/lib/esm/server/master/server.js +0 -103
  428. package/lib/esm/server/messages.js +0 -200
  429. package/lib/esm/server/selenium/browser.js +0 -631
  430. package/lib/esm/server/selenium/index.js +0 -2
  431. package/lib/esm/server/selenium/selenoid.js +0 -140
  432. package/lib/esm/server/stories.js +0 -139
  433. package/lib/esm/server/storybook/providers/browser.js +0 -56
  434. package/lib/esm/server/storybook/providers/hybrid.js +0 -53
  435. package/lib/esm/server/telemetry.js +0 -160
  436. package/lib/esm/server/testsFiles/parser.js +0 -44
  437. package/lib/esm/server/testsFiles/register.js +0 -34
  438. package/lib/esm/server/update.js +0 -53
  439. package/lib/esm/server/utils.js +0 -125
  440. package/lib/esm/server/worker/chai-image.js +0 -109
  441. package/lib/esm/server/worker/helpers.js +0 -53
  442. package/lib/esm/server/worker/index.js +0 -1
  443. package/lib/esm/server/worker/reporter.js +0 -84
  444. package/lib/esm/server/worker/worker.js +0 -231
  445. package/lib/esm/shared/index.js +0 -77
  446. package/lib/esm/shared/serializeRegExp.js +0 -24
  447. package/lib/esm/types.js +0 -47
  448. package/lib/types/cli.d.ts +0 -1
  449. package/lib/types/client/addon/components/Addon.d.ts +0 -9
  450. package/lib/types/client/addon/components/Tools.d.ts +0 -7
  451. package/lib/types/client/addon/index.d.ts +0 -2
  452. package/lib/types/client/addon/register.d.ts +0 -3
  453. package/lib/types/client/shared/components/ImagesView/index.d.ts +0 -5
  454. package/lib/types/client/web/CreeveyLoader.d.ts +0 -3
  455. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +0 -1
  456. package/lib/types/index.d.ts +0 -6
  457. package/lib/types/server/master/index.d.ts +0 -3
  458. package/lib/types/server/master/server.d.ts +0 -2
  459. package/lib/types/server/selenium/index.d.ts +0 -2
  460. package/lib/types/server/storybook/providers/browser.d.ts +0 -2
  461. package/lib/types/server/storybook/providers/hybrid.d.ts +0 -2
  462. package/lib/types/server/testsFiles/register.d.ts +0 -2
  463. package/lib/types/server/update.d.ts +0 -2
  464. package/lib/types/server/worker/index.d.ts +0 -1
  465. package/lib/types/server/worker/worker.d.ts +0 -4
  466. package/types/babel__register.d.ts +0 -1
  467. package/types/event-source-polyfill.d.ts +0 -6
  468. /package/{lib/types → dist}/client/addon/decorator.d.ts +0 -0
  469. /package/{lib/types/creevey.d.ts → dist/client/addon/manager.d.ts} +0 -0
  470. /package/{lib/types → dist}/client/addon/preset.d.ts +0 -0
  471. /package/{lib/types → dist}/client/addon/preview.d.ts +0 -0
  472. /package/{lib/types → dist}/client/addon/readyForCapture.d.ts +0 -0
  473. /package/{lib/cjs → dist}/client/web/main.js.LICENSE.txt +0 -0
  474. /package/{lib/types → dist}/server/telemetry.d.ts +0 -0
  475. /package/{lib/types → dist}/server/worker/reporter.d.ts +0 -0
  476. /package/{lib/types → dist}/shared/serializeRegExp.d.ts +0 -0
  477. /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
- };