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
@@ -1,16 +1,14 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { TabButton } from '@storybook/components';
3
3
 
4
4
  export interface PagingProps {
5
- activePage: number;
5
+ activePage: string;
6
6
  onPageChange: (pageNumber: number) => void;
7
7
  pagesCount: number;
8
8
  }
9
9
 
10
- export type ItemType = number | '.';
11
-
12
10
  export function Paging(props: PagingProps): JSX.Element {
13
- const renderItem = (item: ItemType, index: number): JSX.Element => {
11
+ const renderItem = (item: string, index: number): JSX.Element => {
14
12
  switch (item) {
15
13
  case '.': {
16
14
  return (
@@ -49,17 +47,19 @@ export function Paging(props: PagingProps): JSX.Element {
49
47
  }
50
48
  };
51
49
 
52
- const goToPage = (pageNumber: number): void => {
53
- if (1 <= pageNumber && pageNumber !== props.activePage && pageNumber <= props.pagesCount) {
54
- props.onPageChange(pageNumber);
50
+ const goToPage = (pageNumber: string): void => {
51
+ const newPage = Number(pageNumber);
52
+ if (1 <= newPage && pageNumber !== props.activePage && newPage <= props.pagesCount) {
53
+ props.onPageChange(newPage);
55
54
  }
56
55
  };
57
56
 
58
57
  return <div>{getItems(props.activePage, props.pagesCount).map(renderItem)}</div>;
59
58
  }
60
59
 
61
- function getItems(active: number, total: number): ItemType[] {
62
- const result: ItemType[] = [];
60
+ function getItems(activePage: string, total: number): string[] {
61
+ const active = Number(activePage);
62
+ const result: string[] = [];
63
63
 
64
64
  const left = Math.max(Math.min(active - 2, total - 4), 1);
65
65
  const right = Math.min(Math.max(5, active + 2), total);
@@ -71,11 +71,11 @@ function getItems(active: number, total: number): ItemType[] {
71
71
  const to = hasRightDots ? right : total;
72
72
 
73
73
  if (hasLeftDots) {
74
- result.push(1, '.');
74
+ result.push('1', '.');
75
75
  }
76
76
 
77
77
  for (let i = from; i <= to; ++i) {
78
- result.push(i);
78
+ result.push(`${i}`);
79
79
  }
80
80
 
81
81
  if (hasRightDots) {
@@ -83,7 +83,7 @@ function getItems(active: number, total: number): ItemType[] {
83
83
  }
84
84
 
85
85
  if (hasRightDots && isFinite(total)) {
86
- result.push(total);
86
+ result.push(`${total}`);
87
87
  }
88
88
 
89
89
  return result;
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { styled, withTheme, Theme } from '@storybook/theming';
3
3
 
4
4
  const IMG_SIZE = 64;
@@ -1,5 +1,6 @@
1
- import React, { useEffect } from 'react';
2
- import { Icons, Tabs } from '@storybook/components';
1
+ import React, { JSX, useEffect } from 'react';
2
+ import { Tabs } from '@storybook/components';
3
+ import { CloseAltIcon } from '@storybook/icons';
3
4
  import { styled, withTheme, Theme } from '@storybook/theming';
4
5
  import { ImagesViewMode, Images } from '../../../../types.js';
5
6
  import { getImageUrl } from '../../helpers.js';
@@ -99,7 +100,7 @@ export function PageHeader({
99
100
  <H1>{title.flatMap((token) => [token, <HeaderDivider key={token}>/</HeaderDivider>]).slice(0, -1)}</H1>
100
101
  {error && (
101
102
  <ErrorContainer>
102
- <Icons icon="closeAlt" />
103
+ <CloseAltIcon />
103
104
  <pre>{error}</pre>
104
105
  </ErrorContainer>
105
106
  )}
@@ -1,4 +1,4 @@
1
- import React, { useState } from 'react';
1
+ import React, { JSX, useState } from 'react';
2
2
  import { Placeholder, ScrollArea } from '@storybook/components';
3
3
  import { styled, withTheme, Theme } from '@storybook/theming';
4
4
  import { ImagesView } from './ImagesView/ImagesView.js';
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useEffect, useMemo, useState } from 'react';
1
+ import React, { JSX, useCallback, useEffect, useMemo, useState } from 'react';
2
2
  import { useImmer } from 'use-immer';
3
3
  import { ensure, styled, ThemeProvider, themes, withTheme } from '@storybook/theming';
4
4
  import { CreeveyUpdate, CreeveySuite, isDefined, CreeveyTest } from '../../types.js';
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { styled, withTheme, Theme, keyframes, ensure, ThemeProvider, themes, Keyframes } from '@storybook/theming';
3
3
  import { useTheme } from '../shared/helpers.js';
4
4
 
@@ -1,7 +1,6 @@
1
- import React from 'react';
2
-
1
+ import React, { JSX } from 'react';
3
2
  import { styled, Theme, withTheme } from '@storybook/theming';
4
- import { Icons } from '@storybook/components';
3
+ import { CircleIcon, CheckIcon } from '@storybook/icons';
5
4
  import { transparentize } from 'polished';
6
5
 
7
6
  const Label = withTheme(
@@ -51,12 +50,12 @@ const Box = withTheme(
51
50
  })),
52
51
  );
53
52
 
54
- const CircleIcon = styled(Icons)({
53
+ const CircleIconStyled = styled(CircleIcon)({
55
54
  margin: '4px',
56
55
  verticalAlign: 'baseline',
57
56
  });
58
57
 
59
- const CheckIcon = styled(Icons)({
58
+ const CheckIconStyled = styled(CheckIcon)({
60
59
  margin: '2px',
61
60
  verticalAlign: 'baseline',
62
61
  });
@@ -105,9 +104,9 @@ export class Checkbox extends React.Component<CheckboxProps, CheckboxState> {
105
104
  />
106
105
  <Box>
107
106
  {indeterminate ? (
108
- <CircleIcon icon="circle" width="8" height="8" />
107
+ <CircleIconStyled width="8" height="8" />
109
108
  ) : checked ? (
110
- <CheckIcon icon="check" width="12" height="12" />
109
+ <CheckIconStyled width="12" height="12" />
111
110
  ) : (
112
111
  ' '
113
112
  )}
@@ -1,6 +1,6 @@
1
- import { Icons } from '@storybook/components';
1
+ import React, { JSX, ChangeEvent, useContext, useRef, useState } from 'react';
2
+ import { SearchIcon, CloseAltIcon } from '@storybook/icons';
2
3
  import { styled, Theme, withTheme } from '@storybook/theming';
3
- import React, { ChangeEvent, useContext, useRef, useState } from 'react';
4
4
  import { KeyboardEventsContext } from '../../KeyboardEventsContext.js';
5
5
 
6
6
  interface SearchProps {
@@ -131,9 +131,9 @@ export const Search = ({ onChange, value }: SearchProps): JSX.Element => {
131
131
  placeholder="search by status or substring"
132
132
  value={value}
133
133
  />
134
- <Icons icon="search" />
134
+ <SearchIcon />
135
135
  <CancelButton tabIndex={-1} type="reset" value="reset" title="Clear search">
136
- <Icons icon="closeAlt" />
136
+ <CloseAltIcon />
137
137
  </CancelButton>
138
138
  </FilterForm>
139
139
  );
@@ -1,4 +1,4 @@
1
- import React, { createContext } from 'react';
1
+ import React, { JSX, createContext } from 'react';
2
2
  import { transparentize } from 'polished';
3
3
  import { ScrollArea } from '@storybook/components';
4
4
  import { styled, Theme, withTheme } from '@storybook/theming';
@@ -47,12 +47,6 @@ const ScrollContainer = styled.div({
47
47
  left: '0',
48
48
  });
49
49
 
50
- const StyledScrollArea = styled(ScrollArea)({
51
- '& > div > div': {
52
- height: 'calc(100% - 8px)',
53
- },
54
- });
55
-
56
50
  const Shadow = withTheme(
57
51
  styled.div<{ theme: Theme; position: 'top' | 'bottom' }>(({ theme, position }) => ({
58
52
  [position]: '0px',
@@ -69,7 +63,6 @@ const SelectAllContainer = styled.div({
69
63
 
70
64
  const TestsContainer = styled.div({
71
65
  position: 'relative',
72
- paddingBottom: '8px',
73
66
  height: '100%',
74
67
  });
75
68
 
@@ -108,7 +101,7 @@ export function SideBar({ rootSuite, testId, onOpenTest, filter, setFilter }: Si
108
101
  canStart={countCheckedTests !== 0}
109
102
  />
110
103
  <ScrollContainer>
111
- <StyledScrollArea vertical>
104
+ <ScrollArea vertical>
112
105
  <Shadow position="top" />
113
106
  <TestsContainer>
114
107
  <Divider position="top" />
@@ -126,7 +119,7 @@ export function SideBar({ rootSuite, testId, onOpenTest, filter, setFilter }: Si
126
119
  )}
127
120
  </TestsContainer>
128
121
  <Divider position="bottom" />
129
- </StyledScrollArea>
122
+ </ScrollArea>
130
123
  <Shadow position="bottom" />
131
124
  </ScrollContainer>
132
125
  <SideBarFooter />
@@ -1,11 +1,12 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { styled, withTheme } from '@storybook/theming';
3
- import { Button, Icons } from '@storybook/components';
3
+ import { Button } from '@storybook/components';
4
+ import { ChevronRightIcon } from '@storybook/icons';
4
5
  import { useCreeveyContext } from '../../CreeveyContext.js';
5
6
 
6
7
  const Sticky = withTheme(
7
8
  styled.div(({ theme }) => ({
8
- padding: '24px 16px 8px 16px',
9
+ padding: '24px 32px 8px',
9
10
  background: theme.background.content,
10
11
  height: '50px',
11
12
  zIndex: 5,
@@ -25,11 +26,11 @@ export function SideBarFooter(): JSX.Element {
25
26
  return (
26
27
  <Sticky>
27
28
  <Container>
28
- <Button secondary onClick={onImageApprove} disabled={!onImageApprove} style={{ paddingRight: 8 }}>
29
+ <Button variant="solid" size="medium" onClick={onImageApprove} disabled={!onImageApprove}>
29
30
  Approve
30
- <Icons icon="arrowright" style={{ paddingLeft: 4 }} />
31
+ <ChevronRightIcon />
31
32
  </Button>
32
- <Button secondary outline onClick={onApproveAll}>
33
+ <Button variant="outline" size="medium" onClick={onApproveAll}>
33
34
  Approve all
34
35
  </Button>
35
36
  </Container>
@@ -1,5 +1,6 @@
1
- import React, { useContext, useState } from 'react';
2
- import { Button as NativeButton, Icons } from '@storybook/components';
1
+ import React, { JSX, useContext, useState } from 'react';
2
+ import { Button as NativeButton } from '@storybook/components';
3
+ import { StopIcon, PlayIcon } from '@storybook/icons';
3
4
  import { styled, withTheme } from '@storybook/theming';
4
5
  import { CreeveyContext } from '../../CreeveyContext.js';
5
6
  import { TestsStatus, TestsStatusProps } from './TestsStatus.js';
@@ -119,12 +120,12 @@ export function SideBarHeader({
119
120
  {isReport ? null : (
120
121
  <MarginContainer top="10px">
121
122
  {isRunning ? (
122
- <Button outline secondary onClick={onStop}>
123
- <Icons icon="stop" />
123
+ <Button variant="outline" onClick={onStop}>
124
+ <StopIcon />
124
125
  </Button>
125
126
  ) : (
126
- <Button outline secondary onClick={onStart} disabled={!canStart}>
127
- <Icons icon="play" />
127
+ <Button variant="outline" onClick={onStart} disabled={!canStart}>
128
+ <PlayIcon />
128
129
  </Button>
129
130
  )}
130
131
  </MarginContainer>
@@ -1,5 +1,5 @@
1
- import React, { useRef, useContext, useEffect, useMemo } from 'react';
2
- import { Icons } from '@storybook/components';
1
+ import React, { JSX, useRef, useContext, useEffect, useMemo } from 'react';
2
+ import { ChevronDownIcon, ChevronRightIcon } from '@storybook/icons';
3
3
  import { styled, withTheme, Theme } from '@storybook/theming';
4
4
  import { Checkbox, CheckboxContainer } from './Checkbox.js';
5
5
  import { TestStatusIcon } from './TestStatusIcon.js';
@@ -53,13 +53,16 @@ export const Button = withTheme(
53
53
  })),
54
54
  );
55
55
 
56
- const ArrowIcon = styled(Icons)({
56
+ const iconStyles = {
57
57
  paddingRight: '4px',
58
58
  display: 'inline-block',
59
59
  width: '12px',
60
60
  height: '18px',
61
61
  verticalAlign: 'unset',
62
- });
62
+ };
63
+
64
+ const ChevronDownIconStyled = styled(ChevronDownIcon)(iconStyles);
65
+ const ChevronRightIconStyled = styled(ChevronRightIcon)(iconStyles);
63
66
 
64
67
  export const SuiteContainer = styled.span<{ padding: number }>(({ padding }) => ({
65
68
  paddingLeft: padding,
@@ -126,8 +129,7 @@ export function SuiteLink({ title, suite, 'data-testid': dataTid }: SuiteLinkPro
126
129
  <Button onClick={handleOpen} onFocus={handleFocus} data-testid={dataTid} ref={buttonRef}>
127
130
  <SuiteContainer padding={(suite.path.length - 1) * 8}>
128
131
  {isTest(suite) ||
129
- (Boolean(suite.path.length) &&
130
- (suite.opened ? <ArrowIcon icon="arrowdown" /> : <ArrowIcon icon="arrowright" />))}
132
+ (Boolean(suite.path.length) && (suite.opened ? <ChevronDownIconStyled /> : <ChevronRightIconStyled />))}
131
133
  <TestStatusIcon status={suite.status} skip={suite.skip} />
132
134
  <SuiteTitle>{title}</SuiteTitle>
133
135
  </SuiteContainer>
@@ -1,4 +1,4 @@
1
- import React, { useEffect, useCallback, useContext, useMemo, useRef } from 'react';
1
+ import React, { JSX, useEffect, useCallback, useContext, useMemo, useRef } from 'react';
2
2
  import { CreeveyTest } from '../../../../types.js';
3
3
  import { TestStatusIcon } from './TestStatusIcon.js';
4
4
  import { CreeveyContext } from '../../CreeveyContext.js';
@@ -7,6 +7,7 @@ import { KeyboardEventsContext } from '../../KeyboardEventsContext.js';
7
7
  import { Button, Container, SuiteContainer, SuiteTitle } from './SuiteLink.js';
8
8
  import { Checkbox, CheckboxContainer } from './Checkbox.js';
9
9
  import { getTestPath } from '../../../shared/helpers.js';
10
+ import { styled } from '@storybook/theming';
10
11
 
11
12
  export interface TestLinkProps {
12
13
  title: string;
@@ -14,6 +15,10 @@ export interface TestLinkProps {
14
15
  test: CreeveyTest;
15
16
  }
16
17
 
18
+ const TestContainer = styled(SuiteContainer)({
19
+ gridTemplateColumns: 'min-content auto',
20
+ });
21
+
17
22
  export function TestLink({ title, opened, test }: TestLinkProps): JSX.Element {
18
23
  const { onSuiteToggle } = useContext(CreeveyContext);
19
24
  const { onOpenTest } = useContext(SideBarContext);
@@ -59,10 +64,10 @@ export function TestLink({ title, opened, test }: TestLinkProps): JSX.Element {
59
64
  />
60
65
  </CheckboxContainer>
61
66
  <Button onClick={handleOpen} disabled={emptyResults} ref={buttonRef}>
62
- <SuiteContainer padding={(testPath.length + 1) * 8}>
67
+ <TestContainer padding={(testPath.length + 1) * 8}>
63
68
  <TestStatusIcon inverted={opened} status={test.status} skip={test.skip} />
64
69
  <SuiteTitle>{title}</SuiteTitle>
65
- </SuiteContainer>
70
+ </TestContainer>
66
71
  </Button>
67
72
  </Container>
68
73
  );
@@ -1,6 +1,7 @@
1
- import React from 'react';
1
+ import React, { JSX } from 'react';
2
2
  import { styled, withTheme, Theme } from '@storybook/theming';
3
- import { Icons, Loader } from '@storybook/components';
3
+ import { Loader } from '@storybook/components';
4
+ import { CrossIcon, CheckIcon, CircleHollowIcon, ThumbsUpIcon, AlertIcon, TimeIcon } from '@storybook/icons';
4
5
  import { TestStatus } from '../../../../types.js';
5
6
 
6
7
  export interface TestStatusIconProps {
@@ -17,11 +18,18 @@ const Container = styled.span({
17
18
  display: 'inline-block',
18
19
  });
19
20
 
20
- const Icon = styled(Icons)({
21
+ const iconStyles = {
21
22
  position: 'relative',
22
23
  top: '1px',
23
24
  verticalAlign: 'baseline',
24
- });
25
+ } as const;
26
+
27
+ const CrossIconStyled = styled(CrossIcon)(iconStyles);
28
+ const CheckIconStyled = styled(CheckIcon)(iconStyles);
29
+ const ThumbsUpIconStyled = styled(ThumbsUpIcon)(iconStyles);
30
+ const AlertIconStyled = styled(AlertIcon)(iconStyles);
31
+ const TimeIconStyled = styled(TimeIcon)(iconStyles);
32
+ const CircleHollowIconStyled = styled(CircleHollowIcon)(iconStyles);
25
33
 
26
34
  const Spinner = styled(Loader)({
27
35
  top: '12px',
@@ -34,15 +42,15 @@ export const TestStatusIcon = withTheme(
34
42
  let icon = null;
35
43
  switch (status) {
36
44
  case 'failed': {
37
- icon = <Icon color={inverted ? theme.color.lightest : theme.color.negative} icon="cross" />;
45
+ icon = <CrossIconStyled color={inverted ? theme.color.lightest : theme.color.negative} />;
38
46
  break;
39
47
  }
40
48
  case 'success': {
41
- icon = <Icon color={inverted ? theme.color.lightest : theme.color.green} icon="check" />;
49
+ icon = <CheckIconStyled color={inverted ? theme.color.lightest : theme.color.green} />;
42
50
  break;
43
51
  }
44
52
  case 'approved': {
45
- icon = <Icon color={inverted ? theme.color.lightest : theme.color.mediumdark} icon="thumbsup" />;
53
+ icon = <ThumbsUpIconStyled color={inverted ? theme.color.lightest : theme.color.mediumdark} />;
46
54
  break;
47
55
  }
48
56
  case 'running': {
@@ -50,12 +58,12 @@ export const TestStatusIcon = withTheme(
50
58
  break;
51
59
  }
52
60
  case 'pending': {
53
- icon = <Icon color={inverted ? theme.color.lightest : theme.color.mediumdark} icon="time" />;
61
+ icon = <TimeIconStyled color={inverted ? theme.color.lightest : theme.color.mediumdark} />;
54
62
  break;
55
63
  }
56
64
  default: {
57
- if (skip) icon = <Icon color={inverted ? theme.color.lightest : undefined} icon="alert" />;
58
- else icon = <Icon color={inverted ? theme.color.lightest : undefined} icon="circlehollow" />;
65
+ if (skip) icon = <AlertIconStyled color={inverted ? theme.color.lightest : undefined} />;
66
+ else icon = <CircleHollowIconStyled color={inverted ? theme.color.lightest : undefined} />;
59
67
  break;
60
68
  }
61
69
  }
@@ -1,5 +1,6 @@
1
- import React from 'react';
2
- import { IconButton, Icons } from '@storybook/components';
1
+ import React, { JSX } from 'react';
2
+ import { IconButton } from '@storybook/components';
3
+ import { TimeIcon, CheckIcon, CrossIcon, ThumbsUpIcon } from '@storybook/icons';
3
4
  import { styled, withTheme, Theme } from '@storybook/theming';
4
5
  import { TestStatus } from '../../../../types.js';
5
6
  import { CreeveyTestsStatus } from '../../../shared/helpers.js';
@@ -59,48 +60,44 @@ export const TestsStatus = withTheme(
59
60
  }: TestsStatusProps): JSX.Element => {
60
61
  return (
61
62
  <Container>
62
- {/* @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623 */}
63
63
  <Button
64
64
  onClick={() => {
65
65
  onClickByStatus('pending');
66
66
  }}
67
67
  >
68
68
  <IconContainer color={theme?.color.mediumdark}>
69
- <Icons icon="time" />
69
+ <TimeIcon />
70
70
  {pendingCount}
71
71
  </IconContainer>
72
72
  </Button>
73
73
  <Divider />
74
- {/* @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623 */}
75
74
  <Button
76
75
  onClick={() => {
77
76
  onClickByStatus('success');
78
77
  }}
79
78
  >
80
79
  <IconContainer color={theme?.color.green}>
81
- <Icons icon="check" /> {successCount}
80
+ <CheckIcon /> {successCount}
82
81
  </IconContainer>
83
82
  </Button>
84
83
  <Divider />
85
- {/* @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623 */}
86
84
  <Button
87
85
  onClick={() => {
88
86
  onClickByStatus('failed');
89
87
  }}
90
88
  >
91
89
  <IconContainer color={theme?.color.negative}>
92
- <Icons icon="cross" /> {failedCount}
90
+ <CrossIcon /> {failedCount}
93
91
  </IconContainer>
94
92
  </Button>
95
93
  <Divider />
96
- {/* @ts-expect-error Fixed in https://github.com/storybookjs/storybook/pull/26623 */}
97
94
  <Button
98
95
  onClick={() => {
99
96
  onClickByStatus('approved');
100
97
  }}
101
98
  >
102
99
  <IconContainer color={theme?.color.defaultText}>
103
- <Icons icon="thumbsup" /> {approvedCount}
100
+ <ThumbsUpIcon /> {approvedCount}
104
101
  </IconContainer>
105
102
  </Button>
106
103
  </Container>
@@ -1,5 +1,4 @@
1
- import React from 'react';
2
-
1
+ import React, { JSX } from 'react';
3
2
  import { styled, withTheme } from '@storybook/theming';
4
3
  import { opacify } from 'polished';
5
4
 
@@ -1,4 +1,4 @@
1
- import React, { useState, useEffect, useCallback, useContext } from 'react';
1
+ import React, { JSX, useState, useEffect, useCallback, useContext, PropsWithChildren } from 'react';
2
2
  import { CreeveySuite, isTest, noop } from '../../types.js';
3
3
  import { CreeveyViewFilter, filterTests, flattenSuite, getSuiteByPath, getTestPath } from '../shared/helpers.js';
4
4
  import { CreeveyContext } from './CreeveyContext.js';
@@ -20,11 +20,10 @@ export const KeyboardEvents = ({
20
20
  children,
21
21
  rootSuite,
22
22
  filter,
23
- }: {
23
+ }: PropsWithChildren<{
24
24
  rootSuite: CreeveySuite;
25
25
  filter: CreeveyViewFilter;
26
- children: React.ReactChild;
27
- }): JSX.Element => {
26
+ }>): JSX.Element => {
28
27
  const [sidebarFocusedItem, setSidebarFocusedItem] = useState<FocusableItem>([]);
29
28
 
30
29
  const { onSuiteOpen, onSuiteToggle } = useContext(CreeveyContext);
@@ -23,6 +23,6 @@
23
23
  </head>
24
24
  <body>
25
25
  <div id="root"></div>
26
- <script src="main.js"></script>
26
+ <script type="module" src="./index.tsx"></script>
27
27
  </body>
28
28
  </html>
@@ -1,5 +1,5 @@
1
1
  import React, { Suspense } from 'react';
2
- import ReactDOM from 'react-dom';
2
+ import { createRoot } from 'react-dom/client';
3
3
  import { CreeveyApp } from './CreeveyApp.js';
4
4
 
5
5
  import { initCreeveyClientApi, CreeveyClientApi } from '../shared/creeveyClientApi.js';
@@ -55,9 +55,10 @@ const CreeveyAppAsync = React.lazy(async () => {
55
55
  };
56
56
  });
57
57
 
58
- ReactDOM.render(
58
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
59
+ const root = createRoot(document.getElementById('root')!);
60
+ root.render(
59
61
  <Suspense fallback={<CreeveyLoader />}>
60
62
  <CreeveyAppAsync />
61
63
  </Suspense>,
62
- document.getElementById('root'),
63
64
  );
package/src/creevey.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import cluster from 'cluster';
2
2
  import minimist from 'minimist';
3
3
  import creevey from './server/index.js';
4
- import { noop, Options } from './types.js';
4
+ import { Options } from './types.js';
5
5
  import { emitWorkerMessage } from './server/messages.js';
6
- import { isShuttingDown, shutdown, shutdownWorkers } from './server/utils.js';
6
+ import { isShuttingDown, shutdownWorkers } from './server/utils.js';
7
7
  import Logger from 'loglevel';
8
8
  import { logger } from './server/logger.js';
9
9
 
@@ -15,22 +15,39 @@ function shutdownOnException(reason: unknown): void {
15
15
  logger.error(error);
16
16
 
17
17
  process.exitCode = -1;
18
- if (cluster.isWorker) emitWorkerMessage({ type: 'error', payload: { error } });
18
+ if (cluster.isWorker) emitWorkerMessage({ type: 'error', payload: { subtype: 'unknown', error } });
19
19
  if (cluster.isPrimary) void shutdownWorkers();
20
20
  }
21
21
 
22
22
  process.on('uncaughtException', shutdownOnException);
23
23
  process.on('unhandledRejection', shutdownOnException);
24
- if (cluster.isWorker) process.on('SIGINT', noop);
25
- if (cluster.isPrimary) process.on('SIGINT', shutdown);
24
+ process.on('SIGINT', () => {
25
+ isShuttingDown.current = true;
26
+ });
26
27
 
27
28
  const argv = minimist<Options>(process.argv.slice(2), {
28
- string: ['browser', 'config', 'reporter', 'reportDir', 'screenDir', 'storybookUrl'],
29
- boolean: ['debug', 'trace', 'ui', 'saveReport', 'tests'],
30
- default: { port: 3000, saveReport: true },
29
+ string: ['browser', 'config', 'reporter', 'reportDir', 'screenDir', 'gridUrl', 'storybookUrl'],
30
+ boolean: ['debug', 'trace', 'ui', 'odiff'],
31
+ default: { port: 3000 },
31
32
  alias: { port: 'p', config: 'c', debug: 'd', update: 'u' },
32
33
  });
33
34
 
35
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
36
+ if (cluster.isPrimary && argv.reporter) {
37
+ logger.warn(`--reporter option has been removed please describe reporter in config file:
38
+ import { reporters } from 'mocha';
39
+
40
+ const config = {
41
+ reporter: reporters.${
42
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
43
+ argv.reporter
44
+ },
45
+ };
46
+
47
+ export default config;
48
+ `);
49
+ }
50
+
34
51
  // @ts-expect-error: define log level for storybook
35
52
  global.LOGLEVEL = argv.trace ? 'trace' : argv.debug ? 'debug' : 'warn';
36
53
  if (argv.trace) {
package/src/index.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  export * from './types.js';
2
- export { loadStories as browserStoriesProvider } from './server/storybook/providers/browser.js';
3
- export { loadStories as hybridStoriesProvider } from './server/storybook/providers/hybrid.js';
2
+ export { loadStories as browserStoriesProvider } from './server/providers/browser.js';
3
+ export { loadStories as hybridStoriesProvider } from './server/providers/hybrid.js';
4
+ export { PlaywrightWebdriver } from './server/playwright/webdriver.js';
5
+ export { SeleniumWebdriver } from './server/selenium/webdriver.js';
4
6
  export * from './server/testsFiles/parser.js';