creevey 0.9.0-beta.1 → 0.9.0-beta.3

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 (262) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +9 -1
  3. package/addon/README.md +3 -0
  4. package/addon/package.json +4 -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 +62 -0
  18. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  19. package/lib/cjs/client/addon/register.js +72 -0
  20. package/lib/cjs/client/addon/utils.js +42 -0
  21. package/lib/cjs/client/addon/withCreevey.js +350 -0
  22. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +87 -0
  23. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +92 -0
  24. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +154 -0
  25. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +166 -0
  26. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +91 -0
  27. package/lib/cjs/client/shared/components/ImagesView/index.js +45 -0
  28. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +50 -0
  29. package/lib/cjs/client/shared/components/PageFooter/Paging.js +94 -0
  30. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +82 -0
  31. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +119 -0
  32. package/lib/cjs/client/shared/components/ResultsPage.js +143 -0
  33. package/lib/cjs/client/shared/creeveyClientApi.js +76 -0
  34. package/lib/cjs/client/shared/helpers.js +411 -0
  35. package/lib/cjs/client/shared/viewMode.js +17 -0
  36. package/lib/cjs/client/web/142.js +2 -0
  37. package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
  38. package/lib/cjs/client/web/32.js +1 -0
  39. package/lib/cjs/client/web/551.js +1 -0
  40. package/lib/cjs/client/web/566.js +2 -0
  41. package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
  42. package/lib/cjs/client/web/691.js +2 -0
  43. package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
  44. package/lib/cjs/client/web/725.js +1 -0
  45. package/lib/cjs/client/web/index.html +19 -0
  46. package/lib/cjs/client/web/main.js +2 -38
  47. package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
  48. package/lib/cjs/creevey.js +69 -0
  49. package/lib/cjs/index.js +62 -0
  50. package/lib/cjs/server/config.js +94 -0
  51. package/lib/cjs/server/docker.js +146 -0
  52. package/lib/cjs/server/extract.js +46 -0
  53. package/lib/cjs/server/index.js +83 -0
  54. package/lib/cjs/server/loaders/babel/creevey-plugin.js +86 -0
  55. package/lib/cjs/server/loaders/babel/helpers.js +469 -0
  56. package/lib/cjs/server/loaders/babel/register.js +124 -0
  57. package/lib/cjs/server/loaders/hooks/mdx.js +30 -0
  58. package/lib/cjs/server/loaders/hooks/svelte.js +65 -0
  59. package/lib/cjs/server/loaders/webpack/compile.js +269 -0
  60. package/lib/cjs/server/loaders/webpack/creevey-loader.js +172 -0
  61. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +39 -0
  62. package/lib/cjs/server/loaders/webpack/mdx-loader.js +72 -0
  63. package/lib/cjs/server/loaders/webpack/start.js +41 -0
  64. package/lib/cjs/server/logger.js +48 -0
  65. package/lib/cjs/server/master/api.js +71 -0
  66. package/lib/cjs/server/master/index.js +146 -0
  67. package/lib/cjs/server/master/master.js +57 -0
  68. package/lib/cjs/server/master/pool.js +197 -0
  69. package/lib/cjs/server/master/runner.js +281 -0
  70. package/lib/cjs/server/master/server.js +131 -0
  71. package/lib/cjs/server/messages.js +264 -0
  72. package/lib/cjs/server/selenium/browser.js +656 -0
  73. package/lib/cjs/server/selenium/index.js +31 -0
  74. package/lib/cjs/server/selenium/selenoid.js +172 -0
  75. package/lib/cjs/server/stories.js +153 -0
  76. package/lib/cjs/server/storybook/entry.js +53 -0
  77. package/lib/cjs/server/storybook/helpers.js +158 -0
  78. package/lib/cjs/server/storybook/providers/browser.js +74 -0
  79. package/lib/cjs/server/storybook/providers/hybrid.js +84 -0
  80. package/lib/cjs/server/storybook/providers/nodejs.js +237 -0
  81. package/lib/cjs/server/testsFiles/parser.js +72 -0
  82. package/lib/cjs/server/testsFiles/register.js +48 -0
  83. package/lib/cjs/server/update.js +79 -0
  84. package/lib/cjs/server/utils.js +176 -0
  85. package/lib/cjs/server/worker/chai-image.js +142 -0
  86. package/lib/cjs/server/worker/helpers.js +69 -0
  87. package/lib/cjs/server/worker/index.js +15 -0
  88. package/lib/cjs/server/worker/reporter.js +108 -0
  89. package/lib/cjs/server/worker/worker.js +268 -0
  90. package/lib/cjs/shared/index.js +101 -0
  91. package/lib/cjs/shared/serializeRegExp.js +42 -0
  92. package/lib/cjs/types.js +74 -0
  93. package/lib/esm/cli.js +4 -0
  94. package/lib/esm/client/addon/Manager.js +248 -0
  95. package/lib/esm/client/addon/components/Addon.js +39 -0
  96. package/lib/esm/client/addon/components/Icons.js +31 -0
  97. package/lib/esm/client/addon/components/Panel.js +53 -0
  98. package/lib/esm/client/addon/components/TestSelect.js +51 -0
  99. package/lib/esm/client/addon/components/Tools.js +74 -0
  100. package/lib/esm/client/addon/decorator.js +2 -0
  101. package/lib/esm/client/addon/index.js +2 -0
  102. package/lib/esm/client/addon/preset.ie11.js +59 -0
  103. package/lib/esm/client/addon/preset.js +41 -0
  104. package/lib/esm/client/addon/readyForCapture.js +5 -0
  105. package/lib/esm/client/addon/register.js +51 -0
  106. package/lib/esm/client/addon/utils.js +32 -0
  107. package/lib/esm/client/addon/withCreevey.js +323 -0
  108. package/lib/esm/client/shared/components/ImagesView/BlendView.js +67 -0
  109. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +69 -0
  110. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +131 -0
  111. package/lib/esm/client/shared/components/ImagesView/SlideView.js +143 -0
  112. package/lib/esm/client/shared/components/ImagesView/SwapView.js +71 -0
  113. package/lib/esm/client/shared/components/ImagesView/index.js +5 -0
  114. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +36 -0
  115. package/lib/esm/client/shared/components/PageFooter/Paging.js +80 -0
  116. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +68 -0
  117. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +97 -0
  118. package/lib/esm/client/shared/components/ResultsPage.js +115 -0
  119. package/lib/esm/client/shared/creeveyClientApi.js +67 -0
  120. package/lib/esm/client/shared/helpers.js +353 -0
  121. package/lib/esm/client/shared/viewMode.js +6 -0
  122. package/lib/esm/creevey.js +54 -0
  123. package/lib/esm/index.js +5 -0
  124. package/lib/esm/server/config.js +71 -0
  125. package/lib/esm/server/docker.js +123 -0
  126. package/lib/esm/server/extract.js +32 -0
  127. package/lib/esm/server/index.js +64 -0
  128. package/lib/esm/server/loaders/babel/creevey-plugin.js +72 -0
  129. package/lib/esm/server/loaders/babel/helpers.js +452 -0
  130. package/lib/esm/server/loaders/babel/register.js +103 -0
  131. package/lib/esm/server/loaders/hooks/mdx.js +15 -0
  132. package/lib/esm/server/loaders/hooks/svelte.js +49 -0
  133. package/lib/esm/server/loaders/webpack/compile.js +246 -0
  134. package/lib/esm/server/loaders/webpack/creevey-loader.js +152 -0
  135. package/lib/esm/server/loaders/webpack/dummy-hmr.js +32 -0
  136. package/lib/esm/server/loaders/webpack/mdx-loader.js +58 -0
  137. package/lib/esm/server/loaders/webpack/start.js +27 -0
  138. package/lib/esm/server/logger.js +20 -0
  139. package/lib/esm/server/master/api.js +60 -0
  140. package/lib/esm/server/master/index.js +125 -0
  141. package/lib/esm/server/master/master.js +38 -0
  142. package/lib/esm/server/master/pool.js +176 -0
  143. package/lib/esm/server/master/runner.js +259 -0
  144. package/lib/esm/server/master/server.js +107 -0
  145. package/lib/esm/server/messages.js +232 -0
  146. package/lib/esm/server/selenium/browser.js +623 -0
  147. package/lib/esm/server/selenium/index.js +2 -0
  148. package/lib/esm/server/selenium/selenoid.js +149 -0
  149. package/lib/esm/server/stories.js +135 -0
  150. package/lib/esm/server/storybook/entry.js +27 -0
  151. package/lib/esm/server/storybook/helpers.js +97 -0
  152. package/lib/esm/server/storybook/providers/browser.js +60 -0
  153. package/lib/esm/server/storybook/providers/hybrid.js +64 -0
  154. package/lib/esm/server/storybook/providers/nodejs.js +216 -0
  155. package/lib/esm/server/testsFiles/parser.js +50 -0
  156. package/lib/esm/server/testsFiles/register.js +35 -0
  157. package/lib/esm/server/update.js +61 -0
  158. package/lib/esm/server/utils.js +133 -0
  159. package/lib/esm/server/worker/chai-image.js +130 -0
  160. package/lib/esm/server/worker/helpers.js +60 -0
  161. package/lib/esm/server/worker/index.js +1 -0
  162. package/lib/esm/server/worker/reporter.js +86 -0
  163. package/lib/esm/server/worker/worker.js +238 -0
  164. package/lib/esm/shared/index.js +78 -0
  165. package/lib/esm/shared/serializeRegExp.js +24 -0
  166. package/lib/esm/types.js +43 -0
  167. package/lib/types/cli.d.ts +1 -1
  168. package/lib/types/client/addon/Manager.d.ts +37 -37
  169. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  170. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  171. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  172. package/lib/types/client/addon/components/TestSelect.d.ts +8 -9
  173. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  174. package/lib/types/client/addon/decorator.d.ts +1 -1
  175. package/lib/types/client/addon/index.d.ts +2 -0
  176. package/lib/types/client/addon/preset.d.ts +23 -24
  177. package/lib/types/client/addon/preset.ie11.d.ts +10 -0
  178. package/lib/types/client/addon/readyForCapture.d.ts +6 -6
  179. package/lib/types/client/addon/register.d.ts +3 -3
  180. package/lib/types/client/addon/utils.d.ts +3 -2
  181. package/lib/types/client/addon/withCreevey.d.ts +24 -24
  182. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  183. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +24 -25
  184. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  185. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  186. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  187. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  188. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +8 -9
  189. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +7 -8
  190. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  191. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +16 -17
  192. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  193. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  194. package/lib/types/client/shared/helpers.d.ts +46 -46
  195. package/lib/types/client/shared/viewMode.d.ts +4 -4
  196. package/lib/types/client/web/CreeveyApp.d.ts +11 -12
  197. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  198. package/lib/types/client/web/CreeveyLoader.d.ts +2 -3
  199. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  200. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  201. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  202. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -13
  203. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  204. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -8
  205. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  206. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  207. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  208. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  209. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  210. package/lib/types/client/web/index.d.ts +4 -4
  211. package/lib/types/creevey.d.ts +1 -1
  212. package/lib/types/index.d.ts +1 -4
  213. package/lib/types/server/config.d.ts +4 -4
  214. package/lib/types/server/docker.d.ts +7 -7
  215. package/lib/types/server/extract.d.ts +2 -2
  216. package/lib/types/server/index.d.ts +2 -2
  217. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  218. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  219. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  220. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  221. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  222. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  223. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  224. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  225. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  226. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  227. package/lib/types/server/logger.d.ts +10 -6
  228. package/lib/types/server/master/api.d.ts +7 -7
  229. package/lib/types/server/master/index.d.ts +3 -3
  230. package/lib/types/server/master/master.d.ts +7 -7
  231. package/lib/types/server/master/pool.d.ts +31 -31
  232. package/lib/types/server/master/runner.d.ts +26 -26
  233. package/lib/types/server/master/server.d.ts +2 -2
  234. package/lib/types/server/messages.d.ts +27 -27
  235. package/lib/types/server/selenium/browser.d.ts +17 -17
  236. package/lib/types/server/selenium/index.d.ts +2 -2
  237. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  238. package/lib/types/server/stories.d.ts +8 -8
  239. package/lib/types/server/storybook/entry.d.ts +17 -18
  240. package/lib/types/server/storybook/helpers.d.ts +24 -24
  241. package/lib/types/server/storybook/providers/browser.d.ts +4 -4
  242. package/lib/types/server/storybook/providers/hybrid.d.ts +4 -4
  243. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -9
  244. package/lib/types/server/testsFiles/parser.d.ts +12 -12
  245. package/lib/types/server/testsFiles/register.d.ts +2 -2
  246. package/lib/types/server/update.d.ts +2 -2
  247. package/lib/types/server/utils.d.ts +24 -20
  248. package/lib/types/server/worker/chai-image.d.ts +6 -6
  249. package/lib/types/server/worker/helpers.d.ts +8 -8
  250. package/lib/types/server/worker/index.d.ts +1 -1
  251. package/lib/types/server/worker/reporter.d.ts +8 -8
  252. package/lib/types/server/worker/worker.d.ts +4 -4
  253. package/lib/types/{shared.d.ts → shared/index.d.ts} +7 -16
  254. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  255. package/lib/types/types.d.ts +489 -489
  256. package/package.json +114 -102
  257. package/preset/ie11.js +5 -0
  258. package/{preset.js → preset/index.js} +2 -2
  259. package/types/mdx.d.ts +3 -2
  260. package/lib/cjs/client/web/1.js +0 -13
  261. package/lib/cjs/client/web/2.js +0 -1
  262. package/storybook-static/stories.json +0 -21
@@ -0,0 +1,350 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.capture = capture;
7
+ exports.withCreevey = withCreevey;
8
+
9
+ var Events = _interopRequireWildcard(require("@storybook/core-events"));
10
+
11
+ var polyfill = _interopRequireWildcard(require("event-source-polyfill"));
12
+
13
+ var _testingLibrary = require("@storybook/testing-library");
14
+
15
+ var _addons = require("@storybook/addons");
16
+
17
+ var _types = require("../../types");
18
+
19
+ var _shared = require("../../shared");
20
+
21
+ var _helpers = require("../shared/helpers");
22
+
23
+ var _utils = require("./utils");
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
+ if (typeof process != 'object' || typeof process.version != 'string') {
30
+ // NOTE If you don't use babel-polyfill or any other polyfills that add EventSource for IE11
31
+ // You don't get hot reload in IE11. So put polyfill for that to better UX
32
+ // Don't load in nodejs environment
33
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
34
+ const {
35
+ NativeEventSource,
36
+ EventSourcePolyfill
37
+ } = polyfill; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
38
+
39
+ window.EventSource = NativeEventSource || EventSourcePolyfill;
40
+ }
41
+
42
+ const disableAnimationsStyles = "\n*,\n*:hover,\n*::before,\n*::after {\n animation-delay: -0.0001ms !important;\n animation-duration: 0s !important;\n animation-play-state: paused !important;\n cursor: none !important;\n caret-color: transparent !important;\n transition: 0s !important;\n}\n";
43
+
44
+ async function resetCurrentStory(channel) {
45
+ setTimeout(() => channel.emit(Events.SET_CURRENT_STORY, {
46
+ storyId: true,
47
+ name: '',
48
+ kind: ''
49
+ }), 0);
50
+ return new Promise(resolve => channel.once(Events.STORY_MISSING, resolve));
51
+ }
52
+
53
+ function catchRenderError(channel) {
54
+ let rejectCallback;
55
+ const promise = new Promise((_resolve, reject) => rejectCallback = reject);
56
+
57
+ function errorHandler(_ref) {
58
+ let {
59
+ title,
60
+ description
61
+ } = _ref;
62
+ rejectCallback({
63
+ message: title,
64
+ stack: description
65
+ });
66
+ }
67
+
68
+ function exceptionHandler(exception) {
69
+ rejectCallback(exception);
70
+ }
71
+
72
+ function removeHandlers() {
73
+ channel.off(Events.STORY_ERRORED, errorHandler);
74
+ channel.off(Events.STORY_THREW_EXCEPTION, errorHandler);
75
+ }
76
+
77
+ channel.once(Events.STORY_ERRORED, errorHandler);
78
+ channel.once(Events.STORY_THREW_EXCEPTION, exceptionHandler);
79
+ return Object.assign(promise, {
80
+ cancel: removeHandlers
81
+ });
82
+ }
83
+
84
+ function waitForStoryRendered(channel) {
85
+ let resolveCallback;
86
+ const promise = new Promise(resolve => resolveCallback = resolve);
87
+
88
+ function renderHandler() {
89
+ resolveCallback();
90
+ }
91
+
92
+ function removeHandlers() {
93
+ channel.off(Events.STORY_RENDERED, renderHandler);
94
+ }
95
+
96
+ channel.once(Events.STORY_RENDERED, renderHandler);
97
+ return Object.assign(promise, {
98
+ cancel: removeHandlers
99
+ });
100
+ }
101
+
102
+ function waitForFontsLoaded() {
103
+ if (!document.fonts) return;
104
+ const areFontsLoading = Array.from(document.fonts).some(font => font.status == 'loading');
105
+
106
+ if (areFontsLoading) {
107
+ return new Promise(resolve => {
108
+ const fontsLoadedHandler = () => {
109
+ document.fonts.removeEventListener('loadingdone', fontsLoadedHandler);
110
+ resolve();
111
+ };
112
+
113
+ document.fonts.addEventListener('loadingdone', fontsLoadedHandler);
114
+ });
115
+ }
116
+ }
117
+
118
+ function waitForCaptureCall() {
119
+ return new Promise(resolve => captureResolver = resolve);
120
+ }
121
+
122
+ function initCreeveyState() {
123
+ var _window$localStorage$;
124
+
125
+ const prevState = JSON.parse((_window$localStorage$ = window.localStorage.getItem('Creevey_Tests')) !== null && _window$localStorage$ !== void 0 ? _window$localStorage$ : '{}');
126
+ if (prevState.creeveyHost) window.__CREEVEY_SERVER_HOST__ = prevState.creeveyHost;
127
+ if (prevState.creeveyPort) window.__CREEVEY_SERVER_PORT__ = prevState.creeveyPort;
128
+ if (prevState.setStoriesCounter) setStoriesCounter = prevState.setStoriesCounter;
129
+ if (prevState.isTestBrowser) isTestBrowser = prevState.isTestBrowser;
130
+ window.addEventListener('beforeunload', () => {
131
+ window.localStorage.setItem('Creevey_Tests', JSON.stringify({
132
+ creeveyHost: window.__CREEVEY_SERVER_HOST__,
133
+ creeveyPort: window.__CREEVEY_SERVER_PORT__,
134
+ setStoriesCounter,
135
+ isTestBrowser
136
+ }));
137
+ });
138
+ }
139
+
140
+ let isTestBrowser = false;
141
+ let captureResolver;
142
+ let waitForCreevey;
143
+ let creeveyReady;
144
+ let setStoriesCounter = 0;
145
+
146
+ function withCreevey() {
147
+ let currentStory = '';
148
+ let isAnimationDisabled = false;
149
+ initCreeveyState();
150
+
151
+ function disableAnimation() {
152
+ isAnimationDisabled = true;
153
+ const style = document.createElement('style');
154
+ const textNode = document.createTextNode(disableAnimationsStyles);
155
+ style.setAttribute('type', 'text/css');
156
+ style.appendChild(textNode);
157
+ document.head.appendChild(style);
158
+ }
159
+
160
+ async function getStories() {
161
+ var _window$__STORYBOOK_S;
162
+
163
+ const storiesPromise = new Promise(resolve => _addons.addons.getChannel().once(Events.SET_STORIES, data => resolve((0, _shared.serializeRawStories)((0, _shared.denormalizeStoryParameters)(data)))));
164
+ const store = (_window$__STORYBOOK_S = window.__STORYBOOK_STORY_STORE__) !== null && _window$__STORYBOOK_S !== void 0 ? _window$__STORYBOOK_S : {};
165
+
166
+ if (store.cacheAllCSFFiles) {
167
+ await store.cacheAllCSFFiles();
168
+
169
+ _addons.addons.getChannel().emit(Events.SET_STORIES, store.getSetStoriesPayload());
170
+ } else return;
171
+
172
+ _addons.addons.getChannel().on(Events.SET_STORIES, data => {
173
+ // TODO Figure out how to get only updated stories
174
+ // TODO Subscribe on hmr? like use dummy-hmr
175
+ setStoriesCounter += 1;
176
+ const stories = (0, _shared.serializeRawStories)((0, _shared.denormalizeStoryParameters)(data));
177
+ const storiesByFiles = new Map();
178
+ Object.values(stories).forEach(story => {
179
+ const storiesFromFile = storiesByFiles.get(story.parameters.fileName);
180
+ if (storiesFromFile) storiesFromFile.push(story);else storiesByFiles.set(story.parameters.fileName, [story]);
181
+ });
182
+ void fetch("http://".concat((0, _helpers.getConnectionUrl)(), "/stories"), {
183
+ method: 'POST',
184
+ headers: {
185
+ 'Content-Type': 'application/json'
186
+ },
187
+ body: JSON.stringify({
188
+ setStoriesCounter,
189
+ stories: [...storiesByFiles.entries()]
190
+ })
191
+ });
192
+ });
193
+
194
+ return storiesPromise;
195
+ }
196
+
197
+ async function selectStory(storyId, kind, name, shouldWaitForReady, callback) {
198
+ if (!isAnimationDisabled) disableAnimation();
199
+ isTestBrowser = true;
200
+
201
+ const channel = _addons.addons.getChannel();
202
+
203
+ const waitForReady = shouldWaitForReady ? new Promise(resolve => window.__CREEVEY_SET_READY_FOR_CAPTURE__ = resolve) : Promise.resolve();
204
+ if (storyId == currentStory) await resetCurrentStory(channel);else currentStory = storyId;
205
+ let isCaptureCalled = false;
206
+ const renderPromise = waitForStoryRendered(channel);
207
+ const errorPromise = catchRenderError(channel);
208
+ const capturePromise = waitForCaptureCall().then(() => isCaptureCalled = true);
209
+ setTimeout(() => channel.emit(Events.SET_CURRENT_STORY, {
210
+ storyId,
211
+ name,
212
+ kind
213
+ }), 0);
214
+
215
+ try {
216
+ await Promise.race([(async () => {
217
+ await Promise.race([renderPromise, capturePromise]);
218
+ await waitForFontsLoaded();
219
+ await waitForReady;
220
+ })(), errorPromise]);
221
+ callback([null, isCaptureCalled]);
222
+ } catch (reason) {
223
+ var _reason$stack;
224
+
225
+ // NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
226
+ // NOTE Event `STORY_ERRORED` return error-like object without `name` field
227
+ const errorMessage = reason instanceof Error ? (_reason$stack = reason.stack) !== null && _reason$stack !== void 0 ? _reason$stack : reason.message : (0, _types.isObject)(reason) ? "".concat(reason.message, "\n ").concat(reason.stack) : reason;
228
+ callback([errorMessage]);
229
+ } finally {
230
+ renderPromise.cancel();
231
+ errorPromise.cancel();
232
+ }
233
+ }
234
+
235
+ function updateGlobals(globals) {
236
+ _addons.addons.getChannel().emit(Events.UPDATE_GLOBALS, {
237
+ globals
238
+ });
239
+ }
240
+
241
+ function insertIgnoreStyles(ignoreSelectors) {
242
+ const stylesElement = document.createElement('style');
243
+ stylesElement.setAttribute('type', 'text/css');
244
+ document.head.appendChild(stylesElement);
245
+ ignoreSelectors.forEach(selector => {
246
+ stylesElement.innerHTML += "\n ".concat(selector, " {\n background: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n outline: 0 !important;\n color: rgba(0,0,0,0) !important;\n }\n ").concat(selector, " *, ").concat(selector, "::before, ").concat(selector, "::after {\n visibility: hidden !important;\n }\n ");
247
+ });
248
+ return stylesElement;
249
+ }
250
+
251
+ function removeIgnoreStyles(ignoreStyles) {
252
+ var _ignoreStyles$parentN;
253
+
254
+ (_ignoreStyles$parentN = ignoreStyles.parentNode) === null || _ignoreStyles$parentN === void 0 ? void 0 : _ignoreStyles$parentN.removeChild(ignoreStyles);
255
+ }
256
+
257
+ function hasPlayCompletedYet(callback) {
258
+ creeveyReady();
259
+ let isCaptureCalled = false;
260
+ let isPlayCompleted = false;
261
+
262
+ const channel = _addons.addons.getChannel();
263
+
264
+ void waitForStoryRendered(channel).then(() => {
265
+ if (isCaptureCalled) return;
266
+ isPlayCompleted = true;
267
+ callback(true);
268
+ });
269
+ void waitForCaptureCall().then(() => {
270
+ if (isPlayCompleted) return;
271
+ isCaptureCalled = true;
272
+ callback(false);
273
+ });
274
+ }
275
+
276
+ window.__CREEVEY_GET_STORIES__ = getStories;
277
+ window.__CREEVEY_SELECT_STORY__ = selectStory;
278
+ window.__CREEVEY_UPDATE_GLOBALS__ = updateGlobals;
279
+ window.__CREEVEY_INSERT_IGNORE_STYLES__ = insertIgnoreStyles;
280
+ window.__CREEVEY_REMOVE_IGNORE_STYLES__ = removeIgnoreStyles;
281
+ window.__CREEVEY_HAS_PLAY_COMPLETED_YET__ = hasPlayCompletedYet;
282
+ window.__CREEVEY_SET_READY_FOR_CAPTURE__ = _types.noop;
283
+
284
+ const queryAllByQuery = (container, query) => [...container.querySelectorAll(query)].filter(e => e instanceof HTMLElement);
285
+
286
+ const getMultipleError = (_, query) => "Found multiple elements by query: ".concat(query);
287
+
288
+ const getMissingError = (_, query) => "Unable to find an element by query: ".concat(query);
289
+
290
+ const [queryByQuery, getAllByQuery, getByQuery, findAllByQuery, findByQuery] = (0, _testingLibrary.buildQueries)(queryAllByQuery, getMultipleError, getMissingError);
291
+ const queries = {
292
+ queryByQuery,
293
+ getAllByQuery,
294
+ getByQuery,
295
+ findAllByQuery,
296
+ findByQuery
297
+ };
298
+ return (0, _addons.makeDecorator)({
299
+ name: 'withCreevey',
300
+ parameterName: 'creevey',
301
+ wrapper: (getStory, context) => {
302
+ var _ref2;
303
+
304
+ // TODO Define proper types, like captureElement is a promise
305
+ const {
306
+ captureElement
307
+ } = context.parameters.creevey = (_ref2 = context.parameters.creevey) !== null && _ref2 !== void 0 ? _ref2 : {};
308
+ Object.defineProperty(context.parameters.creevey, 'captureElement', {
309
+ get() {
310
+ switch (true) {
311
+ case captureElement === undefined:
312
+ return Promise.resolve(context.canvasElement);
313
+
314
+ case captureElement === null:
315
+ return Promise.resolve(document.documentElement);
316
+
317
+ case typeof captureElement == 'string':
318
+ return _utils.isInternetExplorer // some code from testing-library makes IE hang
319
+ ? Promise.resolve(context.canvasElement.querySelector(captureElement)) : (0, _testingLibrary.within)(context.canvasElement, queries).findByQuery(captureElement);
320
+
321
+ case typeof captureElement == 'function':
322
+ // TODO Define type for it
323
+ return Promise.resolve(captureElement(context));
324
+ }
325
+ },
326
+
327
+ enumerable: true,
328
+ configurable: true
329
+ });
330
+ return getStory(context);
331
+ }
332
+ });
333
+ }
334
+
335
+ async function capture(options) {
336
+ if (!isTestBrowser) return;
337
+ captureResolver();
338
+ waitForCreevey = new Promise(resolve => creeveyReady = resolve);
339
+ await fetch("http://".concat((0, _helpers.getConnectionUrl)(), "/capture"), {
340
+ method: 'POST',
341
+ headers: {
342
+ 'Content-Type': 'application/json'
343
+ },
344
+ body: JSON.stringify({
345
+ workerId: window.__CREEVEY_WORKER_ID__,
346
+ options
347
+ })
348
+ });
349
+ await waitForCreevey;
350
+ }
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.BlendView = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _ImagesView = require("./ImagesView");
11
+
12
+ var _theming = require("@storybook/theming");
13
+
14
+ var _helpers = require("../../helpers");
15
+
16
+ var _readyForCapture = require("../../../addon/readyForCapture");
17
+
18
+ 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); }
19
+
20
+ 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; }
21
+
22
+ const Container = _theming.styled.div({
23
+ position: 'relative',
24
+ display: 'flex',
25
+ filter: 'invert(100%)'
26
+ });
27
+
28
+ const ImageContainer = _theming.styled.div({
29
+ position: 'absolute',
30
+ width: '100%',
31
+ height: '100%',
32
+ display: 'flex'
33
+ });
34
+
35
+ const Image = _theming.styled.img(_ref => {
36
+ let {
37
+ borderColor
38
+ } = _ref;
39
+ return {
40
+ boxSizing: 'border-box',
41
+ border: "1px solid ".concat(borderColor),
42
+ maxWidth: '100%',
43
+ filter: 'invert(100%)'
44
+ };
45
+ });
46
+
47
+ const ActualImage = (0, _theming.styled)(Image)({
48
+ mixBlendMode: 'difference'
49
+ });
50
+ const DiffImage = (0, _theming.styled)(Image)({
51
+ opacity: '0'
52
+ });
53
+ const BlendView = (0, _theming.withTheme)(_ref2 => {
54
+ let {
55
+ actual,
56
+ diff,
57
+ expect,
58
+ theme
59
+ } = _ref2;
60
+ const expectImageRef = (0, _react.useRef)(null);
61
+ const diffImageRef = (0, _react.useRef)(null);
62
+ const actualImageRef = (0, _react.useRef)(null);
63
+ const loaded = (0, _helpers.useLoadImages)(expect, diff, actual);
64
+ const scale = (0, _helpers.useCalcScale)(diffImageRef, loaded);
65
+ (0, _helpers.useApplyScale)(expectImageRef, scale, loaded);
66
+ (0, _helpers.useApplyScale)(actualImageRef, scale, loaded);
67
+ (0, _react.useEffect)(() => {
68
+ if (loaded) (0, _readyForCapture.readyForCapture)();
69
+ }, [loaded]);
70
+ return /*#__PURE__*/_react.default.createElement(Container, null, /*#__PURE__*/_react.default.createElement(ImageContainer, null, /*#__PURE__*/_react.default.createElement(Image, {
71
+ ref: expectImageRef,
72
+ borderColor: (0, _ImagesView.getBorderColor)(theme, _ImagesView.themeBorderColors.expect),
73
+ alt: "expect",
74
+ src: expect
75
+ })), /*#__PURE__*/_react.default.createElement(DiffImage, {
76
+ ref: diffImageRef,
77
+ borderColor: 'transparent',
78
+ alt: "diff",
79
+ src: diff
80
+ }), /*#__PURE__*/_react.default.createElement(ImageContainer, null, /*#__PURE__*/_react.default.createElement(ActualImage, {
81
+ ref: actualImageRef,
82
+ borderColor: (0, _ImagesView.getBorderColor)(theme, _ImagesView.themeBorderColors.actual),
83
+ alt: "actual",
84
+ src: actual
85
+ })));
86
+ });
87
+ exports.BlendView = BlendView;
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ImagesView = ImagesView;
7
+ exports.getBorderColor = getBorderColor;
8
+ exports.themeBorderColors = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _SideBySideView = require("./SideBySideView");
13
+
14
+ var _SwapView = require("./SwapView");
15
+
16
+ var _SlideView = require("./SlideView");
17
+
18
+ var _BlendView = require("./BlendView");
19
+
20
+ var _theming = require("@storybook/theming");
21
+
22
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
+
24
+ const themeBorderColors = {
25
+ actual: 'negative',
26
+ expect: 'positive',
27
+ diff: 'secondary'
28
+ };
29
+ exports.themeBorderColors = themeBorderColors;
30
+
31
+ const isColor = (theme, color) => color in theme.color;
32
+
33
+ function getBorderColor(theme, color) {
34
+ return isColor(theme, color) ? theme.color[color] : color;
35
+ }
36
+
37
+ const views = {
38
+ 'side-by-side': _SideBySideView.SideBySideView,
39
+ swap: _SwapView.SwapView,
40
+ slide: _SlideView.SlideView,
41
+ blend: _BlendView.BlendView
42
+ };
43
+
44
+ const Container = _theming.styled.div({
45
+ height: '100%',
46
+ display: 'flex',
47
+ textAlign: 'center',
48
+ alignItems: 'center',
49
+ justifyContent: 'center',
50
+ padding: '0 20px'
51
+ });
52
+
53
+ const ImageLink = _theming.styled.a({
54
+ lineHeight: 0
55
+ });
56
+
57
+ const ActualImage = (0, _theming.withTheme)(_theming.styled.img(_ref => {
58
+ let {
59
+ theme
60
+ } = _ref;
61
+ return {
62
+ border: "1px solid ".concat(getBorderColor(theme, themeBorderColors.expect)),
63
+ maxWidth: '100%'
64
+ };
65
+ }));
66
+
67
+ function ImagesView(_ref2) {
68
+ let {
69
+ url,
70
+ image,
71
+ canApprove,
72
+ mode
73
+ } = _ref2;
74
+ const ViewComponent = views[mode];
75
+ const {
76
+ actual,
77
+ diff,
78
+ expect
79
+ } = image;
80
+ return /*#__PURE__*/_react.default.createElement(Container, null, canApprove && diff && expect ? /*#__PURE__*/_react.default.createElement(ViewComponent, {
81
+ actual: "".concat(url, "/").concat(actual),
82
+ diff: "".concat(url, "/").concat(diff),
83
+ expect: "".concat(url, "/").concat(expect)
84
+ }) : /*#__PURE__*/_react.default.createElement(ImageLink, {
85
+ href: "".concat(url, "/").concat(actual),
86
+ target: "_blank",
87
+ rel: "noopener noreferrer"
88
+ }, /*#__PURE__*/_react.default.createElement(ActualImage, {
89
+ alt: "actual",
90
+ src: "".concat(url, "/").concat(actual)
91
+ })));
92
+ }
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.SideBySideView = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _ImagesView = require("./ImagesView");
11
+
12
+ var _theming = require("@storybook/theming");
13
+
14
+ var _helpers = require("../../helpers");
15
+
16
+ var _components = require("@storybook/components");
17
+
18
+ var _readyForCapture = require("../../../addon/readyForCapture");
19
+
20
+ 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); }
21
+
22
+ 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; }
23
+
24
+ const Container = _theming.styled.div({
25
+ display: 'flex',
26
+ flexWrap: 'nowrap',
27
+ alignItems: 'center',
28
+ justifyContent: 'center',
29
+ height: '100%',
30
+ width: '100%'
31
+ });
32
+
33
+ const ImagesLayout = _theming.styled.div(_ref => {
34
+ let {
35
+ layout
36
+ } = _ref;
37
+ return {
38
+ display: 'flex',
39
+ alignItems: 'flex-start',
40
+ justifyContent: 'flex-start',
41
+ flexDirection: layout == 'horizontal' ? 'row' : 'column',
42
+ '& > :not(:first-of-type)': {
43
+ marginLeft: layout == 'horizontal' ? '20px' : 0,
44
+ marginTop: layout == 'horizontal' ? 0 : '20px'
45
+ }
46
+ };
47
+ });
48
+
49
+ const ImageLink = _theming.styled.a({
50
+ lineHeight: 0,
51
+ flexShrink: 0
52
+ });
53
+
54
+ const ImageDiffLink = _theming.styled.a({
55
+ lineHeight: 0
56
+ });
57
+
58
+ const Image = _theming.styled.img(_ref2 => {
59
+ let {
60
+ borderColor
61
+ } = _ref2;
62
+ return {
63
+ boxSizing: 'border-box',
64
+ border: "1px solid ".concat(borderColor),
65
+ maxWidth: '100%',
66
+ flexShrink: 0
67
+ };
68
+ });
69
+
70
+ const DiffImage = (0, _theming.styled)(Image)({
71
+ flexShrink: 1
72
+ });
73
+ const SideBySideView = (0, _theming.withTheme)(_ref3 => {
74
+ let {
75
+ actual,
76
+ diff,
77
+ expect,
78
+ theme
79
+ } = _ref3;
80
+ const [layout, setLayout] = (0, _react.useState)('horizontal');
81
+ const [scale, setScale] = (0, _react.useState)(1);
82
+ const containerRef = (0, _react.useRef)(null);
83
+ const expectImageRef = (0, _react.useRef)(null);
84
+ const diffImageRef = (0, _react.useRef)(null);
85
+ const actualImageRef = (0, _react.useRef)(null);
86
+ const loaded = (0, _helpers.useLoadImages)(expect, diff, actual);
87
+ const calcScale = (0, _react.useCallback)(() => {
88
+ const containerElement = containerRef.current;
89
+ const expectImage = expectImageRef.current;
90
+ const diffImage = diffImageRef.current;
91
+ const actualImage = actualImageRef.current;
92
+ if (!containerElement || !expectImage || !actualImage || !diffImage || !loaded) return setScale(1);
93
+ const borderSize = (0, _helpers.getBorderSize)(diffImage);
94
+
95
+ if (layout == 'vertical') {
96
+ const ratio = (diffImage.getBoundingClientRect().width - borderSize * 2) / diffImage.naturalWidth;
97
+ setScale(Math.min(1, ratio));
98
+ }
99
+
100
+ if (layout == 'horizontal') {
101
+ const ratio = // NOTE: 40px because we have two margins by 20px and 6px for borders
102
+ (containerElement.getBoundingClientRect().width - 40 - borderSize * 6) / [expectImage, diffImage, actualImage].map(image => image.naturalWidth).reduce((a, b) => a + b, 0);
103
+ setScale(Math.min(1, ratio));
104
+ }
105
+ }, [loaded, layout]);
106
+ (0, _helpers.useResizeObserver)(containerRef, calcScale);
107
+ (0, _react.useLayoutEffect)(calcScale, [calcScale]);
108
+ (0, _react.useLayoutEffect)(() => {
109
+ const diffImage = diffImageRef.current;
110
+ if (!diffImage || !loaded) return;
111
+ const ratio = diffImage.naturalWidth / diffImage.naturalHeight;
112
+ setLayout(ratio >= 2 ? 'vertical' : 'horizontal');
113
+ }, [loaded]);
114
+ (0, _helpers.useApplyScale)(expectImageRef, scale);
115
+ (0, _helpers.useApplyScale)(actualImageRef, scale);
116
+ (0, _react.useEffect)(() => {
117
+ if (loaded) (0, _readyForCapture.readyForCapture)();
118
+ }, [loaded]);
119
+ return /*#__PURE__*/_react.default.createElement(Container, {
120
+ ref: containerRef
121
+ }, loaded ? /*#__PURE__*/_react.default.createElement(ImagesLayout, {
122
+ layout: layout
123
+ }, /*#__PURE__*/_react.default.createElement(ImageLink, {
124
+ href: expect,
125
+ target: "_blank",
126
+ rel: "noopener noreferrer"
127
+ }, /*#__PURE__*/_react.default.createElement(Image, {
128
+ ref: expectImageRef,
129
+ borderColor: (0, _ImagesView.getBorderColor)(theme, _ImagesView.themeBorderColors.expect),
130
+ alt: "expect",
131
+ src: expect
132
+ })), /*#__PURE__*/_react.default.createElement(ImageDiffLink, {
133
+ href: diff,
134
+ target: "_blank",
135
+ rel: "noopener noreferrer"
136
+ }, /*#__PURE__*/_react.default.createElement(DiffImage, {
137
+ ref: diffImageRef,
138
+ borderColor: (0, _ImagesView.getBorderColor)(theme, _ImagesView.themeBorderColors.diff),
139
+ alt: "diff",
140
+ src: diff
141
+ })), /*#__PURE__*/_react.default.createElement(ImageLink, {
142
+ href: actual,
143
+ target: "_blank",
144
+ rel: "noopener noreferrer"
145
+ }, /*#__PURE__*/_react.default.createElement(Image, {
146
+ ref: actualImageRef,
147
+ borderColor: (0, _ImagesView.getBorderColor)(theme, _ImagesView.themeBorderColors.actual),
148
+ alt: "actual",
149
+ src: actual
150
+ }))) : /*#__PURE__*/_react.default.createElement(_components.Loader, {
151
+ size: 64
152
+ }));
153
+ });
154
+ exports.SideBySideView = SideBySideView;