creevey 0.9.1 → 0.10.0-beta.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 (259) hide show
  1. package/chromatic.config.json +5 -0
  2. package/dist/client/addon/components/Addon.d.ts +1 -0
  3. package/dist/client/addon/components/Addon.js.map +1 -1
  4. package/dist/client/addon/components/Icons.d.ts +1 -0
  5. package/dist/client/addon/components/Icons.js.map +1 -1
  6. package/dist/client/addon/components/Panel.d.ts +1 -0
  7. package/dist/client/addon/components/Panel.js.map +1 -1
  8. package/dist/client/addon/components/TestSelect.d.ts +1 -0
  9. package/dist/client/addon/components/TestSelect.js +4 -3
  10. package/dist/client/addon/components/TestSelect.js.map +1 -1
  11. package/dist/client/addon/components/Tools.d.ts +1 -0
  12. package/dist/client/addon/components/Tools.js +7 -8
  13. package/dist/client/addon/components/Tools.js.map +1 -1
  14. package/dist/client/addon/controller.d.ts +1 -1
  15. package/dist/client/addon/controller.js.map +1 -1
  16. package/dist/client/addon/decorator.d.ts +1 -1
  17. package/dist/client/addon/manager.js +3 -2
  18. package/dist/client/addon/manager.js.map +1 -1
  19. package/dist/client/addon/preview.d.ts +1 -1
  20. package/dist/client/addon/withCreevey.d.ts +6 -8
  21. package/dist/client/addon/withCreevey.js +21 -19
  22. package/dist/client/addon/withCreevey.js.map +1 -1
  23. package/dist/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  24. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  25. package/dist/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
  26. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
  27. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  28. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  29. package/dist/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  30. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  31. package/dist/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  32. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  33. package/dist/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
  34. package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
  35. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
  36. package/dist/client/shared/components/PageFooter/Paging.d.ts +2 -2
  37. package/dist/client/shared/components/PageFooter/Paging.js +8 -6
  38. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
  39. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  40. package/dist/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
  41. package/dist/client/shared/components/PageHeader/PageHeader.js +2 -1
  42. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  43. package/dist/client/shared/components/ResultsPage.d.ts +2 -2
  44. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  45. package/dist/client/web/CreeveyApp.d.ts +1 -0
  46. package/dist/client/web/CreeveyApp.js.map +1 -1
  47. package/dist/client/web/CreeveyLoader.d.ts +1 -0
  48. package/dist/client/web/CreeveyLoader.js.map +1 -1
  49. package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  50. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +4 -4
  51. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
  52. package/dist/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
  53. package/dist/client/web/CreeveyView/SideBar/Search.js +4 -4
  54. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  55. package/dist/client/web/CreeveyView/SideBar/SideBar.d.ts +1 -1
  56. package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -7
  57. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  58. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.d.ts +1 -0
  59. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +5 -4
  60. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  61. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
  62. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +4 -3
  63. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  64. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +3 -7
  65. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +6 -5
  66. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  67. package/dist/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
  68. package/dist/client/web/CreeveyView/SideBar/TestLink.js +5 -1
  69. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  70. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +15 -8
  71. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
  72. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +5 -4
  73. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  74. package/dist/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
  75. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
  76. package/dist/client/web/KeyboardEventsContext.d.ts +3 -4
  77. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  78. package/dist/client/web/assets/index-DkmZfG9C.js +591 -0
  79. package/dist/client/web/index.html +1 -1
  80. package/dist/client/web/index.js +5 -6
  81. package/dist/client/web/index.js.map +1 -1
  82. package/dist/creevey.js +21 -9
  83. package/dist/creevey.js.map +1 -1
  84. package/dist/index.js +7 -3
  85. package/dist/index.js.map +1 -1
  86. package/dist/server/config.d.ts +1 -1
  87. package/dist/server/config.js +9 -5
  88. package/dist/server/config.js.map +1 -1
  89. package/dist/server/docker.d.ts +2 -2
  90. package/dist/server/docker.js +46 -40
  91. package/dist/server/docker.js.map +1 -1
  92. package/dist/server/index.js +54 -15
  93. package/dist/server/index.js.map +1 -1
  94. package/dist/server/master/master.d.ts +1 -5
  95. package/dist/server/master/master.js +3 -3
  96. package/dist/server/master/master.js.map +1 -1
  97. package/dist/server/master/pool.d.ts +2 -1
  98. package/dist/server/master/pool.js +13 -7
  99. package/dist/server/master/pool.js.map +1 -1
  100. package/dist/server/master/runner.d.ts +1 -1
  101. package/dist/server/master/runner.js +4 -2
  102. package/dist/server/master/runner.js.map +1 -1
  103. package/dist/server/master/server.js +1 -0
  104. package/dist/server/master/server.js.map +1 -1
  105. package/dist/server/master/start.d.ts +3 -0
  106. package/dist/server/master/{index.js → start.js} +6 -9
  107. package/dist/server/master/start.js.map +1 -0
  108. package/dist/server/messages.d.ts +4 -10
  109. package/dist/server/messages.js +4 -58
  110. package/dist/server/messages.js.map +1 -1
  111. package/dist/server/playwright/docker-file.d.ts +1 -0
  112. package/dist/server/playwright/docker-file.js +26 -0
  113. package/dist/server/playwright/docker-file.js.map +1 -0
  114. package/dist/server/playwright/docker.d.ts +1 -0
  115. package/dist/server/playwright/docker.js +31 -0
  116. package/dist/server/playwright/docker.js.map +1 -0
  117. package/dist/server/playwright/internal.d.ts +25 -0
  118. package/dist/server/playwright/internal.js +319 -0
  119. package/dist/server/playwright/internal.js.map +1 -0
  120. package/dist/server/playwright/webdriver.d.ts +16 -0
  121. package/dist/server/playwright/webdriver.js +105 -0
  122. package/dist/server/playwright/webdriver.js.map +1 -0
  123. package/dist/server/providers/browser.d.ts +2 -0
  124. package/dist/server/{storybook/providers → providers}/browser.js +6 -7
  125. package/dist/server/providers/browser.js.map +1 -0
  126. package/dist/server/providers/hybrid.d.ts +2 -0
  127. package/dist/server/{storybook/providers → providers}/hybrid.js +8 -8
  128. package/dist/server/providers/hybrid.js.map +1 -0
  129. package/dist/server/reporter.d.ts +26 -0
  130. package/dist/server/{worker/reporter.js → reporter.js} +34 -56
  131. package/dist/server/reporter.js.map +1 -0
  132. package/dist/server/selenium/internal.d.ts +31 -0
  133. package/dist/server/selenium/internal.js +606 -0
  134. package/dist/server/selenium/internal.js.map +1 -0
  135. package/dist/server/selenium/selenoid.js +6 -13
  136. package/dist/server/selenium/selenoid.js.map +1 -1
  137. package/dist/server/selenium/webdriver.d.ts +24 -0
  138. package/dist/server/selenium/webdriver.js +106 -0
  139. package/dist/server/selenium/webdriver.js.map +1 -0
  140. package/dist/server/stories.js +16 -9
  141. package/dist/server/stories.js.map +1 -1
  142. package/dist/server/telemetry.d.ts +1 -1
  143. package/dist/server/telemetry.js +4 -4
  144. package/dist/server/telemetry.js.map +1 -1
  145. package/dist/server/utils.d.ts +3 -4
  146. package/dist/server/utils.js +10 -9
  147. package/dist/server/utils.js.map +1 -1
  148. package/dist/server/webdriver.d.ts +19 -0
  149. package/dist/server/webdriver.js +79 -0
  150. package/dist/server/webdriver.js.map +1 -0
  151. package/dist/server/worker/chai-image.d.ts +2 -5
  152. package/dist/server/worker/chai-image.js +14 -102
  153. package/dist/server/worker/chai-image.js.map +1 -1
  154. package/dist/server/worker/match-image.d.ts +14 -0
  155. package/dist/server/worker/match-image.js +231 -0
  156. package/dist/server/worker/match-image.js.map +1 -0
  157. package/dist/server/worker/start.d.ts +2 -0
  158. package/dist/server/worker/start.js +258 -0
  159. package/dist/server/worker/start.js.map +1 -0
  160. package/dist/types.d.ts +127 -64
  161. package/dist/types.js +15 -9
  162. package/dist/types.js.map +1 -1
  163. package/package.json +108 -110
  164. package/src/client/addon/components/Addon.tsx +1 -1
  165. package/src/client/addon/components/Icons.tsx +1 -1
  166. package/src/client/addon/components/Panel.tsx +1 -1
  167. package/src/client/addon/components/TestSelect.tsx +5 -5
  168. package/src/client/addon/components/Tools.tsx +9 -9
  169. package/src/client/addon/controller.ts +1 -1
  170. package/src/client/addon/manager.ts +4 -4
  171. package/src/client/addon/withCreevey.ts +26 -28
  172. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  173. package/src/client/shared/components/ImagesView/ImagesView.tsx +2 -2
  174. package/src/client/shared/components/ImagesView/SideBySideView.tsx +1 -1
  175. package/src/client/shared/components/ImagesView/SlideView.tsx +1 -1
  176. package/src/client/shared/components/ImagesView/SwapView.tsx +1 -1
  177. package/src/client/shared/components/PageFooter/PageFooter.tsx +2 -2
  178. package/src/client/shared/components/PageFooter/Paging.tsx +13 -13
  179. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
  180. package/src/client/shared/components/PageHeader/PageHeader.tsx +4 -3
  181. package/src/client/shared/components/ResultsPage.tsx +1 -1
  182. package/src/client/web/CreeveyApp.tsx +1 -1
  183. package/src/client/web/CreeveyLoader.tsx +1 -1
  184. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +6 -7
  185. package/src/client/web/CreeveyView/SideBar/Search.tsx +4 -4
  186. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +3 -10
  187. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +7 -6
  188. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +7 -6
  189. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +8 -6
  190. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -3
  191. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +18 -10
  192. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +7 -10
  193. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -2
  194. package/src/client/web/KeyboardEventsContext.tsx +3 -4
  195. package/src/client/web/index.html +1 -1
  196. package/src/client/web/index.tsx +4 -3
  197. package/src/creevey.ts +25 -8
  198. package/src/index.ts +4 -2
  199. package/src/server/config.ts +12 -8
  200. package/src/server/docker.ts +58 -44
  201. package/src/server/index.ts +57 -18
  202. package/src/server/master/master.ts +3 -6
  203. package/src/server/master/pool.ts +25 -9
  204. package/src/server/master/runner.ts +4 -2
  205. package/src/server/master/server.ts +1 -0
  206. package/src/server/master/{index.ts → start.ts} +13 -11
  207. package/src/server/messages.ts +11 -75
  208. package/src/server/playwright/docker-file.ts +21 -0
  209. package/src/server/playwright/docker.ts +41 -0
  210. package/src/server/playwright/internal.ts +387 -0
  211. package/src/server/playwright/webdriver.ts +126 -0
  212. package/src/server/{storybook/providers → providers}/browser.ts +7 -8
  213. package/src/server/{storybook/providers → providers}/hybrid.ts +19 -19
  214. package/src/server/{worker/reporter.ts → reporter.ts} +40 -72
  215. package/src/server/selenium/internal.ts +785 -0
  216. package/src/server/selenium/selenoid.ts +12 -17
  217. package/src/server/selenium/webdriver.ts +136 -0
  218. package/src/server/stories.ts +18 -11
  219. package/src/server/telemetry.ts +2 -2
  220. package/src/server/utils.ts +9 -9
  221. package/src/server/webdriver.ts +127 -0
  222. package/src/server/worker/chai-image.ts +21 -133
  223. package/src/server/worker/match-image.ts +303 -0
  224. package/src/server/worker/start.ts +303 -0
  225. package/src/types.ts +162 -60
  226. package/dist/client/web/202.js +0 -1
  227. package/dist/client/web/270.js +0 -43
  228. package/dist/client/web/752.js +0 -1
  229. package/dist/client/web/main.js +0 -79
  230. package/dist/client/web/main.js.LICENSE.txt +0 -34
  231. package/dist/server/master/index.d.ts +0 -3
  232. package/dist/server/master/index.js.map +0 -1
  233. package/dist/server/selenium/browser.d.ts +0 -19
  234. package/dist/server/selenium/browser.js +0 -640
  235. package/dist/server/selenium/browser.js.map +0 -1
  236. package/dist/server/selenium/index.d.ts +0 -2
  237. package/dist/server/selenium/index.js +0 -19
  238. package/dist/server/selenium/index.js.map +0 -1
  239. package/dist/server/storybook/providers/browser.d.ts +0 -2
  240. package/dist/server/storybook/providers/browser.js.map +0 -1
  241. package/dist/server/storybook/providers/hybrid.d.ts +0 -2
  242. package/dist/server/storybook/providers/hybrid.js.map +0 -1
  243. package/dist/server/worker/helpers.d.ts +0 -8
  244. package/dist/server/worker/helpers.js +0 -57
  245. package/dist/server/worker/helpers.js.map +0 -1
  246. package/dist/server/worker/index.d.ts +0 -1
  247. package/dist/server/worker/index.js +0 -6
  248. package/dist/server/worker/index.js.map +0 -1
  249. package/dist/server/worker/reporter.d.ts +0 -8
  250. package/dist/server/worker/reporter.js.map +0 -1
  251. package/dist/server/worker/worker.d.ts +0 -4
  252. package/dist/server/worker/worker.js +0 -212
  253. package/dist/server/worker/worker.js.map +0 -1
  254. package/src/server/selenium/browser.ts +0 -840
  255. package/src/server/selenium/index.ts +0 -2
  256. package/src/server/worker/helpers.ts +0 -61
  257. package/src/server/worker/index.ts +0 -1
  258. package/src/server/worker/worker.ts +0 -240
  259. package/types/mocha.d.ts +0 -20
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "creevey",
3
3
  "description": "Cross-browser screenshot testing tool for Storybook with fancy UI Runner",
4
- "version": "0.9.1",
4
+ "version": "0.10.0-beta.0",
5
5
  "type": "commonjs",
6
6
  "bin": "./dist/cli.js",
7
7
  "main": "./dist/index.js",
@@ -32,157 +32,155 @@
32
32
  "license": "MIT",
33
33
  "scripts": {
34
34
  "commit": "git-cz",
35
- "clean": "rimraf dist",
36
- "lint": "redrun -p \"lint:*\"",
35
+ "clean": "rm -rf dist",
36
+ "lint": "concurrently \"yarn lint:tsc\" \"yarn lint:eslint\" \"yarn lint:prettier\"",
37
37
  "lint:tsc": "tsc --noEmit",
38
38
  "lint:eslint": "eslint",
39
39
  "lint:prettier": "prettier --check .",
40
40
  "test": "vitest",
41
- "start": "redrun -p \"start:*\"",
42
- "start:client": "webpack-dev-server",
41
+ "start": "concurrently \"yarn start:client\" \"yarn start:storybook\" \"yarn start:creevey\"",
42
+ "start:client": "vite",
43
43
  "start:storybook": "storybook dev --ci -p 6006",
44
44
  "start:creevey": "yarn creevey --ui",
45
45
  "creevey": "tsx ./src/cli",
46
46
  "creevey:github": "yarn creevey --config .creevey/github.config.mts",
47
47
  "creevey:gitlab": "yarn creevey --config .creevey/gitlab.config.mts",
48
48
  "creevey:hybrid": "yarn creevey --config .creevey/hybrid.config.mts",
49
- "fix": "redrun \"fix:*\"",
49
+ "fix": "concurrently \"yarn fix:eslint\" \"yarn fix:prettier\"",
50
50
  "fix:eslint": "eslint --fix",
51
51
  "fix:prettier": "prettier --write .",
52
52
  "prebuild": "yarn clean && mkdir dist",
53
53
  "build": "yarn prebuild && yarn build:client && yarn build:creevey && yarn postbuild",
54
- "build:client": "webpack --mode production && cpx src/client/web/index.html dist/client/web",
54
+ "build:client": "vite build",
55
55
  "build:creevey": "tsc --build tsconfig.prod.json",
56
- "postbuild": "cpx \"scripts/dist/*\" dist/",
56
+ "postbuild": "cp \"scripts/dist/index.d.ts\" dist/",
57
57
  "version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
58
58
  "build-storybook": "storybook build",
59
- "chromatic": "npx chromatic --project-token t3010eknrh",
60
- "prepare": "husky install"
59
+ "chromatic": "chromatic --project-token=chpt_80df83ca94e6fb4",
60
+ "prepare": "husky"
61
61
  },
62
62
  "engines": {
63
63
  "node": ">=18.0"
64
64
  },
65
+ "peerDependencies": {
66
+ "playwright": "*",
67
+ "selenium-webdriver": "*"
68
+ },
69
+ "peerDependenciesMeta": {
70
+ "playwright": {
71
+ "optional": true
72
+ },
73
+ "selenium-webdriver": {
74
+ "optional": true
75
+ }
76
+ },
65
77
  "dependencies": {
66
- "@koa/cors": "^3.3.0",
67
- "@octokit/core": "^4.0.4",
68
- "@storybook/components": "^7.6.20",
69
- "@storybook/core-events": "^7.6.20",
70
- "@storybook/csf": "^0.1.2",
71
- "@storybook/manager-api": "^7.6.20",
72
- "@storybook/preview-api": "^7.6.20",
73
- "@storybook/theming": "^7.6.20",
74
- "@types/chai": "^4.3.19",
78
+ "@koa/cors": "^5.0.0",
79
+ "@octokit/core": "^6.1.2",
80
+ "@storybook/components": "^8.4.1",
81
+ "@storybook/core-events": "^8.4.1",
82
+ "@storybook/csf": "^0.1.11",
83
+ "@storybook/icons": "^1.2.12",
84
+ "@storybook/manager-api": "^8.4.1",
85
+ "@storybook/preview-api": "^8.4.1",
86
+ "@storybook/theming": "^8.4.1",
87
+ "@storybook/types": "^8.4.1",
88
+ "@types/chai": "^4.3.20",
75
89
  "@types/dockerode": "^3.3.31",
76
- "@types/find-cache-dir": "^3.2.0",
77
- "@types/koa": "^2.13.1",
78
- "@types/koa-bodyparser": "^4.3.7",
79
- "@types/koa-mount": "^4.0.1",
80
- "@types/koa-static": "^4.0.1",
81
- "@types/koa__cors": "^3.3.0",
82
- "@types/lodash": "^4.14.182",
83
- "@types/micromatch": "^4.0.1",
84
- "@types/minimist": "^1.2.1",
85
- "@types/mocha": "^9.1.1",
86
- "@types/pixelmatch": "^5.2.2",
87
- "@types/pngjs": "^6.0.0",
88
- "@types/qs": "^6.9.6",
89
- "@types/react": "^17.0.19",
90
- "@types/react-dom": "^17.0.3",
91
- "@types/selenium-webdriver": "^4.1.26",
90
+ "@types/koa": "^2.15.0",
91
+ "@types/koa-bodyparser": "^4.3.12",
92
+ "@types/koa-mount": "^4.0.5",
93
+ "@types/koa-static": "^4.0.4",
94
+ "@types/koa__cors": "^5.0.0",
95
+ "@types/lodash": "^4.17.13",
96
+ "@types/micromatch": "^4.0.9",
97
+ "@types/minimist": "^1.2.5",
98
+ "@types/pixelmatch": "^5.2.6",
99
+ "@types/pngjs": "^6.0.5",
100
+ "@types/qs": "^6.9.16",
101
+ "@types/react": "^18.3.12",
102
+ "@types/react-dom": "^18.3.1",
103
+ "@types/selenium-webdriver": "^4.1.27",
92
104
  "@types/shelljs": "^0.8.15",
93
- "@types/uuid": "^10",
94
- "@types/ws": "^8.5.3",
105
+ "@types/ws": "^8.5.13",
95
106
  "chai": "^4.5.0",
96
107
  "chalk": "^4.1.2",
97
- "chokidar": "^3.5.3",
108
+ "chokidar": "^4.0.1",
98
109
  "dockerode": "^4.0.2",
99
- "find-cache-dir": "^3.3.1",
100
- "koa": "^2.13.4",
101
- "koa-bodyparser": "^4.3.0",
110
+ "find-cache-dir": "^5.0.0",
111
+ "get-port": "^7.1.0",
112
+ "koa": "^2.15.3",
113
+ "koa-bodyparser": "^4.4.1",
102
114
  "koa-mount": "^4.0.0",
103
115
  "koa-static": "^5.0.0",
104
116
  "lodash": "^4.17.21",
105
- "loglevel": "^1.8.0",
117
+ "loglevel": "^1.9.2",
106
118
  "loglevel-plugin-prefix": "^0.8.4",
107
- "micromatch": "^4.0.5",
108
- "minimist": "^1.2.6",
109
- "mocha": "~10.0.0",
110
- "ora": "^5.4.1",
111
- "pixelmatch": "^5.3.0",
112
- "pngjs": "^6.0.0",
113
- "polished": "^4.2.2",
114
- "qs": "^6.11.0",
115
- "selenium-webdriver": "^4.25.0",
119
+ "micromatch": "^4.0.8",
120
+ "minimist": "^1.2.8",
121
+ "odiff-bin": "^3.1.2",
122
+ "pixelmatch": "^6.0.0",
123
+ "pngjs": "^7.0.0",
124
+ "polished": "^4.3.1",
125
+ "qs": "^6.13.0",
126
+ "semver": "^7.6.3",
116
127
  "shelljs": "^0.8.5",
117
- "tsx": "^4.17.0",
118
- "uuid": "^10.0.0",
119
- "ws": "^8.8.0"
128
+ "tar-stream": "^3.1.7",
129
+ "tsx": "^4.19.2",
130
+ "uuid": "^11.0.2",
131
+ "ws": "^8.18.0",
132
+ "yocto-spinner": "^0.1.1"
120
133
  },
121
134
  "devDependencies": {
122
- "@babel/core": "^7.25.2",
123
- "@babel/preset-env": "^7.25.4",
124
- "@babel/preset-react": "^7.24.7",
125
- "@babel/preset-typescript": "^7.24.7",
126
- "@eslint/js": "^9.9.1",
127
- "@storybook/addon-essentials": "^7.6.20",
128
- "@storybook/addon-interactions": "^7.6.20",
129
- "@storybook/addon-links": "^7.6.20",
130
- "@storybook/addon-onboarding": "^1.0.10",
131
- "@storybook/addons": "^7.6.20",
132
- "@storybook/api": "^7.6.20",
133
- "@storybook/channels": "^7.6.20",
134
- "@storybook/client-api": "^7.6.20",
135
- "@storybook/client-logger": "^7.6.20",
136
- "@storybook/core-client": "^7.6.20",
137
- "@storybook/core-common": "^7.6.20",
138
- "@storybook/core-server": "^7.6.20",
139
- "@storybook/preview-web": "^7.6.20",
140
- "@storybook/react": "^7.6.20",
141
- "@storybook/react-vite": "^7.6.20",
142
- "@storybook/testing-library": "^0.2.2",
143
- "@types/cpx": "^1.5.5",
135
+ "@chromatic-com/storybook": "^3.2.2",
136
+ "@eslint/js": "^9.14.0",
137
+ "@storybook/addon-essentials": "^8.4.1",
138
+ "@storybook/addon-interactions": "^8.4.1",
139
+ "@storybook/blocks": "^8.4.1",
140
+ "@storybook/channels": "^8.4.1",
141
+ "@storybook/client-logger": "^8.4.1",
142
+ "@storybook/core-common": "^8.4.1",
143
+ "@storybook/core-server": "^8.4.1",
144
+ "@storybook/react": "^8.4.1",
145
+ "@storybook/react-vite": "^8.4.1",
146
+ "@storybook/test": "^8.4.1",
144
147
  "@types/eslint": "^9.6.1",
145
148
  "@types/eslint__js": "^8.42.3",
146
- "@types/node": "^18.19.50",
147
- "@types/resize-observer-browser": "^0.1.7",
148
- "@types/tmp": "^0.2.3",
149
- "babel-loader": "^8.2.5",
150
- "browserstack-local": "^1.5.1",
151
- "chromatic": "^6.7.0",
152
- "conventional-changelog-cli": "^2.2.2",
153
- "core-js": "^3.23.4",
154
- "cpx": "^1.5.0",
155
- "cross-env": "7.0.3",
156
- "dotenv": "^16.0.1",
157
- "eslint": "^9.9.1",
149
+ "@types/node": "^18.19.64",
150
+ "@types/resize-observer-browser": "^0.1.11",
151
+ "@types/semver": "^7",
152
+ "@types/tar-stream": "^3.1.3",
153
+ "@types/tmp": "^0.2.6",
154
+ "@vitejs/plugin-react-swc": "^3.7.1",
155
+ "browserstack-local": "^1.5.5",
156
+ "chromatic": "^11.16.3",
157
+ "concurrently": "^9.0.1",
158
+ "conventional-changelog-cli": "^5.0.0",
159
+ "dotenv": "^16.4.5",
160
+ "eslint": "^9.14.0",
158
161
  "eslint-config-prettier": "^9.1.0",
159
162
  "eslint-plugin-prettier": "^5.2.1",
160
- "eslint-plugin-react": "^7.35.0",
163
+ "eslint-plugin-react": "^7.37.2",
161
164
  "eslint-plugin-react-hooks": "^5.0.0",
162
165
  "git-cz": "^4.9.0",
163
- "globals": "^15.9.0",
164
- "husky": "^8.0.1",
165
- "immer": "^9.0.15",
166
- "jiti": "^1.21.6",
167
- "lint-staged": "^13.0.3",
166
+ "globals": "^15.11.0",
167
+ "husky": "^9.1.6",
168
+ "immer": "^10.1.1",
169
+ "lint-staged": "^15.2.10",
168
170
  "pinst": "^3.0.0",
171
+ "playwright-core": "^1.48.0",
169
172
  "prettier": "^3.3.3",
170
- "react": "^17.0.2",
171
- "react-dom": "^17.0.2",
172
- "react-is": "^17.0.2",
173
- "redrun": "^11.0.5",
174
- "regenerator-runtime": "^0.13.7",
175
- "rimraf": "^3.0.2",
176
- "storybook": "^7.6.20",
177
- "tmp": "^0.2.1",
178
- "typescript": "~5.5.4",
179
- "typescript-eslint": "^8.3.0",
180
- "use-immer": "^0.7.0",
181
- "vite": "^5.4.2",
182
- "vitest": "^2.0.5",
183
- "webpack": "^5.94.0",
184
- "webpack-cli": "^5.1.4",
185
- "webpack-dev-server": "^5.0.4"
173
+ "react": "^18.3.1",
174
+ "react-dom": "^18.3.1",
175
+ "react-is": "^18.3.1",
176
+ "selenium-webdriver": "^4.26.0",
177
+ "storybook": "^8.4.1",
178
+ "tmp": "^0.2.3",
179
+ "typescript": "^5.6.3",
180
+ "typescript-eslint": "^8.12.2",
181
+ "use-immer": "^0.10.0",
182
+ "vite": "^5.4.10",
183
+ "vitest": "^2.1.4"
186
184
  },
187
185
  "config": {
188
186
  "commitizen": {
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useState } from 'react';
1
+ import React, { JSX, useEffect, useState } from 'react';
2
2
  import { Placeholder } from '@storybook/components';
3
3
  import { TestData } from '../../../types.js';
4
4
  import { Panel } from './Panel.js';
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
 
3
3
  interface IconProps {
4
4
  width?: number;
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { Loader } from '@storybook/components';
3
3
  import { styled } from '@storybook/theming';
4
4
  import { TestData } from '../../../types.js';
@@ -1,5 +1,6 @@
1
- import React from 'react';
2
- import { Button, Icons, TooltipLinkList, WithTooltip } from '@storybook/components';
1
+ import React, { JSX } from 'react';
2
+ import { Button, TooltipLinkList, WithTooltip } from '@storybook/components';
3
+ import { MenuIcon } from '@storybook/icons';
3
4
  import { styled } from '@storybook/theming';
4
5
  import { TestData } from '../../../types.js';
5
6
  import { getEmojiByTestStatus } from '../utils.js';
@@ -23,7 +24,6 @@ export default function TestSelect(props: TestSelectProps): JSX.Element {
23
24
  <WithTooltip
24
25
  trigger="click"
25
26
  placement="bottom"
26
- closeOnClick
27
27
  tooltip={({ onHide }) => (
28
28
  <TooltipLinkList
29
29
  links={props.tests.map((x) => ({
@@ -39,8 +39,8 @@ export default function TestSelect(props: TestSelectProps): JSX.Element {
39
39
  />
40
40
  )}
41
41
  >
42
- <Button outline small>
43
- <Icons icon="menu" />
42
+ <Button size="small" variant="outline">
43
+ <MenuIcon />
44
44
  {testName}
45
45
  </Button>
46
46
  </WithTooltip>
@@ -1,6 +1,7 @@
1
- import React, { Fragment, useState, useEffect } from 'react';
1
+ import React, { JSX, Fragment, useState, useEffect } from 'react';
2
2
  import { stringify } from 'qs';
3
- import { IconButton, Icons, Separator } from '@storybook/components';
3
+ import { IconButton, Separator } from '@storybook/components';
4
+ import { StopIcon, ShareAltIcon, PlayIcon } from '@storybook/icons';
4
5
  import { styled } from '@storybook/theming';
5
6
  import { ForwardIcon, NextIcon } from './Icons.js';
6
7
  import { isDefined, TestData } from '../../../types.js';
@@ -53,7 +54,6 @@ export const Tools = ({ controller }: ToolsProps): JSX.Element | null => {
53
54
  };
54
55
  const disabled = isRunning && buttonClicked != null && buttonClicked !== type;
55
56
  return (
56
- // @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623
57
57
  <Button
58
58
  onClick={() => {
59
59
  if (isRunning) controller.onStop();
@@ -62,23 +62,23 @@ export const Tools = ({ controller }: ToolsProps): JSX.Element | null => {
62
62
  title={disabled ? '' : title}
63
63
  disabled={disabled}
64
64
  >
65
- {buttonClicked === type && isRunning ? <Icons icon={'stop'} /> : icon}
65
+ {buttonClicked === type && isRunning ? <StopIcon /> : icon}
66
66
  </Button>
67
67
  );
68
68
  }
69
69
 
70
70
  return (
71
71
  <Fragment>
72
- {/* @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623 */}
73
- <IconButton
72
+ <a
74
73
  href={`http://localhost:${__CREEVEY_CLIENT_PORT__ ?? __CREEVEY_SERVER_PORT__ ?? 3000}/?${stringify({
75
74
  testPath: getTestPath(test),
76
75
  })}`}
77
76
  target="_blank"
78
77
  title="Show in Creevey UI"
78
+ rel="noopener noreferrer"
79
79
  >
80
- <Icons icon="sharealt" />
81
- </IconButton>
80
+ <ShareAltIcon />
81
+ </a>
82
82
  <Separator />
83
83
  {renderButton('RunAll', 'Run all', controller.onStartAllTests, <ForwardIcon />)}
84
84
  {renderButton(
@@ -87,7 +87,7 @@ export const Tools = ({ controller }: ToolsProps): JSX.Element | null => {
87
87
  controller.onStartAllStoryTests,
88
88
  <NextIcon width={15} height={11} />,
89
89
  )}
90
- {renderButton('RunTest', 'Run', controller.onStart, <Icons icon="play" />)}
90
+ {renderButton('RunTest', 'Run', controller.onStart, <PlayIcon />)}
91
91
  </Fragment>
92
92
  );
93
93
  };
@@ -1,4 +1,3 @@
1
- import { API } from '@storybook/api';
2
1
  import { Addon_TypesEnum } from '@storybook/types';
3
2
  import { SET_STORIES, STORY_RENDERED } from '@storybook/core-events';
4
3
  import { denormalizeStoryParameters } from '../../shared/index.js';
@@ -6,6 +5,7 @@ import { CreeveyStatus, CreeveyUpdate, isDefined, TestData, TestStatus, StoriesR
6
5
  import { initCreeveyClientApi, CreeveyClientApi } from '../shared/creeveyClientApi.js';
7
6
  import { calcStatus } from '../shared/helpers.js';
8
7
  import { getEmojiByTestStatus } from './utils.js';
8
+ import { API } from '@storybook/manager-api';
9
9
 
10
10
  export const ADDON_ID = 'creevey';
11
11
 
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- import { API } from '@storybook/api';
3
- import { addons, types } from '@storybook/manager-api';
2
+ import { Addon_TypesEnum } from '@storybook/types';
3
+ import { addons, API } from '@storybook/manager-api';
4
4
  import { Addon } from './components/Addon.js';
5
5
  import { Tools } from './components/Tools.js';
6
6
  import { CreeveyController, ADDON_ID } from './controller.js';
@@ -16,7 +16,7 @@ async function registerCreeveyPanels(storybookApi: API): Promise<void> {
16
16
  addons.add(`${ADDON_ID}/panel/run`, {
17
17
  title: `Creevey/Run`,
18
18
  match: ({ viewMode }) => !!(viewMode && /^story$/.exec(viewMode)),
19
- type: types.TOOL,
19
+ type: Addon_TypesEnum.TOOL,
20
20
 
21
21
  render: () => React.createElement(Tools, { controller }),
22
22
  });
@@ -28,7 +28,7 @@ async function registerCreeveyPanels(storybookApi: API): Promise<void> {
28
28
  const title = controller.getTabTitle(browser);
29
29
  addons.add(panelId, {
30
30
  title,
31
- type: types.PANEL,
31
+ type: Addon_TypesEnum.PANEL,
32
32
  paramKey: browser,
33
33
 
34
34
  // NOTE key = PANEL_ID needs to correct render button in addons panel
@@ -1,8 +1,6 @@
1
1
  import * as Events from '@storybook/core-events';
2
- import type { PreviewWeb } from '@storybook/preview-web';
3
- import type { AnyFramework, StoryContextForEnhancers } from '@storybook/csf';
4
- import type { StoryStore } from '@storybook/client-api';
5
- import { makeDecorator } from '@storybook/preview-api';
2
+ import type { Renderer, StoryContextForEnhancers } from '@storybook/csf';
3
+ import { makeDecorator, PreviewWeb, StoryStore } from '@storybook/preview-api';
6
4
  import { Channel } from '@storybook/channels';
7
5
  import { CaptureOptions, CreeveyStoryParams, isObject, noop, StoriesRaw, StorybookGlobals } from '../../types.js';
8
6
  import { serializeRawStories } from '../../shared/index.js';
@@ -17,16 +15,15 @@ declare global {
17
15
  __CREEVEY_SELECT_STORY__: (
18
16
  storyId: string,
19
17
  shouldWaitForReady: boolean,
20
- callback: (response: [error?: string | null, isCaptureCalled?: boolean]) => void,
21
- ) => Promise<void>;
18
+ ) => Promise<[error?: string | null, isCaptureCalled?: boolean]>;
22
19
  __CREEVEY_UPDATE_GLOBALS__: (globals: StorybookGlobals) => void;
23
20
  __CREEVEY_INSERT_IGNORE_STYLES__: (ignoreElements: string[]) => HTMLStyleElement;
24
21
  __CREEVEY_REMOVE_IGNORE_STYLES__: (ignoreStyles: HTMLStyleElement) => void;
25
- __CREEVEY_HAS_PLAY_COMPLETED_YET__: (callback: (isPlayCompleted: boolean) => void) => void;
22
+ __CREEVEY_HAS_PLAY_COMPLETED_YET__: () => Promise<boolean>;
26
23
  __CREEVEY_SET_READY_FOR_CAPTURE__?: () => void;
27
24
  __STORYBOOK_ADDONS_CHANNEL__: Channel;
28
- __STORYBOOK_STORY_STORE__: StoryStore<AnyFramework>;
29
- __STORYBOOK_PREVIEW__: PreviewWeb<AnyFramework>;
25
+ __STORYBOOK_STORY_STORE__: StoryStore<Renderer>;
26
+ __STORYBOOK_PREVIEW__: PreviewWeb<Renderer>;
30
27
  }
31
28
  }
32
29
 
@@ -174,8 +171,7 @@ export function withCreevey(): ReturnType<typeof makeDecorator> {
174
171
  async function selectStory(
175
172
  storyId: string,
176
173
  shouldWaitForReady: boolean,
177
- callback: (response: [error?: string | null, isCaptureCalled?: boolean]) => void,
178
- ): Promise<void> {
174
+ ): Promise<[error?: string | null, isCaptureCalled?: boolean]> {
179
175
  const currentStory = window.__STORYBOOK_PREVIEW__.currentSelection?.storyId ?? '';
180
176
 
181
177
  if (!isAnimationDisabled) disableAnimation();
@@ -205,7 +201,7 @@ export function withCreevey(): ReturnType<typeof makeDecorator> {
205
201
  })(),
206
202
  errorPromise,
207
203
  ]);
208
- callback([null, isCaptureCalled]);
204
+ return [null, isCaptureCalled];
209
205
  } catch (reason) {
210
206
  // NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
211
207
  // NOTE Event `STORY_ERRORED` return error-like object without `name` field
@@ -215,7 +211,7 @@ export function withCreevey(): ReturnType<typeof makeDecorator> {
215
211
  : isObject(reason)
216
212
  ? `${reason.message as string}\n ${reason.stack as string}`
217
213
  : (reason as string);
218
- callback([errorMessage]);
214
+ return [errorMessage];
219
215
  } finally {
220
216
  renderPromise.cancel();
221
217
  errorPromise.cancel();
@@ -251,21 +247,23 @@ export function withCreevey(): ReturnType<typeof makeDecorator> {
251
247
  ignoreStyles.parentNode?.removeChild(ignoreStyles);
252
248
  }
253
249
 
254
- function hasPlayCompletedYet(callback: (isPlayCompleted: boolean) => void): void {
255
- creeveyReady();
256
- let isCaptureCalled = false;
257
- let isPlayCompleted = false;
258
-
259
- const channel = addonsChannel();
260
- void waitForStoryRendered(channel).then(() => {
261
- if (isCaptureCalled) return;
262
- isPlayCompleted = true;
263
- callback(true);
264
- });
265
- void waitForCaptureCall().then(() => {
266
- if (isPlayCompleted) return;
267
- isCaptureCalled = true;
268
- callback(false);
250
+ function hasPlayCompletedYet(): Promise<boolean> {
251
+ return new Promise<boolean>((resolve) => {
252
+ creeveyReady();
253
+ let isCaptureCalled = false;
254
+ let isPlayCompleted = false;
255
+
256
+ const channel = addonsChannel();
257
+ void waitForStoryRendered(channel).then(() => {
258
+ if (isCaptureCalled) return;
259
+ isPlayCompleted = true;
260
+ resolve(true);
261
+ });
262
+ void waitForCaptureCall().then(() => {
263
+ if (isPlayCompleted) return;
264
+ isCaptureCalled = true;
265
+ resolve(false);
266
+ });
269
267
  });
270
268
  }
271
269
 
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useRef } from 'react';
1
+ import React, { JSX, useEffect, useRef } from 'react';
2
2
  import { styled, withTheme } from '@storybook/theming';
3
3
  import { ViewPropsWithTheme, getBorderColor, themeBorderColors } from './common.js';
4
4
  import { useApplyScale, useCalcScale, useLoadImages } from '../../helpers.js';
@@ -1,4 +1,4 @@
1
- import React, { FunctionComponent } from 'react';
1
+ import React, { JSX, FunctionComponent } from 'react';
2
2
  import { styled, withTheme } from '@storybook/theming';
3
3
  import { SideBySideView } from './SideBySideView.js';
4
4
  import { SwapView } from './SwapView.js';
@@ -14,7 +14,7 @@ interface ImagesViewProps {
14
14
  mode: ImagesViewMode;
15
15
  }
16
16
 
17
- const views: { [mode in ImagesViewMode]: FunctionComponent<ViewProps> } = {
17
+ const views: Record<ImagesViewMode, FunctionComponent<ViewProps>> = {
18
18
  'side-by-side': SideBySideView,
19
19
  swap: SwapView,
20
20
  slide: SlideView,
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
1
+ import React, { JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
2
2
  import { Loader } from '@storybook/components';
3
3
  import { styled, withTheme } from '@storybook/theming';
4
4
  import { ViewPropsWithTheme, getBorderColor, themeBorderColors } from './common.js';
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
1
+ import React, { JSX, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';
2
2
  import { Loader } from '@storybook/components';
3
3
  import { styled, withTheme } from '@storybook/theming';
4
4
  import { getBorderColor, themeBorderColors, ViewPropsWithTheme } from './common.js';
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useRef, useState } from 'react';
1
+ import React, { JSX, useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { Loader } from '@storybook/components';
3
3
  import { styled, withTheme } from '@storybook/theming';
4
4
  import { ViewPropsWithTheme, getBorderColor, themeBorderColors } from './common.js';
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { styled, withTheme } from '@storybook/theming';
3
3
  import { Paging } from './Paging.js';
4
4
 
@@ -20,7 +20,7 @@ const Container = withTheme(
20
20
  export function PageFooter({ retriesCount, retry, onRetryChange }: PageFooterProps): JSX.Element {
21
21
  return (
22
22
  <Container>
23
- <Paging activePage={retry} onPageChange={onRetryChange} pagesCount={retriesCount} />
23
+ <Paging activePage={`${retry}`} onPageChange={onRetryChange} pagesCount={retriesCount} />
24
24
  </Container>
25
25
  );
26
26
  }