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
@@ -20,7 +20,7 @@
20
20
  sans-serif;
21
21
  }
22
22
  </style>
23
- <script type="module" crossorigin src="./assets/index-BE9CL5_G.js"></script>
23
+ <script type="module" crossorigin src="./assets/index-CtSq3IhG.js"></script>
24
24
  </head>
25
25
  <body>
26
26
  <div id="root"></div>
@@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
15
15
  }) : function(o, v) {
16
16
  o["default"] = v;
17
17
  });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
25
35
  Object.defineProperty(exports, "__esModule", { value: true });
26
36
  const react_1 = __importStar(require("react"));
27
37
  const client_1 = require("react-dom/client");
@@ -41,7 +51,7 @@ function loadCreeveyData() {
41
51
  document.body.appendChild(script);
42
52
  });
43
53
  }
44
- const CreeveyAppAsync = react_1.default.lazy(async () => {
54
+ const CreeveyAppAsync = (0, react_1.lazy)(async () => {
45
55
  let isReport = false;
46
56
  let creeveyStatus;
47
57
  let creeveyApi;
@@ -54,16 +64,21 @@ const CreeveyAppAsync = react_1.default.lazy(async () => {
54
64
  // NOTE: Failed to get status from API
55
65
  // NOTE: It might happen on circle ci from artifact
56
66
  isReport = true;
57
- creeveyStatus = { isRunning: false, tests: await loadCreeveyData(), browsers: [] };
67
+ creeveyStatus = { isRunning: false, tests: await loadCreeveyData(), browsers: [], isUpdateMode: false };
58
68
  }
59
69
  }
60
70
  else {
61
71
  isReport = true;
62
- creeveyStatus = { isRunning: false, tests: await loadCreeveyData(), browsers: [] };
72
+ creeveyStatus = { isRunning: false, tests: await loadCreeveyData(), browsers: [], isUpdateMode: false };
63
73
  }
64
74
  return {
65
75
  default() {
66
- return (react_1.default.createElement(CreeveyApp_js_1.CreeveyApp, { api: creeveyApi, initialState: { isReport, isRunning: creeveyStatus.isRunning, tests: (0, helpers_js_1.treeifyTests)(creeveyStatus.tests) } }));
76
+ return (react_1.default.createElement(CreeveyApp_js_1.CreeveyApp, { api: creeveyApi, initialState: {
77
+ isReport,
78
+ isRunning: creeveyStatus.isRunning,
79
+ tests: (0, helpers_js_1.treeifyTests)(creeveyStatus.tests),
80
+ isUpdateMode: creeveyStatus.isUpdateMode,
81
+ } }));
67
82
  },
68
83
  };
69
84
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/web/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAwC;AACxC,6CAA8C;AAC9C,mDAA6C;AAE7C,uEAAuF;AACvF,6CAAqD;AACrD,qDAAoD;AACpD,yDAAmD;AAMnD,MAAM,CAAC,iCAAiC,GAAG,eAAI,CAAC;AAEhD,SAAS,eAAe;IACtB,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC5B,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAC5C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,aAA4B,CAAC;IACjC,IAAI,UAAwC,CAAC;IAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,IAAA,0CAAoB,GAAE,CAAC;YAC1C,aAAa,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;YACtC,mDAAmD;YACnD,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACrF,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC;QAChB,aAAa,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACrF,CAAC;IAED,OAAO;QACL,OAAO;YACL,OAAO,CACL,8BAAC,0BAAU,IACT,GAAG,EAAE,UAAU,EACf,YAAY,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,IAAA,yBAAY,EAAC,aAAa,CAAC,KAAK,CAAC,EAAE,GACxG,CACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAE,CAAC,CAAC;AAC1D,IAAI,CAAC,MAAM,CACT,8BAAC,gBAAQ,IAAC,QAAQ,EAAE,8BAAC,gCAAa,OAAG;IACnC,8BAAC,eAAe,OAAG,CACV,CACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/client/web/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAA8C;AAC9C,6CAA8C;AAC9C,mDAA6C;AAE7C,uEAAuF;AACvF,6CAAqD;AACrD,qDAAoD;AACpD,yDAAmD;AAMnD,MAAM,CAAC,iCAAiC,GAAG,eAAI,CAAC;AAEhD,SAAS,eAAe;IACtB,OAAO,IAAI,OAAO,CAAyB,CAAC,OAAO,EAAE,EAAE;QACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC5B,CAAC,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,eAAe,GAAG,IAAA,YAAI,EAAC,KAAK,IAAI,EAAE;IACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,aAA4B,CAAC;IACjC,IAAI,UAAwC,CAAC;IAC7C,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,IAAA,0CAAoB,GAAE,CAAC;YAC1C,aAAa,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;YACtC,mDAAmD;YACnD,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAC1G,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,IAAI,CAAC;QAChB,aAAa,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC1G,CAAC;IAED,OAAO;QACL,OAAO;YACL,OAAO,CACL,8BAAC,0BAAU,IACT,GAAG,EAAE,UAAU,EACf,YAAY,EAAE;oBACZ,QAAQ;oBACR,SAAS,EAAE,aAAa,CAAC,SAAS;oBAClC,KAAK,EAAE,IAAA,yBAAY,EAAC,aAAa,CAAC,KAAK,CAAC;oBACxC,YAAY,EAAE,aAAa,CAAC,YAAY;iBACzC,GACD,CACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,oEAAoE;AACpE,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAE,CAAC,CAAC;AAC1D,IAAI,CAAC,MAAM,CACT,8BAAC,gBAAQ,IAAC,QAAQ,EAAE,8BAAC,gCAAa,OAAG;IACnC,8BAAC,eAAe,OAAG,CACV,CACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ThemeVars } from 'storybook/theming';
2
+ export declare function useTheme(): [ThemeVars['base'], (theme: ThemeVars['base']) => void];
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTheme = useTheme;
4
+ const react_1 = require("react");
5
+ const theming_1 = require("storybook/theming");
6
+ const types_js_1 = require("../../types.js");
7
+ const CREEVEY_THEME = 'Creevey_theme';
8
+ function isTheme(theme) {
9
+ return (0, types_js_1.isDefined)(theme) && Object.prototype.hasOwnProperty.call(theming_1.themes, theme);
10
+ }
11
+ function initialTheme() {
12
+ const theme = localStorage.getItem(CREEVEY_THEME);
13
+ return isTheme(theme) ? theme : 'light';
14
+ }
15
+ function useTheme() {
16
+ const [theme, setTheme] = (0, react_1.useState)(initialTheme());
17
+ (0, react_1.useEffect)(() => {
18
+ localStorage.setItem(CREEVEY_THEME, theme);
19
+ }, [theme]);
20
+ return [theme, setTheme];
21
+ }
22
+ //# sourceMappingURL=themes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../../../src/client/web/themes.ts"],"names":[],"mappings":";;AAeA,4BAQC;AAvBD,iCAA4C;AAC5C,+CAAsD;AACtD,6CAA2C;AAE3C,MAAM,aAAa,GAAG,eAAe,CAAC;AAEtC,SAAS,OAAO,CAAC,KAAqB;IACpC,OAAO,IAAA,oBAAS,EAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAM,EAAE,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAClD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1C,CAAC;AAED,SAAgB,QAAQ;IACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAoB,YAAY,EAAE,CAAC,CAAC;IAEtE,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC"}
package/dist/creevey.d.ts CHANGED
@@ -1 +1 @@
1
- export {};
1
+ import './server/shutdown.js';
package/dist/creevey.js CHANGED
@@ -1,66 +1,147 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
5
38
  Object.defineProperty(exports, "__esModule", { value: true });
6
39
  const cluster_1 = __importDefault(require("cluster"));
7
- const minimist_1 = __importDefault(require("minimist"));
8
- const index_js_1 = __importDefault(require("./server/index.js"));
9
- const messages_js_1 = require("./server/messages.js");
10
- const utils_js_1 = require("./server/utils.js");
40
+ const v = __importStar(require("valibot"));
11
41
  const loglevel_1 = __importDefault(require("loglevel"));
42
+ const cac_1 = require("cac");
43
+ const types_js_1 = require("./types.js");
44
+ const package_json_1 = require("../package.json");
12
45
  const logger_js_1 = require("./server/logger.js");
13
- function shutdownOnException(reason) {
14
- if (utils_js_1.isShuttingDown.current)
15
- return;
16
- const error = reason instanceof Error ? (reason.stack ?? reason.message) : reason;
17
- (0, logger_js_1.logger)().error(error);
18
- process.exitCode = -1;
19
- if (cluster_1.default.isWorker)
20
- (0, messages_js_1.emitWorkerMessage)({ type: 'error', payload: { subtype: 'unknown', error } });
21
- if (cluster_1.default.isPrimary)
22
- void (0, utils_js_1.shutdownWorkers)();
46
+ const index_js_1 = __importDefault(require("./server/index.js"));
47
+ require("./server/shutdown.js");
48
+ const workerCli = (0, cac_1.cac)('worker');
49
+ workerCli
50
+ .command('worker', 'Start worker')
51
+ .option('--browser <browser>', 'Specify browser to run tests')
52
+ .option('--grid-url <url>', 'Selenium grid URL')
53
+ .option('-d, --debug', 'Enable debug mode')
54
+ .option('-c, --config <config>', 'Path to config file')
55
+ .option('-p, --port <port>', 'Port for UI server', { default: 3000 })
56
+ .option('--trace', 'Enable trace mode (more verbose than debug)')
57
+ .option('--report-dir <dir>', 'Directory for test reports')
58
+ .option('--screen-dir <dir>', 'Directory for reference images')
59
+ .option('--storybook-url <url>', 'Storybook server URL')
60
+ .option('--odiff', 'Use odiff for image comparison');
61
+ workerCli.parse();
62
+ const cli = (0, cac_1.cac)('creevey');
63
+ cli
64
+ .command('report [reportDir]', 'Launch web UI to review and approve test results')
65
+ .option('-c, --config <config>', 'Path to config file')
66
+ .option('-p, --port <port>', 'Port for UI server', { default: 3000 })
67
+ .option('--screen-dir <dir>', 'Directory for reference images');
68
+ // TODO Add ability to start specific tests/files/stories
69
+ cli
70
+ .command('test [options]', 'Run tests')
71
+ .option('--ui', 'Launch web UI for running tests and reviewing test results')
72
+ .option('-s, --storybook-start [cmd]', 'Start Storybook automatically')
73
+ .option('-c, --config <config>', 'Path to config file')
74
+ .option('-d, --debug', 'Enable debug mode')
75
+ .option('-p, --port <port>', 'Port for UI server', { default: 3000 })
76
+ .option('--fail-fast', 'Stop tests after first failure')
77
+ .option('--report-dir <dir>', 'Directory for test reports')
78
+ .option('--screen-dir <dir>', 'Directory for reference images')
79
+ .option('--storybook-url <url>', 'Storybook server URL')
80
+ .option('--storybook-port <port>', 'Storybook server port')
81
+ .option('--reporter <reporter>', '[DEPRECATED] Use config file instead')
82
+ .option('--odiff', 'Use odiff for image comparison')
83
+ .option('--trace', 'Enable trace mode (more verbose than debug)')
84
+ .option('--no-docker', 'Disable Docker usage');
85
+ cli.version(process.env.npm_package_version ?? package_json_1.version);
86
+ cli.help();
87
+ cli.parse();
88
+ if (process.argv.includes('--help') ||
89
+ process.argv.includes('-h') ||
90
+ process.argv.includes('--version') ||
91
+ process.argv.includes('-v')) {
92
+ process.exit(0);
93
+ }
94
+ const command = cluster_1.default.isWorker ? workerCli.matchedCommandName : cli.matchedCommandName;
95
+ const args = cluster_1.default.isWorker ? workerCli.args : cli.args;
96
+ let options;
97
+ if (!command || (command !== 'report' && command !== 'test' && command !== 'worker')) {
98
+ console.error('Error: No known command specified\n');
99
+ cli.outputHelp();
100
+ process.exit(1);
23
101
  }
24
- process.on('uncaughtException', shutdownOnException);
25
- process.on('unhandledRejection', shutdownOnException);
26
- // TODO SIGINT Stuck with selenium
27
- process.on('SIGINT', () => {
28
- if (utils_js_1.isShuttingDown.current) {
29
- process.exit(-1);
102
+ try {
103
+ options = cluster_1.default.isWorker ? v.parse(types_js_1.WorkerOptionsSchema, workerCli.options) : v.parse(types_js_1.OptionsSchema, cli.options);
104
+ }
105
+ catch (error) {
106
+ if (v.isValiError(error)) {
107
+ console.error('Options validation failed:');
108
+ for (const issue of error.issues) {
109
+ const path = issue.path?.map((p) => p.key).join('.');
110
+ console.error(` ${path ? `${path}: ` : ''}${issue.message}`);
111
+ }
30
112
  }
31
- utils_js_1.isShuttingDown.current = true;
32
- });
33
- const argv = (0, minimist_1.default)(process.argv.slice(2), {
34
- string: ['browser', 'config', 'reporter', 'reportDir', 'screenDir', 'gridUrl', 'storybookUrl'],
35
- boolean: ['debug', 'trace', 'ui', 'odiff'],
36
- default: { port: 3000 },
37
- alias: { port: 'p', config: 'c', debug: 'd', update: 'u' },
38
- });
39
- if ('port' in argv && !isNaN(argv.port))
40
- argv.port = Number(argv.port);
41
- if ('browser' in argv && argv.browser)
42
- (0, logger_js_1.setRootName)(argv.browser);
43
- // eslint-disable-next-line @typescript-eslint/no-deprecated
44
- if (cluster_1.default.isPrimary && argv.reporter) {
113
+ else {
114
+ console.error(error);
115
+ }
116
+ console.log();
117
+ cli.matchedCommand?.outputHelp();
118
+ process.exit(1);
119
+ }
120
+ if (v.is(types_js_1.OptionsSchema, options) && command == 'report' && args.length > 0) {
121
+ options.reportDir = args[0];
122
+ options.ui = true;
123
+ }
124
+ // Handle browser name for logging
125
+ if (v.is(types_js_1.WorkerOptionsSchema, options))
126
+ (0, logger_js_1.setRootName)(options.browser);
127
+ if (cluster_1.default.isPrimary && 'reporter' in options) {
45
128
  (0, logger_js_1.logger)().warn(`--reporter option has been removed please describe reporter in config file:
46
129
  import { reporters } from 'mocha';
47
130
 
48
131
  const config = {
49
- reporter: reporters.${
50
- // eslint-disable-next-line @typescript-eslint/no-deprecated
51
- argv.reporter},
132
+ reporter: reporters.${options.reporter},
52
133
  };
53
134
 
54
135
  export default config;
55
136
  `);
56
137
  }
57
138
  // @ts-expect-error: define log level for storybook
58
- global.LOGLEVEL = argv.trace ? 'trace' : argv.debug ? 'debug' : 'warn';
59
- if (argv.trace) {
139
+ global.LOGLEVEL = options.trace ? 'trace' : options.debug ? 'debug' : 'warn';
140
+ if (options.trace) {
60
141
  (0, logger_js_1.logger)().setDefaultLevel(loglevel_1.default.levels.TRACE);
61
142
  loglevel_1.default.setDefaultLevel(loglevel_1.default.levels.TRACE);
62
143
  }
63
- else if (argv.debug) {
144
+ else if (options.debug) {
64
145
  (0, logger_js_1.logger)().setDefaultLevel(loglevel_1.default.levels.DEBUG);
65
146
  loglevel_1.default.setDefaultLevel(loglevel_1.default.levels.DEBUG);
66
147
  }
@@ -68,5 +149,5 @@ else {
68
149
  (0, logger_js_1.logger)().setDefaultLevel(loglevel_1.default.levels.INFO);
69
150
  loglevel_1.default.setDefaultLevel(loglevel_1.default.levels.INFO);
70
151
  }
71
- void (0, index_js_1.default)(argv);
152
+ void (0, index_js_1.default)(command, options);
72
153
  //# sourceMappingURL=creevey.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"creevey.js","sourceRoot":"","sources":["../src/creevey.ts"],"names":[],"mappings":";;;;;AAAA,sDAA8B;AAC9B,wDAAgC;AAChC,iEAAwC;AAExC,sDAAyD;AACzD,gDAAoE;AACpE,wDAA8B;AAC9B,kDAAyD;AAEzD,SAAS,mBAAmB,CAAC,MAAe;IAC1C,IAAI,yBAAc,CAAC,OAAO;QAAE,OAAO;IAEnC,MAAM,KAAK,GAAG,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,MAAiB,CAAC;IAE9F,IAAA,kBAAM,GAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAEtB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,iBAAO,CAAC,QAAQ;QAAE,IAAA,+BAAiB,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACnG,IAAI,iBAAO,CAAC,SAAS;QAAE,KAAK,IAAA,0BAAe,GAAE,CAAC;AAChD,CAAC;AAED,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;AACrD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;AACtD,kCAAkC;AAClC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,IAAI,yBAAc,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,yBAAc,CAAC,OAAO,GAAG,IAAI,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,IAAA,kBAAQ,EAAU,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IACpD,MAAM,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC;IAC9F,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;IAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;IACvB,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CAC3D,CAAC,CAAC;AAEH,IAAI,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvE,IAAI,SAAS,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO;IAAE,IAAA,uBAAW,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAEjE,4DAA4D;AAC5D,IAAI,iBAAO,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;IACvC,IAAA,kBAAM,GAAE,CAAC,IAAI,CAAC;;;;4BAIY;IACpB,4DAA4D;IAC5D,IAAI,CAAC,QACP;;;;GAIH,CAAC,CAAC;AACL,CAAC;AAED,mDAAmD;AACnD,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AACvE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,IAAA,kBAAM,GAAE,CAAC,eAAe,CAAC,kBAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,kBAAM,CAAC,eAAe,CAAC,kBAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;KAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;IACtB,IAAA,kBAAM,GAAE,CAAC,eAAe,CAAC,kBAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9C,kBAAM,CAAC,eAAe,CAAC,kBAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9C,CAAC;KAAM,CAAC;IACN,IAAA,kBAAM,GAAE,CAAC,eAAe,CAAC,kBAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,kBAAM,CAAC,eAAe,CAAC,kBAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,KAAK,IAAA,kBAAO,EAAC,IAAI,CAAC,CAAC"}
1
+ {"version":3,"file":"creevey.js","sourceRoot":"","sources":["../src/creevey.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  /// <reference types="../types/chai" />
2
+ /// <reference types="../types/global" />
2
3
  export * from './types.js';
3
4
  export { loadStories as browserStoriesProvider } from './server/storybook/providers/browser.js';
4
5
  export { loadStories as hybridStoriesProvider } from './server/storybook/providers/hybrid.js';
@@ -0,0 +1,25 @@
1
+ import type { PixelmatchOptions } from 'pixelmatch';
2
+ import type { ODiffOptions } from 'odiff-bin';
3
+ export interface TestsConfig {
4
+ /**
5
+ * Define pixelmatch diff options
6
+ * @default { threshold: 0.1, includeAA: false }
7
+ */
8
+ diffOptions: PixelmatchOptions;
9
+ /**
10
+ * Define odiff diff options
11
+ * @default { threshold: 0.1, antialiasing: true }
12
+ */
13
+ odiffOptions: ODiffOptions;
14
+ /**
15
+ * Define matcher for visual regression assertion
16
+ * @default 'pixelmatch'
17
+ */
18
+ comparisonLibrary: 'pixelmatch' | 'odiff';
19
+ /**
20
+ * Enables page context reuse across tests for faster execution, though this breaks test isolation.
21
+ * @default true
22
+ */
23
+ reusePageContext: boolean;
24
+ }
25
+ export declare function definePlaywrightTests(config?: Partial<TestsConfig>): void;
@@ -0,0 +1,243 @@
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.definePlaywrightTests = definePlaywrightTests;
7
+ const path_1 = __importDefault(require("path"));
8
+ const assert_1 = __importDefault(require("assert"));
9
+ const fs_1 = require("fs");
10
+ const test_1 = require("@playwright/test");
11
+ const isEqual_js_1 = __importDefault(require("lodash/isEqual.js"));
12
+ const types_1 = require("../types");
13
+ const compare_1 = require("../server/compare");
14
+ const webdriver_1 = require("../server/webdriver");
15
+ const helpers_1 = require("./helpers");
16
+ const cacheDir = process.env.CREEVEY_CACHE_DIR;
17
+ const defaultConfig = {
18
+ diffOptions: { threshold: 0.1, includeAA: false },
19
+ odiffOptions: { threshold: 0.1, antialiasing: true },
20
+ comparisonLibrary: 'pixelmatch',
21
+ reusePageContext: true,
22
+ };
23
+ // TODO: Use this Storybook function for building args for query params
24
+ // export const buildArgsParam = (initialArgs: Args | undefined, args: Args): string => {
25
+ // TODO: Pass globals to story
26
+ function appendStoryQueryParams(url, storyId) {
27
+ return `${url}?args=&globals=&id=${storyId}`;
28
+ }
29
+ function assertWrapper(assert) {
30
+ return async function assertImage(actual, imageName) {
31
+ try {
32
+ const errorMessage = await assert(actual, imageName);
33
+ if (errorMessage) {
34
+ throw new Error(errorMessage);
35
+ }
36
+ }
37
+ catch (error) {
38
+ if (error instanceof Error) {
39
+ error.stack = error.stack
40
+ ?.split('\n')
41
+ .filter((line) => !line.includes('at assertImage'))
42
+ .join('\n');
43
+ }
44
+ throw error;
45
+ }
46
+ };
47
+ }
48
+ async function takeScreenshot(page, storyId, captureElement, ignoreElements) {
49
+ const ignore = ignoreElements ? (Array.isArray(ignoreElements) ? ignoreElements : [ignoreElements]) : [];
50
+ const mask = ignore.map((selector) => page.locator(selector));
51
+ if (captureElement) {
52
+ const element = await page.$(captureElement);
53
+ if (!element)
54
+ throw new Error(`Capture element '${captureElement}' not found for story '${storyId}'`);
55
+ return element.screenshot({
56
+ style: ':root { overflow: hidden !important; }',
57
+ animations: 'disabled',
58
+ mask,
59
+ });
60
+ }
61
+ else {
62
+ return page.screenshot({
63
+ animations: 'disabled',
64
+ mask,
65
+ });
66
+ }
67
+ }
68
+ // TODO: To support parallel tests, we need to define each test suite in separate file
69
+ // TODO: How to support custom interactions for different tests
70
+ // Main function to define tests using Playwright's API
71
+ function definePlaywrightTests(config) {
72
+ (0, assert_1.default)(cacheDir, 'Cache directory not found');
73
+ const stories = JSON.parse((0, fs_1.readFileSync)(path_1.default.join(cacheDir, 'stories.json'), 'utf-8'));
74
+ let globals = {};
75
+ let reusedPage;
76
+ const { diffOptions, odiffOptions, comparisonLibrary, reusePageContext } = {
77
+ ...defaultConfig,
78
+ ...config,
79
+ };
80
+ async function updateGlobals(page, storybookGlobals) {
81
+ if (storybookGlobals && typeof storybookGlobals === 'object' && !(0, isEqual_js_1.default)(globals, storybookGlobals)) {
82
+ globals = storybookGlobals;
83
+ await page.evaluate((globals) => {
84
+ window.__STORYBOOK_ADDONS_CHANNEL__.emit(types_1.StorybookEvents.UPDATE_GLOBALS, { globals });
85
+ }, globals);
86
+ }
87
+ }
88
+ test_1.test.describe('Creevey Tests', () => {
89
+ const imagesContext = {
90
+ attachments: [],
91
+ testFullPath: [],
92
+ images: {},
93
+ };
94
+ let assertImage;
95
+ test_1.test.beforeAll('Setup images context', async ({ browser }, { project }) => {
96
+ const { snapshotDir, outputDir } = project;
97
+ if (reusePageContext) {
98
+ const storybookUrl = project.use.baseURL;
99
+ (0, assert_1.default)(storybookUrl, 'Storybook URL not found');
100
+ reusedPage = await browser.newPage();
101
+ await reusedPage.goto((0, webdriver_1.appendIframePath)(storybookUrl), { waitUntil: 'networkidle', timeout: 60000 });
102
+ await (0, helpers_1.waitForStorybookReady)(reusedPage);
103
+ }
104
+ if (comparisonLibrary === 'pixelmatch') {
105
+ const { default: pixelmatch } = await import('pixelmatch');
106
+ assertImage = assertWrapper((0, compare_1.getPixelmatchAssert)(pixelmatch, imagesContext, { screenDir: snapshotDir, reportDir: outputDir, diffOptions }));
107
+ }
108
+ else {
109
+ const { compare } = await import('odiff-bin');
110
+ assertImage = assertWrapper((0, compare_1.getOdiffAssert)(compare, imagesContext, { screenDir: snapshotDir, reportDir: outputDir, odiffOptions }));
111
+ }
112
+ });
113
+ test_1.test.beforeEach('Switch story', async ({ page }, { annotations, project }) => {
114
+ const { description: storyId } = annotations.find((annotation) => annotation.type === 'storyId') ?? {};
115
+ (0, assert_1.default)(storyId, 'Cannot get storyId. It seems like inner test annotation is missing');
116
+ const story = stories[storyId];
117
+ (0, assert_1.default)(story, `Story '${storyId}' not found in stories cache`);
118
+ const { title, name, parameters } = story;
119
+ const { waitForReady: shouldWaitForReady } = (parameters.creevey ?? {});
120
+ const storybookGlobals = project.metadata.storybookGlobals;
121
+ imagesContext.attachments = [];
122
+ imagesContext.testFullPath = [...title.split('/').map((x) => x.trim()), name, project.name];
123
+ imagesContext.images = {};
124
+ if (!reusePageContext) {
125
+ const storybookUrl = project.use.baseURL;
126
+ (0, assert_1.default)(storybookUrl, 'Storybook URL not found');
127
+ await page.goto(appendStoryQueryParams((0, webdriver_1.appendIframePath)(storybookUrl), storyId), {
128
+ waitUntil: 'networkidle',
129
+ timeout: 60000,
130
+ });
131
+ await (0, helpers_1.waitForStorybookReady)(page);
132
+ // TODO: Pass globals to story
133
+ await updateGlobals(page, storybookGlobals);
134
+ return;
135
+ }
136
+ // 1. Update Storybook Globals
137
+ await updateGlobals(reusedPage, storybookGlobals);
138
+ // 2. Reset Mouse Position
139
+ await reusedPage.mouse.move(0, 0);
140
+ // 3. Select Story
141
+ const errorMessage = await reusedPage.evaluate(async ({ storyId, StorybookEvents, shouldWaitForReady }) => {
142
+ // TODO: DRY with withCreevey.ts
143
+ // NOTE: Copy-pasted from withCreevey.ts
144
+ const channel = window.__STORYBOOK_ADDONS_CHANNEL__;
145
+ const waitForReady = shouldWaitForReady
146
+ ? new Promise((resolve) => (window.__CREEVEY_SET_READY_FOR_CAPTURE__ = resolve))
147
+ : Promise.resolve();
148
+ let rejectCallback;
149
+ const renderErrorPromise = new Promise((_resolve, reject) => (rejectCallback = reject));
150
+ function errorHandler({ title, description }) {
151
+ rejectCallback({
152
+ message: title,
153
+ stack: description,
154
+ });
155
+ }
156
+ function exceptionHandler(exception) {
157
+ rejectCallback(exception);
158
+ }
159
+ function removeErrorHandlers() {
160
+ channel.off(StorybookEvents.STORY_ERRORED, errorHandler);
161
+ channel.off(StorybookEvents.STORY_THREW_EXCEPTION, errorHandler);
162
+ }
163
+ channel.once(StorybookEvents.STORY_ERRORED, errorHandler);
164
+ channel.once(StorybookEvents.STORY_THREW_EXCEPTION, exceptionHandler);
165
+ let resolveCallback;
166
+ const storyRenderedPromise = new Promise((resolve) => (resolveCallback = resolve));
167
+ function renderHandler() {
168
+ resolveCallback();
169
+ }
170
+ function removeRenderHandlers() {
171
+ channel.off(StorybookEvents.STORY_RENDERED, renderHandler);
172
+ }
173
+ channel.once(StorybookEvents.STORY_RENDERED, renderHandler);
174
+ setTimeout(() => {
175
+ channel.emit(StorybookEvents.SET_CURRENT_STORY, { storyId });
176
+ }, 0);
177
+ try {
178
+ await Promise.race([renderErrorPromise, Promise.all([storyRenderedPromise, waitForReady])]);
179
+ }
180
+ catch (reason) {
181
+ // NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
182
+ // NOTE Event `STORY_ERRORED` return error-like object without `name` field
183
+ const errorMessage = reason instanceof Error
184
+ ? (reason.stack ?? reason.message)
185
+ : (0, types_1.isObject)(reason)
186
+ ? `${reason.message}\n ${reason.stack}`
187
+ : reason;
188
+ return errorMessage;
189
+ }
190
+ finally {
191
+ removeErrorHandlers();
192
+ removeRenderHandlers();
193
+ }
194
+ return null;
195
+ }, { storyId: story.id, StorybookEvents: types_1.StorybookEvents, shouldWaitForReady });
196
+ if (errorMessage) {
197
+ throw new Error(`Failed to select story '${story.id}': ${errorMessage}`);
198
+ }
199
+ });
200
+ test_1.test.afterEach('Save screenshot', () => {
201
+ const { name: projectName } = test_1.test.info().project;
202
+ // TODO: Use another way to handle attachments
203
+ // NOTE: Don't need to copy files for assertImage, because it's done internally
204
+ const { actual, diff, expect } = imagesContext.images[projectName] ?? {};
205
+ for (const image of imagesContext.attachments) {
206
+ switch (true) {
207
+ case image.includes('actual') && !!actual: {
208
+ test_1.test.info().attachments.push({ name: actual, path: image, contentType: 'image/png' });
209
+ // await test.info().attach(actual, { path: image });
210
+ break;
211
+ }
212
+ case image.includes('expect') && !!expect: {
213
+ test_1.test.info().attachments.push({ name: expect, path: image, contentType: 'image/png' });
214
+ // await test.info().attach(expect, { path: image });
215
+ break;
216
+ }
217
+ case image.includes('diff') && !!diff: {
218
+ test_1.test.info().attachments.push({ name: diff, path: image, contentType: 'image/png' });
219
+ // await test.info().attach(diff, { path: image });
220
+ break;
221
+ }
222
+ }
223
+ }
224
+ });
225
+ for (const story of Object.values(stories)) {
226
+ const { name, title, parameters } = story;
227
+ const { captureElement, ignoreElements } = (parameters.creevey ?? {});
228
+ test_1.test.describe(title, () => {
229
+ // TODO: Support creevey.skip
230
+ (0, test_1.test)(name, { annotation: [{ type: 'storyId', description: story.id }] }, async ({ page }) => {
231
+ // 4. Take Screenshot
232
+ const screenshot = await takeScreenshot(reusePageContext ? reusedPage : page, story.id, captureElement, ignoreElements);
233
+ // TODO: Support this
234
+ // NOTE: Bear in mind that page.locator('#root > *') is not working
235
+ // await expect(page.locator(captureElement)).toHaveScreenshot(name);
236
+ // 5. Assert Image
237
+ await assertImage(screenshot);
238
+ });
239
+ });
240
+ }
241
+ });
242
+ }
243
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/playwright/generator.ts"],"names":[],"mappings":";;;;;AAoGA,sDA6NC;AAjUD,gDAAwB;AACxB,oDAA4B;AAC5B,2BAAkC;AAGlC,2CAA8C;AAC9C,mEAAwC;AACxC,oCAAuG;AACvG,+CAAsF;AACtF,mDAAuD;AACvD,uCAAkD;AAyBlD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAC/C,MAAM,aAAa,GAAgB;IACjC,WAAW,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE;IACjD,YAAY,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE;IACpD,iBAAiB,EAAE,YAAY;IAC/B,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,uEAAuE;AACvE,yFAAyF;AAEzF,8BAA8B;AAC9B,SAAS,sBAAsB,CAAC,GAAW,EAAE,OAAe;IAC1D,OAAO,GAAG,GAAG,sBAAsB,OAAO,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,aAAa,CACpB,MAA2E;IAE3E,OAAO,KAAK,UAAU,WAAW,CAAC,MAAM,EAAE,SAAS;QACjD,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YACrD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;gBAC3B,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;oBACvB,EAAE,KAAK,CAAC,IAAI,CAAC;qBACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;qBAClD,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAU,EACV,OAAe,EACf,cAA8B,EAC9B,cAAyC;IAEzC,MAAM,MAAM,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAE9D,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,cAAc,0BAA0B,OAAO,GAAG,CAAC,CAAC;QACtG,OAAO,OAAO,CAAC,UAAU,CAAC;YACxB,KAAK,EAAE,wCAAwC;YAC/C,UAAU,EAAE,UAAU;YACtB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,CAAC,UAAU,CAAC;YACrB,UAAU,EAAE,UAAU;YACtB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,sFAAsF;AACtF,+DAA+D;AAC/D,uDAAuD;AACvD,SAAgB,qBAAqB,CAAC,MAA6B;IACjE,IAAA,gBAAM,EAAC,QAAQ,EAAE,2BAA2B,CAAC,CAAC;IAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,cAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAe,CAAC;IACrG,IAAI,OAAO,GAAqB,EAAE,CAAC;IACnC,IAAI,UAAgB,CAAC;IAErB,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,GAAG;QACzE,GAAG,aAAa;QAChB,GAAG,MAAM;KACV,CAAC;IAEF,KAAK,UAAU,aAAa,CAAC,IAAU,EAAE,gBAAyB;QAChE,IAAI,gBAAgB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,IAAI,CAAC,IAAA,oBAAO,EAAC,OAAO,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACpG,OAAO,GAAG,gBAAoC,CAAC;YAC/C,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE;gBAC9B,MAAM,CAAC,4BAA4B,CAAC,IAAI,CAAC,uBAAe,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YACxF,CAAC,EAAE,OAAO,CAAC,CAAC;QACd,CAAC;IACH,CAAC;IAED,WAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAClC,MAAM,aAAa,GAAiB;YAClC,WAAW,EAAE,EAAE;YACf,YAAY,EAAE,EAAE;YAChB,MAAM,EAAE,EAAE;SACX,CAAC;QACF,IAAI,WAAkE,CAAC;QAEvE,WAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YACxE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;YAC3C,IAAI,gBAAgB,EAAE,CAAC;gBACrB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAEzC,IAAA,gBAAM,EAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;gBAEhD,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,UAAU,CAAC,IAAI,CAAC,IAAA,4BAAgB,EAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpG,MAAM,IAAA,+BAAqB,EAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;YACD,IAAI,iBAAiB,KAAK,YAAY,EAAE,CAAC;gBACvC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC3D,WAAW,GAAG,aAAa,CACzB,IAAA,6BAAmB,EAAC,UAAU,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,CAC9G,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;gBAC9C,WAAW,GAAG,aAAa,CACzB,IAAA,wBAAc,EAAC,OAAO,EAAE,aAAa,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CACvG,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,WAAI,CAAC,UAAU,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;YAC3E,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAEvG,IAAA,gBAAM,EAAC,OAAO,EAAE,oEAAoE,CAAC,CAAC;YAEtF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAE/B,IAAA,gBAAM,EAAC,KAAK,EAAE,UAAU,OAAO,8BAA8B,CAAC,CAAC;YAE/D,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;YAC1C,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAuB,CAAC;YAE9F,MAAM,gBAAgB,GAAY,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAEpE,aAAa,CAAC,WAAW,GAAG,EAAE,CAAC;YAC/B,aAAa,CAAC,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5F,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC;YAE1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAEzC,IAAA,gBAAM,EAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;gBAEhD,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAA,4BAAgB,EAAC,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE;oBAC/E,SAAS,EAAE,aAAa;oBACxB,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,MAAM,IAAA,+BAAqB,EAAC,IAAI,CAAC,CAAC;gBAClC,8BAA8B;gBAC9B,MAAM,aAAa,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;gBAE5C,OAAO;YACT,CAAC;YAED,8BAA8B;YAC9B,MAAM,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;YAElD,0BAA0B;YAC1B,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAElC,kBAAkB;YAClB,MAAM,YAAY,GAAG,MAAM,UAAU,CAAC,QAAQ,CAI5C,KAAK,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,EAAE,EAAE;gBACzD,gCAAgC;gBAChC,wCAAwC;gBACxC,MAAM,OAAO,GAAG,MAAM,CAAC,4BAA4B,CAAC;gBAEpD,MAAM,YAAY,GAAG,kBAAkB;oBACrC,CAAC,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,iCAAiC,GAAG,OAAO,CAAC,CAAC;oBACtF,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAEtB,IAAI,cAA0C,CAAC;gBAC/C,MAAM,kBAAkB,GAAG,IAAI,OAAO,CAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC;gBAE9F,SAAS,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAA0C;oBAClF,cAAc,CAAC;wBACb,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,WAAW;qBACnB,CAAC,CAAC;gBACL,CAAC;gBACD,SAAS,gBAAgB,CAAC,SAAgB;oBACxC,cAAc,CAAC,SAAS,CAAC,CAAC;gBAC5B,CAAC;gBACD,SAAS,mBAAmB;oBAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;gBACnE,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC;gBAEtE,IAAI,eAA2B,CAAC;gBAChC,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,eAAe,GAAG,OAAO,CAAC,CAAC,CAAC;gBACzF,SAAS,aAAa;oBACpB,eAAe,EAAE,CAAC;gBACpB,CAAC;gBACD,SAAS,oBAAoB;oBAC3B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBAC7D,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;gBAE5D,UAAU,CAAC,GAAG,EAAE;oBACd,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/D,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEN,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,CAAC;gBAAC,OAAO,MAAM,EAAE,CAAC;oBAChB,0GAA0G;oBAC1G,2EAA2E;oBAC3E,MAAM,YAAY,GAChB,MAAM,YAAY,KAAK;wBACrB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC;wBAClC,CAAC,CAAC,IAAA,gBAAQ,EAAC,MAAM,CAAC;4BAChB,CAAC,CAAC,GAAG,MAAM,CAAC,OAAiB,SAAS,MAAM,CAAC,KAAe,EAAE;4BAC9D,CAAC,CAAE,MAAiB,CAAC;oBAC3B,OAAO,YAAY,CAAC;gBACtB,CAAC;wBAAS,CAAC;oBACT,mBAAmB,EAAE,CAAC;oBACtB,oBAAoB,EAAE,CAAC;gBACzB,CAAC;gBAED,OAAO,IAAI,CAAC;YACd,CAAC,EACD,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,eAAe,EAAf,uBAAe,EAAE,kBAAkB,EAAE,CAC3D,CAAC;YAEF,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,KAAK,CAAC,EAAE,MAAM,YAAY,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,WAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE;YACrC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,WAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC;YAElD,8CAA8C;YAE9C,+EAA+E;YAC/E,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACzE,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,WAAW,EAAE,CAAC;gBAC9C,QAAQ,IAAI,EAAE,CAAC;oBACb,KAAK,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;wBAC1C,WAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;wBACtF,qDAAqD;wBACrD,MAAM;oBACR,CAAC;oBACD,KAAK,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;wBAC1C,WAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;wBACtF,qDAAqD;wBACrD,MAAM;oBACR,CAAC;oBACD,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;wBACtC,WAAI,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC,CAAC;wBACpF,mDAAmD;wBACnD,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;YAC1C,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAuB,CAAC;YAE5F,WAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE;gBACxB,6BAA6B;gBAC7B,IAAA,WAAI,EAAC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;oBAC1F,qBAAqB;oBACrB,MAAM,UAAU,GAAG,MAAM,cAAc,CACrC,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,EACpC,KAAK,CAAC,EAAE,EACR,cAAc,EACd,cAAc,CACf,CAAC;oBACF,qBAAqB;oBACrB,mEAAmE;oBACnE,qEAAqE;oBAErE,kBAAkB;oBAClB,MAAM,WAAW,CAAC,UAAU,CAAC,CAAC;gBAChC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}