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

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 +34 -0
  107. package/dist/playwright/generator.js +267 -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 +166 -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 +36 -0
  246. package/docs/migration-0.9-to-0.10.md +182 -0
  247. package/docs/playwright-reporter.md +170 -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 +360 -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 +165 -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 +74 -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
@@ -0,0 +1,45 @@
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.report = report;
7
+ const open_1 = __importDefault(require("open"));
8
+ const logger_js_1 = require("./logger.js");
9
+ const testsManager_js_1 = require("./master/testsManager.js");
10
+ const server_js_1 = require("./master/server.js");
11
+ const api_js_1 = require("./master/api.js");
12
+ const utils_js_1 = require("./utils.js");
13
+ /**
14
+ * UI Update Mode implementation.
15
+ * This mode allows users to review and approve screenshots from the browser interface.
16
+ * It combines the functionality of both --ui and --update flags.
17
+ *
18
+ * @param config Creevey configuration
19
+ * @param port Port to run the server on
20
+ */
21
+ function report(config, reportDir, port) {
22
+ (0, logger_js_1.logger)().info('Starting UI Update Mode');
23
+ process.on('SIGINT', () => void (0, utils_js_1.shutdownWorkers)());
24
+ const url = `http://localhost:${port}`;
25
+ // Initialize TestsManager with the configured directories
26
+ const testsManager = new testsManager_js_1.TestsManager(config.screenDir, reportDir);
27
+ // Load tests from the report
28
+ const testsFromReport = testsManager.loadTestsFromReport();
29
+ if (Object.keys(testsFromReport).length === 0) {
30
+ (0, logger_js_1.logger)().warn('No tests found in report. Run tests first to generate report data.');
31
+ return;
32
+ }
33
+ // Set tests in the manager
34
+ testsManager.updateTests(testsFromReport);
35
+ // Start API server with UI enabled
36
+ const resolveApi = (0, server_js_1.start)(reportDir, port, true);
37
+ // Initialize API
38
+ const api = new api_js_1.CreeveyApi(testsManager);
39
+ // Resolve the API for the server
40
+ resolveApi(api);
41
+ (0, logger_js_1.logger)().info(`UI Update Mode started on ${url}`);
42
+ (0, logger_js_1.logger)().info('You can now review and approve screenshots from the browser.');
43
+ void (0, open_1.default)(url);
44
+ }
45
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/server/report.ts"],"names":[],"mappings":";;;;;AAgBA,wBAkCC;AAlDD,gDAAwB;AAExB,2CAAqC;AACrC,8DAAwD;AACxD,kDAA0D;AAC1D,4CAA6C;AAC7C,yCAA6C;AAE7C;;;;;;;GAOG;AACH,SAAgB,MAAM,CAAC,MAAc,EAAE,SAAiB,EAAE,IAAY;IACpE,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAEzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,IAAA,0BAAe,GAAE,CAAC,CAAC;IAEnD,MAAM,GAAG,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,YAAY,GAAG,IAAI,8BAAY,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAEnE,6BAA6B;IAC7B,MAAM,eAAe,GAAG,YAAY,CAAC,mBAAmB,EAAE,CAAC;IAE3D,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IAED,2BAA2B;IAC3B,YAAY,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAE1C,mCAAmC;IACnC,MAAM,UAAU,GAAG,IAAA,iBAAW,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAEtD,iBAAiB;IACjB,MAAM,GAAG,GAAG,IAAI,mBAAU,CAAC,YAAY,CAAC,CAAC;IAEzC,iCAAiC;IACjC,UAAU,CAAC,GAAG,CAAC,CAAC;IAEhB,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAC,CAAC;IAClD,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAE9E,KAAK,IAAA,cAAI,EAAC,GAAG,CAAC,CAAC;AACjB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import EventEmitter from 'events';
2
+ export declare class CreeveyReporter {
3
+ private logger;
4
+ constructor(runner: EventEmitter);
5
+ private getLogger;
6
+ private getErrors;
7
+ }
@@ -0,0 +1,63 @@
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.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
+ logger = null;
18
+ // TODO Output in better way, like vitest, maybe
19
+ constructor(runner) {
20
+ runner.on(types_js_1.TEST_EVENTS.TEST_BEGIN, (test) => {
21
+ this.getLogger(test.creevey).warn(chalk_1.default.cyan(test.fullTitle()));
22
+ });
23
+ runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
24
+ this.getLogger(test.creevey).info(chalk_1.default.cyan(test.fullTitle()), test.duration ? chalk_1.default.gray(`(${test.duration} ms)`) : '');
25
+ });
26
+ runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test, error) => {
27
+ this.getLogger(test.creevey).error(chalk_1.default.cyan(test.fullTitle()), test.duration ? chalk_1.default.gray(`(${test.duration} ms)`) : '', '\n ', this.getErrors(error, (error, imageName) => `${chalk_1.default.bold(imageName ?? test.creevey.browserName)}:${error}`, (error) => error.stack ?? error.message).join('\n '));
28
+ });
29
+ }
30
+ getLogger(options) {
31
+ if (this.logger)
32
+ return this.logger;
33
+ const { sessionId, browserName } = options;
34
+ const testLogger = loglevel_1.default.getLogger(sessionId);
35
+ this.logger = loglevel_plugin_prefix_1.default.apply(testLogger, {
36
+ format(level) {
37
+ return `[${browserName}:${chalk_1.default.gray(process.pid)}] ${testLevels[level]} => ${chalk_1.default.gray(sessionId)}`;
38
+ },
39
+ });
40
+ return this.logger;
41
+ }
42
+ getErrors(error, imageErrorToString, errorToString) {
43
+ const errors = [];
44
+ if (!(error instanceof Error)) {
45
+ errors.push(error);
46
+ }
47
+ else if (!(0, types_js_1.isImageError)(error)) {
48
+ errors.push(errorToString(error));
49
+ }
50
+ else if (typeof error.images == 'string') {
51
+ errors.push(imageErrorToString(error.images));
52
+ }
53
+ else {
54
+ const imageErrors = error.images ?? {};
55
+ Object.keys(imageErrors).forEach((imageName) => {
56
+ errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
57
+ });
58
+ }
59
+ return errors;
60
+ }
61
+ }
62
+ exports.CreeveyReporter = CreeveyReporter;
63
+ //# sourceMappingURL=creevey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"creevey.js","sourceRoot":"","sources":["../../../src/server/reporters/creevey.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { BaseReporter } from '../../types.js';
2
+ export declare function getReporter(reporter: BaseReporter | 'creevey' | 'teamcity' | 'junit'): BaseReporter;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getReporter = getReporter;
4
+ const creevey_js_1 = require("./creevey.js");
5
+ const junit_js_1 = require("./junit.js");
6
+ const teamcity_js_1 = require("./teamcity.js");
7
+ function getReporter(reporter) {
8
+ if (reporter === 'creevey')
9
+ return creevey_js_1.CreeveyReporter;
10
+ if (reporter === 'teamcity')
11
+ return teamcity_js_1.TeamcityReporter;
12
+ if (reporter === 'junit')
13
+ return junit_js_1.JUnitReporter;
14
+ return reporter;
15
+ }
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/reporters/index.ts"],"names":[],"mappings":";;AAKA,kCAKC;AATD,6CAA+C;AAC/C,yCAA2C;AAC3C,+CAAiD;AAEjD,SAAgB,WAAW,CAAC,QAAyD;IACnF,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,4BAAe,CAAC;IACnD,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,8BAAgB,CAAC;IACrD,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,wBAAa,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import EventEmitter from 'events';
2
+ export declare class JUnitReporter {
3
+ private reportFile;
4
+ private fileFd?;
5
+ private logger;
6
+ private suites;
7
+ constructor(runner: EventEmitter, options: {
8
+ reportDir: string;
9
+ reporterOptions: {
10
+ outputFile?: string;
11
+ };
12
+ });
13
+ private writeElement;
14
+ private writeTasks;
15
+ private onFinished;
16
+ }
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JUnitReporter = void 0;
4
+ const path_1 = require("path");
5
+ const fs_1 = require("fs");
6
+ const types_js_1 = require("../../types.js");
7
+ const logger_js_1 = require("../logger.js");
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ class IndentedLogger {
10
+ baseLog;
11
+ currentIndent = '';
12
+ constructor(baseLog) {
13
+ this.baseLog = baseLog;
14
+ }
15
+ indent() {
16
+ this.currentIndent += ' ';
17
+ }
18
+ unindent() {
19
+ this.currentIndent = this.currentIndent.substring(0, this.currentIndent.length - 4);
20
+ }
21
+ log(text) {
22
+ return this.baseLog(this.currentIndent + text);
23
+ }
24
+ }
25
+ // NOTE: This is a reworked copy of the JUnitReporter class from Vitest.
26
+ class JUnitReporter {
27
+ reportFile;
28
+ fileFd;
29
+ logger;
30
+ suites = {};
31
+ // TODO classnameTemplate
32
+ // TODO Output console logs
33
+ // TODO Output attachments
34
+ constructor(runner, options) {
35
+ const { reportDir, reporterOptions } = options;
36
+ this.reportFile = reporterOptions.outputFile ?? (0, path_1.resolve)(reportDir, 'junit.xml');
37
+ this.logger = new IndentedLogger((text) => {
38
+ this.fileFd ??= (0, fs_1.openSync)(this.reportFile, 'w+');
39
+ (0, fs_1.writeFileSync)(this.fileFd, `${text}\n`);
40
+ });
41
+ runner.on(types_js_1.TEST_EVENTS.RUN_BEGIN, () => {
42
+ this.suites = {};
43
+ const outputDirectory = (0, path_1.dirname)(this.reportFile);
44
+ if (!(0, fs_1.existsSync)(outputDirectory)) {
45
+ (0, fs_1.mkdirSync)(outputDirectory, { recursive: true });
46
+ }
47
+ this.fileFd = (0, fs_1.openSync)(this.reportFile, 'w+');
48
+ });
49
+ runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
50
+ const suite = (this.suites[test.parent.title] ??= []);
51
+ suite.push(test);
52
+ });
53
+ runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test) => {
54
+ const suite = (this.suites[test.parent.title] ??= []);
55
+ suite.push(test);
56
+ });
57
+ runner.on(types_js_1.TEST_EVENTS.RUN_END, () => {
58
+ this.onFinished();
59
+ });
60
+ }
61
+ writeElement(name, attrs, children) {
62
+ const pairs = [];
63
+ for (const key in attrs) {
64
+ const attr = attrs[key];
65
+ if (attr === undefined) {
66
+ continue;
67
+ }
68
+ pairs.push(`${key}="${escapeXML(attr)}"`);
69
+ }
70
+ this.logger.log(`<${name}${pairs.length ? ` ${pairs.join(' ')}` : ''}>`);
71
+ this.logger.indent();
72
+ children?.call(this);
73
+ this.logger.unindent();
74
+ this.logger.log(`</${name}>`);
75
+ }
76
+ writeTasks(tests) {
77
+ for (const test of tests) {
78
+ const classname = test.parent.title;
79
+ this.writeElement('testcase', {
80
+ classname,
81
+ name: test.title,
82
+ time: getDuration(test),
83
+ }, () => {
84
+ if (test.state === 'failed') {
85
+ const error = test.err;
86
+ this.writeElement('failure', { message: error });
87
+ }
88
+ });
89
+ }
90
+ }
91
+ onFinished() {
92
+ this.logger.log('<?xml version="1.0" encoding="UTF-8" ?>');
93
+ const suites = Object.entries(this.suites).map(([name, tests]) => {
94
+ return {
95
+ name,
96
+ tests,
97
+ failures: tests.filter((test) => test.state === 'failed').length,
98
+ time: tests.reduce((acc, test) => acc + (test.duration ?? 0), 0),
99
+ };
100
+ });
101
+ const stats = suites.reduce((s, { tests, failures, time }) => {
102
+ s.tests += tests.length;
103
+ s.failures += failures;
104
+ s.time += time;
105
+ return s;
106
+ }, { name: 'creevey tests', tests: 0, failures: 0, time: 0 });
107
+ this.writeElement('testsuites', { ...stats, time: executionTime(stats.time) }, () => {
108
+ suites.forEach(({ name, tests, failures, time }) => {
109
+ this.writeElement('testsuite', {
110
+ name,
111
+ tests: tests.length,
112
+ failures,
113
+ time: executionTime(time),
114
+ }, () => {
115
+ this.writeTasks(tests);
116
+ });
117
+ });
118
+ });
119
+ if (this.reportFile) {
120
+ (0, logger_js_1.logger)().info(`JUNIT report written to ${this.reportFile}`);
121
+ }
122
+ if (this.fileFd) {
123
+ (0, fs_1.closeSync)(this.fileFd);
124
+ this.fileFd = undefined;
125
+ }
126
+ }
127
+ }
128
+ exports.JUnitReporter = JUnitReporter;
129
+ // https://gist.github.com/john-doherty/b9195065884cdbfd2017a4756e6409cc
130
+ function removeInvalidXMLCharacters(value, removeDiscouragedChars) {
131
+ let regex =
132
+ // eslint-disable-next-line no-control-regex
133
+ /([\0-\x08\v\f\x0E-\x1F\uFFFD\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g;
134
+ value = String(value).replace(regex, '');
135
+ if (removeDiscouragedChars) {
136
+ // remove everything discouraged by XML 1.0 specifications
137
+ regex = new RegExp('([\\x7F-\\x84]|[\\x86-\\x9F]|[\\uFDD0-\\uFDEF]|\\uD83F[\\uDFFE\\uDFFF]|(?:\\uD87F[\\uDF' +
138
+ 'FE\\uDFFF])|\\uD8BF[\\uDFFE\\uDFFF]|\\uD8FF[\\uDFFE\\uDFFF]|(?:\\uD93F[\\uDFFE\\uD' +
139
+ 'FFF])|\\uD97F[\\uDFFE\\uDFFF]|\\uD9BF[\\uDFFE\\uDFFF]|\\uD9FF[\\uDFFE\\uDFFF]' +
140
+ '|\\uDA3F[\\uDFFE\\uDFFF]|\\uDA7F[\\uDFFE\\uDFFF]|\\uDABF[\\uDFFE\\uDFFF]|(?:\\' +
141
+ 'uDAFF[\\uDFFE\\uDFFF])|\\uDB3F[\\uDFFE\\uDFFF]|\\uDB7F[\\uDFFE\\uDFFF]|(?:\\uDBBF' +
142
+ '[\\uDFFE\\uDFFF])|\\uDBFF[\\uDFFE\\uDFFF](?:[\\0-\\t\\v\\f\\x0E-\\u2027\\u202A-\\uD7FF\\' +
143
+ 'uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|' +
144
+ '(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))', 'g');
145
+ value = value.replace(regex, '');
146
+ }
147
+ return value;
148
+ }
149
+ function escapeXML(value) {
150
+ return removeInvalidXMLCharacters(String(value)
151
+ .replace(/&/g, '&amp;')
152
+ .replace(/"/g, '&quot;')
153
+ .replace(/'/g, '&apos;')
154
+ .replace(/</g, '&lt;')
155
+ .replace(/>/g, '&gt;'), true);
156
+ }
157
+ function executionTime(durationMS) {
158
+ return (durationMS / 1000).toLocaleString('en-US', {
159
+ useGrouping: false,
160
+ maximumFractionDigits: 10,
161
+ });
162
+ }
163
+ function getDuration(task) {
164
+ const duration = task.duration ?? 0;
165
+ return executionTime(duration);
166
+ }
167
+ //# sourceMappingURL=junit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junit.js","sourceRoot":"","sources":["../../../src/server/reporters/junit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import EventEmitter from 'events';
2
+ export declare class TeamcityReporter {
3
+ constructor(runner: EventEmitter, options: {
4
+ reportDir: string;
5
+ });
6
+ private escape;
7
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TeamcityReporter = void 0;
4
+ const types_js_1 = require("../../types.js");
5
+ class TeamcityReporter {
6
+ constructor(runner, options) {
7
+ const { reportDir } = options;
8
+ runner.on(types_js_1.TEST_EVENTS.TEST_BEGIN, (test) => {
9
+ console.log(`##teamcity[testStarted name='${this.escape(test.fullTitle())}' flowId='${test.creevey.workerId}']`);
10
+ });
11
+ runner.on(types_js_1.TEST_EVENTS.TEST_PASS, (test) => {
12
+ console.log(`##teamcity[testFinished name='${this.escape(test.fullTitle())}' flowId='${test.creevey.workerId}']`);
13
+ });
14
+ runner.on(types_js_1.TEST_EVENTS.TEST_FAIL, (test, error) => {
15
+ const browserName = this.escape(test.creevey.browserName);
16
+ Object.entries(test.creevey.images).forEach(([name, image]) => {
17
+ if (!image)
18
+ return;
19
+ const filePath = test
20
+ .titlePath()
21
+ .slice(0, -1)
22
+ .concat(name == browserName ? [] : [browserName])
23
+ .map(this.escape)
24
+ .join('/');
25
+ const { error: _, ...rest } = image;
26
+ Object.values(rest)
27
+ .filter(types_js_1.isDefined)
28
+ .forEach((fileName) => {
29
+ console.log(`##teamcity[publishArtifacts '${reportDir}/${filePath}/${fileName} => report/${filePath}']`);
30
+ console.log(`##teamcity[testMetadata testName='${this.escape(test.fullTitle())}' type='image' value='report/${filePath}/${fileName}' flowId='${test.creevey.workerId}']`);
31
+ });
32
+ });
33
+ // Output failed test as passed due TC don't support retry mechanic
34
+ // 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
35
+ if (test.creevey.willRetry)
36
+ console.log(`##teamcity[testFinished name='${this.escape(test.fullTitle())}' flowId='${test.creevey.workerId}']`);
37
+ else
38
+ console.log(`##teamcity[testFailed name='${this.escape(test.fullTitle())}' message='${this.escape(error.message)}' details='${this.escape(error.stack ?? '')}' flowId='${test.creevey.workerId}']`);
39
+ });
40
+ }
41
+ escape = (str) => {
42
+ if (!str)
43
+ return '';
44
+ return (str
45
+ .toString()
46
+ // eslint-disable-next-line no-control-regex
47
+ .replace(/\x1B.*?m/g, '')
48
+ .replace(/\|/g, '||')
49
+ .replace(/\n/g, '|n')
50
+ .replace(/\r/g, '|r')
51
+ .replace(/\[/g, '|[')
52
+ .replace(/\]/g, '|]')
53
+ .replace(/\u0085/g, '|x')
54
+ .replace(/\u2028/g, '|l')
55
+ .replace(/\u2029/g, '|p')
56
+ .replace(/'/g, "|'"));
57
+ };
58
+ }
59
+ exports.TeamcityReporter = TeamcityReporter;
60
+ //# sourceMappingURL=teamcity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teamcity.js","sourceRoot":"","sources":["../../../src/server/reporters/teamcity.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { Args } from '@storybook/csf';
1
+ import type { Args } from 'storybook/internal/types';
2
2
  import { WebDriver } from 'selenium-webdriver';
3
- import { Config, StorybookGlobals, StoryInput, StoriesRaw, Options, ServerTest } from '../../types.js';
3
+ import { Config, StorybookGlobals, StoryInput, StoriesRaw, WorkerOptions, ServerTest } from '../../types.js';
4
4
  export declare class InternalBrowser {
5
5
  #private;
6
6
  constructor(browser: WebDriver, port: number, storybookGlobals?: StorybookGlobals);
@@ -12,7 +12,7 @@ export declare class InternalBrowser {
12
12
  updateStoryArgs(story: StoryInput, updatedArgs: Args): Promise<void>;
13
13
  loadStoriesFromBrowser(): Promise<StoriesRaw>;
14
14
  afterTest(test: ServerTest): Promise<void>;
15
- static getBrowser(browserName: string, gridUrl: string, config: Config, options: Options): Promise<InternalBrowser | null>;
15
+ static getBrowser(browserName: string, gridUrl: string, config: Config, options: WorkerOptions): Promise<InternalBrowser | null>;
16
16
  private init;
17
17
  private openStorybookPage;
18
18
  private checkUrl;
@@ -190,7 +190,7 @@ class InternalBrowser {
190
190
  else {
191
191
  (0, logger_js_1.logger)().debug(`Checking is element ${chalk_1.default.cyan(captureElement)} fit into viewport`);
192
192
  const rects = await this.#browser.executeScript(function (selector) {
193
- window.scrollTo(0, 0); // TODO Maybe we should remove same code from `resetMousePosition`
193
+ window.scrollTo(0, 0);
194
194
  // eslint-disable-next-line no-var
195
195
  var element = document.querySelector(selector);
196
196
  if (!element)
@@ -206,9 +206,7 @@ class InternalBrowser {
206
206
  },
207
207
  // NOTE page_Offset is used only for IE9-11
208
208
  windowRect: {
209
- // eslint-disable-next-line @typescript-eslint/no-deprecated
210
209
  top: Math.round(window.scrollY || window.pageYOffset),
211
- // eslint-disable-next-line @typescript-eslint/no-deprecated
212
210
  left: Math.round(window.scrollX || window.pageXOffset),
213
211
  width: window.innerWidth,
214
212
  height: window.innerHeight,
@@ -230,12 +228,10 @@ class InternalBrowser {
230
228
  // ? context
231
229
  // ? await context.captureElementScreenshot(await element.getId())
232
230
  // : await browser.findElement(By.css(captureElement)).takeScreenshot()
233
- // : // TODO pointer-events: none, need to research
234
- // await takeCompositeScreenshot(browser, windowRect, elementRect);
231
+ // : await takeCompositeScreenshot(browser, windowRect, elementRect);
235
232
  screenshot = isFitIntoViewport
236
233
  ? await this.#browser.findElement(selenium_webdriver_1.By.css(captureElement)).takeScreenshot()
237
- : // TODO pointer-events: none, need to research
238
- await this.takeCompositeScreenshot(windowRect, elementRect);
234
+ : await this.takeCompositeScreenshot(windowRect, elementRect);
239
235
  (0, logger_js_1.logger)().debug(`${chalk_1.default.cyan(captureElement)} is captured`);
240
236
  }
241
237
  }
@@ -281,9 +277,27 @@ class InternalBrowser {
281
277
  }, story.id, updatedArgs, types_js_1.StorybookEvents.UPDATE_STORY_ARGS, types_js_1.StorybookEvents.STORY_RENDERED);
282
278
  }
283
279
  async loadStoriesFromBrowser() {
284
- const stories = await this.#browser.executeAsyncScript(function (callback) {
285
- void window.__CREEVEY_GET_STORIES__().then(callback);
280
+ const result = await this.#browser.executeAsyncScript(function (callback) {
281
+ window
282
+ .__CREEVEY_GET_STORIES__()
283
+ .then((stories) => {
284
+ callback([null, stories]);
285
+ })
286
+ .catch((error) => {
287
+ const errorInfo = {
288
+ message: error instanceof Error ? error.message : String(error),
289
+ stack: error instanceof Error ? error.stack : undefined,
290
+ };
291
+ callback([errorInfo]);
292
+ });
286
293
  });
294
+ const [error, stories] = result;
295
+ if (error) {
296
+ const errorObj = new Error(error.message);
297
+ if (error.stack)
298
+ errorObj.stack = error.stack;
299
+ throw errorObj;
300
+ }
287
301
  if (!stories)
288
302
  throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
289
303
  return stories;
@@ -301,12 +315,14 @@ class InternalBrowser {
301
315
  }
302
316
  static async getBrowser(browserName, gridUrl, config, options) {
303
317
  const browserConfig = config.browsers[browserName];
304
- const { storybookUrl: address = config.storybookUrl, limit, viewport, _storybookGlobals } = browserConfig;
318
+ const { storybookUrl: address = config.storybookUrl, limit, viewport,
319
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
320
+ _storybookGlobals, storybookGlobals = _storybookGlobals, } = browserConfig;
305
321
  void limit;
306
322
  const browser = await buildWebdriver(browserName, gridUrl, config, options);
307
323
  if (!browser)
308
324
  return null;
309
- const internalBrowser = new InternalBrowser(browser, options.port, _storybookGlobals);
325
+ const internalBrowser = new InternalBrowser(browser, options.port, storybookGlobals);
310
326
  try {
311
327
  if (utils_js_1.isShuttingDown.current)
312
328
  return null;
@@ -315,7 +331,6 @@ class InternalBrowser {
315
331
  gridUrl,
316
332
  viewport,
317
333
  storybookUrl: address,
318
- resolveStorybookUrl: config.resolveStorybookUrl,
319
334
  });
320
335
  return done ? internalBrowser : null;
321
336
  }
@@ -329,7 +344,7 @@ class InternalBrowser {
329
344
  return null;
330
345
  }
331
346
  }
332
- async init({ browserName, gridUrl, viewport, storybookUrl, resolveStorybookUrl, }) {
347
+ async init({ browserName, gridUrl, viewport, storybookUrl, }) {
333
348
  const sessionId = (await this.#browser.getSession()).getId();
334
349
  let browserHost = '';
335
350
  try {
@@ -349,7 +364,7 @@ class InternalBrowser {
349
364
  (0, logger_js_1.logger)().debug(`Connected successful with ${chalk_1.default.green(browserHost)}`);
350
365
  return await (0, utils_js_1.runSequence)([
351
366
  () => this.#browser.manage().setTimeouts({ pageLoad: 60000, script: 60000 }),
352
- () => this.openStorybookPage(storybookUrl, resolveStorybookUrl),
367
+ () => this.openStorybookPage(storybookUrl),
353
368
  () => this.waitForStorybook(),
354
369
  () => this.updateStorybookGlobals(),
355
370
  () => this.resolveCreeveyHost(),
@@ -363,22 +378,13 @@ class InternalBrowser {
363
378
  },
364
379
  ], () => !this.#isShuttingDown);
365
380
  }
366
- async openStorybookPage(storybookUrl, resolver) {
381
+ async openStorybookPage(storybookUrl) {
367
382
  if (!webdriver_js_1.LOCALHOST_REGEXP.test(storybookUrl)) {
368
383
  return this.#browser.get((0, webdriver_js_1.appendIframePath)(storybookUrl));
369
384
  }
370
385
  try {
371
- if (resolver) {
372
- (0, logger_js_1.logger)().debug('Resolving storybook url with custom resolver');
373
- const resolvedUrl = await resolver();
374
- (0, logger_js_1.logger)().debug(`Resolver storybook url ${resolvedUrl}`);
375
- await this.#browser.get((0, webdriver_js_1.appendIframePath)(resolvedUrl));
376
- }
377
- else {
378
- // TODO Pageload timeout 10s
379
- // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
380
- await (0, webdriver_js_1.resolveStorybookUrl)((0, webdriver_js_1.appendIframePath)(storybookUrl), (url) => this.checkUrl(url));
381
- }
386
+ // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
387
+ await (0, webdriver_js_1.resolveStorybookUrl)((0, webdriver_js_1.appendIframePath)(storybookUrl), (url) => this.checkUrl(url));
382
388
  }
383
389
  catch (error) {
384
390
  (0, logger_js_1.logger)().error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
@@ -407,7 +413,7 @@ class InternalBrowser {
407
413
  }
408
414
  }
409
415
  async waitForStorybook() {
410
- (0, logger_js_1.logger)().debug('Waiting for `setStories` event to make sure that storybook is initiated');
416
+ (0, logger_js_1.logger)().debug('Waiting for Storybook to initiate');
411
417
  const isTimeout = await Promise.race([
412
418
  new Promise((resolve) => {
413
419
  setTimeout(() => {
@@ -419,9 +425,6 @@ class InternalBrowser {
419
425
  do {
420
426
  // TODO Research a different way to ensure storybook is initiated
421
427
  wait = await this.#browser.executeScript(function (SET_GLOBALS) {
422
- // TODO Maybe use
423
- // import { global } from '@storybook/global';
424
- // global.IS_STORYBOOK
425
428
  if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined')
426
429
  return true;
427
430
  if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined)
@@ -432,9 +435,8 @@ class InternalBrowser {
432
435
  return false;
433
436
  })(),
434
437
  ]);
435
- // TODO Change the message to describe a reason why it might happen
436
438
  if (isTimeout)
437
- throw new Error('Failed to wait `setStories` event');
439
+ throw new Error('Failed to wait Storybook init');
438
440
  }
439
441
  async updateStorybookGlobals() {
440
442
  if (!this.#storybookGlobals)
@@ -445,7 +447,9 @@ class InternalBrowser {
445
447
  }, this.#storybookGlobals);
446
448
  }
447
449
  async resolveCreeveyHost() {
448
- const addresses = (0, webdriver_js_1.getAddresses)();
450
+ const storybookUrl = await this.#browser.getCurrentUrl();
451
+ const storybookHost = new URL(storybookUrl).hostname;
452
+ const addresses = [storybookHost, ...(0, webdriver_js_1.getAddresses)()];
449
453
  this.#serverHost = await this.#browser.executeAsyncScript(function (hosts, port, callback) {
450
454
  void Promise.all(hosts.map(function (host) {
451
455
  return Promise.race([
@@ -474,6 +478,7 @@ class InternalBrowser {
474
478
  }
475
479
  async updateBrowserGlobalVariables() {
476
480
  await this.#browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
481
+ window.__CREEVEY_ENV__ = true;
477
482
  window.__CREEVEY_WORKER_ID__ = workerId;
478
483
  window.__CREEVEY_SERVER_HOST__ = creeveyHost;
479
484
  window.__CREEVEY_SERVER_PORT__ = creeveyPort;
@@ -633,8 +638,17 @@ class InternalBrowser {
633
638
  keepAlive() {
634
639
  this.#keepAliveInterval = setInterval(() => {
635
640
  // NOTE Simple way to keep session alive
636
- void this.#browser.getCurrentUrl().then((url) => {
641
+ void this.#browser
642
+ .getCurrentUrl()
643
+ .then((url) => {
637
644
  (0, logger_js_1.logger)().debug('current url', chalk_1.default.magenta(url));
645
+ })
646
+ .catch((error) => {
647
+ (0, logger_js_1.logger)().error(error);
648
+ (0, messages_js_1.emitWorkerMessage)({
649
+ type: 'error',
650
+ payload: { subtype: 'browser', error: 'Failed to ping browser' },
651
+ });
638
652
  });
639
653
  }, 10 * 1000);
640
654
  }