creevey 0.9.0-beta.1 → 0.9.0-beta.10.timeouts.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 (221) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +9 -1
  3. package/addon/README.md +3 -0
  4. package/addon/package.json +5 -0
  5. package/docs/config.md +29 -26
  6. package/jest.config.js +6 -0
  7. package/lib/cjs/cli.js +5 -0
  8. package/lib/cjs/client/addon/Manager.js +264 -0
  9. package/lib/cjs/client/addon/components/Addon.js +55 -0
  10. package/lib/cjs/client/addon/components/Icons.js +46 -0
  11. package/lib/cjs/client/addon/components/Panel.js +72 -0
  12. package/lib/cjs/client/addon/components/TestSelect.js +65 -0
  13. package/lib/cjs/client/addon/components/Tools.js +95 -0
  14. package/lib/cjs/client/addon/decorator.js +11 -0
  15. package/lib/cjs/client/addon/index.js +31 -0
  16. package/lib/cjs/client/addon/preset.ie11.js +74 -0
  17. package/lib/cjs/client/addon/preset.js +17 -0
  18. package/lib/cjs/client/addon/preset.sb7.js +19 -0
  19. package/lib/cjs/client/addon/preview.js +14 -0
  20. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  21. package/lib/cjs/client/addon/register.js +72 -0
  22. package/lib/cjs/client/addon/utils.js +42 -0
  23. package/lib/cjs/client/addon/withCreevey.js +351 -0
  24. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +87 -0
  25. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +92 -0
  26. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +154 -0
  27. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +166 -0
  28. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +91 -0
  29. package/lib/cjs/client/shared/components/ImagesView/index.js +45 -0
  30. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +50 -0
  31. package/lib/cjs/client/shared/components/PageFooter/Paging.js +94 -0
  32. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +82 -0
  33. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +119 -0
  34. package/lib/cjs/client/shared/components/ResultsPage.js +143 -0
  35. package/lib/cjs/client/shared/creeveyClientApi.js +76 -0
  36. package/lib/cjs/client/shared/helpers.js +411 -0
  37. package/lib/cjs/client/shared/viewMode.js +17 -0
  38. package/lib/cjs/client/web/142.js +2 -0
  39. package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
  40. package/lib/cjs/client/web/32.js +1 -0
  41. package/lib/cjs/client/web/551.js +1 -0
  42. package/lib/cjs/client/web/566.js +2 -0
  43. package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
  44. package/lib/cjs/client/web/691.js +2 -0
  45. package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
  46. package/lib/cjs/client/web/725.js +1 -0
  47. package/lib/cjs/client/web/index.html +19 -0
  48. package/lib/cjs/client/web/main.js +2 -38
  49. package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
  50. package/lib/cjs/creevey.js +69 -0
  51. package/lib/cjs/index.js +62 -0
  52. package/lib/cjs/server/config.js +94 -0
  53. package/lib/cjs/server/docker.js +146 -0
  54. package/lib/cjs/server/extract.js +46 -0
  55. package/lib/cjs/server/index.js +83 -0
  56. package/lib/cjs/server/loaders/babel/creevey-plugin.js +86 -0
  57. package/lib/cjs/server/loaders/babel/helpers.js +469 -0
  58. package/lib/cjs/server/loaders/babel/register.js +124 -0
  59. package/lib/cjs/server/loaders/hooks/mdx.js +30 -0
  60. package/lib/cjs/server/loaders/hooks/svelte.js +65 -0
  61. package/lib/cjs/server/loaders/webpack/compile.js +269 -0
  62. package/lib/cjs/server/loaders/webpack/creevey-loader.js +172 -0
  63. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +39 -0
  64. package/lib/cjs/server/loaders/webpack/mdx-loader.js +72 -0
  65. package/lib/cjs/server/loaders/webpack/start.js +41 -0
  66. package/lib/cjs/server/logger.js +48 -0
  67. package/lib/cjs/server/master/api.js +71 -0
  68. package/lib/cjs/server/master/index.js +146 -0
  69. package/lib/cjs/server/master/master.js +57 -0
  70. package/lib/cjs/server/master/pool.js +197 -0
  71. package/lib/cjs/server/master/runner.js +281 -0
  72. package/lib/cjs/server/master/server.js +131 -0
  73. package/lib/cjs/server/messages.js +264 -0
  74. package/lib/cjs/server/selenium/browser.js +671 -0
  75. package/lib/cjs/server/selenium/index.js +31 -0
  76. package/lib/cjs/server/selenium/selenoid.js +172 -0
  77. package/lib/cjs/server/stories.js +153 -0
  78. package/lib/cjs/server/storybook/entry.js +53 -0
  79. package/lib/cjs/server/storybook/helpers.js +158 -0
  80. package/lib/cjs/server/storybook/providers/browser.js +74 -0
  81. package/lib/cjs/server/storybook/providers/hybrid.js +82 -0
  82. package/lib/cjs/server/storybook/providers/nodejs.js +239 -0
  83. package/lib/cjs/server/testsFiles/parser.js +72 -0
  84. package/lib/cjs/server/testsFiles/register.js +44 -0
  85. package/lib/cjs/server/update.js +79 -0
  86. package/lib/cjs/server/utils.js +176 -0
  87. package/lib/cjs/server/worker/chai-image.js +142 -0
  88. package/lib/cjs/server/worker/helpers.js +69 -0
  89. package/lib/cjs/server/worker/index.js +15 -0
  90. package/lib/cjs/server/worker/reporter.js +108 -0
  91. package/lib/cjs/server/worker/worker.js +268 -0
  92. package/lib/cjs/shared/index.js +101 -0
  93. package/lib/cjs/shared/serializeRegExp.js +42 -0
  94. package/lib/cjs/types.js +75 -0
  95. package/lib/esm/cli.js +4 -0
  96. package/lib/esm/client/addon/Manager.js +248 -0
  97. package/lib/esm/client/addon/components/Addon.js +39 -0
  98. package/lib/esm/client/addon/components/Icons.js +31 -0
  99. package/lib/esm/client/addon/components/Panel.js +53 -0
  100. package/lib/esm/client/addon/components/TestSelect.js +51 -0
  101. package/lib/esm/client/addon/components/Tools.js +74 -0
  102. package/lib/esm/client/addon/decorator.js +2 -0
  103. package/lib/esm/client/addon/index.js +2 -0
  104. package/lib/esm/client/addon/preset.ie11.js +59 -0
  105. package/lib/esm/client/addon/preset.js +8 -0
  106. package/lib/esm/client/addon/preset.sb7.js +8 -0
  107. package/lib/esm/client/addon/preview.js +5 -0
  108. package/lib/esm/client/addon/readyForCapture.js +5 -0
  109. package/lib/esm/client/addon/register.js +51 -0
  110. package/lib/esm/client/addon/utils.js +32 -0
  111. package/lib/esm/client/addon/withCreevey.js +325 -0
  112. package/lib/esm/client/shared/components/ImagesView/BlendView.js +67 -0
  113. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +69 -0
  114. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +131 -0
  115. package/lib/esm/client/shared/components/ImagesView/SlideView.js +143 -0
  116. package/lib/esm/client/shared/components/ImagesView/SwapView.js +71 -0
  117. package/lib/esm/client/shared/components/ImagesView/index.js +5 -0
  118. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +36 -0
  119. package/lib/esm/client/shared/components/PageFooter/Paging.js +80 -0
  120. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +68 -0
  121. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +97 -0
  122. package/lib/esm/client/shared/components/ResultsPage.js +115 -0
  123. package/lib/esm/client/shared/creeveyClientApi.js +67 -0
  124. package/lib/esm/client/shared/helpers.js +353 -0
  125. package/lib/esm/client/shared/viewMode.js +6 -0
  126. package/lib/esm/creevey.js +54 -0
  127. package/lib/esm/index.js +5 -0
  128. package/lib/esm/server/config.js +71 -0
  129. package/lib/esm/server/docker.js +123 -0
  130. package/lib/esm/server/extract.js +32 -0
  131. package/lib/esm/server/index.js +64 -0
  132. package/lib/esm/server/loaders/babel/creevey-plugin.js +72 -0
  133. package/lib/esm/server/loaders/babel/helpers.js +452 -0
  134. package/lib/esm/server/loaders/babel/register.js +103 -0
  135. package/lib/esm/server/loaders/hooks/mdx.js +15 -0
  136. package/lib/esm/server/loaders/hooks/svelte.js +49 -0
  137. package/lib/esm/server/loaders/webpack/compile.js +246 -0
  138. package/lib/esm/server/loaders/webpack/creevey-loader.js +152 -0
  139. package/lib/esm/server/loaders/webpack/dummy-hmr.js +32 -0
  140. package/lib/esm/server/loaders/webpack/mdx-loader.js +58 -0
  141. package/lib/esm/server/loaders/webpack/start.js +27 -0
  142. package/lib/esm/server/logger.js +20 -0
  143. package/lib/esm/server/master/api.js +60 -0
  144. package/lib/esm/server/master/index.js +125 -0
  145. package/lib/esm/server/master/master.js +38 -0
  146. package/lib/esm/server/master/pool.js +176 -0
  147. package/lib/esm/server/master/runner.js +259 -0
  148. package/lib/esm/server/master/server.js +107 -0
  149. package/lib/esm/server/messages.js +232 -0
  150. package/lib/esm/server/selenium/browser.js +638 -0
  151. package/lib/esm/server/selenium/index.js +2 -0
  152. package/lib/esm/server/selenium/selenoid.js +149 -0
  153. package/lib/esm/server/stories.js +135 -0
  154. package/lib/esm/server/storybook/entry.js +27 -0
  155. package/lib/esm/server/storybook/helpers.js +97 -0
  156. package/lib/esm/server/storybook/providers/browser.js +58 -0
  157. package/lib/esm/server/storybook/providers/hybrid.js +60 -0
  158. package/lib/esm/server/storybook/providers/nodejs.js +216 -0
  159. package/lib/esm/server/testsFiles/parser.js +50 -0
  160. package/lib/esm/server/testsFiles/register.js +31 -0
  161. package/lib/esm/server/update.js +61 -0
  162. package/lib/esm/server/utils.js +133 -0
  163. package/lib/esm/server/worker/chai-image.js +130 -0
  164. package/lib/esm/server/worker/helpers.js +60 -0
  165. package/lib/esm/server/worker/index.js +1 -0
  166. package/lib/esm/server/worker/reporter.js +86 -0
  167. package/lib/esm/server/worker/worker.js +238 -0
  168. package/lib/esm/shared/index.js +78 -0
  169. package/lib/esm/shared/serializeRegExp.js +24 -0
  170. package/lib/esm/types.js +44 -0
  171. package/lib/types/client/addon/Manager.d.ts +2 -2
  172. package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
  173. package/lib/types/client/addon/index.d.ts +2 -0
  174. package/lib/types/client/addon/preset.d.ts +0 -22
  175. package/lib/types/client/addon/preset.ie11.d.ts +10 -0
  176. package/lib/types/client/addon/preset.sb7.d.ts +2 -0
  177. package/lib/types/client/addon/preview.d.ts +4 -0
  178. package/lib/types/client/addon/utils.d.ts +1 -0
  179. package/lib/types/client/addon/withCreevey.d.ts +1 -1
  180. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  181. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
  182. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  183. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  184. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  185. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
  186. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
  187. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
  188. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
  189. package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
  190. package/lib/types/client/web/CreeveyApp.d.ts +0 -1
  191. package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
  192. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  193. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
  194. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +4 -4
  195. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
  196. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
  197. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
  198. package/lib/types/index.d.ts +1 -0
  199. package/lib/types/server/loaders/babel/register.d.ts +1 -1
  200. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  201. package/lib/types/server/logger.d.ts +6 -2
  202. package/lib/types/server/messages.d.ts +14 -12
  203. package/lib/types/server/selenium/browser.d.ts +5 -3
  204. package/lib/types/server/storybook/entry.d.ts +2 -3
  205. package/lib/types/server/storybook/helpers.d.ts +1 -1
  206. package/lib/types/server/storybook/providers/browser.d.ts +2 -4
  207. package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
  208. package/lib/types/server/storybook/providers/nodejs.d.ts +3 -3
  209. package/lib/types/server/utils.d.ts +5 -1
  210. package/lib/types/{shared.d.ts → shared/index.d.ts} +1 -10
  211. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  212. package/lib/types/types.d.ts +4 -7
  213. package/package.json +117 -103
  214. package/preset/ie11.js +5 -0
  215. package/{preset.js → preset/index.js} +2 -2
  216. package/preset/sb7.js +5 -0
  217. package/types/global.d.ts +5 -0
  218. package/types/mdx.d.ts +3 -2
  219. package/lib/cjs/client/web/1.js +0 -13
  220. package/lib/cjs/client/web/2.js +0 -1
  221. package/storybook-static/stories.json +0 -21
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ResultsPage = void 0;
7
+ exports.ResultsPageInternal = ResultsPageInternal;
8
+
9
+ var _react = _interopRequireWildcard(require("react"));
10
+
11
+ var _ImagesView = require("./ImagesView/ImagesView");
12
+
13
+ var _PageHeader = require("./PageHeader/PageHeader");
14
+
15
+ var _PageFooter = require("./PageFooter/PageFooter");
16
+
17
+ var _helpers = require("../helpers");
18
+
19
+ var _theming = require("@storybook/theming");
20
+
21
+ var _components = require("@storybook/components");
22
+
23
+ var _viewMode = require("../viewMode");
24
+
25
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
26
+
27
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
28
+
29
+ const Wrapper = _theming.styled.div({
30
+ width: '100%',
31
+ height: '100%',
32
+ boxSizing: 'border-box',
33
+ display: 'flex',
34
+ flexDirection: 'column'
35
+ });
36
+
37
+ const ImagesViewContainer = _theming.styled.div(_ref => {
38
+ let {
39
+ theme
40
+ } = _ref;
41
+ return {
42
+ background: theme.base == 'light' ? theme.color.mediumlight : theme.color.darker,
43
+ flexGrow: 1,
44
+ padding: '20px 0'
45
+ };
46
+ });
47
+
48
+ const HeaderContainer = _theming.styled.div({
49
+ position: 'sticky',
50
+ top: 0,
51
+ zIndex: 1
52
+ });
53
+
54
+ const BodyContainer = _theming.styled.div({
55
+ flexGrow: 1
56
+ });
57
+
58
+ const FooterContainer = _theming.styled.div({
59
+ position: 'sticky',
60
+ bottom: 0,
61
+ zIndex: 1
62
+ });
63
+
64
+ const Container = _theming.styled.div(_ref2 => {
65
+ let {
66
+ height = '100vh'
67
+ } = _ref2;
68
+ return {
69
+ height,
70
+ width: '100%',
71
+ overflowY: 'hidden',
72
+ display: 'flex',
73
+ flexDirection: 'column'
74
+ };
75
+ });
76
+
77
+ function ResultsPageInternal(_ref3) {
78
+ var _results, _Object$keys$, _result$images, _result$images2;
79
+
80
+ let {
81
+ id,
82
+ path,
83
+ results = [],
84
+ approved = {},
85
+ theme,
86
+ onImageApprove,
87
+ showTitle = false,
88
+ height
89
+ } = _ref3;
90
+ const [retry, setRetry] = (0, _react.useState)(results.length);
91
+ const result = (_results = results[retry - 1]) !== null && _results !== void 0 ? _results : {};
92
+ const [imageName, setImageName] = (0, _react.useState)((_Object$keys$ = Object.keys((_result$images = result.images) !== null && _result$images !== void 0 ? _result$images : {})[0]) !== null && _Object$keys$ !== void 0 ? _Object$keys$ : '');
93
+ const [viewMode, setViewMode] = (0, _react.useState)((0, _viewMode.getViewMode)());
94
+ (0, _react.useEffect)(() => setRetry(results.length), [results.length]);
95
+ const url = (0, _helpers.getImageUrl)(path, imageName);
96
+ const image = (_result$images2 = result.images) === null || _result$images2 === void 0 ? void 0 : _result$images2[imageName];
97
+ const canApprove = Boolean(image && approved[imageName] != retry - 1 && result.status != 'success');
98
+ const hasDiffAndExpect = canApprove && Boolean((image === null || image === void 0 ? void 0 : image.diff) && image.expect);
99
+ const imagesWithError = result.images ? Object.keys(result.images).filter(imageName => {
100
+ var _imageName;
101
+
102
+ return result.status != 'success' && approved[imageName] != retry - 1 && ((_imageName = (result.images || {})[imageName]) === null || _imageName === void 0 ? void 0 : _imageName.error) != null;
103
+ }) : [];
104
+
105
+ const handleApprove = () => onImageApprove(id, retry - 1, imageName);
106
+
107
+ const handleChangeViewMode = mode => {
108
+ localStorage.setItem(_viewMode.VIEW_MODE_KEY, mode);
109
+ setViewMode(mode);
110
+ };
111
+
112
+ return /*#__PURE__*/_react.default.createElement(Container, {
113
+ height: height
114
+ }, /*#__PURE__*/_react.default.createElement(HeaderContainer, null, /*#__PURE__*/_react.default.createElement(_PageHeader.PageHeader, {
115
+ title: path,
116
+ images: result.images,
117
+ errorMessage: result.error,
118
+ showViewModes: hasDiffAndExpect,
119
+ viewMode: viewMode,
120
+ onViewModeChange: handleChangeViewMode,
121
+ onImageChange: setImageName,
122
+ showTitle: showTitle,
123
+ imagesWithError: imagesWithError
124
+ })), /*#__PURE__*/_react.default.createElement(BodyContainer, null, /*#__PURE__*/_react.default.createElement(_components.ScrollArea, {
125
+ vertical: true
126
+ }, /*#__PURE__*/_react.default.createElement(Wrapper, null, /*#__PURE__*/_react.default.createElement(ImagesViewContainer, {
127
+ theme: theme
128
+ }, image ? /*#__PURE__*/_react.default.createElement(_ImagesView.ImagesView, {
129
+ url: url,
130
+ image: image,
131
+ canApprove: canApprove,
132
+ mode: viewMode
133
+ }) : /*#__PURE__*/_react.default.createElement(_components.Placeholder, null, "Image ".concat(imageName, " not found")))))), results.length ? /*#__PURE__*/_react.default.createElement(FooterContainer, null, /*#__PURE__*/_react.default.createElement(_PageFooter.PageFooter, {
134
+ canApprove: canApprove,
135
+ retry: retry,
136
+ retriesCount: results.length,
137
+ onRetryChange: setRetry,
138
+ onApprove: handleApprove
139
+ })) : null);
140
+ }
141
+
142
+ const ResultsPage = (0, _theming.withTheme)(ResultsPageInternal);
143
+ exports.ResultsPage = ResultsPage;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.initCreeveyClientApi = initCreeveyClientApi;
7
+
8
+ var _types = require("../../types");
9
+
10
+ var _helpers = require("./helpers");
11
+
12
+ async function initCreeveyClientApi() {
13
+ let clientApiResolver = _types.noop;
14
+ const updateListeners = new Set();
15
+ let statusRequest = null;
16
+ let statusResolver = _types.noop;
17
+ const ws = new WebSocket("ws://".concat((0, _helpers.getConnectionUrl)()));
18
+
19
+ function send(request) {
20
+ ws.send(JSON.stringify(request));
21
+ }
22
+
23
+ ws.addEventListener('open', () => {
24
+ clientApiResolver({
25
+ start(ids) {
26
+ send({
27
+ type: 'start',
28
+ payload: ids
29
+ });
30
+ },
31
+
32
+ stop() {
33
+ send({
34
+ type: 'stop'
35
+ });
36
+ },
37
+
38
+ approve(id, retry, image) {
39
+ send({
40
+ type: 'approve',
41
+ payload: {
42
+ id,
43
+ retry,
44
+ image
45
+ }
46
+ });
47
+ },
48
+
49
+ onUpdate(fn) {
50
+ updateListeners.add(fn);
51
+ return () => updateListeners.delete(fn);
52
+ },
53
+
54
+ get status() {
55
+ if (statusRequest) return statusRequest;
56
+ send({
57
+ type: 'status'
58
+ });
59
+ return statusRequest = new Promise(resolve => statusResolver = resolve);
60
+ }
61
+
62
+ });
63
+ });
64
+ ws.addEventListener('message', message => {
65
+ const data = JSON.parse(message.data);
66
+ if (data.type == 'update') updateListeners.forEach(fn => fn(data.payload));
67
+
68
+ if (data.type == 'status') {
69
+ statusResolver(data.payload);
70
+ statusResolver = _types.noop;
71
+ statusRequest = null;
72
+ }
73
+ }); // TODO Reconnect
74
+
75
+ return new Promise(resolve => clientApiResolver = resolve);
76
+ }
@@ -0,0 +1,411 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.calcStatus = calcStatus;
7
+ exports.checkSuite = checkSuite;
8
+ exports.countTestsStatus = countTestsStatus;
9
+ exports.filterTests = filterTests;
10
+ exports.flattenSuite = flattenSuite;
11
+ exports.getBorderSize = getBorderSize;
12
+ exports.getCheckedTests = getCheckedTests;
13
+ exports.getConnectionUrl = getConnectionUrl;
14
+ exports.getImageUrl = getImageUrl;
15
+ exports.getSuiteByPath = getSuiteByPath;
16
+ exports.getTestByPath = getTestByPath;
17
+ exports.getTestPath = getTestPath;
18
+ exports.getTestPathFromSearch = getTestPathFromSearch;
19
+ exports.getTestsByStoryId = getTestsByStoryId;
20
+ exports.openSuite = openSuite;
21
+ exports.removeTests = removeTests;
22
+ exports.setSearchParams = setSearchParams;
23
+ exports.treeifyTests = treeifyTests;
24
+ exports.updateTestStatus = updateTestStatus;
25
+ exports.useApplyScale = useApplyScale;
26
+ exports.useCalcScale = useCalcScale;
27
+ exports.useForceUpdate = useForceUpdate;
28
+ exports.useLoadImages = useLoadImages;
29
+ exports.useResizeObserver = useResizeObserver;
30
+ exports.useTheme = useTheme;
31
+
32
+ var _theming = require("@storybook/theming");
33
+
34
+ var _qs = require("qs");
35
+
36
+ var _react = require("react");
37
+
38
+ var _types = require("../../types");
39
+
40
+ const statusUpdatesMap = new Map([[undefined, /(unknown|success|failed|pending|running)/], ['unknown', /(success|failed|pending|running)/], ['success', /(failed|pending|running)/], ['failed', /(pending|running)/], ['pending', /running/]]);
41
+
42
+ function makeEmptySuiteNode() {
43
+ let path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
44
+ return {
45
+ path,
46
+ skip: true,
47
+ opened: false,
48
+ checked: true,
49
+ indeterminate: false,
50
+ children: {}
51
+ };
52
+ }
53
+
54
+ function calcStatus(oldStatus, newStatus) {
55
+ var _statusUpdatesMap$get;
56
+
57
+ return newStatus && (_statusUpdatesMap$get = statusUpdatesMap.get(oldStatus)) !== null && _statusUpdatesMap$get !== void 0 && _statusUpdatesMap$get.test(newStatus) ? newStatus : oldStatus;
58
+ }
59
+
60
+ function getTestPath(test) {
61
+ const {
62
+ browser,
63
+ testName,
64
+ storyPath
65
+ } = test;
66
+ return [...storyPath, testName, browser].filter(_types.isDefined);
67
+ }
68
+
69
+ function getSuiteByPath(suite, path) {
70
+ return path.reduce((suiteOrTest, pathToken) => (0, _types.isTest)(suiteOrTest) ? suiteOrTest : suiteOrTest === null || suiteOrTest === void 0 ? void 0 : suiteOrTest.children[pathToken], suite);
71
+ }
72
+
73
+ function getTestByPath(suite, path) {
74
+ var _getSuiteByPath;
75
+
76
+ const test = (_getSuiteByPath = getSuiteByPath(suite, path)) !== null && _getSuiteByPath !== void 0 ? _getSuiteByPath : suite;
77
+ return (0, _types.isTest)(test) ? test : null;
78
+ }
79
+
80
+ function getTestsByStoryId(suite, storyId) {
81
+ return Object.values(suite.children).filter(_types.isDefined).flatMap(suiteOrTest => {
82
+ if ((0, _types.isTest)(suiteOrTest)) return suiteOrTest.storyId === storyId ? suiteOrTest : [];
83
+ return getTestsByStoryId(suiteOrTest, storyId);
84
+ }).filter(_types.isDefined);
85
+ }
86
+
87
+ function checkTests(suiteOrTest, checked) {
88
+ suiteOrTest.checked = checked;
89
+
90
+ if (!(0, _types.isTest)(suiteOrTest)) {
91
+ suiteOrTest.indeterminate = false;
92
+ Object.values(suiteOrTest.children).filter(_types.isDefined).forEach(child => checkTests(child, checked));
93
+ }
94
+ }
95
+
96
+ function updateChecked(suite) {
97
+ const children = Object.values(suite.children).filter(_types.isDefined).filter(child => !child.skip);
98
+ const checkedEvery = children.every(test => test.checked);
99
+ const checkedSome = children.some(test => test.checked);
100
+ const indeterminate = children.some(test => (0, _types.isTest)(test) ? false : test.indeterminate) || !checkedEvery && checkedSome;
101
+ const checked = indeterminate || suite.checked == checkedEvery ? suite.checked : checkedEvery;
102
+ suite.checked = checked;
103
+ suite.indeterminate = indeterminate;
104
+ }
105
+
106
+ function checkSuite(suite, path, checked) {
107
+ const subSuite = getSuiteByPath(suite, path);
108
+ if (subSuite) checkTests(subSuite, checked);
109
+ path.slice(0, -1).map((_, index, tokens) => tokens.slice(0, tokens.length - index)).forEach(parentPath => {
110
+ const parentSuite = getSuiteByPath(suite, parentPath);
111
+ if ((0, _types.isTest)(parentSuite)) return;
112
+ if (parentSuite) updateChecked(parentSuite);
113
+ });
114
+ updateChecked(suite);
115
+ }
116
+
117
+ function treeifyTests(testsById) {
118
+ const rootSuite = makeEmptySuiteNode();
119
+ rootSuite.opened = true;
120
+ Object.values(testsById).forEach(test => {
121
+ if (!test) return;
122
+ const [browser, ...testPath] = getTestPath(test).reverse();
123
+ const lastSuite = testPath.reverse().reduce((suite, token) => {
124
+ const subSuite = suite.children[token] || makeEmptySuiteNode([...suite.path, token]);
125
+ subSuite.status = calcStatus(subSuite.status, test.status);
126
+ if (!test.skip) subSuite.skip = false;
127
+ if (!subSuite.skip) suite.skip = false;
128
+ suite.children[token] = subSuite;
129
+ suite.status = calcStatus(suite.status, subSuite.status);
130
+
131
+ if ((0, _types.isTest)(subSuite)) {
132
+ throw new Error("Suite and Test should not have same path '".concat(JSON.stringify(getTestPath(subSuite)), "'"));
133
+ }
134
+
135
+ return subSuite;
136
+ }, rootSuite);
137
+ lastSuite.children[browser] = { ...test,
138
+ checked: true
139
+ };
140
+ });
141
+ return rootSuite;
142
+ }
143
+
144
+ function getCheckedTests(suite) {
145
+ return Object.values(suite.children).filter(_types.isDefined).flatMap(suiteOrTest => {
146
+ if ((0, _types.isTest)(suiteOrTest)) return suiteOrTest.checked ? suiteOrTest : [];
147
+ if (!suiteOrTest.checked && !suiteOrTest.indeterminate) return [];
148
+ return getCheckedTests(suiteOrTest);
149
+ });
150
+ }
151
+
152
+ function updateTestStatus(suite, path, update) {
153
+ var _suite$children$title;
154
+
155
+ const title = path.shift();
156
+ if (!title) return;
157
+ const suiteOrTest = (_suite$children$title = suite.children[title]) !== null && _suite$children$title !== void 0 ? _suite$children$title : suite.children[title] = { ...(path.length == 0 ? update : makeEmptySuiteNode([...suite.path, title])),
158
+ checked: suite.checked
159
+ };
160
+
161
+ if ((0, _types.isTest)(suiteOrTest)) {
162
+ const test = suiteOrTest;
163
+ const {
164
+ skip,
165
+ status,
166
+ results,
167
+ approved
168
+ } = update;
169
+ if ((0, _types.isDefined)(skip)) test.skip = skip;
170
+ if ((0, _types.isDefined)(status)) test.status = status;
171
+ if ((0, _types.isDefined)(results)) test.results ? test.results.push(...results) : test.results = results;
172
+ if ((0, _types.isDefined)(approved)) Object.entries(approved).forEach(_ref => {
173
+ let [image, retry] = _ref;
174
+ return retry !== undefined && ((test.approved = test.approved || {})[image] = retry);
175
+ });
176
+ } else {
177
+ const subSuite = suiteOrTest;
178
+ updateTestStatus(subSuite, path, update);
179
+ }
180
+
181
+ suite.skip = Object.values(suite.children).filter(_types.isDefined).map(_ref2 => {
182
+ let {
183
+ skip
184
+ } = _ref2;
185
+ return skip;
186
+ }).every(Boolean);
187
+ suite.status = Object.values(suite.children).filter(_types.isDefined).map(_ref3 => {
188
+ let {
189
+ status
190
+ } = _ref3;
191
+ return status;
192
+ }).reduce(calcStatus);
193
+ }
194
+
195
+ function removeTests(suite, path) {
196
+ var _suiteOrTest$children;
197
+
198
+ const title = path.shift();
199
+ if (!title) return;
200
+ const suiteOrTest = suite.children[title];
201
+ if (suiteOrTest && !(0, _types.isTest)(suiteOrTest)) removeTests(suiteOrTest, path);
202
+ if ((0, _types.isTest)(suiteOrTest) || Object.keys((_suiteOrTest$children = suiteOrTest === null || suiteOrTest === void 0 ? void 0 : suiteOrTest.children) !== null && _suiteOrTest$children !== void 0 ? _suiteOrTest$children : {}).length == 0) delete suite.children[title];
203
+ if (Object.keys(suite.children).length == 0) return;
204
+ updateChecked(suite);
205
+ suite.skip = Object.values(suite.children).filter(_types.isDefined).map(_ref4 => {
206
+ let {
207
+ skip
208
+ } = _ref4;
209
+ return skip;
210
+ }).every(Boolean);
211
+ suite.status = Object.values(suite.children).filter(_types.isDefined).map(_ref5 => {
212
+ let {
213
+ status
214
+ } = _ref5;
215
+ return status;
216
+ }).reduce(calcStatus);
217
+ }
218
+
219
+ function filterTests(suite, filter) {
220
+ const {
221
+ status,
222
+ subStrings
223
+ } = filter;
224
+ if (!status && !subStrings.length) return suite;
225
+ const filteredSuite = { ...suite,
226
+ children: {}
227
+ };
228
+ Object.entries(suite.children).forEach(_ref6 => {
229
+ let [title, suiteOrTest] = _ref6;
230
+ if (!suiteOrTest || suiteOrTest.skip) return;
231
+
232
+ if (!status && subStrings.some(subString => title.toLowerCase().includes(subString))) {
233
+ filteredSuite.children[title] = suiteOrTest;
234
+ } else if ((0, _types.isTest)(suiteOrTest)) {
235
+ if (status && suiteOrTest.status && ['pending', 'running', status].includes(suiteOrTest.status)) filteredSuite.children[title] = suiteOrTest;
236
+ } else {
237
+ const filteredSubSuite = filterTests(suiteOrTest, filter);
238
+ if (Object.keys(filteredSubSuite.children).length == 0) return;
239
+ filteredSuite.children[title] = filteredSubSuite;
240
+ }
241
+ });
242
+ return filteredSuite;
243
+ }
244
+
245
+ function openSuite(suite, path, opened) {
246
+ const subSuite = path.reduce((suiteOrTest, pathToken) => {
247
+ if (suiteOrTest && !(0, _types.isTest)(suiteOrTest)) {
248
+ if (opened) suiteOrTest.opened = opened;
249
+ return suiteOrTest.children[pathToken];
250
+ }
251
+ }, suite);
252
+ if (subSuite && !(0, _types.isTest)(subSuite)) subSuite.opened = opened;
253
+ }
254
+
255
+ function flattenSuite(suite) {
256
+ if (!suite.opened) return [];
257
+ return Object.entries(suite.children).flatMap(_ref7 => {
258
+ let [title, subSuite] = _ref7;
259
+ return subSuite ? [{
260
+ title,
261
+ suite: subSuite
262
+ }, ...((0, _types.isTest)(subSuite) ? [] : flattenSuite(subSuite))] : [];
263
+ });
264
+ }
265
+
266
+ function countTestsStatus(suite) {
267
+ let successCount = 0;
268
+ let failedCount = 0;
269
+ let skippedCount = 0;
270
+ let pendingCount = 0;
271
+ const cases = Object.values(suite.children).filter(_types.isDefined);
272
+ let suiteOrTest;
273
+
274
+ while (suiteOrTest = cases.pop()) {
275
+ if ((0, _types.isTest)(suiteOrTest)) {
276
+ if (suiteOrTest.skip) skippedCount++;
277
+ if (suiteOrTest.status === 'success') successCount++;
278
+ if (suiteOrTest.status === 'failed') failedCount++;
279
+ if (suiteOrTest.status === 'pending') pendingCount++;
280
+ } else {
281
+ cases.push(...Object.values(suiteOrTest.children).filter(_types.isDefined));
282
+ }
283
+ }
284
+
285
+ return {
286
+ successCount,
287
+ failedCount,
288
+ skippedCount,
289
+ pendingCount
290
+ };
291
+ }
292
+
293
+ function getConnectionUrl() {
294
+ return [typeof __CREEVEY_SERVER_HOST__ == 'undefined' ? window.location.hostname : __CREEVEY_SERVER_HOST__, typeof __CREEVEY_SERVER_PORT__ == 'undefined' ? window.location.port : __CREEVEY_SERVER_PORT__].filter(Boolean).join(':');
295
+ }
296
+
297
+ function getImageUrl(path, imageName) {
298
+ // path => [kind, story, test, browser]
299
+ const browser = path.slice(-1)[0];
300
+ const imagesUrl = window.location.host ? "".concat(window.location.protocol, "//").concat(getConnectionUrl()).concat(window.location.pathname == '/' ? '/report' : window.location.pathname.split('/').slice(0, -1).join('/'), "/").concat(encodeURI(path.slice(0, -1).join('/'))) : encodeURI(path.slice(0, -1).join('/'));
301
+ return imageName == browser ? imagesUrl : "".concat(imagesUrl, "/").concat(encodeURI(browser));
302
+ }
303
+
304
+ function getBorderSize(element) {
305
+ // NOTE Firefox returns empty string for `borderWidth` prop
306
+ const borderSize = parseFloat(getComputedStyle(element).borderTopWidth);
307
+ return Number.isNaN(borderSize) ? 0 : borderSize;
308
+ }
309
+
310
+ function useLoadImages(s1, s2, s3) {
311
+ const [loaded, setLoaded] = (0, _react.useState)(false);
312
+ (0, _react.useEffect)(() => {
313
+ setLoaded(false);
314
+ void Promise.all([s1, s2, s3].map(url => new Promise(resolve => {
315
+ const image = document.createElement('img');
316
+ image.src = url;
317
+ image.onload = resolve;
318
+ image.onerror = resolve;
319
+ }))).then(() => setLoaded(true));
320
+ }, [s1, s2, s3]);
321
+ return loaded;
322
+ }
323
+ /**
324
+ * Uses the ResizeObserver API to observe changes within the given HTML Element DOM Rect.
325
+ *
326
+ * @returns dimensions of element's content box (which means without paddings and border width)
327
+ */
328
+
329
+
330
+ function useResizeObserver(elementRef, onResize) {
331
+ let debounceTimeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 16;
332
+ const observerRef = (0, _react.useRef)(null);
333
+ (0, _react.useEffect)(() => {
334
+ if (!elementRef.current) return;
335
+ observerRef.current = new ResizeObserver(onResize);
336
+ observerRef.current.observe(elementRef.current);
337
+ return () => {
338
+ var _observerRef$current;
339
+
340
+ return (_observerRef$current = observerRef.current) === null || _observerRef$current === void 0 ? void 0 : _observerRef$current.disconnect();
341
+ };
342
+ }, [debounceTimeout, elementRef, onResize]);
343
+ }
344
+
345
+ function useApplyScale(imageRef, scale, dependency) {
346
+ (0, _react.useLayoutEffect)(() => {
347
+ if (!imageRef.current) return;
348
+ const image = imageRef.current;
349
+ const borderSize = getBorderSize(image);
350
+ image.style.height = "".concat(image.naturalHeight * scale + borderSize * 2, "px");
351
+ }, [imageRef, scale, dependency]);
352
+ }
353
+
354
+ function useCalcScale(diffImageRef, loaded) {
355
+ const [scale, setScale] = (0, _react.useState)(1);
356
+ const calcScale = (0, _react.useCallback)(() => {
357
+ const diffImage = diffImageRef.current;
358
+ if (!diffImage || !loaded) return setScale(1);
359
+ const borderSize = getBorderSize(diffImage);
360
+ const ratio = (diffImage.getBoundingClientRect().width - borderSize * 2) / diffImage.naturalWidth;
361
+ setScale(Math.min(1, ratio));
362
+ }, [diffImageRef, loaded]);
363
+ useResizeObserver(diffImageRef, calcScale);
364
+ (0, _react.useLayoutEffect)(calcScale, [calcScale]);
365
+ return scale;
366
+ }
367
+
368
+ const CREEVEY_THEME = 'Creevey_theme';
369
+
370
+ function isTheme(theme) {
371
+ return (0, _types.isDefined)(theme) && Object.prototype.hasOwnProperty.call(_theming.themes, theme);
372
+ }
373
+
374
+ function initialTheme() {
375
+ const theme = localStorage.getItem(CREEVEY_THEME);
376
+ return isTheme(theme) ? theme : 'light';
377
+ }
378
+
379
+ function useTheme() {
380
+ const [theme, setTheme] = (0, _react.useState)(initialTheme());
381
+ (0, _react.useEffect)(() => {
382
+ localStorage.setItem(CREEVEY_THEME, theme);
383
+ }, [theme]);
384
+ return [theme, setTheme];
385
+ }
386
+
387
+ function setSearchParams(testPath) {
388
+ const pageUrl = "?".concat((0, _qs.stringify)({
389
+ testPath
390
+ }));
391
+ window.history.pushState({
392
+ testPath
393
+ }, '', pageUrl);
394
+ }
395
+
396
+ function getTestPathFromSearch() {
397
+ const {
398
+ testPath
399
+ } = (0, _qs.parse)(window.location.search.slice(1)); //@ts-expect-error: This expression is not callable.
400
+
401
+ if (Array.isArray(testPath) && testPath.every(token => typeof token == 'string')) {
402
+ return testPath;
403
+ }
404
+
405
+ return [];
406
+ }
407
+
408
+ function useForceUpdate() {
409
+ const [, update] = (0, _react.useState)({});
410
+ return (0, _react.useCallback)(() => update({}), []);
411
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.viewModes = exports.getViewMode = exports.VIEW_MODE_KEY = void 0;
7
+ const VIEW_MODE_KEY = 'Creevey_view_mode';
8
+ exports.VIEW_MODE_KEY = VIEW_MODE_KEY;
9
+ const viewModes = ['side-by-side', 'swap', 'slide', 'blend'];
10
+ exports.viewModes = viewModes;
11
+
12
+ const getViewMode = () => {
13
+ const item = localStorage.getItem(VIEW_MODE_KEY);
14
+ return item && viewModes.includes(item) ? item : 'side-by-side';
15
+ };
16
+
17
+ exports.getViewMode = getViewMode;