creevey 0.10.0-beta.9 → 0.10.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/AUTHORS +2 -0
  2. package/CHANGELOG.md +281 -0
  3. package/README.md +19 -41
  4. package/dist/client/addon/components/Addon.js +18 -8
  5. package/dist/client/addon/components/Addon.js.map +1 -1
  6. package/dist/client/addon/components/Panel.js +2 -2
  7. package/dist/client/addon/components/Panel.js.map +1 -1
  8. package/dist/client/addon/components/TestSelect.js +2 -2
  9. package/dist/client/addon/components/TestSelect.js.map +1 -1
  10. package/dist/client/addon/components/Tools.js +19 -9
  11. package/dist/client/addon/components/Tools.js.map +1 -1
  12. package/dist/client/addon/controller.d.ts +1 -1
  13. package/dist/client/addon/controller.js +3 -3
  14. package/dist/client/addon/controller.js.map +1 -1
  15. package/dist/client/addon/decorator.d.ts +1 -1
  16. package/dist/client/addon/makeDecorator.d.ts +9 -0
  17. package/dist/client/addon/makeDecorator.js +48 -0
  18. package/dist/client/addon/makeDecorator.js.map +1 -0
  19. package/dist/client/addon/manager.js +38 -39
  20. package/dist/client/addon/manager.js.map +1 -1
  21. package/dist/client/addon/preset.d.ts +0 -1
  22. package/dist/client/addon/preset.js +3 -2
  23. package/dist/client/addon/preset.js.map +1 -1
  24. package/dist/client/addon/preview.d.ts +1 -1
  25. package/dist/client/addon/withCreevey.d.ts +5 -3
  26. package/dist/client/addon/withCreevey.js +5 -20
  27. package/dist/client/addon/withCreevey.js.map +1 -1
  28. package/dist/client/shared/components/ImagesView/BlendView.d.ts +2 -2
  29. package/dist/client/shared/components/ImagesView/BlendView.js +18 -8
  30. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  31. package/dist/client/shared/components/ImagesView/ImagesView.js +1 -1
  32. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
  33. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
  34. package/dist/client/shared/components/ImagesView/SideBySideView.js +19 -9
  35. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  36. package/dist/client/shared/components/ImagesView/SlideView.d.ts +2 -2
  37. package/dist/client/shared/components/ImagesView/SlideView.js +19 -9
  38. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  39. package/dist/client/shared/components/ImagesView/SwapView.d.ts +2 -2
  40. package/dist/client/shared/components/ImagesView/SwapView.js +19 -9
  41. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  42. package/dist/client/shared/components/ImagesView/common.d.ts +1 -1
  43. package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
  44. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
  45. package/dist/client/shared/components/PageFooter/Paging.js +1 -1
  46. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
  47. package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +2 -2
  48. package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -1
  49. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  50. package/dist/client/shared/components/PageHeader/PageHeader.js +34 -13
  51. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  52. package/dist/client/shared/components/ResultsPage.d.ts +2 -2
  53. package/dist/client/shared/components/ResultsPage.js +22 -10
  54. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  55. package/dist/client/shared/creeveyClientApi.js +18 -1
  56. package/dist/client/shared/creeveyClientApi.js.map +1 -1
  57. package/dist/client/shared/helpers.d.ts +1 -3
  58. package/dist/client/shared/helpers.js +4 -19
  59. package/dist/client/shared/helpers.js.map +1 -1
  60. package/dist/client/web/CreeveyApp.d.ts +1 -0
  61. package/dist/client/web/CreeveyApp.js +22 -9
  62. package/dist/client/web/CreeveyApp.js.map +1 -1
  63. package/dist/client/web/CreeveyContext.d.ts +1 -0
  64. package/dist/client/web/CreeveyContext.js +18 -7
  65. package/dist/client/web/CreeveyContext.js.map +1 -1
  66. package/dist/client/web/CreeveyLoader.d.ts +1 -1
  67. package/dist/client/web/CreeveyLoader.js +3 -3
  68. package/dist/client/web/CreeveyLoader.js.map +1 -1
  69. package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -4
  70. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +36 -6
  71. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
  72. package/dist/client/web/CreeveyView/SideBar/Search.js +18 -8
  73. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  74. package/dist/client/web/CreeveyView/SideBar/SideBar.js +26 -12
  75. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  76. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +28 -17
  77. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  78. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +32 -12
  79. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  80. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
  81. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +20 -11
  82. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  83. package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -11
  84. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  85. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
  86. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +2 -2
  87. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
  88. package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +2 -2
  89. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +3 -2
  90. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  91. package/dist/client/web/CreeveyView/SideBar/Toggle.js +1 -1
  92. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
  93. package/dist/client/web/KeyboardEventsContext.js +17 -7
  94. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  95. package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
  96. package/dist/client/web/index.html +1 -1
  97. package/dist/client/web/index.js +26 -11
  98. package/dist/client/web/index.js.map +1 -1
  99. package/dist/client/web/themes.d.ts +2 -0
  100. package/dist/client/web/themes.js +22 -0
  101. package/dist/client/web/themes.js.map +1 -0
  102. package/dist/creevey.d.ts +1 -1
  103. package/dist/creevey.js +122 -41
  104. package/dist/creevey.js.map +1 -1
  105. package/dist/index.d.ts +1 -0
  106. package/dist/playwright/generator.d.ts +25 -0
  107. package/dist/playwright/generator.js +243 -0
  108. package/dist/playwright/generator.js.map +1 -0
  109. package/dist/playwright/helpers.d.ts +2 -0
  110. package/dist/playwright/helpers.js +29 -0
  111. package/dist/playwright/helpers.js.map +1 -0
  112. package/dist/playwright/reporter.d.ts +83 -0
  113. package/dist/playwright/reporter.js +334 -0
  114. package/dist/playwright/reporter.js.map +1 -0
  115. package/dist/playwright/setup.d.ts +3 -0
  116. package/dist/playwright/setup.js +72 -0
  117. package/dist/playwright/setup.js.map +1 -0
  118. package/dist/playwright.d.ts +1 -0
  119. package/dist/playwright.js +3 -1
  120. package/dist/playwright.js.map +1 -1
  121. package/dist/server/compare.d.ts +18 -0
  122. package/dist/server/compare.js +182 -0
  123. package/dist/server/compare.js.map +1 -0
  124. package/dist/server/config.d.ts +3 -3
  125. package/dist/server/config.js +75 -8
  126. package/dist/server/config.js.map +1 -1
  127. package/dist/server/connection.d.ts +3 -0
  128. package/dist/server/connection.js +28 -0
  129. package/dist/server/connection.js.map +1 -0
  130. package/dist/server/docker.d.ts +1 -1
  131. package/dist/server/docker.js +54 -32
  132. package/dist/server/docker.js.map +1 -1
  133. package/dist/server/index.d.ts +2 -2
  134. package/dist/server/index.js +161 -64
  135. package/dist/server/index.js.map +1 -1
  136. package/dist/server/master/api.d.ts +11 -6
  137. package/dist/server/master/api.js +88 -25
  138. package/dist/server/master/api.js.map +1 -1
  139. package/dist/server/master/handlers/capture-handler.d.ts +5 -0
  140. package/dist/server/master/handlers/capture-handler.js +25 -0
  141. package/dist/server/master/handlers/capture-handler.js.map +1 -0
  142. package/dist/server/master/handlers/index.d.ts +4 -0
  143. package/dist/server/master/handlers/index.js +21 -0
  144. package/dist/server/master/handlers/index.js.map +1 -0
  145. package/dist/server/master/handlers/ping-handler.d.ts +2 -0
  146. package/dist/server/master/handlers/ping-handler.js +8 -0
  147. package/dist/server/master/handlers/ping-handler.js.map +1 -0
  148. package/dist/server/master/handlers/static-handler.d.ts +1 -0
  149. package/dist/server/master/handlers/static-handler.js +20 -0
  150. package/dist/server/master/handlers/static-handler.js.map +1 -0
  151. package/dist/server/master/handlers/stories-handler.d.ts +4 -0
  152. package/dist/server/master/handlers/stories-handler.js +24 -0
  153. package/dist/server/master/handlers/stories-handler.js.map +1 -0
  154. package/dist/server/master/master.js +7 -24
  155. package/dist/server/master/master.js.map +1 -1
  156. package/dist/server/master/pool.d.ts +1 -0
  157. package/dist/server/master/pool.js +5 -3
  158. package/dist/server/master/pool.js.map +1 -1
  159. package/dist/server/master/queue.d.ts +1 -1
  160. package/dist/server/master/queue.js +14 -6
  161. package/dist/server/master/queue.js.map +1 -1
  162. package/dist/server/master/runner.d.ts +6 -6
  163. package/dist/server/master/runner.js +98 -130
  164. package/dist/server/master/runner.js.map +1 -1
  165. package/dist/server/master/server.d.ts +1 -1
  166. package/dist/server/master/server.js +193 -88
  167. package/dist/server/master/server.js.map +1 -1
  168. package/dist/server/master/start.d.ts +1 -2
  169. package/dist/server/master/start.js +13 -29
  170. package/dist/server/master/start.js.map +1 -1
  171. package/dist/server/master/testsManager.d.ts +81 -0
  172. package/dist/server/master/testsManager.js +282 -0
  173. package/dist/server/master/testsManager.js.map +1 -0
  174. package/dist/server/playwright/docker-file.d.ts +1 -1
  175. package/dist/server/playwright/docker-file.js +17 -8
  176. package/dist/server/playwright/docker-file.js.map +1 -1
  177. package/dist/server/playwright/docker.d.ts +2 -1
  178. package/dist/server/playwright/docker.js +10 -2
  179. package/dist/server/playwright/docker.js.map +1 -1
  180. package/dist/server/playwright/index-source.mjs +16 -0
  181. package/dist/server/playwright/internal.d.ts +7 -7
  182. package/dist/server/playwright/internal.js +137 -79
  183. package/dist/server/playwright/internal.js.map +1 -1
  184. package/dist/server/playwright/webdriver.d.ts +3 -3
  185. package/dist/server/playwright/webdriver.js +0 -6
  186. package/dist/server/playwright/webdriver.js.map +1 -1
  187. package/dist/server/providers/browser.js +4 -3
  188. package/dist/server/providers/browser.js.map +1 -1
  189. package/dist/server/providers/hybrid.js +2 -2
  190. package/dist/server/providers/hybrid.js.map +1 -1
  191. package/dist/server/report.d.ts +10 -0
  192. package/dist/server/report.js +45 -0
  193. package/dist/server/report.js.map +1 -0
  194. package/dist/server/reporters/creevey.d.ts +7 -0
  195. package/dist/server/reporters/creevey.js +63 -0
  196. package/dist/server/reporters/creevey.js.map +1 -0
  197. package/dist/server/reporters/index.d.ts +2 -0
  198. package/dist/server/reporters/index.js +16 -0
  199. package/dist/server/reporters/index.js.map +1 -0
  200. package/dist/server/reporters/junit.d.ts +16 -0
  201. package/dist/server/reporters/junit.js +167 -0
  202. package/dist/server/reporters/junit.js.map +1 -0
  203. package/dist/server/reporters/teamcity.d.ts +7 -0
  204. package/dist/server/reporters/teamcity.js +60 -0
  205. package/dist/server/reporters/teamcity.js.map +1 -0
  206. package/dist/server/selenium/internal.d.ts +3 -3
  207. package/dist/server/selenium/internal.js +48 -34
  208. package/dist/server/selenium/internal.js.map +1 -1
  209. package/dist/server/selenium/selenoid.js +12 -6
  210. package/dist/server/selenium/selenoid.js.map +1 -1
  211. package/dist/server/selenium/webdriver.d.ts +3 -3
  212. package/dist/server/selenium/webdriver.js +4 -8
  213. package/dist/server/selenium/webdriver.js.map +1 -1
  214. package/dist/server/shutdown.d.ts +1 -0
  215. package/dist/server/shutdown.js +23 -0
  216. package/dist/server/shutdown.js.map +1 -0
  217. package/dist/server/stories.d.ts +0 -1
  218. package/dist/server/stories.js +0 -12
  219. package/dist/server/stories.js.map +1 -1
  220. package/dist/server/telemetry.js +3 -3
  221. package/dist/server/telemetry.js.map +1 -1
  222. package/dist/server/testsFiles/parser.js +45 -5
  223. package/dist/server/testsFiles/parser.js.map +1 -1
  224. package/dist/server/utils.d.ts +23 -0
  225. package/dist/server/utils.js +113 -13
  226. package/dist/server/utils.js.map +1 -1
  227. package/dist/server/webdriver.d.ts +1 -1
  228. package/dist/server/worker/context.d.ts +3 -0
  229. package/dist/server/worker/context.js +15 -0
  230. package/dist/server/worker/context.js.map +1 -0
  231. package/dist/server/worker/match-image.d.ts +8 -12
  232. package/dist/server/worker/match-image.js +11 -178
  233. package/dist/server/worker/match-image.js.map +1 -1
  234. package/dist/server/worker/start.d.ts +2 -2
  235. package/dist/server/worker/start.js +27 -63
  236. package/dist/server/worker/start.js.map +1 -1
  237. package/dist/shared/index.d.ts +1 -1
  238. package/dist/shared/index.js +9 -7
  239. package/dist/shared/index.js.map +1 -1
  240. package/dist/types.d.ts +84 -43
  241. package/dist/types.js +65 -1
  242. package/dist/types.js.map +1 -1
  243. package/docs/cli.md +80 -0
  244. package/docs/config.md +179 -165
  245. package/docs/examples/playwright-reporer/playwright.config.ts +37 -0
  246. package/docs/migration-0.9-to-0.10.md +144 -0
  247. package/docs/playwright-reporter.md +357 -0
  248. package/docs/storybook.md +60 -0
  249. package/docs/tests.md +50 -45
  250. package/package.json +78 -83
  251. package/playwright.config.mts +46 -0
  252. package/src/client/addon/components/Addon.tsx +1 -1
  253. package/src/client/addon/components/Panel.tsx +2 -2
  254. package/src/client/addon/components/TestSelect.tsx +2 -2
  255. package/src/client/addon/components/Tools.tsx +2 -2
  256. package/src/client/addon/controller.ts +4 -4
  257. package/src/client/addon/makeDecorator.ts +69 -0
  258. package/src/client/addon/manager.ts +38 -37
  259. package/src/client/addon/preset.ts +2 -1
  260. package/src/client/addon/withCreevey.ts +10 -18
  261. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  262. package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
  263. package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
  264. package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
  265. package/src/client/shared/components/ImagesView/SwapView.tsx +2 -2
  266. package/src/client/shared/components/ImagesView/common.ts +1 -1
  267. package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
  268. package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
  269. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
  270. package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
  271. package/src/client/shared/components/ResultsPage.tsx +6 -4
  272. package/src/client/shared/creeveyClientApi.ts +19 -1
  273. package/src/client/shared/helpers.ts +4 -24
  274. package/src/client/web/CreeveyApp.tsx +5 -2
  275. package/src/client/web/CreeveyContext.tsx +2 -0
  276. package/src/client/web/CreeveyLoader.tsx +2 -2
  277. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
  278. package/src/client/web/CreeveyView/SideBar/Search.tsx +1 -1
  279. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
  280. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +21 -19
  281. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
  282. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +10 -8
  283. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +9 -7
  284. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
  285. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
  286. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
  287. package/src/client/web/index.tsx +10 -5
  288. package/src/client/web/themes.ts +24 -0
  289. package/src/creevey.ts +92 -38
  290. package/src/playwright/generator.ts +322 -0
  291. package/src/playwright/helpers.ts +31 -0
  292. package/src/playwright/reporter.ts +381 -0
  293. package/src/playwright/setup.ts +84 -0
  294. package/src/playwright.ts +1 -0
  295. package/src/server/compare.ts +260 -0
  296. package/src/server/config.ts +52 -9
  297. package/src/server/connection.ts +26 -0
  298. package/src/server/docker.ts +62 -34
  299. package/src/server/index.ts +161 -79
  300. package/src/server/master/api.ts +94 -28
  301. package/src/server/master/handlers/capture-handler.ts +20 -0
  302. package/src/server/master/handlers/index.ts +4 -0
  303. package/src/server/master/handlers/ping-handler.ts +6 -0
  304. package/src/server/master/handlers/static-handler.ts +16 -0
  305. package/src/server/master/handlers/stories-handler.ts +20 -0
  306. package/src/server/master/master.ts +10 -27
  307. package/src/server/master/pool.ts +7 -3
  308. package/src/server/master/queue.ts +21 -7
  309. package/src/server/master/runner.ts +123 -134
  310. package/src/server/master/server.ts +214 -101
  311. package/src/server/master/start.ts +19 -41
  312. package/src/server/master/testsManager.ts +316 -0
  313. package/src/server/playwright/docker-file.ts +20 -8
  314. package/src/server/playwright/docker.ts +16 -3
  315. package/src/server/playwright/index-source.mjs +16 -0
  316. package/src/server/playwright/internal.ts +169 -96
  317. package/src/server/playwright/webdriver.ts +4 -10
  318. package/src/server/providers/browser.ts +4 -3
  319. package/src/server/providers/hybrid.ts +2 -3
  320. package/src/server/report.ts +51 -0
  321. package/src/server/reporters/creevey.ts +71 -0
  322. package/src/server/reporters/index.ts +11 -0
  323. package/src/server/reporters/junit.ts +207 -0
  324. package/src/server/reporters/teamcity.ts +74 -0
  325. package/src/server/selenium/internal.ts +62 -45
  326. package/src/server/selenium/selenoid.ts +13 -6
  327. package/src/server/selenium/webdriver.ts +8 -12
  328. package/src/server/shutdown.ts +19 -0
  329. package/src/server/stories.ts +1 -12
  330. package/src/server/telemetry.ts +3 -3
  331. package/src/server/testsFiles/parser.ts +52 -4
  332. package/src/server/utils.ts +123 -14
  333. package/src/server/webdriver.ts +1 -1
  334. package/src/server/worker/context.ts +14 -0
  335. package/src/server/worker/match-image.ts +16 -248
  336. package/src/server/worker/start.ts +32 -75
  337. package/src/shared/index.ts +10 -8
  338. package/src/types.ts +91 -58
  339. package/types/global.d.ts +1 -0
  340. package/dist/client/web/assets/index-BE9CL5_G.js +0 -591
  341. package/dist/server/reporter.d.ts +0 -26
  342. package/dist/server/reporter.js +0 -108
  343. package/dist/server/reporter.js.map +0 -1
  344. package/dist/server/update.d.ts +0 -2
  345. package/dist/server/update.js +0 -53
  346. package/dist/server/update.js.map +0 -1
  347. package/src/server/reporter.ts +0 -139
  348. package/src/server/update.ts +0 -74
@@ -1,26 +0,0 @@
1
- import { Images } from '../types.js';
2
- import EventEmitter from 'events';
3
- interface ReporterOptions {
4
- reportDir: string;
5
- sessionId: string;
6
- browserName: string;
7
- willRetry: boolean;
8
- images: Partial<Record<string, Partial<Images>>>;
9
- }
10
- export declare class CreeveyReporter {
11
- constructor(runner: EventEmitter, options: {
12
- reporterOptions: {
13
- creevey: ReporterOptions;
14
- };
15
- });
16
- private getErrors;
17
- }
18
- export declare class TeamcityReporter {
19
- constructor(runner: EventEmitter, options: {
20
- reporterOptions: {
21
- creevey: ReporterOptions;
22
- };
23
- });
24
- private escape;
25
- }
26
- export {};
@@ -1,108 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TeamcityReporter = exports.CreeveyReporter = void 0;
7
- const chalk_1 = __importDefault(require("chalk"));
8
- const loglevel_1 = __importDefault(require("loglevel"));
9
- const loglevel_plugin_prefix_1 = __importDefault(require("loglevel-plugin-prefix"));
10
- const types_js_1 = require("../types.js");
11
- const testLevels = {
12
- INFO: chalk_1.default.green('PASS'),
13
- WARN: chalk_1.default.yellow('START'),
14
- ERROR: chalk_1.default.red('FAIL'),
15
- };
16
- class CreeveyReporter {
17
- // TODO Output in better way, like vitest, maybe
18
- constructor(runner, options) {
19
- const { sessionId, browserName } = options.reporterOptions.creevey;
20
- const testLogger = loglevel_1.default.getLogger(sessionId);
21
- loglevel_plugin_prefix_1.default.apply(testLogger, {
22
- format(level) {
23
- return `[${browserName}:${chalk_1.default.gray(process.pid)}] ${testLevels[level]} => ${chalk_1.default.gray(sessionId)}`;
24
- },
25
- });
26
- runner.on(types_js_1.TEST_EVENTS.TEST_BEGIN, (test) => {
27
- testLogger.warn(chalk_1.default.cyan(test.titlePath().join('/')));
28
- });
29
- runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
30
- testLogger.info(chalk_1.default.cyan(test.titlePath().join('/')), chalk_1.default.gray(`(${test.duration} ms)`));
31
- });
32
- runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test, error) => {
33
- testLogger.error(chalk_1.default.cyan(test.titlePath().join('/')), chalk_1.default.gray(`(${test.duration} ms)`), '\n ', this.getErrors(error, (error, imageName) => `${chalk_1.default.bold(imageName ?? browserName)}:${error}`, (error) => error.stack ?? error.message).join('\n '));
34
- });
35
- }
36
- getErrors(error, imageErrorToString, errorToString) {
37
- const errors = [];
38
- if (!(error instanceof Error)) {
39
- errors.push(error);
40
- }
41
- else if (!(0, types_js_1.isImageError)(error)) {
42
- errors.push(errorToString(error));
43
- }
44
- else if (typeof error.images == 'string') {
45
- errors.push(imageErrorToString(error.images));
46
- }
47
- else {
48
- const imageErrors = error.images ?? {};
49
- Object.keys(imageErrors).forEach((imageName) => {
50
- errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
51
- });
52
- }
53
- return errors;
54
- }
55
- }
56
- exports.CreeveyReporter = CreeveyReporter;
57
- class TeamcityReporter {
58
- constructor(runner, options) {
59
- const browserName = this.escape(options.reporterOptions.creevey.browserName);
60
- const reporterOptions = options.reporterOptions.creevey;
61
- runner.on(types_js_1.TEST_EVENTS.TEST_BEGIN, (test) => {
62
- console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`);
63
- });
64
- runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test, error) => {
65
- Object.entries(reporterOptions.images).forEach(([name, image]) => {
66
- if (!image)
67
- return;
68
- const filePath = test
69
- .titlePath()
70
- .concat(name == browserName ? [] : [browserName])
71
- .map(this.escape)
72
- .join('/');
73
- const { error: _, ...rest } = image;
74
- Object.values(rest)
75
- .filter(types_js_1.isDefined)
76
- .forEach((fileName) => {
77
- console.log(`##teamcity[publishArtifacts '${reporterOptions.reportDir}/${filePath}/${fileName} => report/${filePath}']`);
78
- console.log(`##teamcity[testMetadata testName='${this.escape(test.title)}' type='image' value='report/${filePath}/${fileName}' flowId='${process.pid}']`);
79
- });
80
- });
81
- // Output failed test as passed due TC don't support retry mechanic
82
- // 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
83
- if (reporterOptions.willRetry)
84
- console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`);
85
- else
86
- console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`);
87
- });
88
- }
89
- escape = (str) => {
90
- if (!str)
91
- return '';
92
- return (str
93
- .toString()
94
- // eslint-disable-next-line no-control-regex
95
- .replace(/\x1B.*?m/g, '')
96
- .replace(/\|/g, '||')
97
- .replace(/\n/g, '|n')
98
- .replace(/\r/g, '|r')
99
- .replace(/\[/g, '|[')
100
- .replace(/\]/g, '|]')
101
- .replace(/\u0085/g, '|x')
102
- .replace(/\u2028/g, '|l')
103
- .replace(/\u2029/g, '|p')
104
- .replace(/'/g, "|'"));
105
- };
106
- }
107
- exports.TeamcityReporter = TeamcityReporter;
108
- //# sourceMappingURL=reporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../src/server/reporter.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import { Config } from '../types.js';
2
- export declare function update(config: Config, grepPattern?: string): void;
@@ -1,53 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.update = update;
7
- const path_1 = __importDefault(require("path"));
8
- const fs_1 = require("fs");
9
- const micromatch_1 = __importDefault(require("micromatch"));
10
- const types_js_1 = require("../types.js");
11
- const utils_js_1 = require("./utils.js");
12
- const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
13
- function approve(dirents, srcPath, dstPath, testPaths, isMatch) {
14
- dirents
15
- .filter((dirent) => dirent.isFile())
16
- .map((dirent) => actualRegex.exec(dirent.name))
17
- .filter(types_js_1.isDefined)
18
- .filter(([fileName, imageName]) => !testPaths || (testPaths.find(([token]) => token == imageName) && isMatch(path_1.default.join(srcPath, fileName))))
19
- .reduce((images, [, imageName, retry]) => Number(retry) > (images.get(imageName) ?? -1) ? images.set(imageName, Number(retry)) : images, new Map())
20
- .forEach((retry, imageName) => {
21
- (0, fs_1.mkdirSync)(dstPath, { recursive: true });
22
- (0, fs_1.copyFileSync)(path_1.default.join(srcPath, `${imageName}-actual-${retry}.png`), path_1.default.join(dstPath, `${imageName}.png`));
23
- });
24
- }
25
- function traverse(srcPath, dstPath, testPaths, isMatch) {
26
- const dirents = (0, fs_1.readdirSync)(srcPath, { withFileTypes: true });
27
- approve(dirents, srcPath, dstPath, testPaths, isMatch);
28
- dirents
29
- .filter((dirent) => dirent.isDirectory())
30
- .map((dirent) => [
31
- dirent.name,
32
- testPaths?.map(([token, ...restPath]) => (token == dirent.name ? restPath : null)).filter(types_js_1.isDefined),
33
- ])
34
- .filter(([, paths]) => !paths || paths.length > 0)
35
- .forEach(([dirname, paths]) => {
36
- traverse(path_1.default.join(srcPath, dirname), path_1.default.join(dstPath, dirname), paths, isMatch);
37
- });
38
- }
39
- function update(config, grepPattern) {
40
- const { reportDir, screenDir } = config;
41
- const isMatch = grepPattern ? micromatch_1.default.matcher(grepPattern, { contains: true }) : () => true;
42
- const testsMeta = (0, utils_js_1.tryToLoadTestsData)(`${reportDir}/tests.json`);
43
- const testsReport = (0, utils_js_1.tryToLoadTestsData)(`${reportDir}/data.js`);
44
- let testPaths = null;
45
- if (testsMeta && testsReport) {
46
- testPaths = Object.values(testsMeta)
47
- .filter(types_js_1.isDefined)
48
- .filter(({ id }) => testsReport[id]?.status == 'failed')
49
- .map(({ storyPath, testName, browser }) => [...storyPath, ...(testName ? [testName] : []), browser]);
50
- }
51
- traverse(reportDir, screenDir, testPaths, (value) => isMatch(path_1.default.relative(reportDir, value)));
52
- }
53
- //# sourceMappingURL=update.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/server/update.ts"],"names":[],"mappings":"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"}
@@ -1,139 +0,0 @@
1
- import chalk from 'chalk';
2
- import Logger from 'loglevel';
3
- import prefix from 'loglevel-plugin-prefix';
4
- import { FakeTest, Images, isDefined, isImageError, TEST_EVENTS } from '../types.js';
5
- import EventEmitter from 'events';
6
-
7
- interface ReporterOptions {
8
- reportDir: string;
9
- sessionId: string;
10
- browserName: string;
11
- willRetry: boolean;
12
- images: Partial<Record<string, Partial<Images>>>;
13
- }
14
-
15
- const testLevels: Record<string, string> = {
16
- INFO: chalk.green('PASS'),
17
- WARN: chalk.yellow('START'),
18
- ERROR: chalk.red('FAIL'),
19
- };
20
-
21
- export class CreeveyReporter {
22
- // TODO Output in better way, like vitest, maybe
23
- constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
24
- const { sessionId, browserName } = options.reporterOptions.creevey;
25
- const testLogger = Logger.getLogger(sessionId);
26
-
27
- prefix.apply(testLogger, {
28
- format(level) {
29
- return `[${browserName}:${chalk.gray(process.pid)}] ${testLevels[level]} => ${chalk.gray(sessionId)}`;
30
- },
31
- });
32
-
33
- runner.on(TEST_EVENTS.TEST_BEGIN, (test: FakeTest) => {
34
- testLogger.warn(chalk.cyan(test.titlePath().join('/')));
35
- });
36
- runner.on(TEST_EVENTS.TEST_PASS, (test: FakeTest) => {
37
- testLogger.info(chalk.cyan(test.titlePath().join('/')), chalk.gray(`(${test.duration} ms)`));
38
- });
39
- runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error) => {
40
- testLogger.error(
41
- chalk.cyan(test.titlePath().join('/')),
42
- chalk.gray(`(${test.duration} ms)`),
43
- '\n ',
44
- this.getErrors(
45
- error,
46
- (error, imageName) => `${chalk.bold(imageName ?? browserName)}:${error}`,
47
- (error) => error.stack ?? error.message,
48
- ).join('\n '),
49
- );
50
- });
51
- }
52
- private getErrors(
53
- error: unknown,
54
- imageErrorToString: (error: string, imageName?: string) => string,
55
- errorToString: (error: Error) => string,
56
- ): string[] {
57
- const errors = [];
58
- if (!(error instanceof Error)) {
59
- errors.push(error as string);
60
- } else if (!isImageError(error)) {
61
- errors.push(errorToString(error));
62
- } else if (typeof error.images == 'string') {
63
- errors.push(imageErrorToString(error.images));
64
- } else {
65
- const imageErrors = error.images ?? {};
66
- Object.keys(imageErrors).forEach((imageName) => {
67
- errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
68
- });
69
- }
70
- return errors;
71
- }
72
- }
73
-
74
- export class TeamcityReporter {
75
- constructor(runner: EventEmitter, options: { reporterOptions: { creevey: ReporterOptions } }) {
76
- const browserName = this.escape(options.reporterOptions.creevey.browserName);
77
- const reporterOptions = options.reporterOptions.creevey;
78
-
79
- runner.on(TEST_EVENTS.TEST_BEGIN, (test: FakeTest) => {
80
- console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`);
81
- });
82
-
83
- runner.on(TEST_EVENTS.TEST_FAIL, (test: FakeTest, error: Error) => {
84
- Object.entries(reporterOptions.images).forEach(([name, image]) => {
85
- if (!image) return;
86
- const filePath = test
87
- .titlePath()
88
- .concat(name == browserName ? [] : [browserName])
89
- .map(this.escape)
90
- .join('/');
91
-
92
- const { error: _, ...rest } = image;
93
- Object.values(rest as Partial<Images>)
94
- .filter(isDefined)
95
- .forEach((fileName) => {
96
- console.log(
97
- `##teamcity[publishArtifacts '${reporterOptions.reportDir}/${filePath}/${fileName} => report/${filePath}']`,
98
- );
99
- console.log(
100
- `##teamcity[testMetadata testName='${this.escape(
101
- test.title,
102
- )}' type='image' value='report/${filePath}/${fileName}' flowId='${process.pid}']`,
103
- );
104
- });
105
- });
106
-
107
- // Output failed test as passed due TC don't support retry mechanic
108
- // 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
109
-
110
- if (reporterOptions.willRetry)
111
- console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`);
112
- else
113
- console.log(
114
- `##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(
115
- error.message,
116
- )}' details='${this.escape(error.stack ?? '')}' flowId='${process.pid}']`,
117
- );
118
- });
119
- }
120
-
121
- private escape = (str: string): string => {
122
- if (!str) return '';
123
- return (
124
- str
125
- .toString()
126
- // eslint-disable-next-line no-control-regex
127
- .replace(/\x1B.*?m/g, '')
128
- .replace(/\|/g, '||')
129
- .replace(/\n/g, '|n')
130
- .replace(/\r/g, '|r')
131
- .replace(/\[/g, '|[')
132
- .replace(/\]/g, '|]')
133
- .replace(/\u0085/g, '|x')
134
- .replace(/\u2028/g, '|l')
135
- .replace(/\u2029/g, '|p')
136
- .replace(/'/g, "|'")
137
- );
138
- };
139
- }
@@ -1,74 +0,0 @@
1
- import path from 'path';
2
- import { Dirent, mkdirSync, copyFileSync, readdirSync } from 'fs';
3
- import micromatch from 'micromatch';
4
- import { Config, isDefined } from '../types.js';
5
- import { tryToLoadTestsData } from './utils.js';
6
-
7
- const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
8
-
9
- function approve(
10
- dirents: Dirent[],
11
- srcPath: string,
12
- dstPath: string,
13
- testPaths: string[][] | null,
14
- isMatch: (value: string) => boolean,
15
- ): void {
16
- dirents
17
- .filter((dirent) => dirent.isFile())
18
- .map((dirent) => actualRegex.exec(dirent.name))
19
- .filter(isDefined)
20
- .filter(
21
- ([fileName, imageName]) =>
22
- !testPaths || (testPaths.find(([token]) => token == imageName) && isMatch(path.join(srcPath, fileName))),
23
- )
24
- .reduce(
25
- (images, [, imageName, retry]) =>
26
- Number(retry) > (images.get(imageName) ?? -1) ? images.set(imageName, Number(retry)) : images,
27
- new Map<string, number>(),
28
- )
29
- .forEach((retry, imageName) => {
30
- mkdirSync(dstPath, { recursive: true });
31
- copyFileSync(path.join(srcPath, `${imageName}-actual-${retry}.png`), path.join(dstPath, `${imageName}.png`));
32
- });
33
- }
34
-
35
- function traverse(
36
- srcPath: string,
37
- dstPath: string,
38
- testPaths: string[][] | null,
39
- isMatch: (value: string) => boolean,
40
- ): void {
41
- const dirents = readdirSync(srcPath, { withFileTypes: true });
42
- approve(dirents, srcPath, dstPath, testPaths, isMatch);
43
- dirents
44
- .filter((dirent) => dirent.isDirectory())
45
- .map(
46
- (dirent) =>
47
- [
48
- dirent.name,
49
- testPaths?.map(([token, ...restPath]) => (token == dirent.name ? restPath : null)).filter(isDefined),
50
- ] as [string, string[][] | null],
51
- )
52
- .filter(([, paths]) => !paths || paths.length > 0)
53
- .forEach(([dirname, paths]) => {
54
- traverse(path.join(srcPath, dirname), path.join(dstPath, dirname), paths, isMatch);
55
- });
56
- }
57
-
58
- export function update(config: Config, grepPattern?: string): void {
59
- const { reportDir, screenDir } = config;
60
- const isMatch = grepPattern ? micromatch.matcher(grepPattern, { contains: true }) : () => true;
61
-
62
- const testsMeta = tryToLoadTestsData(`${reportDir}/tests.json`);
63
- const testsReport = tryToLoadTestsData(`${reportDir}/data.js`);
64
- let testPaths: string[][] | null = null;
65
-
66
- if (testsMeta && testsReport) {
67
- testPaths = Object.values(testsMeta)
68
- .filter(isDefined)
69
- .filter(({ id }) => testsReport[id]?.status == 'failed')
70
- .map(({ storyPath, testName, browser }) => [...storyPath, ...(testName ? [testName] : []), browser]);
71
- }
72
-
73
- traverse(reportDir, screenDir, testPaths, (value: string) => isMatch(path.relative(reportDir, value)));
74
- }