creevey 0.10.0-beta.8 → 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 (350) 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 +4 -4
  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 +14 -21
  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 +31 -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 +2 -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 +45 -15
  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 +44 -15
  62. package/dist/client/web/CreeveyApp.js.map +1 -1
  63. package/dist/client/web/CreeveyContext.d.ts +6 -0
  64. package/dist/client/web/CreeveyContext.js +21 -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 +20 -10
  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 +67 -13
  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 -13
  82. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  83. package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -13
  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.d.ts +1 -8
  94. package/dist/client/web/KeyboardEventsContext.js +79 -64
  95. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  96. package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
  97. package/dist/client/web/index.html +1 -1
  98. package/dist/client/web/index.js +26 -11
  99. package/dist/client/web/index.js.map +1 -1
  100. package/dist/client/web/themes.d.ts +2 -0
  101. package/dist/client/web/themes.js +22 -0
  102. package/dist/client/web/themes.js.map +1 -0
  103. package/dist/creevey.d.ts +1 -1
  104. package/dist/creevey.js +122 -41
  105. package/dist/creevey.js.map +1 -1
  106. package/dist/index.d.ts +1 -0
  107. package/dist/playwright/generator.d.ts +25 -0
  108. package/dist/playwright/generator.js +243 -0
  109. package/dist/playwright/generator.js.map +1 -0
  110. package/dist/playwright/helpers.d.ts +2 -0
  111. package/dist/playwright/helpers.js +29 -0
  112. package/dist/playwright/helpers.js.map +1 -0
  113. package/dist/playwright/reporter.d.ts +83 -0
  114. package/dist/playwright/reporter.js +334 -0
  115. package/dist/playwright/reporter.js.map +1 -0
  116. package/dist/playwright/setup.d.ts +3 -0
  117. package/dist/playwright/setup.js +72 -0
  118. package/dist/playwright/setup.js.map +1 -0
  119. package/dist/playwright.d.ts +1 -0
  120. package/dist/playwright.js +3 -1
  121. package/dist/playwright.js.map +1 -1
  122. package/dist/server/compare.d.ts +18 -0
  123. package/dist/server/compare.js +182 -0
  124. package/dist/server/compare.js.map +1 -0
  125. package/dist/server/config.d.ts +3 -3
  126. package/dist/server/config.js +75 -8
  127. package/dist/server/config.js.map +1 -1
  128. package/dist/server/connection.d.ts +3 -0
  129. package/dist/server/connection.js +28 -0
  130. package/dist/server/connection.js.map +1 -0
  131. package/dist/server/docker.d.ts +1 -1
  132. package/dist/server/docker.js +54 -32
  133. package/dist/server/docker.js.map +1 -1
  134. package/dist/server/index.d.ts +2 -2
  135. package/dist/server/index.js +165 -64
  136. package/dist/server/index.js.map +1 -1
  137. package/dist/server/master/api.d.ts +11 -6
  138. package/dist/server/master/api.js +88 -25
  139. package/dist/server/master/api.js.map +1 -1
  140. package/dist/server/master/handlers/capture-handler.d.ts +5 -0
  141. package/dist/server/master/handlers/capture-handler.js +25 -0
  142. package/dist/server/master/handlers/capture-handler.js.map +1 -0
  143. package/dist/server/master/handlers/index.d.ts +4 -0
  144. package/dist/server/master/handlers/index.js +21 -0
  145. package/dist/server/master/handlers/index.js.map +1 -0
  146. package/dist/server/master/handlers/ping-handler.d.ts +2 -0
  147. package/dist/server/master/handlers/ping-handler.js +8 -0
  148. package/dist/server/master/handlers/ping-handler.js.map +1 -0
  149. package/dist/server/master/handlers/static-handler.d.ts +1 -0
  150. package/dist/server/master/handlers/static-handler.js +20 -0
  151. package/dist/server/master/handlers/static-handler.js.map +1 -0
  152. package/dist/server/master/handlers/stories-handler.d.ts +4 -0
  153. package/dist/server/master/handlers/stories-handler.js +24 -0
  154. package/dist/server/master/handlers/stories-handler.js.map +1 -0
  155. package/dist/server/master/master.js +7 -24
  156. package/dist/server/master/master.js.map +1 -1
  157. package/dist/server/master/pool.d.ts +1 -0
  158. package/dist/server/master/pool.js +5 -3
  159. package/dist/server/master/pool.js.map +1 -1
  160. package/dist/server/master/queue.d.ts +1 -1
  161. package/dist/server/master/queue.js +14 -6
  162. package/dist/server/master/queue.js.map +1 -1
  163. package/dist/server/master/runner.d.ts +6 -6
  164. package/dist/server/master/runner.js +98 -130
  165. package/dist/server/master/runner.js.map +1 -1
  166. package/dist/server/master/server.d.ts +1 -1
  167. package/dist/server/master/server.js +193 -88
  168. package/dist/server/master/server.js.map +1 -1
  169. package/dist/server/master/start.d.ts +1 -2
  170. package/dist/server/master/start.js +13 -29
  171. package/dist/server/master/start.js.map +1 -1
  172. package/dist/server/master/testsManager.d.ts +81 -0
  173. package/dist/server/master/testsManager.js +282 -0
  174. package/dist/server/master/testsManager.js.map +1 -0
  175. package/dist/server/playwright/docker-file.d.ts +1 -1
  176. package/dist/server/playwright/docker-file.js +17 -8
  177. package/dist/server/playwright/docker-file.js.map +1 -1
  178. package/dist/server/playwright/docker.d.ts +2 -1
  179. package/dist/server/playwright/docker.js +10 -2
  180. package/dist/server/playwright/docker.js.map +1 -1
  181. package/dist/server/playwright/index-source.mjs +16 -0
  182. package/dist/server/playwright/internal.d.ts +7 -7
  183. package/dist/server/playwright/internal.js +144 -84
  184. package/dist/server/playwright/internal.js.map +1 -1
  185. package/dist/server/playwright/webdriver.d.ts +3 -3
  186. package/dist/server/playwright/webdriver.js +0 -6
  187. package/dist/server/playwright/webdriver.js.map +1 -1
  188. package/dist/server/providers/browser.js +4 -3
  189. package/dist/server/providers/browser.js.map +1 -1
  190. package/dist/server/providers/hybrid.js +2 -2
  191. package/dist/server/providers/hybrid.js.map +1 -1
  192. package/dist/server/report.d.ts +10 -0
  193. package/dist/server/report.js +45 -0
  194. package/dist/server/report.js.map +1 -0
  195. package/dist/server/reporters/creevey.d.ts +7 -0
  196. package/dist/server/reporters/creevey.js +63 -0
  197. package/dist/server/reporters/creevey.js.map +1 -0
  198. package/dist/server/reporters/index.d.ts +2 -0
  199. package/dist/server/reporters/index.js +16 -0
  200. package/dist/server/reporters/index.js.map +1 -0
  201. package/dist/server/reporters/junit.d.ts +16 -0
  202. package/dist/server/reporters/junit.js +167 -0
  203. package/dist/server/reporters/junit.js.map +1 -0
  204. package/dist/server/reporters/teamcity.d.ts +7 -0
  205. package/dist/server/reporters/teamcity.js +60 -0
  206. package/dist/server/reporters/teamcity.js.map +1 -0
  207. package/dist/server/selenium/internal.d.ts +4 -4
  208. package/dist/server/selenium/internal.js +56 -40
  209. package/dist/server/selenium/internal.js.map +1 -1
  210. package/dist/server/selenium/selenoid.js +12 -6
  211. package/dist/server/selenium/selenoid.js.map +1 -1
  212. package/dist/server/selenium/webdriver.d.ts +3 -3
  213. package/dist/server/selenium/webdriver.js +4 -8
  214. package/dist/server/selenium/webdriver.js.map +1 -1
  215. package/dist/server/shutdown.d.ts +1 -0
  216. package/dist/server/shutdown.js +23 -0
  217. package/dist/server/shutdown.js.map +1 -0
  218. package/dist/server/stories.d.ts +0 -1
  219. package/dist/server/stories.js +0 -12
  220. package/dist/server/stories.js.map +1 -1
  221. package/dist/server/telemetry.js +3 -3
  222. package/dist/server/telemetry.js.map +1 -1
  223. package/dist/server/testsFiles/parser.js +45 -5
  224. package/dist/server/testsFiles/parser.js.map +1 -1
  225. package/dist/server/utils.d.ts +23 -0
  226. package/dist/server/utils.js +114 -15
  227. package/dist/server/utils.js.map +1 -1
  228. package/dist/server/webdriver.d.ts +1 -1
  229. package/dist/server/worker/context.d.ts +3 -0
  230. package/dist/server/worker/context.js +15 -0
  231. package/dist/server/worker/context.js.map +1 -0
  232. package/dist/server/worker/match-image.d.ts +8 -12
  233. package/dist/server/worker/match-image.js +11 -178
  234. package/dist/server/worker/match-image.js.map +1 -1
  235. package/dist/server/worker/start.d.ts +2 -2
  236. package/dist/server/worker/start.js +41 -64
  237. package/dist/server/worker/start.js.map +1 -1
  238. package/dist/shared/index.d.ts +1 -1
  239. package/dist/shared/index.js +9 -7
  240. package/dist/shared/index.js.map +1 -1
  241. package/dist/types.d.ts +84 -43
  242. package/dist/types.js +65 -1
  243. package/dist/types.js.map +1 -1
  244. package/docs/cli.md +80 -0
  245. package/docs/config.md +179 -165
  246. package/docs/examples/playwright-reporer/playwright.config.ts +37 -0
  247. package/docs/migration-0.9-to-0.10.md +144 -0
  248. package/docs/playwright-reporter.md +357 -0
  249. package/docs/storybook.md +60 -0
  250. package/docs/tests.md +50 -45
  251. package/package.json +78 -83
  252. package/playwright.config.mts +46 -0
  253. package/src/client/addon/components/Addon.tsx +1 -1
  254. package/src/client/addon/components/Panel.tsx +4 -4
  255. package/src/client/addon/components/TestSelect.tsx +2 -2
  256. package/src/client/addon/components/Tools.tsx +2 -2
  257. package/src/client/addon/controller.ts +4 -4
  258. package/src/client/addon/makeDecorator.ts +69 -0
  259. package/src/client/addon/manager.ts +38 -37
  260. package/src/client/addon/preset.ts +2 -1
  261. package/src/client/addon/withCreevey.ts +16 -19
  262. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  263. package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
  264. package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
  265. package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
  266. package/src/client/shared/components/ImagesView/SwapView.tsx +20 -2
  267. package/src/client/shared/components/ImagesView/common.ts +1 -1
  268. package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
  269. package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
  270. package/src/client/shared/components/PageHeader/ImagePreview.tsx +2 -1
  271. package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
  272. package/src/client/shared/components/ResultsPage.tsx +33 -10
  273. package/src/client/shared/creeveyClientApi.ts +19 -1
  274. package/src/client/shared/helpers.ts +4 -24
  275. package/src/client/web/CreeveyApp.tsx +30 -9
  276. package/src/client/web/CreeveyContext.tsx +11 -0
  277. package/src/client/web/CreeveyLoader.tsx +2 -2
  278. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
  279. package/src/client/web/CreeveyView/SideBar/Search.tsx +4 -4
  280. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
  281. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +48 -15
  282. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
  283. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +12 -12
  284. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +10 -10
  285. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
  286. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
  287. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
  288. package/src/client/web/KeyboardEventsContext.tsx +61 -73
  289. package/src/client/web/index.tsx +10 -5
  290. package/src/client/web/themes.ts +24 -0
  291. package/src/creevey.ts +92 -38
  292. package/src/playwright/generator.ts +322 -0
  293. package/src/playwright/helpers.ts +31 -0
  294. package/src/playwright/reporter.ts +381 -0
  295. package/src/playwright/setup.ts +84 -0
  296. package/src/playwright.ts +1 -0
  297. package/src/server/compare.ts +260 -0
  298. package/src/server/config.ts +52 -9
  299. package/src/server/connection.ts +26 -0
  300. package/src/server/docker.ts +62 -34
  301. package/src/server/index.ts +166 -79
  302. package/src/server/master/api.ts +94 -28
  303. package/src/server/master/handlers/capture-handler.ts +20 -0
  304. package/src/server/master/handlers/index.ts +4 -0
  305. package/src/server/master/handlers/ping-handler.ts +6 -0
  306. package/src/server/master/handlers/static-handler.ts +16 -0
  307. package/src/server/master/handlers/stories-handler.ts +20 -0
  308. package/src/server/master/master.ts +10 -27
  309. package/src/server/master/pool.ts +7 -3
  310. package/src/server/master/queue.ts +21 -7
  311. package/src/server/master/runner.ts +123 -134
  312. package/src/server/master/server.ts +214 -101
  313. package/src/server/master/start.ts +19 -41
  314. package/src/server/master/testsManager.ts +316 -0
  315. package/src/server/playwright/docker-file.ts +20 -8
  316. package/src/server/playwright/docker.ts +16 -3
  317. package/src/server/playwright/index-source.mjs +16 -0
  318. package/src/server/playwright/internal.ts +176 -103
  319. package/src/server/playwright/webdriver.ts +4 -10
  320. package/src/server/providers/browser.ts +4 -3
  321. package/src/server/providers/hybrid.ts +2 -3
  322. package/src/server/report.ts +51 -0
  323. package/src/server/reporters/creevey.ts +71 -0
  324. package/src/server/reporters/index.ts +11 -0
  325. package/src/server/reporters/junit.ts +207 -0
  326. package/src/server/reporters/teamcity.ts +74 -0
  327. package/src/server/selenium/internal.ts +70 -53
  328. package/src/server/selenium/selenoid.ts +13 -6
  329. package/src/server/selenium/webdriver.ts +8 -12
  330. package/src/server/shutdown.ts +19 -0
  331. package/src/server/stories.ts +1 -12
  332. package/src/server/telemetry.ts +3 -3
  333. package/src/server/testsFiles/parser.ts +52 -4
  334. package/src/server/utils.ts +124 -16
  335. package/src/server/webdriver.ts +1 -1
  336. package/src/server/worker/context.ts +14 -0
  337. package/src/server/worker/match-image.ts +16 -248
  338. package/src/server/worker/start.ts +49 -79
  339. package/src/shared/index.ts +10 -8
  340. package/src/types.ts +91 -58
  341. package/types/global.d.ts +1 -0
  342. package/dist/client/web/assets/index-DB8lHlJw.js +0 -591
  343. package/dist/server/reporter.d.ts +0 -26
  344. package/dist/server/reporter.js +0 -108
  345. package/dist/server/reporter.js.map +0 -1
  346. package/dist/server/update.d.ts +0 -2
  347. package/dist/server/update.js +0 -53
  348. package/dist/server/update.js.map +0 -1
  349. package/src/server/reporter.ts +0 -139
  350. package/src/server/update.ts +0 -74
@@ -0,0 +1,282 @@
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.TestsManager = void 0;
7
+ const path_1 = __importDefault(require("path"));
8
+ const fs_1 = require("fs");
9
+ const events_1 = __importDefault(require("events"));
10
+ const types_js_1 = require("../../types.js");
11
+ const utils_js_1 = require("../utils.js");
12
+ const promises_1 = require("fs/promises");
13
+ /**
14
+ * TestsManager is responsible for all operations related to test data management
15
+ * including loading, saving, merging, and updating test data.
16
+ * It extends EventEmitter to emit update events that can be subscribed to.
17
+ */
18
+ class TestsManager extends events_1.default {
19
+ tests = {};
20
+ screenDir;
21
+ reportDir;
22
+ /**
23
+ * Creates a new TestsManager instance
24
+ * @param screenDir Directory for storing reference images
25
+ * @param reportDir Directory for storing reports and screenshots
26
+ */
27
+ constructor(screenDir, reportDir) {
28
+ super();
29
+ this.screenDir = screenDir;
30
+ this.reportDir = reportDir;
31
+ }
32
+ /**
33
+ * Get a copy of all tests
34
+ * @returns all tests
35
+ */
36
+ getTests() {
37
+ return this.tests;
38
+ }
39
+ /**
40
+ * Get a test by ID
41
+ * @param id Test ID
42
+ * @returns Test data
43
+ */
44
+ getTest(id) {
45
+ return this.tests[id];
46
+ }
47
+ /**
48
+ * Get test data in a format suitable for status reporting
49
+ * @returns Test data in the format needed for status
50
+ */
51
+ getTestsData() {
52
+ const testsData = {};
53
+ Object.entries(this.tests).forEach(([id, test]) => {
54
+ if (!test)
55
+ return;
56
+ const { story: _, fn: __, ...testData } = test;
57
+ testsData[id] = testData;
58
+ });
59
+ return testsData;
60
+ }
61
+ /**
62
+ * Load tests from a report file
63
+ */
64
+ loadTestsFromReport() {
65
+ // TODO: Move to utils
66
+ const reportDataPath = path_1.default.join(this.reportDir, 'data.js');
67
+ const testsFromReport = (0, utils_js_1.tryToLoadTestsData)(reportDataPath) ?? {};
68
+ return testsFromReport;
69
+ }
70
+ /**
71
+ * Merge tests from report with tests from stories
72
+ */
73
+ mergeTests(testsWithReports, testsFromStories) {
74
+ Object.values(testsFromStories)
75
+ .filter(types_js_1.isDefined)
76
+ .forEach((test) => {
77
+ const testWithReport = testsWithReports[test.id];
78
+ if (!testWithReport)
79
+ return;
80
+ test.retries = testWithReport.retries;
81
+ if (testWithReport.status === 'success' || testWithReport.status === 'failed') {
82
+ test.status = testWithReport.status;
83
+ }
84
+ test.results = testWithReport.results;
85
+ test.approved = testWithReport.approved;
86
+ });
87
+ return testsFromStories;
88
+ }
89
+ loadAndMergeTests(testsFromStories) {
90
+ const testsFromReport = this.loadTestsFromReport();
91
+ return this.mergeTests(testsFromReport, testsFromStories);
92
+ }
93
+ /**
94
+ * Update tests with incremental changes
95
+ * @param testsDiff Tests to update or remove
96
+ */
97
+ updateTests(testsDiff) {
98
+ const tests = {};
99
+ const removedTests = [];
100
+ Object.entries(testsDiff).forEach(([id, newTest]) => {
101
+ if (newTest) {
102
+ if (this.tests[id]) {
103
+ this.tests[id] = {
104
+ ...newTest,
105
+ retries: this.tests[id].retries,
106
+ results: this.tests[id].results,
107
+ approved: this.tests[id].approved,
108
+ };
109
+ }
110
+ else {
111
+ this.tests[id] = newTest;
112
+ }
113
+ const { story: _, fn: __, ...restTest } = newTest;
114
+ tests[id] = { ...restTest, status: 'unknown' };
115
+ }
116
+ else if (this.tests[id]) {
117
+ const { id: testId, browser, testName, storyPath, storyId } = this.tests[id];
118
+ removedTests.push({ id: testId, browser, testName, storyPath, storyId });
119
+ // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
120
+ delete this.tests[id];
121
+ }
122
+ });
123
+ this.saveTestsToJson();
124
+ const update = { tests, removedTests };
125
+ this.emit('update', update);
126
+ return update;
127
+ }
128
+ /**
129
+ * Update test result
130
+ * @param id Test ID
131
+ * @param status New test status
132
+ * @param result Optional test result
133
+ */
134
+ updateTestStatus(id, status, result) {
135
+ // TODO Handle 'retrying' status
136
+ const test = this.tests[id];
137
+ if (!test)
138
+ return null;
139
+ const { browser, testName, storyPath, storyId } = test;
140
+ test.status = status === 'retrying' ? 'failed' : status;
141
+ if (!result) {
142
+ // NOTE: Running status
143
+ const update = { tests: { [id]: { id, browser, testName, storyPath, status, storyId } } };
144
+ this.emit('update', update);
145
+ return update;
146
+ }
147
+ test.results ??= [];
148
+ test.results.push(result);
149
+ if (status === 'failed') {
150
+ test.approved = null;
151
+ }
152
+ const update = {
153
+ tests: {
154
+ [id]: {
155
+ id,
156
+ browser,
157
+ testName,
158
+ storyPath,
159
+ status,
160
+ approved: test.approved,
161
+ results: [result],
162
+ storyId,
163
+ },
164
+ },
165
+ };
166
+ this.emit('update', update);
167
+ return update;
168
+ }
169
+ /**
170
+ * Save tests to JSON file
171
+ * @param reportDir Directory to save the JSON file
172
+ */
173
+ saveTestsToJson() {
174
+ (0, fs_1.mkdirSync)(this.reportDir, { recursive: true });
175
+ (0, fs_1.writeFileSync)(path_1.default.join(this.reportDir, 'tests.json'),
176
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
177
+ JSON.stringify(this.tests, (_, value) => ((0, types_js_1.isFunction)(value) ? value.toString() : value), 2));
178
+ }
179
+ /**
180
+ * Save test data to a module
181
+ * @param data Test data to include in the module
182
+ */
183
+ async saveTestData(data = this.getTestsData()) {
184
+ const dataModule = `
185
+ (function (root, factory) {
186
+ if (typeof module === 'object' && module.exports) {
187
+ module.exports = factory();
188
+ } else {
189
+ root.__CREEVEY_DATA__ = factory();
190
+ }
191
+ }(this, function () { return ${JSON.stringify(data)} }));
192
+ `;
193
+ await (0, promises_1.writeFile)(path_1.default.join(this.reportDir, 'data.js'), dataModule);
194
+ }
195
+ /**
196
+ * Copy image for approval
197
+ * @param test Test data
198
+ * @param image Image name
199
+ * @param actual Actual image path
200
+ */
201
+ async copyImage(test, image, actual) {
202
+ const { browser, testName, storyPath } = test;
203
+ const restPath = [...storyPath, testName].filter(types_js_1.isDefined);
204
+ const testPath = path_1.default.join(...restPath, image == browser ? '' : browser);
205
+ const srcImagePath = path_1.default.join(this.reportDir, testPath, actual);
206
+ const dstImagePath = path_1.default.join(this.screenDir, testPath, `${image}.png`);
207
+ await (0, promises_1.mkdir)(path_1.default.join(this.screenDir, testPath), { recursive: true });
208
+ await (0, promises_1.copyFile)(srcImagePath, dstImagePath);
209
+ }
210
+ /**
211
+ * Approve a specific test
212
+ * @param payload Approval payload with test ID, retry index, and image name
213
+ */
214
+ async approve({ id, retry, image }) {
215
+ const test = this.tests[id];
216
+ if (!test?.results)
217
+ return null;
218
+ const result = test.results[retry];
219
+ if (!result.images)
220
+ return null;
221
+ const images = result.images[image];
222
+ if (!images)
223
+ return null;
224
+ test.approved ??= {};
225
+ const { browser, testName, storyPath, storyId } = test;
226
+ await this.copyImage(test, image, images.actual);
227
+ test.approved[image] = retry;
228
+ if (Object.keys(result.images).every((name) => typeof test.approved?.[name] == 'number')) {
229
+ test.status = 'approved';
230
+ }
231
+ const update = {
232
+ tests: {
233
+ [id]: {
234
+ id,
235
+ browser,
236
+ testName,
237
+ storyPath,
238
+ status: test.status,
239
+ approved: test.approved,
240
+ storyId,
241
+ },
242
+ },
243
+ };
244
+ this.emit('update', update);
245
+ return update;
246
+ }
247
+ /**
248
+ * Approve all failed tests
249
+ */
250
+ async approveAll() {
251
+ const updatedTests = {};
252
+ for (const test of Object.values(this.tests)) {
253
+ if (!test?.results)
254
+ continue;
255
+ const retry = test.results.length - 1;
256
+ const { images, status } = test.results.at(retry) ?? {};
257
+ if (!images || status != 'failed')
258
+ continue;
259
+ for (const [name, image] of Object.entries(images)) {
260
+ if (!image)
261
+ continue;
262
+ await this.copyImage(test, name, image.actual);
263
+ test.approved ??= {};
264
+ test.approved[name] = retry;
265
+ test.status = 'approved';
266
+ updatedTests[test.id] = {
267
+ id: test.id,
268
+ browser: test.browser,
269
+ storyPath: test.storyPath,
270
+ storyId: test.storyId,
271
+ status: test.status,
272
+ approved: { [name]: retry },
273
+ };
274
+ }
275
+ }
276
+ const result = { tests: updatedTests };
277
+ this.emit('update', result);
278
+ return result;
279
+ }
280
+ }
281
+ exports.TestsManager = TestsManager;
282
+ //# sourceMappingURL=testsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testsManager.js","sourceRoot":"","sources":["../../../src/server/master/testsManager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export declare function playwrightDockerFile(browser: string, version: string): string;
1
+ export declare function playwrightDockerFile(browser: string, version: string): Promise<string>;
@@ -4,34 +4,43 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.playwrightDockerFile = playwrightDockerFile;
7
+ const promises_1 = require("fs/promises");
8
+ const url_1 = require("url");
7
9
  const semver_1 = __importDefault(require("semver"));
8
- const shelljs_1 = require("shelljs");
10
+ const shelljs_1 = __importDefault(require("shelljs"));
11
+ const importMetaUrl = (0, url_1.pathToFileURL)(__filename).href;
9
12
  // TODO Support custom docker images
10
- function playwrightDockerFile(browser, version) {
13
+ async function playwrightDockerFile(browser, version) {
11
14
  const sv = semver_1.default.coerce(version);
12
15
  let npmRegistry;
13
16
  try {
14
- npmRegistry = (0, shelljs_1.exec)('npm config get registry', { silent: true }).stdout.trim();
17
+ npmRegistry = shelljs_1.default.exec('npm config get registry', { silent: true }).stdout.trim();
15
18
  }
16
19
  catch {
17
20
  /* noop */
18
21
  }
19
- return `
20
- FROM mcr.microsoft.com/playwright:v${sv?.format() ?? version}
22
+ const indexJs = await (0, promises_1.readFile)(new URL('./index-source.mjs', importMetaUrl), 'utf-8');
23
+ const dockerfile = `
24
+ FROM node:lts
21
25
 
22
26
  WORKDIR /creevey
23
27
 
24
28
  RUN echo "{ \\"type\\": \\"module\\" }" > package.json && \\
25
- echo "import { ${browser} as browser } from 'playwright-core';" >> index.js && \\
26
- echo "const ws = await browser.launchServer({ port: 4444, wsPath: 'creevey' })" >> index.js && \\${npmRegistry
29
+ ${indexJs
30
+ .split('\n')
31
+ .map((line) => ` echo "${line.replace(/"/g, '\\"')}" >> index.js && \\`)
32
+ .join('\n')}
33
+ ${npmRegistry
27
34
  ? `
28
35
  echo "registry=${npmRegistry}" > .npmrc && \\`
29
36
  : ''}
30
- npm i playwright-core${sv ? `@${sv.format()}` : ''}
37
+ npm i playwright-core${sv ? `@${sv.format()}` : ''} && \\
38
+ npx -y playwright${sv ? `@${sv.format()}` : ''} install --with-deps ${browser}
31
39
 
32
40
  EXPOSE 4444
33
41
 
34
42
  ENTRYPOINT [ "node", "./index.js" ]
35
43
  `;
44
+ return dockerfile.replace(/\\\n\s*\\?\n/g, '\\\n');
36
45
  }
37
46
  //# sourceMappingURL=docker-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docker-file.js","sourceRoot":"","sources":["../../../src/server/playwright/docker-file.ts"],"names":[],"mappings":";;;;;AAIA,oDA6BC;AAjCD,oDAA4B;AAC5B,qCAA+B;AAE/B,oCAAoC;AACpC,SAAgB,oBAAoB,CAAC,OAAe,EAAE,OAAe;IACnE,MAAM,EAAE,GAAG,gBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,WAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,IAAA,cAAI,EAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;IAED,OAAO;qCAC4B,EAAE,EAAE,MAAM,EAAE,IAAI,OAAO;;;;;qBAKvC,OAAO;uGAEtB,WAAW;QACT,CAAC,CAAC;qBACW,WAAW,kBAAkB;QAC1C,CAAC,CAAC,EACN;2BACuB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;;;;;CAKrD,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"docker-file.js","sourceRoot":"","sources":["../../../src/server/playwright/docker-file.ts"],"names":[],"mappings":";;;;;AAQA,oDAqCC;AA7CD,0CAAuC;AACvC,6BAAoC;AACpC,oDAA4B;AAC5B,sDAAyB;AAEzB,MAAM,aAAa,GAAG,IAAA,mBAAa,EAAC,UAAU,CAAC,CAAC,IAAI,CAAC;AAErD,oCAAoC;AAC7B,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAe;IACzE,MAAM,EAAE,GAAG,gBAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAElC,IAAI,WAAW,CAAC;IAChB,IAAI,CAAC;QACH,WAAW,GAAG,iBAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,UAAU;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC;IAEtF,MAAM,UAAU,GAAG;;;;;;EAMnB,OAAO;SACN,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,qBAAqB,CAAC;SAC1E,IAAI,CAAC,IAAI,CAAC;MAEP,WAAW;QACT,CAAC,CAAC;qBACW,WAAW,kBAAkB;QAC1C,CAAC,CAAC,EACN;2BACuB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;uBAC/B,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,wBAAwB,OAAO;;;;;CAKhF,CAAC;IAEA,OAAO,UAAU,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
@@ -1 +1,2 @@
1
- export declare function startPlaywrightContainer(imageName: string, debug: boolean): Promise<string>;
1
+ import type { Config } from '../../types';
2
+ export declare function startPlaywrightContainer(imageName: string, browser: string, config: Config, debug: boolean): Promise<string>;
@@ -1,11 +1,16 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.startPlaywrightContainer = startPlaywrightContainer;
7
+ const assert_1 = __importDefault(require("assert"));
4
8
  const docker_1 = require("../docker");
5
9
  const messages_1 = require("../messages");
6
10
  const utils_1 = require("../utils");
7
11
  const webdriver_1 = require("../webdriver");
8
- async function startPlaywrightContainer(imageName, debug) {
12
+ async function startPlaywrightContainer(imageName, browser, config, debug) {
13
+ const { browserName, playwrightOptions } = config.browsers[browser];
9
14
  const port = await new Promise((resolve) => {
10
15
  (0, messages_1.subscribeOn)('worker', (message) => {
11
16
  if (message.type == 'port') {
@@ -14,10 +19,13 @@ async function startPlaywrightContainer(imageName, debug) {
14
19
  });
15
20
  (0, messages_1.emitWorkerMessage)({ type: 'port', payload: { port: -1 } });
16
21
  });
17
- const host = await (0, docker_1.runImage)(imageName, [], {
22
+ const cacheDir = await (0, utils_1.getCreeveyCache)();
23
+ (0, assert_1.default)(cacheDir, "Couldn't get cache directory");
24
+ const host = await (0, docker_1.runImage)(imageName, [JSON.stringify({ ...playwrightOptions, browser: (0, utils_1.resolvePlaywrightBrowserType)(browserName) })], {
18
25
  ExposedPorts: { [`${port}/tcp`]: {} },
19
26
  HostConfig: {
20
27
  PortBindings: { ['4444/tcp']: [{ HostPort: `${port}` }] },
28
+ Binds: [`${cacheDir}/${process.pid}:/creevey/traces`],
21
29
  },
22
30
  }, debug);
23
31
  const gridUrl = `ws://localhost:${port}/creevey`;
@@ -1 +1 @@
1
- {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/server/playwright/docker.ts"],"names":[],"mappings":";;AAKA,4DAyBC;AA9BD,sCAAqC;AACrC,0CAA6D;AAC7D,oCAA0C;AAC1C,4CAAgD;AAEzC,KAAK,UAAU,wBAAwB,CAAC,SAAiB,EAAE,KAAc;IAC9E,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACjD,IAAA,sBAAW,EAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;YAChC,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAA,4BAAiB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAQ,EACzB,SAAS,EACT,EAAE,EACF;QACE,YAAY,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE;QACrC,UAAU,EAAE;YACV,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE;SAC1D;KACF,EACD,KAAK,CACN,CAAC;IAEF,MAAM,OAAO,GAAG,kBAAkB,IAAI,UAAU,CAAC;IAEjD,OAAO,sBAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5E,CAAC"}
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../../src/server/playwright/docker.ts"],"names":[],"mappings":";;;;;AAOA,4DAoCC;AA3CD,oDAA4B;AAC5B,sCAAqC;AACrC,0CAA6D;AAC7D,oCAAyF;AACzF,4CAAgD;AAGzC,KAAK,UAAU,wBAAwB,CAC5C,SAAiB,EACjB,OAAe,EACf,MAAc,EACd,KAAc;IAEd,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAwB,CAAC;IAC3F,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QACjD,IAAA,sBAAW,EAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE;YAChC,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAA,4BAAiB,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAe,GAAE,CAAC;IAEzC,IAAA,gBAAM,EAAC,QAAQ,EAAE,8BAA8B,CAAC,CAAC;IAEjD,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAQ,EACzB,SAAS,EACT,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,iBAAiB,EAAE,OAAO,EAAE,IAAA,oCAA4B,EAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAC9F;QACE,YAAY,EAAE,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,EAAE;QACrC,UAAU,EAAE;YACV,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE;YACzD,KAAK,EAAE,CAAC,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,kBAAkB,CAAC;SACtD;KACF,EACD,KAAK,CACN,CAAC;IAEF,MAAM,OAAO,GAAG,kBAAkB,IAAI,UAAU,CAAC;IAEjD,OAAO,sBAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAAgB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { chromium, firefox, webkit } from 'playwright-core';
2
+
3
+ /** @type import("playwright-core").LaunchOptions & { browser: 'chromium' | 'firefox' | 'webkit' } */
4
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
5
+ const config = JSON.parse(process.argv.slice(2)[0]);
6
+
7
+ const browsers = { chromium, firefox, webkit };
8
+
9
+ const ws = await browsers[config.browser].launchServer({
10
+ ...config,
11
+ port: 4444,
12
+ wsPath: 'creevey',
13
+ tracesDir: 'traces',
14
+ });
15
+
16
+ console.log(config.browser, 'browser server launched on:', ws.wsEndpoint());
@@ -1,9 +1,9 @@
1
- import { Browser, Page } from 'playwright-core';
2
- import { Config, Options, StoriesRaw, StoryInput } from '../../types';
3
- import { Args } from '@storybook/csf';
1
+ import { Browser, BrowserContext, Page } from 'playwright-core';
2
+ import type { Args } from 'storybook/internal/types';
3
+ import { Config, StoriesRaw, StoryInput, StorybookGlobals, WorkerOptions } from '../../types';
4
4
  export declare class InternalBrowser {
5
5
  #private;
6
- constructor(browser: Browser, page: Page, port: number);
6
+ constructor(browser: Browser, context: BrowserContext, page: Page, traceDir: string, port: number, debug?: boolean, storybookGlobals?: StorybookGlobals);
7
7
  get browser(): Page;
8
8
  get sessionId(): string;
9
9
  closeBrowser(): Promise<void>;
@@ -11,15 +11,15 @@ export declare class InternalBrowser {
11
11
  waitForComplete(callback: (isCompleted: boolean) => void): void;
12
12
  selectStory(id: string, waitForReady?: boolean): Promise<boolean>;
13
13
  updateStoryArgs(story: StoryInput, updatedArgs: Args): Promise<void>;
14
- loadStoriesFromBrowser(retry?: boolean): Promise<StoriesRaw>;
15
- static getBrowser(browserName: string, gridUrl: string, config: Config, options: Options): Promise<InternalBrowser | null>;
14
+ loadStoriesFromBrowser(): Promise<StoriesRaw>;
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;
19
19
  private waitForStorybook;
20
+ private triggerViteReload;
20
21
  private updateStorybookGlobals;
21
22
  private resolveCreeveyHost;
22
23
  private updateBrowserGlobalVariables;
23
- private resizeViewport;
24
24
  private resetMousePosition;
25
25
  }