creevey 0.8.0-beta.0 → 0.8.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 (199) hide show
  1. package/CHANGELOG.md +30 -7
  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/client/addon/Manager.js +122 -271
  8. package/lib/cjs/client/addon/components/Addon.js +17 -38
  9. package/lib/cjs/client/addon/components/Icons.js +11 -7
  10. package/lib/cjs/client/addon/components/Panel.js +17 -13
  11. package/lib/cjs/client/addon/components/TestSelect.js +11 -9
  12. package/lib/cjs/client/addon/components/Tools.js +21 -40
  13. package/lib/cjs/client/addon/decorator.js +1 -1
  14. package/lib/cjs/client/addon/index.js +31 -0
  15. package/lib/cjs/client/addon/preset.ie11.js +74 -0
  16. package/lib/cjs/client/addon/preset.js +13 -31
  17. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  18. package/lib/cjs/client/addon/register.js +46 -70
  19. package/lib/cjs/client/addon/utils.js +6 -2
  20. package/lib/cjs/client/addon/withCreevey.js +221 -155
  21. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +26 -24
  22. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +22 -18
  23. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +44 -66
  24. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +38 -50
  25. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -45
  26. package/lib/cjs/client/shared/components/ImagesView/index.js +9 -9
  27. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +12 -8
  28. package/lib/cjs/client/shared/components/PageFooter/Paging.js +14 -18
  29. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +22 -18
  30. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +42 -67
  31. package/lib/cjs/client/shared/components/ResultsPage.js +39 -69
  32. package/lib/cjs/client/shared/creeveyClientApi.js +55 -82
  33. package/lib/cjs/client/shared/helpers.js +140 -211
  34. package/lib/cjs/client/shared/viewMode.js +5 -5
  35. package/lib/cjs/client/web/142.js +2 -0
  36. package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
  37. package/lib/cjs/client/web/32.js +1 -0
  38. package/lib/cjs/client/web/551.js +1 -0
  39. package/lib/cjs/client/web/566.js +2 -0
  40. package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
  41. package/lib/cjs/client/web/691.js +2 -0
  42. package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
  43. package/lib/cjs/client/web/725.js +1 -0
  44. package/lib/cjs/client/web/main.js +2 -38
  45. package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
  46. package/lib/cjs/creevey.js +3 -5
  47. package/lib/cjs/index.js +10 -15
  48. package/lib/cjs/server/config.js +5 -4
  49. package/lib/cjs/server/docker.js +3 -7
  50. package/lib/cjs/server/extract.js +7 -4
  51. package/lib/cjs/server/index.js +3 -5
  52. package/lib/cjs/server/loaders/babel/creevey-plugin.js +1 -3
  53. package/lib/cjs/server/loaders/babel/helpers.js +13 -23
  54. package/lib/cjs/server/loaders/babel/register.js +2 -4
  55. package/lib/cjs/server/loaders/webpack/compile.js +34 -51
  56. package/lib/cjs/server/loaders/webpack/creevey-loader.js +20 -22
  57. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +2 -7
  58. package/lib/cjs/server/loaders/webpack/mdx-loader.js +2 -2
  59. package/lib/cjs/server/loaders/webpack/start.js +1 -1
  60. package/lib/cjs/server/logger.js +2 -1
  61. package/lib/cjs/server/master/index.js +4 -4
  62. package/lib/cjs/server/master/master.js +1 -0
  63. package/lib/cjs/server/master/pool.js +38 -47
  64. package/lib/cjs/server/master/runner.js +53 -66
  65. package/lib/cjs/server/master/server.js +78 -4
  66. package/lib/cjs/server/messages.js +128 -18
  67. package/lib/cjs/server/selenium/browser.js +129 -55
  68. package/lib/cjs/server/selenium/selenoid.js +5 -7
  69. package/lib/cjs/server/stories.js +58 -72
  70. package/lib/cjs/server/storybook/entry.js +7 -22
  71. package/lib/cjs/server/storybook/helpers.js +20 -27
  72. package/lib/cjs/server/storybook/providers/browser.js +74 -0
  73. package/lib/cjs/server/storybook/{nodejs-provider.js → providers/nodejs.js} +37 -20
  74. package/lib/cjs/server/update.js +1 -5
  75. package/lib/cjs/server/utils.js +26 -35
  76. package/lib/cjs/server/worker/helpers.js +2 -6
  77. package/lib/cjs/server/worker/reporter.js +8 -20
  78. package/lib/cjs/server/worker/worker.js +21 -19
  79. package/lib/cjs/shared/index.js +101 -0
  80. package/lib/cjs/shared/serializeRegExp.js +42 -0
  81. package/lib/cjs/types.js +11 -6
  82. package/lib/esm/client/addon/Manager.js +122 -271
  83. package/lib/esm/client/addon/components/Addon.js +15 -34
  84. package/lib/esm/client/addon/components/Icons.js +10 -6
  85. package/lib/esm/client/addon/components/Panel.js +17 -13
  86. package/lib/esm/client/addon/components/TestSelect.js +11 -9
  87. package/lib/esm/client/addon/components/Tools.js +19 -36
  88. package/lib/esm/client/addon/decorator.js +1 -1
  89. package/lib/esm/client/addon/index.js +2 -0
  90. package/lib/esm/client/addon/preset.ie11.js +59 -0
  91. package/lib/esm/client/addon/preset.js +12 -26
  92. package/lib/esm/client/addon/readyForCapture.js +5 -0
  93. package/lib/esm/client/addon/register.js +42 -66
  94. package/lib/esm/client/addon/utils.js +3 -2
  95. package/lib/esm/client/addon/withCreevey.js +209 -156
  96. package/lib/esm/client/shared/components/ImagesView/BlendView.js +23 -20
  97. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +21 -17
  98. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +42 -63
  99. package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
  100. package/lib/esm/client/shared/components/ImagesView/SwapView.js +24 -42
  101. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
  102. package/lib/esm/client/shared/components/PageFooter/Paging.js +14 -18
  103. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +22 -18
  104. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +37 -60
  105. package/lib/esm/client/shared/components/ResultsPage.js +36 -64
  106. package/lib/esm/client/shared/creeveyClientApi.js +57 -84
  107. package/lib/esm/client/shared/helpers.js +124 -195
  108. package/lib/esm/client/shared/viewMode.js +4 -4
  109. package/lib/esm/creevey.js +3 -5
  110. package/lib/esm/index.js +2 -3
  111. package/lib/esm/server/config.js +4 -5
  112. package/lib/esm/server/docker.js +2 -2
  113. package/lib/esm/server/extract.js +6 -4
  114. package/lib/esm/server/index.js +3 -4
  115. package/lib/esm/server/loaders/babel/creevey-plugin.js +1 -3
  116. package/lib/esm/server/loaders/babel/helpers.js +12 -22
  117. package/lib/esm/server/loaders/babel/register.js +3 -5
  118. package/lib/esm/server/loaders/webpack/compile.js +35 -52
  119. package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
  120. package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
  121. package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
  122. package/lib/esm/server/loaders/webpack/start.js +1 -1
  123. package/lib/esm/server/master/index.js +4 -4
  124. package/lib/esm/server/master/master.js +1 -0
  125. package/lib/esm/server/master/pool.js +38 -49
  126. package/lib/esm/server/master/runner.js +53 -66
  127. package/lib/esm/server/master/server.js +76 -6
  128. package/lib/esm/server/messages.js +118 -14
  129. package/lib/esm/server/selenium/browser.js +126 -57
  130. package/lib/esm/server/selenium/selenoid.js +4 -6
  131. package/lib/esm/server/stories.js +58 -70
  132. package/lib/esm/server/storybook/entry.js +5 -22
  133. package/lib/esm/server/storybook/helpers.js +11 -20
  134. package/lib/esm/server/storybook/providers/browser.js +60 -0
  135. package/lib/esm/server/storybook/{nodejs-provider.js → providers/nodejs.js} +35 -19
  136. package/lib/esm/server/update.js +1 -5
  137. package/lib/esm/server/utils.js +18 -31
  138. package/lib/esm/server/worker/helpers.js +2 -6
  139. package/lib/esm/server/worker/reporter.js +8 -20
  140. package/lib/esm/server/worker/worker.js +22 -20
  141. package/lib/esm/shared/index.js +78 -0
  142. package/lib/esm/shared/serializeRegExp.js +24 -0
  143. package/lib/esm/types.js +3 -0
  144. package/lib/types/client/addon/Manager.d.ts +2 -2
  145. package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
  146. package/lib/types/client/addon/index.d.ts +2 -0
  147. package/lib/types/client/addon/preset.d.ts +2 -1
  148. package/lib/types/client/addon/preset.ie11.d.ts +10 -0
  149. package/lib/types/client/addon/readyForCapture.d.ts +6 -0
  150. package/lib/types/client/addon/utils.d.ts +1 -0
  151. package/lib/types/client/addon/withCreevey.d.ts +13 -2
  152. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  153. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
  154. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  155. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  156. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  157. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
  158. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
  159. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
  160. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
  161. package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
  162. package/lib/types/client/web/CreeveyApp.d.ts +0 -1
  163. package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
  164. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  165. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
  166. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
  167. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
  168. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
  169. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
  170. package/lib/types/index.d.ts +0 -1
  171. package/lib/types/server/loaders/babel/register.d.ts +1 -1
  172. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  173. package/lib/types/server/logger.d.ts +6 -2
  174. package/lib/types/server/master/master.d.ts +1 -0
  175. package/lib/types/server/master/pool.d.ts +1 -0
  176. package/lib/types/server/master/server.d.ts +1 -1
  177. package/lib/types/server/messages.d.ts +17 -6
  178. package/lib/types/server/selenium/browser.d.ts +5 -2
  179. package/lib/types/server/stories.d.ts +2 -2
  180. package/lib/types/server/storybook/entry.d.ts +2 -3
  181. package/lib/types/server/storybook/helpers.d.ts +1 -1
  182. package/lib/types/server/storybook/providers/browser.d.ts +4 -0
  183. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
  184. package/lib/types/server/utils.d.ts +5 -1
  185. package/lib/types/server/worker/helpers.d.ts +2 -1
  186. package/lib/types/shared/index.d.ts +7 -0
  187. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  188. package/lib/types/types.d.ts +32 -5
  189. package/package.json +120 -103
  190. package/preset/ie11.js +5 -0
  191. package/{preset.js → preset/index.js} +2 -2
  192. package/types/mdx.d.ts +3 -2
  193. package/types/mocha.d.ts +1 -0
  194. package/lib/cjs/client/web/1.js +0 -13
  195. package/lib/cjs/client/web/2.js +0 -1
  196. package/lib/cjs/shared.js +0 -35
  197. package/lib/esm/shared.js +0 -22
  198. package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
  199. package/lib/types/shared.d.ts +0 -4
@@ -3,79 +3,62 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.capture = capture;
6
7
  exports.withCreevey = withCreevey;
7
8
 
8
9
  var Events = _interopRequireWildcard(require("@storybook/core-events"));
9
10
 
10
11
  var polyfill = _interopRequireWildcard(require("event-source-polyfill"));
11
12
 
13
+ var _testingLibrary = require("@storybook/testing-library");
14
+
12
15
  var _addons = require("@storybook/addons");
13
16
 
14
17
  var _types = require("../../types");
15
18
 
16
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
+ var _shared = require("../../shared");
17
20
 
18
- 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
+ var _helpers = require("../shared/helpers");
19
22
 
20
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
23
+ var _utils = require("./utils");
21
24
 
22
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
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); }
23
26
 
24
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
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; }
25
28
 
26
- if ((typeof process === "undefined" ? "undefined" : _typeof(process)) != 'object' || typeof process.version != 'string') {
29
+ if (typeof process != 'object' || typeof process.version != 'string') {
27
30
  // NOTE If you don't use babel-polyfill or any other polyfills that add EventSource for IE11
28
31
  // You don't get hot reload in IE11. So put polyfill for that to better UX
29
32
  // Don't load in nodejs environment
30
33
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
31
- var NativeEventSource = polyfill.NativeEventSource,
32
- EventSourcePolyfill = polyfill.EventSourcePolyfill; // 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
33
38
 
34
39
  window.EventSource = NativeEventSource || EventSourcePolyfill;
35
40
  }
36
41
 
37
- var 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";
38
-
39
- function resetCurrentStory(_x) {
40
- return _resetCurrentStory.apply(this, arguments);
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";
42
43
 
43
- function _resetCurrentStory() {
44
- _resetCurrentStory = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(channel) {
45
- return regeneratorRuntime.wrap(function _callee3$(_context3) {
46
- while (1) {
47
- switch (_context3.prev = _context3.next) {
48
- case 0:
49
- setTimeout(function () {
50
- return channel.emit(Events.SET_CURRENT_STORY, {
51
- storyId: true,
52
- name: '',
53
- kind: ''
54
- });
55
- }, 0);
56
- return _context3.abrupt("return", new Promise(function (resolve) {
57
- return channel.once(Events.STORY_MISSING, resolve);
58
- }));
59
-
60
- case 2:
61
- case "end":
62
- return _context3.stop();
63
- }
64
- }
65
- }, _callee3);
66
- }));
67
- return _resetCurrentStory.apply(this, arguments);
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));
68
51
  }
69
52
 
70
53
  function catchRenderError(channel) {
71
- var rejectCallback;
72
- var promise = new Promise(function (_resolve, reject) {
73
- return rejectCallback = reject;
74
- });
54
+ let rejectCallback;
55
+ const promise = new Promise((_resolve, reject) => rejectCallback = reject);
75
56
 
76
57
  function errorHandler(_ref) {
77
- var title = _ref.title,
78
- description = _ref.description;
58
+ let {
59
+ title,
60
+ description
61
+ } = _ref;
79
62
  rejectCallback({
80
63
  message: title,
81
64
  stack: description
@@ -99,10 +82,8 @@ function catchRenderError(channel) {
99
82
  }
100
83
 
101
84
  function waitForStoryRendered(channel) {
102
- var resolveCallback;
103
- var promise = new Promise(function (resolve) {
104
- return resolveCallback = resolve;
105
- });
85
+ let resolveCallback;
86
+ const promise = new Promise(resolve => resolveCallback = resolve);
106
87
 
107
88
  function renderHandler() {
108
89
  resolveCallback();
@@ -120,13 +101,11 @@ function waitForStoryRendered(channel) {
120
101
 
121
102
  function waitForFontsLoaded() {
122
103
  if (!document.fonts) return;
123
- var areFontsLoading = Array.from(document.fonts).some(function (font) {
124
- return font.status == 'loading';
125
- });
104
+ const areFontsLoading = Array.from(document.fonts).some(font => font.status == 'loading');
126
105
 
127
106
  if (areFontsLoading) {
128
- return new Promise(function (resolve) {
129
- var fontsLoadedHandler = function fontsLoadedHandler() {
107
+ return new Promise(resolve => {
108
+ const fontsLoadedHandler = () => {
130
109
  document.fonts.removeEventListener('loadingdone', fontsLoadedHandler);
131
110
  resolve();
132
111
  };
@@ -136,128 +115,134 @@ function waitForFontsLoaded() {
136
115
  }
137
116
  }
138
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
+
139
146
  function withCreevey() {
140
- var currentStory = '';
141
- var isAnimationDisabled = false;
147
+ let currentStory = '';
148
+ let isAnimationDisabled = false;
149
+ initCreeveyState();
142
150
 
143
151
  function disableAnimation() {
144
152
  isAnimationDisabled = true;
145
- var style = document.createElement('style');
146
- var textNode = document.createTextNode(disableAnimationsStyles);
153
+ const style = document.createElement('style');
154
+ const textNode = document.createTextNode(disableAnimationsStyles);
147
155
  style.setAttribute('type', 'text/css');
148
156
  style.appendChild(textNode);
149
157
  document.head.appendChild(style);
150
158
  }
151
159
 
152
- function selectStory(_x2, _x3, _x4, _x5, _x6) {
153
- return _selectStory.apply(this, arguments);
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;
154
195
  }
155
196
 
156
- function _selectStory() {
157
- _selectStory = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(storyId, kind, name, shouldWaitForReady, callback) {
158
- var channel, waitForReady, renderPromise, errorPromise, _reason$stack, errorMessage;
159
-
160
- return regeneratorRuntime.wrap(function _callee2$(_context2) {
161
- while (1) {
162
- switch (_context2.prev = _context2.next) {
163
- case 0:
164
- if (!isAnimationDisabled) disableAnimation();
165
- channel = _addons.addons.getChannel();
166
- waitForReady = shouldWaitForReady ? new Promise(function (resolve) {
167
- return window.__CREEVEY_SET_READY_FOR_CAPTURE__ = resolve;
168
- }) : Promise.resolve();
169
-
170
- if (!(storyId == currentStory)) {
171
- _context2.next = 8;
172
- break;
173
- }
174
-
175
- _context2.next = 6;
176
- return resetCurrentStory(channel);
177
-
178
- case 6:
179
- _context2.next = 9;
180
- break;
181
-
182
- case 8:
183
- currentStory = storyId;
184
-
185
- case 9:
186
- renderPromise = waitForStoryRendered(channel);
187
- errorPromise = catchRenderError(channel);
188
- setTimeout(function () {
189
- return channel.emit(Events.SET_CURRENT_STORY, {
190
- storyId: storyId,
191
- name: name,
192
- kind: kind
193
- });
194
- }, 0);
195
- _context2.prev = 12;
196
- _context2.next = 15;
197
- return Promise.race([_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
198
- return regeneratorRuntime.wrap(function _callee$(_context) {
199
- while (1) {
200
- switch (_context.prev = _context.next) {
201
- case 0:
202
- _context.next = 2;
203
- return renderPromise;
204
-
205
- case 2:
206
- _context.next = 4;
207
- return waitForFontsLoaded();
208
-
209
- case 4:
210
- _context.next = 6;
211
- return waitForReady;
212
-
213
- case 6:
214
- case "end":
215
- return _context.stop();
216
- }
217
- }
218
- }, _callee);
219
- }))(), errorPromise]);
220
-
221
- case 15:
222
- callback();
223
- _context2.next = 22;
224
- break;
225
-
226
- case 18:
227
- _context2.prev = 18;
228
- _context2.t0 = _context2["catch"](12);
229
- // NOTE Event `STORY_THREW_EXCEPTION` triggered only in react and vue frameworks and return Error instance
230
- // NOTE Event `STORY_ERRORED` return error-like object without `name` field
231
- errorMessage = _context2.t0 instanceof Error ? (_reason$stack = _context2.t0.stack) !== null && _reason$stack !== void 0 ? _reason$stack : _context2.t0.message : (0, _types.isObject)(_context2.t0) ? "".concat(_context2.t0.message, "\n ").concat(_context2.t0.stack) : _context2.t0;
232
- callback(errorMessage);
233
-
234
- case 22:
235
- _context2.prev = 22;
236
- renderPromise.cancel();
237
- errorPromise.cancel();
238
- return _context2.finish(22);
239
-
240
- case 26:
241
- case "end":
242
- return _context2.stop();
243
- }
244
- }
245
- }, _callee2, null, [[12, 18, 22, 26]]);
246
- }));
247
- return _selectStory.apply(this, arguments);
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
+ }
248
233
  }
249
234
 
250
235
  function updateGlobals(globals) {
251
236
  _addons.addons.getChannel().emit(Events.UPDATE_GLOBALS, {
252
- globals: globals
237
+ globals
253
238
  });
254
239
  }
255
240
 
256
241
  function insertIgnoreStyles(ignoreSelectors) {
257
- var stylesElement = document.createElement('style');
242
+ const stylesElement = document.createElement('style');
258
243
  stylesElement.setAttribute('type', 'text/css');
259
244
  document.head.appendChild(stylesElement);
260
- ignoreSelectors.forEach(function (selector) {
245
+ ignoreSelectors.forEach(selector => {
261
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 ");
262
247
  });
263
248
  return stylesElement;
@@ -269,16 +254,97 @@ function withCreevey() {
269
254
  (_ignoreStyles$parentN = ignoreStyles.parentNode) === null || _ignoreStyles$parentN === void 0 ? void 0 : _ignoreStyles$parentN.removeChild(ignoreStyles);
270
255
  }
271
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;
272
277
  window.__CREEVEY_SELECT_STORY__ = selectStory;
273
278
  window.__CREEVEY_UPDATE_GLOBALS__ = updateGlobals;
274
279
  window.__CREEVEY_INSERT_IGNORE_STYLES__ = insertIgnoreStyles;
275
280
  window.__CREEVEY_REMOVE_IGNORE_STYLES__ = removeIgnoreStyles;
281
+ window.__CREEVEY_HAS_PLAY_COMPLETED_YET__ = hasPlayCompletedYet;
276
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
+ };
277
298
  return (0, _addons.makeDecorator)({
278
299
  name: 'withCreevey',
279
300
  parameterName: 'creevey',
280
- wrapper: function wrapper(getStory, context) {
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
+ });
281
330
  return getStory(context);
282
331
  }
283
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;
284
350
  }
@@ -1,7 +1,5 @@
1
1
  "use strict";
2
2
 
3
- function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
@@ -15,25 +13,29 @@ var _theming = require("@storybook/theming");
15
13
 
16
14
  var _helpers = require("../../helpers");
17
15
 
18
- function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
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
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; }
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
21
 
22
- var Container = _theming.styled.div({
22
+ const Container = _theming.styled.div({
23
23
  position: 'relative',
24
24
  display: 'flex',
25
25
  filter: 'invert(100%)'
26
26
  });
27
27
 
28
- var ImageContainer = _theming.styled.div({
28
+ const ImageContainer = _theming.styled.div({
29
29
  position: 'absolute',
30
30
  width: '100%',
31
31
  height: '100%',
32
32
  display: 'flex'
33
33
  });
34
34
 
35
- var Image = _theming.styled.img(function (_ref) {
36
- var borderColor = _ref.borderColor;
35
+ const Image = _theming.styled.img(_ref => {
36
+ let {
37
+ borderColor
38
+ } = _ref;
37
39
  return {
38
40
  boxSizing: 'border-box',
39
41
  border: "1px solid ".concat(borderColor),
@@ -42,28 +44,28 @@ var Image = _theming.styled.img(function (_ref) {
42
44
  };
43
45
  });
44
46
 
45
- var ActualImage = (0, _theming.styled)(Image)({
47
+ const ActualImage = (0, _theming.styled)(Image)({
46
48
  mixBlendMode: 'difference'
47
49
  });
48
- var DiffImage = (0, _theming.styled)(Image)({
50
+ const DiffImage = (0, _theming.styled)(Image)({
49
51
  opacity: '0'
50
52
  });
51
- var BlendView = (0, _theming.withTheme)(function (_ref2) {
52
- var actual = _ref2.actual,
53
- diff = _ref2.diff,
54
- expect = _ref2.expect,
55
- theme = _ref2.theme;
56
- var expectImageRef = (0, _react.useRef)(null);
57
- var diffImageRef = (0, _react.useRef)(null);
58
- var actualImageRef = (0, _react.useRef)(null);
59
- var loaded = (0, _helpers.useLoadImages)(expect, diff, actual);
60
- var scale = (0, _helpers.useCalcScale)(diffImageRef, loaded);
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);
61
65
  (0, _helpers.useApplyScale)(expectImageRef, scale, loaded);
62
66
  (0, _helpers.useApplyScale)(actualImageRef, scale, loaded);
63
- (0, _react.useEffect)(function () {
64
- var _window$__CREEVEY_SET, _window;
65
-
66
- if (loaded) (_window$__CREEVEY_SET = (_window = window).__CREEVEY_SET_READY_FOR_CAPTURE__) === null || _window$__CREEVEY_SET === void 0 ? void 0 : _window$__CREEVEY_SET.call(_window);
67
+ (0, _react.useEffect)(() => {
68
+ if (loaded) (0, _readyForCapture.readyForCapture)();
67
69
  }, [loaded]);
68
70
  return /*#__PURE__*/_react.default.createElement(Container, null, /*#__PURE__*/_react.default.createElement(ImageContainer, null, /*#__PURE__*/_react.default.createElement(Image, {
69
71
  ref: expectImageRef,
@@ -3,8 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getBorderColor = getBorderColor;
7
6
  exports.ImagesView = ImagesView;
7
+ exports.getBorderColor = getBorderColor;
8
8
  exports.themeBorderColors = void 0;
9
9
 
10
10
  var _react = _interopRequireDefault(require("react"));
@@ -21,29 +21,27 @@ var _theming = require("@storybook/theming");
21
21
 
22
22
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
23
 
24
- var themeBorderColors = {
24
+ const themeBorderColors = {
25
25
  actual: 'negative',
26
26
  expect: 'positive',
27
27
  diff: 'secondary'
28
28
  };
29
29
  exports.themeBorderColors = themeBorderColors;
30
30
 
31
- var isColor = function isColor(theme, color) {
32
- return color in theme.color;
33
- };
31
+ const isColor = (theme, color) => color in theme.color;
34
32
 
35
33
  function getBorderColor(theme, color) {
36
34
  return isColor(theme, color) ? theme.color[color] : color;
37
35
  }
38
36
 
39
- var views = {
37
+ const views = {
40
38
  'side-by-side': _SideBySideView.SideBySideView,
41
39
  swap: _SwapView.SwapView,
42
40
  slide: _SlideView.SlideView,
43
41
  blend: _BlendView.BlendView
44
42
  };
45
43
 
46
- var Container = _theming.styled.div({
44
+ const Container = _theming.styled.div({
47
45
  height: '100%',
48
46
  display: 'flex',
49
47
  textAlign: 'center',
@@ -52,12 +50,14 @@ var Container = _theming.styled.div({
52
50
  padding: '0 20px'
53
51
  });
54
52
 
55
- var ImageLink = _theming.styled.a({
53
+ const ImageLink = _theming.styled.a({
56
54
  lineHeight: 0
57
55
  });
58
56
 
59
- var ActualImage = (0, _theming.withTheme)(_theming.styled.img(function (_ref) {
60
- var theme = _ref.theme;
57
+ const ActualImage = (0, _theming.withTheme)(_theming.styled.img(_ref => {
58
+ let {
59
+ theme
60
+ } = _ref;
61
61
  return {
62
62
  border: "1px solid ".concat(getBorderColor(theme, themeBorderColors.expect)),
63
63
  maxWidth: '100%'
@@ -65,14 +65,18 @@ var ActualImage = (0, _theming.withTheme)(_theming.styled.img(function (_ref) {
65
65
  }));
66
66
 
67
67
  function ImagesView(_ref2) {
68
- var url = _ref2.url,
69
- image = _ref2.image,
70
- canApprove = _ref2.canApprove,
71
- mode = _ref2.mode;
72
- var ViewComponent = views[mode];
73
- var actual = image.actual,
74
- diff = image.diff,
75
- expect = image.expect;
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;
76
80
  return /*#__PURE__*/_react.default.createElement(Container, null, canApprove && diff && expect ? /*#__PURE__*/_react.default.createElement(ViewComponent, {
77
81
  actual: "".concat(url, "/").concat(actual),
78
82
  diff: "".concat(url, "/").concat(diff),