creevey 0.9.0-beta.5 → 0.9.0-beta.7

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 (112) 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 +35 -25
  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/testsFiles/register.js +1 -5
  14. package/lib/cjs/server/worker/worker.js +3 -3
  15. package/lib/cjs/types.js +1 -0
  16. package/lib/esm/server/selenium/browser.js +36 -26
  17. package/lib/esm/server/storybook/helpers.js +1 -1
  18. package/lib/esm/server/storybook/providers/browser.js +3 -5
  19. package/lib/esm/server/storybook/providers/hybrid.js +3 -7
  20. package/lib/esm/server/storybook/providers/nodejs.js +3 -3
  21. package/lib/esm/server/testsFiles/register.js +1 -5
  22. package/lib/esm/server/worker/worker.js +3 -3
  23. package/lib/esm/types.js +1 -0
  24. package/lib/types/cli.d.ts +1 -1
  25. package/lib/types/client/addon/Manager.d.ts +37 -37
  26. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  27. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  28. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  29. package/lib/types/client/addon/components/TestSelect.d.ts +8 -8
  30. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  31. package/lib/types/client/addon/decorator.d.ts +1 -1
  32. package/lib/types/client/addon/index.d.ts +2 -2
  33. package/lib/types/client/addon/preset.d.ts +23 -23
  34. package/lib/types/client/addon/preset.ie11.d.ts +10 -10
  35. package/lib/types/client/addon/readyForCapture.d.ts +6 -6
  36. package/lib/types/client/addon/register.d.ts +3 -3
  37. package/lib/types/client/addon/utils.d.ts +3 -3
  38. package/lib/types/client/addon/withCreevey.d.ts +24 -24
  39. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  40. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +24 -24
  41. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  42. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  43. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  44. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  45. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +8 -8
  46. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +7 -7
  47. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  48. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +16 -16
  49. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  50. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  51. package/lib/types/client/shared/helpers.d.ts +46 -46
  52. package/lib/types/client/shared/viewMode.d.ts +4 -4
  53. package/lib/types/client/web/CreeveyApp.d.ts +11 -11
  54. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  55. package/lib/types/client/web/CreeveyLoader.d.ts +2 -2
  56. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  57. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  58. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  59. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -12
  60. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  61. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -7
  62. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  63. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  64. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  65. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  66. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  67. package/lib/types/client/web/index.d.ts +4 -4
  68. package/lib/types/creevey.d.ts +1 -1
  69. package/lib/types/server/config.d.ts +4 -4
  70. package/lib/types/server/docker.d.ts +7 -7
  71. package/lib/types/server/extract.d.ts +2 -2
  72. package/lib/types/server/index.d.ts +2 -2
  73. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  74. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  75. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  76. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  77. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  78. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  79. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -4
  80. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  81. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  82. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  83. package/lib/types/server/logger.d.ts +10 -10
  84. package/lib/types/server/master/api.d.ts +7 -7
  85. package/lib/types/server/master/index.d.ts +3 -3
  86. package/lib/types/server/master/master.d.ts +7 -7
  87. package/lib/types/server/master/pool.d.ts +31 -31
  88. package/lib/types/server/master/runner.d.ts +26 -26
  89. package/lib/types/server/master/server.d.ts +2 -2
  90. package/lib/types/server/messages.d.ts +29 -27
  91. package/lib/types/server/selenium/browser.d.ts +19 -17
  92. package/lib/types/server/selenium/index.d.ts +2 -2
  93. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  94. package/lib/types/server/stories.d.ts +8 -8
  95. package/lib/types/server/storybook/entry.d.ts +17 -17
  96. package/lib/types/server/storybook/helpers.d.ts +24 -24
  97. package/lib/types/server/storybook/providers/browser.d.ts +2 -4
  98. package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
  99. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -9
  100. package/lib/types/server/testsFiles/parser.d.ts +12 -12
  101. package/lib/types/server/testsFiles/register.d.ts +2 -2
  102. package/lib/types/server/update.d.ts +2 -2
  103. package/lib/types/server/utils.d.ts +24 -24
  104. package/lib/types/server/worker/chai-image.d.ts +6 -6
  105. package/lib/types/server/worker/helpers.d.ts +8 -8
  106. package/lib/types/server/worker/index.d.ts +1 -1
  107. package/lib/types/server/worker/reporter.d.ts +8 -8
  108. package/lib/types/server/worker/worker.d.ts +4 -4
  109. package/lib/types/shared/index.d.ts +7 -7
  110. package/lib/types/shared/serializeRegExp.d.ts +9 -9
  111. package/lib/types/types.d.ts +486 -489
  112. package/package.json +4 -3
@@ -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
 
@@ -411,10 +419,12 @@ async function resolveCreeveyHost(browser, port) {
411
419
  const addresses = getAddresses();
412
420
  creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
413
421
  void Promise.all(hosts.map(function (host) {
414
- // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
415
- return fetch('http://' + host + ':' + port + '/ping').then(function (response) {
422
+ return Promise.race([// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
423
+ fetch('http://' + host + ':' + port + '/ping').then(function (response) {
416
424
  return response.text();
417
- }).then(function (pong) {
425
+ }), new Promise((_resolve, reject) => {
426
+ setTimeout(reject, 5000);
427
+ })]).then(function (pong) {
418
428
  return pong == 'pong' ? host : null;
419
429
  }).catch(function () {
420
430
  return null;
@@ -429,21 +439,18 @@ async function resolveCreeveyHost(browser, port) {
429
439
  return creeveyServerHost;
430
440
  }
431
441
 
432
- async function loadStoriesFromBrowser(port) {
442
+ async function loadStoriesFromBrowser() {
433
443
  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;
444
+ const stories = await browser.executeAsyncScript(function (callback) {
438
445
  void window.__CREEVEY_GET_STORIES__().then(callback);
439
- }, host, port);
446
+ });
440
447
  if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
441
448
  return stories;
442
449
  }
443
450
 
444
- async function getBrowser(config, name) {
451
+ async function getBrowser(config, options) {
445
452
  if (browser) return browser;
446
- browserName = name;
453
+ browserName = options.browser;
447
454
  const browserConfig = config.browsers[browserName];
448
455
  const {
449
456
  gridUrl = config.gridUrl,
@@ -473,7 +480,7 @@ async function getBrowser(config, name) {
473
480
  const url = new URL(gridUrl);
474
481
  url.username = url.username ? '********' : '';
475
482
  url.password = url.password ? '********' : '';
476
- browserLogger.debug(`(${name}) Connecting to Selenium ${_chalk.default.magenta(url.toString())}`);
483
+ browserLogger.debug(`(${browserName}) Connecting to Selenium ${_chalk.default.magenta(url.toString())}`);
477
484
  browser = await new _seleniumWebdriver.Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
478
485
  const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
479
486
  let browserHost = '';
@@ -487,14 +494,14 @@ async function getBrowser(config, name) {
487
494
  /* noop */
488
495
  }
489
496
 
490
- browserLogger.debug(`(${name}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
497
+ browserLogger.debug(`(${browserName}) Connected successful with ${[_chalk.default.green(browserHost), _chalk.default.magenta(sessionId)].filter(Boolean).join(':')}`);
491
498
  browserLogger = (0, _loglevel.getLogger)(sessionId);
492
499
 
493
500
  _loglevelPluginPrefix.default.apply(browserLogger, {
494
501
  format(level) {
495
502
  const levelColor = _logger.colors[level.toUpperCase()];
496
503
 
497
- return `[${name}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
504
+ return `[${browserName}:${_chalk.default.gray(sessionId)}] ${levelColor(level)} =>`;
498
505
  }
499
506
 
500
507
  });
@@ -528,9 +535,12 @@ async function getBrowser(config, name) {
528
535
  await updateStorybookGlobals(browser, _storybookGlobals);
529
536
  }
530
537
 
531
- await browser.executeScript(function (workerId) {
538
+ const creeveyHost = await resolveCreeveyHost(browser, options.port);
539
+ await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
532
540
  window.__CREEVEY_WORKER_ID__ = workerId;
533
- }, process.pid);
541
+ window.__CREEVEY_SERVER_HOST__ = creeveyHost;
542
+ window.__CREEVEY_SERVER_PORT__ = creeveyPort;
543
+ }, process.pid, creeveyHost, options.port);
534
544
  return browser;
535
545
  }
536
546
 
@@ -581,7 +591,7 @@ async function switchStory() {
581
591
  parameters
582
592
  } = story;
583
593
  const {
584
- captureElement = '#root',
594
+ captureElement = `#${storybookRootID}`,
585
595
  waitForReady,
586
596
  ignoreElements
587
597
  } = 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,
@@ -40,9 +40,5 @@ async function register(config) {
40
40
  plugins: [['@babel/plugin-transform-runtime'], ['babel-plugin-tsconfig-paths', {
41
41
  tsconfig: tsConfigPath
42
42
  }]]
43
- }));
44
- (await Promise.resolve().then(() => _interopRequireWildcard(require('ts-node')))).register({
45
- project: tsConfigPath,
46
- transpileOnly: true
47
- });
43
+ })); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
48
44
  }
@@ -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
 
@@ -383,10 +391,12 @@ async function resolveCreeveyHost(browser, port) {
383
391
  const addresses = getAddresses();
384
392
  creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
385
393
  void Promise.all(hosts.map(function (host) {
386
- // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
387
- return fetch('http://' + host + ':' + port + '/ping').then(function (response) {
394
+ return Promise.race([// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
395
+ fetch('http://' + host + ':' + port + '/ping').then(function (response) {
388
396
  return response.text();
389
- }).then(function (pong) {
397
+ }), new Promise((_resolve, reject) => {
398
+ setTimeout(reject, 5000);
399
+ })]).then(function (pong) {
390
400
  return pong == 'pong' ? host : null;
391
401
  }).catch(function () {
392
402
  return null;
@@ -401,20 +411,17 @@ async function resolveCreeveyHost(browser, port) {
401
411
  return creeveyServerHost;
402
412
  }
403
413
 
404
- export async function loadStoriesFromBrowser(port) {
414
+ export async function loadStoriesFromBrowser() {
405
415
  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;
416
+ const stories = await browser.executeAsyncScript(function (callback) {
410
417
  void window.__CREEVEY_GET_STORIES__().then(callback);
411
- }, host, port);
418
+ });
412
419
  if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
413
420
  return stories;
414
421
  }
415
- export async function getBrowser(config, name) {
422
+ export async function getBrowser(config, options) {
416
423
  if (browser) return browser;
417
- browserName = name;
424
+ browserName = options.browser;
418
425
  const browserConfig = config.browsers[browserName];
419
426
  const {
420
427
  gridUrl = config.gridUrl,
@@ -444,7 +451,7 @@ export async function getBrowser(config, name) {
444
451
  const url = new URL(gridUrl);
445
452
  url.username = url.username ? '********' : '';
446
453
  url.password = url.password ? '********' : '';
447
- browserLogger.debug(`(${name}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
454
+ browserLogger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
448
455
  browser = await new Builder().usingServer(gridUrl).withCapabilities(capabilities).build();
449
456
  const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
450
457
  let browserHost = '';
@@ -458,12 +465,12 @@ export async function getBrowser(config, name) {
458
465
  /* noop */
459
466
  }
460
467
 
461
- browserLogger.debug(`(${name}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
468
+ browserLogger.debug(`(${browserName}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
462
469
  browserLogger = getLogger(sessionId);
463
470
  prefix.apply(browserLogger, {
464
471
  format(level) {
465
472
  const levelColor = colors[level.toUpperCase()];
466
- return `[${name}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
473
+ return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
467
474
  }
468
475
 
469
476
  });
@@ -496,9 +503,12 @@ export async function getBrowser(config, name) {
496
503
  await updateStorybookGlobals(browser, _storybookGlobals);
497
504
  }
498
505
 
499
- await browser.executeScript(function (workerId) {
506
+ const creeveyHost = await resolveCreeveyHost(browser, options.port);
507
+ await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
500
508
  window.__CREEVEY_WORKER_ID__ = workerId;
501
- }, process.pid);
509
+ window.__CREEVEY_SERVER_HOST__ = creeveyHost;
510
+ window.__CREEVEY_SERVER_PORT__ = creeveyPort;
511
+ }, process.pid, creeveyHost, options.port);
502
512
  return browser;
503
513
  }
504
514
 
@@ -548,7 +558,7 @@ export async function switchStory() {
548
558
  parameters
549
559
  } = story;
550
560
  const {
551
- captureElement = '#root',
561
+ captureElement = `#${storybookRootID}`,
552
562
  waitForReady,
553
563
  ignoreElements
554
564
  } = 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
@@ -27,9 +27,5 @@ export default async function register(config) {
27
27
  plugins: [['@babel/plugin-transform-runtime'], ['babel-plugin-tsconfig-paths', {
28
28
  tsconfig: tsConfigPath
29
29
  }]]
30
- }));
31
- (await import('ts-node')).register({
32
- project: tsConfigPath,
33
- transpileOnly: true
34
- });
30
+ })); // (await import('ts-node')).register({ project: tsConfigPath, transpileOnly: true });
35
31
  }
@@ -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