creevey 0.9.0-beta.5 → 0.9.0-beta.6

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 (110) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/addon/package.json +1 -0
  3. package/lib/cjs/client/web/32.js +1 -1
  4. package/lib/cjs/client/web/551.js +1 -1
  5. package/lib/cjs/client/web/691.js +1 -1
  6. package/lib/cjs/client/web/725.js +1 -1
  7. package/lib/cjs/client/web/main.js +1 -1
  8. package/lib/cjs/server/selenium/browser.js +30 -22
  9. package/lib/cjs/server/storybook/helpers.js +1 -1
  10. package/lib/cjs/server/storybook/providers/browser.js +6 -6
  11. package/lib/cjs/server/storybook/providers/hybrid.js +6 -8
  12. package/lib/cjs/server/storybook/providers/nodejs.js +6 -4
  13. package/lib/cjs/server/worker/worker.js +3 -3
  14. package/lib/cjs/types.js +1 -0
  15. package/lib/esm/server/selenium/browser.js +31 -23
  16. package/lib/esm/server/storybook/helpers.js +1 -1
  17. package/lib/esm/server/storybook/providers/browser.js +3 -5
  18. package/lib/esm/server/storybook/providers/hybrid.js +3 -7
  19. package/lib/esm/server/storybook/providers/nodejs.js +3 -3
  20. package/lib/esm/server/worker/worker.js +3 -3
  21. package/lib/esm/types.js +1 -0
  22. package/lib/types/cli.d.ts +1 -1
  23. package/lib/types/client/addon/Manager.d.ts +37 -37
  24. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  25. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  26. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  27. package/lib/types/client/addon/components/TestSelect.d.ts +8 -8
  28. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  29. package/lib/types/client/addon/decorator.d.ts +1 -1
  30. package/lib/types/client/addon/index.d.ts +2 -2
  31. package/lib/types/client/addon/preset.d.ts +23 -23
  32. package/lib/types/client/addon/preset.ie11.d.ts +10 -10
  33. package/lib/types/client/addon/readyForCapture.d.ts +6 -6
  34. package/lib/types/client/addon/register.d.ts +3 -3
  35. package/lib/types/client/addon/utils.d.ts +3 -3
  36. package/lib/types/client/addon/withCreevey.d.ts +24 -24
  37. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  38. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +24 -24
  39. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  40. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  41. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  42. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  43. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +8 -8
  44. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +7 -7
  45. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  46. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +16 -16
  47. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  48. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  49. package/lib/types/client/shared/helpers.d.ts +46 -46
  50. package/lib/types/client/shared/viewMode.d.ts +4 -4
  51. package/lib/types/client/web/CreeveyApp.d.ts +11 -11
  52. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  53. package/lib/types/client/web/CreeveyLoader.d.ts +2 -2
  54. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  55. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  56. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  57. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -12
  58. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  59. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -7
  60. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  61. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  62. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  63. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  64. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  65. package/lib/types/client/web/index.d.ts +4 -4
  66. package/lib/types/creevey.d.ts +1 -1
  67. package/lib/types/server/config.d.ts +4 -4
  68. package/lib/types/server/docker.d.ts +7 -7
  69. package/lib/types/server/extract.d.ts +2 -2
  70. package/lib/types/server/index.d.ts +2 -2
  71. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  72. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  73. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  74. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  75. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  76. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  77. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -4
  78. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  79. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  80. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  81. package/lib/types/server/logger.d.ts +10 -10
  82. package/lib/types/server/master/api.d.ts +7 -7
  83. package/lib/types/server/master/index.d.ts +3 -3
  84. package/lib/types/server/master/master.d.ts +7 -7
  85. package/lib/types/server/master/pool.d.ts +31 -31
  86. package/lib/types/server/master/runner.d.ts +26 -26
  87. package/lib/types/server/master/server.d.ts +2 -2
  88. package/lib/types/server/messages.d.ts +27 -27
  89. package/lib/types/server/selenium/browser.d.ts +19 -17
  90. package/lib/types/server/selenium/index.d.ts +2 -2
  91. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  92. package/lib/types/server/stories.d.ts +8 -8
  93. package/lib/types/server/storybook/entry.d.ts +17 -17
  94. package/lib/types/server/storybook/helpers.d.ts +24 -24
  95. package/lib/types/server/storybook/providers/browser.d.ts +2 -4
  96. package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
  97. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -9
  98. package/lib/types/server/testsFiles/parser.d.ts +12 -12
  99. package/lib/types/server/testsFiles/register.d.ts +2 -2
  100. package/lib/types/server/update.d.ts +2 -2
  101. package/lib/types/server/utils.d.ts +24 -24
  102. package/lib/types/server/worker/chai-image.d.ts +6 -6
  103. package/lib/types/server/worker/helpers.d.ts +8 -8
  104. package/lib/types/server/worker/index.d.ts +1 -1
  105. package/lib/types/server/worker/reporter.d.ts +8 -8
  106. package/lib/types/server/worker/worker.d.ts +4 -4
  107. package/lib/types/shared/index.d.ts +7 -7
  108. package/lib/types/shared/serializeRegExp.d.ts +9 -9
  109. package/lib/types/types.d.ts +486 -489
  110. package/package.json +2 -1
@@ -40,6 +40,7 @@ var _utils = require("../utils");
40
40
 
41
41
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
42
 
43
+ const storybookRootID = (0, _helpers.isStorybookVersionLessThan)(7) ? 'root' : 'storybook-root';
43
44
  const DOCKER_INTERNAL = 'host.docker.internal';
44
45
  let browserLogger = _logger.logger;
45
46
  let browserName = '';
@@ -116,10 +117,10 @@ function getUrlChecker(browser) {
116
117
  // We don't use any page load strategies except `NONE`
117
118
  // because other add significant delay and some of them don't work in earlier chrome versions
118
119
  // Browsers always load page successful even it's failed
119
- // So we just check `#root` element
120
+ // So we just check `root` element
120
121
 
121
- browserLogger.debug(`Checking ${_chalk.default.cyan('#root')} existence on ${_chalk.default.magenta(url)}`);
122
- return source.includes('<div id="root"></div>');
122
+ browserLogger.debug(`Checking ${_chalk.default.cyan(`#${storybookRootID}`)} existence on ${_chalk.default.magenta(url)}`);
123
+ return source.includes(`id="${storybookRootID}"`);
123
124
  } catch (error) {
124
125
  return false;
125
126
  }
@@ -137,11 +138,18 @@ async function waitForStorybook(browser) {
137
138
  }, 60000);
138
139
 
139
140
  while (wait) {
140
- wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
141
- if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
142
- if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
143
- return callback(false);
144
- }, Events.SET_STORIES);
141
+ if ((0, _helpers.isStorybookVersionLessThan)(7)) {
142
+ wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
143
+ if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
144
+ if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
145
+ return callback(false);
146
+ }, Events.SET_STORIES);
147
+ } else {
148
+ wait = await browser.executeAsyncScript(function (callback) {
149
+ return callback(typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined');
150
+ });
151
+ }
152
+
145
153
  if (!wait) clearTimeout(initiateTimeout);
146
154
  }
147
155
 
@@ -429,21 +437,18 @@ async function resolveCreeveyHost(browser, port) {
429
437
  return creeveyServerHost;
430
438
  }
431
439
 
432
- async function loadStoriesFromBrowser(port) {
440
+ async function loadStoriesFromBrowser() {
433
441
  if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
434
- const host = await resolveCreeveyHost(browser, port);
435
- const stories = await browser.executeAsyncScript(function (creeveyHost, creeveyPort, callback) {
436
- window.__CREEVEY_SERVER_HOST__ = creeveyHost;
437
- window.__CREEVEY_SERVER_PORT__ = creeveyPort;
442
+ const stories = await browser.executeAsyncScript(function (callback) {
438
443
  void window.__CREEVEY_GET_STORIES__().then(callback);
439
- }, host, port);
444
+ });
440
445
  if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
441
446
  return stories;
442
447
  }
443
448
 
444
- async function getBrowser(config, name) {
449
+ async function getBrowser(config, options) {
445
450
  if (browser) return browser;
446
- browserName = name;
451
+ browserName = options.browser;
447
452
  const browserConfig = config.browsers[browserName];
448
453
  const {
449
454
  gridUrl = config.gridUrl,
@@ -473,7 +478,7 @@ async function getBrowser(config, name) {
473
478
  const url = new URL(gridUrl);
474
479
  url.username = url.username ? '********' : '';
475
480
  url.password = url.password ? '********' : '';
476
- browserLogger.debug(`(${name}) Connecting to Selenium ${_chalk.default.magenta(url.toString())}`);
481
+ browserLogger.debug(`(${browserName}) Connecting to Selenium ${_chalk.default.magenta(url.toString())}`);
477
482
  browser = await new _seleniumWebdriver.Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
478
483
  const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
479
484
  let browserHost = '';
@@ -487,14 +492,14 @@ async function getBrowser(config, name) {
487
492
  /* noop */
488
493
  }
489
494
 
490
- browserLogger.debug(`(${name}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
495
+ browserLogger.debug(`(${browserName}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
491
496
  browserLogger = (0, _loglevel.getLogger)(sessionId);
492
497
 
493
498
  _loglevelPluginPrefix.default.apply(browserLogger, {
494
499
  format(level) {
495
500
  const levelColor = _logger.colors[level.toUpperCase()];
496
501
 
497
- return `[${name}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
502
+ return `[${browserName}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
498
503
  }
499
504
 
500
505
  });
@@ -528,9 +533,12 @@ async function getBrowser(config, name) {
528
533
  await updateStorybookGlobals(browser, _storybookGlobals);
529
534
  }
530
535
 
531
- await browser.executeScript(function (workerId) {
536
+ const creeveyHost = await resolveCreeveyHost(browser, options.port);
537
+ await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
532
538
  window.__CREEVEY_WORKER_ID__ = workerId;
533
- }, process.pid);
539
+ window.__CREEVEY_SERVER_HOST__ = creeveyHost;
540
+ window.__CREEVEY_SERVER_PORT__ = creeveyPort;
541
+ }, process.pid, creeveyHost, options.port);
534
542
  return browser;
535
543
  }
536
544
 
@@ -581,7 +589,7 @@ async function switchStory() {
581
589
  parameters
582
590
  } = story;
583
591
  const {
584
- captureElement = '#root',
592
+ captureElement = `#${storybookRootID}`,
585
593
  waitForReady,
586
594
  ignoreElements
587
595
  } = parameters.creevey ?? {};
@@ -88,7 +88,7 @@ function getStorybookVersion() {
88
88
  // eslint-disable-next-line @typescript-eslint/no-var-requires
89
89
  const {
90
90
  version
91
- } = require(resolveFromStorybook('@storybook/core/package.json'));
91
+ } = require(resolveFromStorybook('@storybook/core-server/package.json'));
92
92
 
93
93
  return version;
94
94
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.loadStories = loadStories;
6
+ exports.loadStories = void 0;
7
7
 
8
8
  var _cluster = _interopRequireDefault(require("cluster"));
9
9
 
@@ -17,9 +17,7 @@ var _logger = require("../../logger");
17
17
 
18
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
19
 
20
- async function loadStories(_config, {
21
- port
22
- }, storiesListener) {
20
+ const loadStories = async (_config, _options, storiesListener) => {
23
21
  if (_cluster.default.isPrimary) {
24
22
  return new Promise(resolve => {
25
23
  const worker = Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).find(worker => worker.isConnected());
@@ -57,7 +55,7 @@ async function loadStories(_config, {
57
55
  });
58
56
  if (message.type == 'update') storiesListener(new Map(message.payload));
59
57
  });
60
- const stories = await (0, _selenium.loadStoriesFromBrowser)(port);
58
+ const stories = await (0, _selenium.loadStoriesFromBrowser)();
61
59
  const storiesWithOldTests = [];
62
60
  Object.values(stories).forEach(story => {
63
61
  var _parameters, _parameters$creevey;
@@ -71,4 +69,6 @@ async function loadStories(_config, {
71
69
  });
72
70
  return stories;
73
71
  }
74
- }
72
+ };
73
+
74
+ exports.loadStories = loadStories;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.loadStories = loadStories;
6
+ exports.loadStories = void 0;
7
7
 
8
8
  var _chokidar = _interopRequireDefault(require("chokidar"));
9
9
 
@@ -23,9 +23,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
23
23
 
24
24
  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
25
 
26
- async function loadStories(_config, {
27
- port
28
- }, storiesListener) {
26
+ const loadStories = async (_config, _options, storiesListener) => {
29
27
  let creeveyParamsByStoryId = {};
30
28
 
31
29
  const mergeParamsFromTestsToStory = (story, creeveyParams) => {
@@ -34,9 +32,7 @@ async function loadStories(_config, {
34
32
  }
35
33
  };
36
34
 
37
- const stories = await (0, _browser.loadStories)(_config, {
38
- port
39
- }, updatedStoriesByFiles => {
35
+ const stories = await (0, _browser.loadStories)(_config, {}, updatedStoriesByFiles => {
40
36
  Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
41
37
  storiesArray.forEach(story => {
42
38
  const creeveyParams = creeveyParamsByStoryId[story.id];
@@ -56,7 +52,9 @@ async function loadStories(_config, {
56
52
  mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
57
53
  });
58
54
  return stories;
59
- }
55
+ };
56
+
57
+ exports.loadStories = loadStories;
60
58
 
61
59
  async function parseParams(config, listener) {
62
60
  if (!config.testsDir) {
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.extractStoriesData = extractStoriesData;
7
- exports.loadStories = loadStories;
7
+ exports.loadStories = void 0;
8
8
 
9
9
  var _path = _interopRequireDefault(require("path"));
10
10
 
@@ -189,10 +189,10 @@ async function loadStoriesDirectly(config, {
189
189
  } // TODO Do we need to support multiple storybooks here?
190
190
 
191
191
 
192
- async function loadStories(config, {
192
+ const loadStories = async (config, {
193
193
  watch,
194
194
  debug
195
- }, storiesListener) {
195
+ }, storiesListener) => {
196
196
  const storybookApi = await initStorybookEnvironment();
197
197
  const Events = await (0, _helpers.importStorybookCoreEvents)();
198
198
  const {
@@ -217,7 +217,9 @@ async function loadStories(config, {
217
217
  debug
218
218
  });
219
219
  return loadPromise;
220
- }
220
+ };
221
+
222
+ exports.loadStories = loadStories;
221
223
 
222
224
  async function extractStoriesData(config, {
223
225
  watch,
@@ -194,7 +194,7 @@ async function worker(config, options) {
194
194
 
195
195
  _chai.default.use((0, _chaiImage.default)(getExpected, config.diffOptions));
196
196
 
197
- if ((await (0, _selenium.getBrowser)(config, options.browser)) == null) return;
197
+ if ((await (0, _selenium.getBrowser)(config, options)) == null) return;
198
198
  await (0, _helpers.addTestsFromStories)(mocha.suite, config, {
199
199
  browser: options.browser,
200
200
  watch: options.ui,
@@ -205,12 +205,12 @@ async function worker(config, options) {
205
205
  try {
206
206
  var _await$getBrowser;
207
207
 
208
- await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options.browser)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
208
+ await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
209
209
  } catch (_) {
210
210
  await (0, _selenium.closeBrowser)();
211
211
  }
212
212
 
213
- const browser = await (0, _selenium.getBrowser)(config, options.browser);
213
+ const browser = await (0, _selenium.getBrowser)(config, options);
214
214
  const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
215
215
  if (browser == null) return;
216
216
  const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
package/lib/cjs/types.js CHANGED
@@ -20,6 +20,7 @@ exports.noop = noop;
20
20
  /* eslint-disable @typescript-eslint/no-explicit-any */
21
21
 
22
22
  /* eslint-enable @typescript-eslint/no-explicit-any */
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
24
  function noop() {
24
25
  /* noop */
25
26
  }
@@ -10,8 +10,9 @@ import { PageLoadStrategy } from 'selenium-webdriver/lib/capabilities';
10
10
  import { isDefined, noop } from '../../types';
11
11
  import { colors, logger } from '../logger';
12
12
  import { emitStoriesMessage, subscribeOn } from '../messages';
13
- import { importStorybookCoreEvents } from '../storybook/helpers';
13
+ import { importStorybookCoreEvents, isStorybookVersionLessThan } from '../storybook/helpers';
14
14
  import { isShuttingDown, LOCALHOST_REGEXP, runSequence } from '../utils';
15
+ const storybookRootID = isStorybookVersionLessThan(7) ? 'root' : 'storybook-root';
15
16
  const DOCKER_INTERNAL = 'host.docker.internal';
16
17
  let browserLogger = logger;
17
18
  let browserName = '';
@@ -88,10 +89,10 @@ function getUrlChecker(browser) {
88
89
  // We don't use any page load strategies except `NONE`
89
90
  // because other add significant delay and some of them don't work in earlier chrome versions
90
91
  // Browsers always load page successful even it's failed
91
- // So we just check `#root` element
92
+ // So we just check `root` element
92
93
 
93
- browserLogger.debug(`Checking ${chalk.cyan('#root')} existence on ${chalk.magenta(url)}`);
94
- return source.includes('<div id="root"></div>');
94
+ browserLogger.debug(`Checking ${chalk.cyan(`#${storybookRootID}`)} existence on ${chalk.magenta(url)}`);
95
+ return source.includes(`id="${storybookRootID}"`);
95
96
  } catch (error) {
96
97
  return false;
97
98
  }
@@ -109,11 +110,18 @@ async function waitForStorybook(browser) {
109
110
  }, 60000);
110
111
 
111
112
  while (wait) {
112
- wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
113
- if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
114
- if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
115
- return callback(false);
116
- }, Events.SET_STORIES);
113
+ if (isStorybookVersionLessThan(7)) {
114
+ wait = await browser.executeAsyncScript(function (SET_STORIES, callback) {
115
+ if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return callback(true);
116
+ if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_STORIES) == undefined) return callback(true);
117
+ return callback(false);
118
+ }, Events.SET_STORIES);
119
+ } else {
120
+ wait = await browser.executeAsyncScript(function (callback) {
121
+ return callback(typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined');
122
+ });
123
+ }
124
+
117
125
  if (!wait) clearTimeout(initiateTimeout);
118
126
  }
119
127
 
@@ -401,20 +409,17 @@ async function resolveCreeveyHost(browser, port) {
401
409
  return creeveyServerHost;
402
410
  }
403
411
 
404
- export async function loadStoriesFromBrowser(port) {
412
+ export async function loadStoriesFromBrowser() {
405
413
  if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
406
- const host = await resolveCreeveyHost(browser, port);
407
- const stories = await browser.executeAsyncScript(function (creeveyHost, creeveyPort, callback) {
408
- window.__CREEVEY_SERVER_HOST__ = creeveyHost;
409
- window.__CREEVEY_SERVER_PORT__ = creeveyPort;
414
+ const stories = await browser.executeAsyncScript(function (callback) {
410
415
  void window.__CREEVEY_GET_STORIES__().then(callback);
411
- }, host, port);
416
+ });
412
417
  if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
413
418
  return stories;
414
419
  }
415
- export async function getBrowser(config, name) {
420
+ export async function getBrowser(config, options) {
416
421
  if (browser) return browser;
417
- browserName = name;
422
+ browserName = options.browser;
418
423
  const browserConfig = config.browsers[browserName];
419
424
  const {
420
425
  gridUrl = config.gridUrl,
@@ -444,7 +449,7 @@ export async function getBrowser(config, name) {
444
449
  const url = new URL(gridUrl);
445
450
  url.username = url.username ? '********' : '';
446
451
  url.password = url.password ? '********' : '';
447
- browserLogger.debug(`(${name}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
452
+ browserLogger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
448
453
  browser = await new Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
449
454
  const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
450
455
  let browserHost = '';
@@ -458,12 +463,12 @@ export async function getBrowser(config, name) {
458
463
  /* noop */
459
464
  }
460
465
 
461
- browserLogger.debug(`(${name}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
466
+ browserLogger.debug(`(${browserName}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
462
467
  browserLogger = getLogger(sessionId);
463
468
  prefix.apply(browserLogger, {
464
469
  format(level) {
465
470
  const levelColor = colors[level.toUpperCase()];
466
- return `[${name}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
471
+ return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
467
472
  }
468
473
 
469
474
  });
@@ -496,9 +501,12 @@ export async function getBrowser(config, name) {
496
501
  await updateStorybookGlobals(browser, _storybookGlobals);
497
502
  }
498
503
 
499
- await browser.executeScript(function (workerId) {
504
+ const creeveyHost = await resolveCreeveyHost(browser, options.port);
505
+ await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
500
506
  window.__CREEVEY_WORKER_ID__ = workerId;
501
- }, process.pid);
507
+ window.__CREEVEY_SERVER_HOST__ = creeveyHost;
508
+ window.__CREEVEY_SERVER_PORT__ = creeveyPort;
509
+ }, process.pid, creeveyHost, options.port);
502
510
  return browser;
503
511
  }
504
512
 
@@ -548,7 +556,7 @@ export async function switchStory() {
548
556
  parameters
549
557
  } = story;
550
558
  const {
551
- captureElement = '#root',
559
+ captureElement = `#${storybookRootID}`,
552
560
  waitForReady,
553
561
  ignoreElements
554
562
  } = parameters.creevey ?? {};
@@ -35,7 +35,7 @@ export function getStorybookVersion() {
35
35
  // eslint-disable-next-line @typescript-eslint/no-var-requires
36
36
  const {
37
37
  version
38
- } = require(resolveFromStorybook('@storybook/core/package.json'));
38
+ } = require(resolveFromStorybook('@storybook/core-server/package.json'));
39
39
 
40
40
  return version;
41
41
  }
@@ -3,9 +3,7 @@ import { loadStoriesFromBrowser } from '../../selenium';
3
3
  import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../../messages';
4
4
  import { isDefined } from '../../../types';
5
5
  import { logger } from '../../logger';
6
- export async function loadStories(_config, {
7
- port
8
- }, storiesListener) {
6
+ export const loadStories = async (_config, _options, storiesListener) => {
9
7
  if (cluster.isPrimary) {
10
8
  return new Promise(resolve => {
11
9
  const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.isConnected());
@@ -43,7 +41,7 @@ export async function loadStories(_config, {
43
41
  });
44
42
  if (message.type == 'update') storiesListener(new Map(message.payload));
45
43
  });
46
- const stories = await loadStoriesFromBrowser(port);
44
+ const stories = await loadStoriesFromBrowser();
47
45
  const storiesWithOldTests = [];
48
46
  Object.values(stories).forEach(story => {
49
47
  var _parameters, _parameters$creevey;
@@ -57,4 +55,4 @@ export async function loadStories(_config, {
57
55
  });
58
56
  return stories;
59
57
  }
60
- }
58
+ };
@@ -4,9 +4,7 @@ import { logger } from '../../logger';
4
4
  import parse from '../../testsFiles/parser';
5
5
  import { readDirRecursive } from '../../../server/utils';
6
6
  import { combineParameters } from '../../../shared';
7
- export async function loadStories(_config, {
8
- port
9
- }, storiesListener) {
7
+ export const loadStories = async (_config, _options, storiesListener) => {
10
8
  let creeveyParamsByStoryId = {};
11
9
 
12
10
  const mergeParamsFromTestsToStory = (story, creeveyParams) => {
@@ -15,9 +13,7 @@ export async function loadStories(_config, {
15
13
  }
16
14
  };
17
15
 
18
- const stories = await browserProvider(_config, {
19
- port
20
- }, updatedStoriesByFiles => {
16
+ const stories = await browserProvider(_config, {}, updatedStoriesByFiles => {
21
17
  Array.from(updatedStoriesByFiles.entries()).forEach(([, storiesArray]) => {
22
18
  storiesArray.forEach(story => {
23
19
  const creeveyParams = creeveyParamsByStoryId[story.id];
@@ -37,7 +33,7 @@ export async function loadStories(_config, {
37
33
  mergeParamsFromTestsToStory(story, creeveyParamsByStoryId[storyId]);
38
34
  });
39
35
  return stories;
40
- }
36
+ };
41
37
 
42
38
  async function parseParams(config, listener) {
43
39
  if (!config.testsDir) {
@@ -169,10 +169,10 @@ async function loadStoriesDirectly(config, {
169
169
  } // TODO Do we need to support multiple storybooks here?
170
170
 
171
171
 
172
- export async function loadStories(config, {
172
+ export const loadStories = async (config, {
173
173
  watch,
174
174
  debug
175
- }, storiesListener) {
175
+ }, storiesListener) => {
176
176
  const storybookApi = await initStorybookEnvironment();
177
177
  const Events = await importStorybookCoreEvents();
178
178
  const {
@@ -197,7 +197,7 @@ export async function loadStories(config, {
197
197
  debug
198
198
  });
199
199
  return loadPromise;
200
- }
200
+ };
201
201
  export async function extractStoriesData(config, {
202
202
  watch,
203
203
  debug
@@ -166,7 +166,7 @@ export default async function worker(config, options) {
166
166
  const mocha = new Mocha(mochaOptions);
167
167
  mocha.cleanReferencesAfterRun(false);
168
168
  chai.use(chaiImage(getExpected, config.diffOptions));
169
- if ((await getBrowser(config, options.browser)) == null) return;
169
+ if ((await getBrowser(config, options)) == null) return;
170
170
  await addTestsFromStories(mocha.suite, config, {
171
171
  browser: options.browser,
172
172
  watch: options.ui,
@@ -177,12 +177,12 @@ export default async function worker(config, options) {
177
177
  try {
178
178
  var _await$getBrowser;
179
179
 
180
- await ((_await$getBrowser = await getBrowser(config, options.browser)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
180
+ await ((_await$getBrowser = await getBrowser(config, options)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
181
181
  } catch (_) {
182
182
  await closeBrowser();
183
183
  }
184
184
 
185
- const browser = await getBrowser(config, options.browser);
185
+ const browser = await getBrowser(config, options);
186
186
  const sessionId = (_await$browser$getSes = await (browser === null || browser === void 0 ? void 0 : browser.getSession())) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
187
187
  if (browser == null) return;
188
188
  const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
package/lib/esm/types.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
 
3
3
  /* eslint-enable @typescript-eslint/no-explicit-any */
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
5
  export function noop() {
5
6
  /* noop */
6
7
  }
@@ -1 +1 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
@@ -1,37 +1,37 @@
1
- import { API } from '@storybook/api';
2
- import { denormalizeStoryParameters } from '../../shared';
3
- import { CreeveyStatus, CreeveyUpdate, TestData, TestStatus, StoriesRaw } from '../../types';
4
- import { CreeveyClientApi } from '../shared/creeveyClientApi';
5
- export declare class CreeveyManager {
6
- storybookApi: API;
7
- storyId: string;
8
- activeBrowser: string;
9
- selectedTestId: string;
10
- status: CreeveyStatus;
11
- creeveyApi: CreeveyClientApi | null;
12
- stories: StoriesRaw;
13
- updateStatusListeners: Array<(update: CreeveyUpdate) => void>;
14
- changeTestListeners: Array<(testId: string) => void>;
15
- constructor(storybookApi: API);
16
- initAll: () => Promise<void>;
17
- onUpdateStatus(listener: (update: CreeveyUpdate) => void): () => void;
18
- onChangeTest(listener: (testId: string) => void): () => void;
19
- handleCreeveyUpdate: (update: CreeveyUpdate) => void;
20
- getCurrentTest: () => TestData | undefined;
21
- onStoryRendered: (storyId: string) => void;
22
- onStart: () => void;
23
- onStop: () => void;
24
- onImageApprove: (id: string, retry: number, image: string) => void;
25
- onStartAllStoryTests: () => void;
26
- onStartAllTests: () => void;
27
- onSetStories: (data: Parameters<typeof denormalizeStoryParameters>['0']) => void;
28
- setActiveBrowser: (browser: string) => void;
29
- setSelectedTestId: (testId: string) => void;
30
- getStoryTests: (storyId: string) => TestData[];
31
- getBrowsers: () => string[];
32
- getTestsByStoryIdAndBrowser: (browser: string) => TestData[];
33
- getTabTitle: (browser: string) => string;
34
- setPanelsTitle: () => void;
35
- addStatusesToSideBar(): Promise<void>;
36
- addStatusToStoryName(name: string, status: TestStatus | undefined, skip: string | boolean): string;
37
- }
1
+ import { API } from '@storybook/api';
2
+ import { denormalizeStoryParameters } from '../../shared';
3
+ import { CreeveyStatus, CreeveyUpdate, TestData, TestStatus, StoriesRaw } from '../../types';
4
+ import { CreeveyClientApi } from '../shared/creeveyClientApi';
5
+ export declare class CreeveyManager {
6
+ storybookApi: API;
7
+ storyId: string;
8
+ activeBrowser: string;
9
+ selectedTestId: string;
10
+ status: CreeveyStatus;
11
+ creeveyApi: CreeveyClientApi | null;
12
+ stories: StoriesRaw;
13
+ updateStatusListeners: Array<(update: CreeveyUpdate) => void>;
14
+ changeTestListeners: Array<(testId: string) => void>;
15
+ constructor(storybookApi: API);
16
+ initAll: () => Promise<void>;
17
+ onUpdateStatus(listener: (update: CreeveyUpdate) => void): () => void;
18
+ onChangeTest(listener: (testId: string) => void): () => void;
19
+ handleCreeveyUpdate: (update: CreeveyUpdate) => void;
20
+ getCurrentTest: () => TestData | undefined;
21
+ onStoryRendered: (storyId: string) => void;
22
+ onStart: () => void;
23
+ onStop: () => void;
24
+ onImageApprove: (id: string, retry: number, image: string) => void;
25
+ onStartAllStoryTests: () => void;
26
+ onStartAllTests: () => void;
27
+ onSetStories: (data: Parameters<typeof denormalizeStoryParameters>['0']) => void;
28
+ setActiveBrowser: (browser: string) => void;
29
+ setSelectedTestId: (testId: string) => void;
30
+ getStoryTests: (storyId: string) => TestData[];
31
+ getBrowsers: () => string[];
32
+ getTestsByStoryIdAndBrowser: (browser: string) => TestData[];
33
+ getTabTitle: (browser: string) => string;
34
+ setPanelsTitle: () => void;
35
+ addStatusesToSideBar(): Promise<void>;
36
+ addStatusToStoryName(name: string, status: TestStatus | undefined, skip: string | boolean): string;
37
+ }
@@ -1,8 +1,8 @@
1
- import { CreeveyManager } from '../Manager';
2
- interface AddonProps {
3
- active?: boolean;
4
- browser: string;
5
- manager: CreeveyManager;
6
- }
7
- export declare const Addon: ({ active, browser, manager }: AddonProps) => JSX.Element | null;
8
- export {};
1
+ import { CreeveyManager } from '../Manager';
2
+ interface AddonProps {
3
+ active?: boolean;
4
+ browser: string;
5
+ manager: CreeveyManager;
6
+ }
7
+ export declare const Addon: ({ active, browser, manager }: AddonProps) => JSX.Element | null;
8
+ export {};
@@ -1,7 +1,7 @@
1
- interface IconProps {
2
- width?: number;
3
- height?: number;
4
- }
5
- export declare const NextIcon: ({ width, height }: IconProps) => JSX.Element;
6
- export declare const ForwardIcon: ({ width, height }: IconProps) => JSX.Element;
7
- export {};
1
+ interface IconProps {
2
+ width?: number;
3
+ height?: number;
4
+ }
5
+ export declare const NextIcon: ({ width, height }: IconProps) => JSX.Element;
6
+ export declare const ForwardIcon: ({ width, height }: IconProps) => JSX.Element;
7
+ export {};
@@ -1,9 +1,9 @@
1
- import { TestData } from '../../../types';
2
- interface PanelProps {
3
- tests: TestData[];
4
- selectedTestId: string;
5
- onChangeTest: (testId: string) => void;
6
- onImageApprove: (id: string, retry: number, image: string) => void;
7
- }
8
- export declare const Panel: ({ tests, selectedTestId, onChangeTest, onImageApprove }: PanelProps) => JSX.Element;
9
- export {};
1
+ import { TestData } from '../../../types';
2
+ interface PanelProps {
3
+ tests: TestData[];
4
+ selectedTestId: string;
5
+ onChangeTest: (testId: string) => void;
6
+ onImageApprove: (id: string, retry: number, image: string) => void;
7
+ }
8
+ export declare const Panel: ({ tests, selectedTestId, onChangeTest, onImageApprove }: PanelProps) => JSX.Element;
9
+ export {};