creevey 0.7.37 → 0.8.0-beta.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 (130) hide show
  1. package/CHANGELOG.md +30 -5
  2. package/README.md +1 -1
  3. package/docs/config.md +37 -5
  4. package/docs/grid.md +2 -1
  5. package/lib/cjs/client/addon/Manager.js +3 -1
  6. package/lib/cjs/client/addon/utils.js +1 -41
  7. package/lib/cjs/client/addon/withCreevey.js +11 -13
  8. package/lib/cjs/client/web/1.js +2 -2
  9. package/lib/cjs/client/web/2.js +1 -1
  10. package/lib/cjs/client/web/main.js +6 -6
  11. package/lib/cjs/index.js +14 -1
  12. package/lib/cjs/server/config.js +3 -0
  13. package/lib/cjs/server/extract.js +7 -3
  14. package/lib/cjs/server/loaders/babel/register.js +2 -1
  15. package/lib/cjs/server/loaders/webpack/compile.js +3 -19
  16. package/lib/cjs/server/loaders/webpack/creevey-loader.js +1 -1
  17. package/lib/cjs/server/master/master.js +3 -5
  18. package/lib/cjs/server/selenium/browser.js +25 -11
  19. package/lib/cjs/server/selenium/selenoid.js +1 -1
  20. package/lib/cjs/server/stories.js +20 -226
  21. package/lib/cjs/server/storybook/entry.js +5 -4
  22. package/lib/cjs/server/storybook/helpers.js +40 -4
  23. package/lib/cjs/server/storybook/nodejs-provider.js +220 -0
  24. package/lib/cjs/server/utils.js +25 -2
  25. package/lib/cjs/server/worker/helpers.js +8 -9
  26. package/lib/cjs/server/worker/worker.js +1 -2
  27. package/lib/cjs/shared.js +35 -0
  28. package/lib/esm/client/addon/Manager.js +3 -2
  29. package/lib/esm/client/addon/utils.js +1 -33
  30. package/lib/esm/client/addon/withCreevey.js +1 -1
  31. package/lib/esm/index.js +3 -1
  32. package/lib/esm/server/config.js +4 -1
  33. package/lib/esm/server/extract.js +7 -3
  34. package/lib/esm/server/loaders/babel/register.js +3 -2
  35. package/lib/esm/server/loaders/webpack/compile.js +4 -20
  36. package/lib/esm/server/loaders/webpack/creevey-loader.js +1 -1
  37. package/lib/esm/server/master/master.js +3 -5
  38. package/lib/esm/server/selenium/browser.js +22 -7
  39. package/lib/esm/server/selenium/selenoid.js +1 -1
  40. package/lib/esm/server/stories.js +23 -219
  41. package/lib/esm/server/storybook/entry.js +4 -4
  42. package/lib/esm/server/storybook/helpers.js +36 -4
  43. package/lib/esm/server/storybook/nodejs-provider.js +200 -0
  44. package/lib/esm/server/utils.js +23 -1
  45. package/lib/esm/server/worker/helpers.js +8 -9
  46. package/lib/esm/server/worker/worker.js +1 -2
  47. package/lib/esm/shared.js +22 -0
  48. package/lib/types/cli.d.ts +1 -1
  49. package/lib/types/client/addon/Manager.d.ts +37 -37
  50. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  51. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  52. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  53. package/lib/types/client/addon/components/TestSelect.d.ts +9 -9
  54. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  55. package/lib/types/client/addon/decorator.d.ts +1 -1
  56. package/lib/types/client/addon/preset.d.ts +22 -22
  57. package/lib/types/client/addon/register.d.ts +3 -3
  58. package/lib/types/client/addon/utils.d.ts +2 -6
  59. package/lib/types/client/addon/withCreevey.d.ts +13 -46
  60. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  61. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +25 -25
  62. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  63. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  64. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  65. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  66. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +9 -9
  67. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +8 -8
  68. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  69. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +17 -17
  70. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  71. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  72. package/lib/types/client/shared/helpers.d.ts +46 -46
  73. package/lib/types/client/shared/viewMode.d.ts +4 -4
  74. package/lib/types/client/web/CreeveyApp.d.ts +12 -12
  75. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  76. package/lib/types/client/web/CreeveyLoader.d.ts +3 -3
  77. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  78. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  79. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  80. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +13 -13
  81. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  82. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +8 -8
  83. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  84. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  85. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  86. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  87. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  88. package/lib/types/client/web/index.d.ts +4 -4
  89. package/lib/types/creevey.d.ts +1 -1
  90. package/lib/types/server/config.d.ts +4 -4
  91. package/lib/types/server/docker.d.ts +7 -7
  92. package/lib/types/server/extract.d.ts +2 -2
  93. package/lib/types/server/index.d.ts +2 -2
  94. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  95. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  96. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  97. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  98. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  99. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  100. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +2 -2
  101. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  102. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  103. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  104. package/lib/types/server/logger.d.ts +6 -6
  105. package/lib/types/server/master/api.d.ts +7 -7
  106. package/lib/types/server/master/index.d.ts +3 -3
  107. package/lib/types/server/master/master.d.ts +6 -6
  108. package/lib/types/server/master/pool.d.ts +30 -30
  109. package/lib/types/server/master/runner.d.ts +26 -26
  110. package/lib/types/server/master/server.d.ts +2 -2
  111. package/lib/types/server/messages.d.ts +18 -18
  112. package/lib/types/server/selenium/browser.d.ts +14 -14
  113. package/lib/types/server/selenium/index.d.ts +2 -2
  114. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  115. package/lib/types/server/stories.d.ts +8 -13
  116. package/lib/types/server/storybook/entry.d.ts +18 -14
  117. package/lib/types/server/storybook/helpers.d.ts +24 -22
  118. package/lib/types/server/storybook/nodejs-provider.d.ts +5 -0
  119. package/lib/types/server/update.d.ts +2 -2
  120. package/lib/types/server/utils.d.ts +19 -18
  121. package/lib/types/server/worker/chai-image.d.ts +6 -6
  122. package/lib/types/server/worker/helpers.d.ts +7 -7
  123. package/lib/types/server/worker/index.d.ts +1 -1
  124. package/lib/types/server/worker/reporter.d.ts +8 -8
  125. package/lib/types/server/worker/worker.d.ts +4 -4
  126. package/lib/types/shared.d.ts +4 -0
  127. package/lib/types/types.d.ts +459 -431
  128. package/package.json +53 -48
  129. package/types/mocha.d.ts +1 -0
  130. package/storybook-static/stories.json +0 -530
package/lib/cjs/index.js CHANGED
@@ -3,11 +3,21 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ var _exportNames = {
7
+ nodejsStoriesProvider: true
8
+ };
9
+ Object.defineProperty(exports, "nodejsStoriesProvider", {
10
+ enumerable: true,
11
+ get: function () {
12
+ return _nodejsProvider.loadStories;
13
+ }
14
+ });
6
15
 
7
16
  var _types = require("./types");
8
17
 
9
18
  Object.keys(_types).forEach(function (key) {
10
19
  if (key === "default" || key === "__esModule") return;
20
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
11
21
  if (key in exports && exports[key] === _types[key]) return;
12
22
  Object.defineProperty(exports, key, {
13
23
  enumerable: true,
@@ -21,6 +31,7 @@ var _withCreevey = require("./client/addon/withCreevey");
21
31
 
22
32
  Object.keys(_withCreevey).forEach(function (key) {
23
33
  if (key === "default" || key === "__esModule") return;
34
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
24
35
  if (key in exports && exports[key] === _withCreevey[key]) return;
25
36
  Object.defineProperty(exports, key, {
26
37
  enumerable: true,
@@ -28,4 +39,6 @@ Object.keys(_withCreevey).forEach(function (key) {
28
39
  return _withCreevey[key];
29
40
  }
30
41
  });
31
- });
42
+ });
43
+
44
+ var _nodejsProvider = require("./server/storybook/nodejs-provider");
@@ -12,6 +12,8 @@ var _path = _interopRequireDefault(require("path"));
12
12
 
13
13
  var _helpers = require("./storybook/helpers");
14
14
 
15
+ var _nodejsProvider = require("./storybook/nodejs-provider");
16
+
15
17
  var _types = require("../types");
16
18
 
17
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -79,6 +81,7 @@ async function readConfig(options) {
79
81
  if ((0, _types.isDefined)(configPath)) Object.assign(userConfig, (await Promise.resolve(`${configPath}`).then(s => _interopRequireWildcard(require(s)))).default);
80
82
  _helpers.storybookDirRef.current = userConfig.storybookDir;
81
83
  if ((0, _helpers.isStorybookVersionLessThan)(6, 2)) userConfig.useWebpackToExtractTests = true;
84
+ if (!userConfig.storiesProvider) userConfig.storiesProvider = (await (0, _helpers.isCSFv3Enabled)()) ? _nodejsProvider.loadStories : _nodejsProvider.loadStories;
82
85
  if (options.failFast != undefined) userConfig.failFast = Boolean(options.failFast);
83
86
  if (options.reportDir) userConfig.reportDir = _path.default.resolve(options.reportDir);
84
87
  if (options.screenDir) userConfig.screenDir = _path.default.resolve(options.screenDir); // NOTE: Hack to pass typescript checking
@@ -29,10 +29,14 @@ async function extract(config, options) {
29
29
  });
30
30
  }
31
31
 
32
- const tests = await (0, _stories.loadTestsFromStories)(config, Object.keys(config.browsers), {
33
- debug: options.debug
32
+ const tests = await (0, _stories.loadTestsFromStories)(Object.keys(config.browsers), async listener => {
33
+ const stories = await config.storiesProvider(config, {
34
+ watch: false,
35
+ debug: options.debug
36
+ }, listener);
37
+ if (options.extract) (0, _stories.saveStoriesJson)(stories, options.extract);
38
+ return stories;
34
39
  });
35
- if (options.extract) (0, _stories.saveStoriesJson)(options.extract);
36
40
  if (options.tests) (0, _stories.saveTestsJson)(tests); // eslint-disable-next-line no-process-exit
37
41
 
38
42
  process.exit(0);
@@ -90,7 +90,8 @@ function getRequireContext(rootDir) {
90
90
  }
91
91
 
92
92
  async function register(config, debug = false) {
93
- const requireContext = getRequireContext(config.storybookDir);
93
+ const rootDir = (0, _helpers.isStorybookVersionLessThan)(6, 4) ? config.storybookDir : process.cwd();
94
+ const requireContext = getRequireContext(rootDir);
94
95
  const preview = (0, _path.resolve)(config.storybookDir, 'preview');
95
96
  if ((0, _helpers.hasDocsAddon)()) await (await Promise.resolve().then(() => _interopRequireWildcard(require('../hooks/mdx')))).addMDXHook(() => story);
96
97
  if ((0, _helpers.hasSvelteCSFAddon)()) await (await Promise.resolve().then(() => _interopRequireWildcard(require('../hooks/svelte')))).addSvelteHook(() => story); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
@@ -179,27 +179,11 @@ async function getWebpackConfigForStorybook_6_2(framework, configDir, outputDir)
179
179
  });
180
180
  }
181
181
 
182
- async function removeAddons(configDir) {
183
- const storybookUtilsPath = (0, _helpers.isStorybookVersionLessThan)(6, 2) ? '@storybook/core/dist/server/utils' : '@storybook/core-common/dist/cjs/utils';
184
- const serverRequireModule = (0, _helpers.isStorybookVersionLessThan)(6, 2) ? 'server-require' : 'interpret-require';
185
-
182
+ async function removeAddons() {
186
183
  try {
187
184
  var _config$core;
188
185
 
189
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
190
- const {
191
- getInterpretedFile
192
- } = await Promise.resolve(`${(0, _helpers.resolveFromStorybook)(`${storybookUtilsPath}/interpret-files`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
193
-
194
- const {
195
- default: serverRequireFallback,
196
- serverRequire = serverRequireFallback
197
- } = await Promise.resolve(`${(0, _helpers.resolveFromStorybook)(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
198
-
199
- const mainConfigFile = (0, _helpers.isStorybookVersionLessThan)(6, 1) ? _path.default.join(configDir, 'main') : // eslint-disable-next-line @typescript-eslint/no-unsafe-call
200
- getInterpretedFile(_path.default.join(configDir, 'main')); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
201
-
202
- const config = serverRequire(mainConfigFile);
186
+ const config = await (0, _helpers.importStorybookConfig)();
203
187
 
204
188
  if (((_config$core = config.core) === null || _config$core === void 0 ? void 0 : _config$core.builder) == 'webpack5') {
205
189
  _logger.logger.warn("Be aware Creevey doesn't fully support webpack@5, some feature might not work well");
@@ -243,7 +227,7 @@ async function compile(config, {
243
227
  };
244
228
  process.env.NODE_ENV = 'production'; // NOTE Remove addons by monkey patching, only for new config file (main.js)
245
229
 
246
- const areAddonsRemoved = await removeAddons(config.storybookDir);
230
+ const areAddonsRemoved = await removeAddons();
247
231
  const getWebpackConfig = (0, _helpers.isStorybookVersionLessThan)(6, 2) ? getWebpackConfigForStorybook_pre6_2 : getWebpackConfigForStorybook_6_2;
248
232
  const storybookWebpackConfig = await getWebpackConfig(storybookFramework, config.storybookDir, outputDir);
249
233
  const extensions = (_storybookWebpackConf = (_storybookWebpackConf2 = storybookWebpackConfig.resolve) === null || _storybookWebpackConf2 === void 0 ? void 0 : _storybookWebpackConf2.extensions) !== null && _storybookWebpackConf !== void 0 ? _storybookWebpackConf : _utils.extensions;
@@ -159,7 +159,7 @@ function _default(source) {
159
159
  } catch (error) {
160
160
  this && _logger.logger.warn('Failed to transform file', this.resourcePath);
161
161
 
162
- if ('loc' in error) {
162
+ if (typeof error == 'object' && error && 'loc' in error) {
163
163
  _logger.logger.warn((0, _codeFrame.codeFrameColumns)(source, {
164
164
  start: error.loc
165
165
  }, {
@@ -46,11 +46,9 @@ async function master(config, options) {
46
46
  } catch (error) {// Ignore error
47
47
  }
48
48
 
49
- const tests = await (0, _stories.loadTestsFromStories)(config, Object.keys(config.browsers), { ...options,
50
- update: testsDiff => {
51
- runner.updateTests(testsDiff);
52
- (0, _stories.saveTestsJson)(runner.tests, config.reportDir);
53
- }
49
+ const tests = await (0, _stories.loadTestsFromStories)(Object.keys(config.browsers), listener => config.storiesProvider(config, options, listener), testsDiff => {
50
+ runner.updateTests(testsDiff);
51
+ (0, _stories.saveTestsJson)(runner.tests, config.reportDir);
54
52
  });
55
53
  runner.tests = mergeTests(testsFromReport, tests);
56
54
  (0, _stories.saveTestsJson)(runner.tests, config.reportDir);
@@ -7,33 +7,33 @@ exports.updateStorybookGlobals = updateStorybookGlobals;
7
7
  exports.getBrowser = getBrowser;
8
8
  exports.switchStory = switchStory;
9
9
 
10
+ var _chalk = _interopRequireDefault(require("chalk"));
11
+
10
12
  var _http = _interopRequireDefault(require("http"));
11
13
 
12
14
  var _https = _interopRequireDefault(require("https"));
13
15
 
14
- var _pngjs = require("pngjs");
15
-
16
16
  var _loglevel = require("loglevel");
17
17
 
18
18
  var _loglevelPluginPrefix = _interopRequireDefault(require("loglevel-plugin-prefix"));
19
19
 
20
- var _seleniumWebdriver = require("selenium-webdriver");
21
-
22
- var _types = require("../../types");
23
-
24
- var _messages = require("../messages");
25
-
26
20
  var _os = require("os");
27
21
 
28
- var _utils = require("../utils");
22
+ var _pngjs = require("pngjs");
23
+
24
+ var _seleniumWebdriver = require("selenium-webdriver");
29
25
 
30
26
  var _capabilities = require("selenium-webdriver/lib/capabilities");
31
27
 
32
- var _helpers = require("../storybook/helpers");
28
+ var _types = require("../../types");
33
29
 
34
30
  var _logger = require("../logger");
35
31
 
36
- var _chalk = _interopRequireDefault(require("chalk"));
32
+ var _messages = require("../messages");
33
+
34
+ var _helpers = require("../storybook/helpers");
35
+
36
+ var _utils = require("../utils");
37
37
 
38
38
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
39
 
@@ -502,6 +502,18 @@ async function getBrowser(config, browserConfig) {
502
502
  return browser;
503
503
  }
504
504
 
505
+ async function updateStoryArgs(browser, story, updatedArgs) {
506
+ const Events = await (0, _helpers.importStorybookCoreEvents)();
507
+ await browser.executeAsyncScript(function (storyId, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED, callback) {
508
+ window.__STORYBOOK_ADDONS_CHANNEL__.once(STORY_RENDERED, callback);
509
+
510
+ window.__STORYBOOK_ADDONS_CHANNEL__.emit(UPDATE_STORY_ARGS, {
511
+ storyId,
512
+ updatedArgs
513
+ });
514
+ }, story.id, updatedArgs, Events.UPDATE_STORY_ARGS, Events.STORY_RENDERED);
515
+ }
516
+
505
517
  async function switchStory() {
506
518
  var _this$currentTest, _this$currentTest$ctx, _parameters$creevey;
507
519
 
@@ -546,6 +558,8 @@ async function switchStory() {
546
558
 
547
559
  this.takeScreenshot = () => takeScreenshot(this.browser, captureElement, ignoreElements);
548
560
 
561
+ this.updateStoryArgs = updatedArgs => updateStoryArgs(this.browser, story, updatedArgs);
562
+
549
563
  this.testScope.reverse();
550
564
  }
551
565
 
@@ -51,7 +51,7 @@ async function createSelenoidConfig(browsers, {
51
51
  selenoidConfig[browserName].versions[version] = {
52
52
  image: useDocker ? dockerImage : webdriverCommand,
53
53
  port: '4444',
54
- path: !useDocker || ['chrome', 'opera', 'webkit'].includes(browserName) ? '/' : '/wd/hub'
54
+ path: !useDocker || ['chrome', 'opera', 'webkit', 'MicrosoftEdge'].includes(browserName) ? '/' : '/wd/hub'
55
55
  };
56
56
  });
57
57
  await mkdirAsync(selenoidConfigDir, {
@@ -6,39 +6,25 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.loadTestsFromStories = loadTestsFromStories;
7
7
  exports.saveStoriesJson = saveStoriesJson;
8
8
  exports.saveTestsJson = saveTestsJson;
9
- exports.storybookApi = void 0;
10
9
 
11
10
  var _path = _interopRequireDefault(require("path"));
12
11
 
13
12
  var _fs = require("fs");
14
13
 
15
- var _cluster = require("cluster");
16
-
17
14
  var _crypto = require("crypto");
18
15
 
19
- var _chokidar = _interopRequireDefault(require("chokidar"));
16
+ var _lodash = require("lodash");
20
17
 
21
18
  var _types = require("../types");
22
19
 
23
20
  var _utils = require("./utils");
24
21
 
25
- var _lodash = require("lodash");
26
-
27
- var _messages = require("./messages");
28
-
29
22
  var _helpers = require("./storybook/helpers");
30
23
 
31
- var _logger = require("./logger");
24
+ var _shared = require("../shared");
32
25
 
33
26
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
34
27
 
35
- 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); }
36
-
37
- 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; }
38
-
39
- let storybookApi = null;
40
- exports.storybookApi = storybookApi;
41
-
42
28
  function storyTestFabric(delay, testFn) {
43
29
  return async function storyTest() {
44
30
  var _testFn$call;
@@ -111,214 +97,9 @@ function convertStories(browsers, stories) {
111
97
  return tests;
112
98
  }
113
99
 
114
- async function initStorybookEnvironment() {
115
- // eslint-disable-next-line @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
116
- (await Promise.resolve().then(() => _interopRequireWildcard(require('jsdom-global')))).default(undefined, {
117
- url: 'http://localhost'
118
- }); // NOTE Cutoff `jsdom` part from userAgent, because storybook check enviroment and create events channel if runs in browser
119
- // https://github.com/storybookjs/storybook/blob/v5.2.8/lib/core/src/client/preview/start.js#L98
120
- // Example: "Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/15.2.1"
121
-
122
- Object.defineProperty(window.navigator, 'userAgent', {
123
- value: window.navigator.userAgent.split(' ').filter(token => !token.startsWith('jsdom')).join(' ')
124
- }); // TODO Look at creevey debug flag
125
-
126
- const {
127
- logger
128
- } = await (0, _helpers.importStorybookClientLogger)(); // NOTE: Disable duplication warnings for >=6.2 storybook
129
-
130
- if (_cluster.isWorker) logger.warn = _types.noop; // NOTE: disable logger for 5.x storybook
131
-
132
- logger.debug = _types.noop;
133
- return Promise.resolve().then(() => _interopRequireWildcard(require('./storybook/entry')));
134
- }
135
-
136
- function watchStories(channel, watcher, initialFiles) {
137
- const watchingFiles = initialFiles;
138
- let storiesByFiles = new Map();
139
- (0, _messages.subscribeOn)('shutdown', () => void watcher.close());
140
- watcher.add(Array.from(watchingFiles));
141
- watcher.on('change', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
142
- watcher.on('unlink', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
143
- return data => {
144
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : flatStories(data);
145
- const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
146
- const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
147
- const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
148
- watcher.add(addedFiles);
149
- addedFiles.forEach(filePath => {
150
- watchingFiles.add(filePath);
151
- storiesByFiles.set(filePath, []);
152
- });
153
- removedFiles.forEach(filePath => watchingFiles.delete(filePath));
154
- Object.values(stories).forEach(story => {
155
- var _storiesByFiles$get;
156
-
157
- return (_storiesByFiles$get = storiesByFiles.get(story.parameters.fileName)) === null || _storiesByFiles$get === void 0 ? void 0 : _storiesByFiles$get.push(story);
158
- });
159
- channel.emit('storiesUpdated', storiesByFiles);
160
- storiesByFiles = new Map();
161
- };
162
- } // TODO use the storybook version, after the fix of skip option API
163
-
164
-
165
- function flatStories({
166
- globalParameters,
167
- kindParameters,
168
- stories
169
- }) {
170
- Object.values(stories).forEach(story => {
171
- // NOTE: Copy-paste merge parameters from storybook
172
- story.parameters = (0, _lodash.mergeWith)({}, globalParameters, kindParameters[story.kind], story.parameters, (objValue, srcValue) => Array.isArray(objValue) ? objValue.concat(srcValue) : undefined);
173
- });
174
- return stories;
175
- }
176
-
177
- function loadStoriesFromBundle(watch) {
178
- const bundlePath = _path.default.join((0, _utils.getCreeveyCache)(), 'storybook/main.js');
179
-
180
- if (watch) {
181
- (0, _messages.subscribeOn)('webpack', message => {
182
- if (message.type != 'rebuild succeeded') return;
183
- Object.values(global.__CREEVEY_HMR_DATA__).filter(({
184
- callback
185
- }) => callback).forEach(({
186
- data,
187
- callback
188
- }) => callback(data));
189
- delete require.cache[bundlePath];
190
- Promise.resolve(`${bundlePath}`).then(s => _interopRequireWildcard(require(s)));
191
- });
192
- }
193
-
194
- Promise.resolve(`${bundlePath}`).then(s => _interopRequireWildcard(require(s)));
195
- }
196
-
197
- async function loadStoriesDirectly(config, {
198
- watcher,
199
- debug
200
- }) {
201
- const {
202
- toRequireContext
203
- } = await (0, _helpers.importStorybookCoreCommon)();
204
- const {
205
- addParameters,
206
- configure
207
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./storybook/entry')));
208
- const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('./loaders/babel/register')))).default(config, debug);
209
-
210
- const preview = (() => {
211
- try {
212
- return require.resolve(`${config.storybookDir}/preview`);
213
- } catch (_) {
214
- /* noop */
215
- }
216
- })();
217
-
218
- const {
219
- stories
220
- } = await (0, _helpers.importStorybookConfig)();
221
- const contexts = stories.map(input => {
222
- const {
223
- path: storiesPath,
224
- recursive,
225
- match
226
- } = toRequireContext(input);
227
- watcher === null || watcher === void 0 ? void 0 : watcher.add(_path.default.resolve(config.storybookDir, storiesPath));
228
- return () => requireContext(storiesPath, recursive, new RegExp(match));
229
- });
230
-
231
- let disposeCallback = data => void data;
232
-
233
- Object.assign(module, {
234
- hot: {
235
- data: {},
236
-
237
- accept() {
238
- /* noop */
239
- },
240
-
241
- dispose(callback) {
242
- disposeCallback = callback;
243
- }
244
-
245
- }
246
- });
247
-
248
- async function startStorybook() {
249
- if (preview) {
250
- const {
251
- parameters,
252
- globals,
253
- globalTypes
254
- } = await Promise.resolve(`${preview}`).then(s => _interopRequireWildcard(require(s)));
255
- if (parameters) addParameters(parameters);
256
- if (globals) addParameters({
257
- globals
258
- });
259
- if (globalTypes) addParameters({
260
- globalTypes
261
- });
262
- }
263
-
264
- try {
265
- configure(contexts.map(ctx => ctx()), module, false);
266
- } catch (error) {
267
- if (_cluster.isMaster) _logger.logger.error(error);
268
- }
269
- }
270
-
271
- watcher === null || watcher === void 0 ? void 0 : watcher.add(config.storybookDir);
272
- watcher === null || watcher === void 0 ? void 0 : watcher.on('all', (_event, filename) => {
273
- var _module$hot;
274
-
275
- disposeCallback((_module$hot = module.hot) === null || _module$hot === void 0 ? void 0 : _module$hot.data);
276
- delete require.cache[filename];
277
- void startStorybook();
278
- });
279
- void startStorybook();
280
- }
281
-
282
- async function loadStorybook(config, {
283
- watch,
284
- debug
285
- }, storiesListener) {
286
- exports.storybookApi = storybookApi = await initStorybookEnvironment();
287
- const Events = await (0, _helpers.importStorybookCoreEvents)();
288
- const {
289
- channel
290
- } = storybookApi;
291
- channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
292
- channel.on('storiesUpdated', storiesListener);
293
- let watcher = null;
294
- if (watch) watcher = _chokidar.default.watch([], {
295
- ignoreInitial: true
296
- });
297
- const loadPromise = new Promise(resolve => {
298
- channel.once(Events.SET_STORIES, data => {
299
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : flatStories(data);
300
- const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
301
- if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
302
- resolve(stories);
303
- });
304
- });
305
- if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
306
- watcher,
307
- debug
308
- });
309
- return loadPromise;
310
- }
311
-
312
- async function loadTestsFromStories(config, browsers, {
313
- watch = false,
314
- debug = false,
315
- update
316
- }) {
100
+ async function loadTestsFromStories(browsers, provider, update) {
317
101
  const testIdsByFiles = new Map();
318
- const stories = await loadStorybook(config, {
319
- debug,
320
- watch
321
- }, storiesByFiles => {
102
+ const data = await provider(storiesByFiles => {
322
103
  const testsDiff = {};
323
104
  Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
324
105
  var _testIdsByFiles$get$f, _testIdsByFiles$get;
@@ -332,6 +113,7 @@ async function loadTestsFromStories(config, browsers, {
332
113
  });
333
114
  update === null || update === void 0 ? void 0 : update(testsDiff);
334
115
  });
116
+ const stories = (0, _helpers.isStorybookVersionLessThan)(6) || (0, _helpers.isStorybookVersionGreaterThan)(6, 3) ? data.stories : (0, _shared.denormalizeStoryParameters)(data);
335
117
  const tests = convertStories(browsers, stories);
336
118
  Object.values(tests).filter(_types.isDefined).forEach(({
337
119
  id,
@@ -350,11 +132,23 @@ async function loadTestsFromStories(config, browsers, {
350
132
  return tests;
351
133
  }
352
134
 
353
- function saveStoriesJson(extract) {
354
- var _storybookApi, _storiesData$stories;
135
+ function saveStoriesJson(storiesData, extract) {
136
+ var _storiesData$stories;
355
137
 
356
138
  const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
357
- const storiesData = (_storybookApi = storybookApi) === null || _storybookApi === void 0 ? void 0 : _storybookApi.clientApi.store().getStoriesJsonData(); // TODO Fix args stories
139
+
140
+ if (!(0, _helpers.isStorybookVersionLessThan)(6)) {
141
+ // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
142
+ const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
143
+ storiesData.globalParameters = (0, _lodash.pick)(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
144
+
145
+ storiesData.kindParameters = (0, _lodash.mapValues)(storiesData.kindParameters, v => (0, _lodash.pick)(v, allowed)); // @ts-expect-error ignore error
146
+
147
+ storiesData.stories = (0, _lodash.mapValues)(storiesData.stories, v => ({ ...(0, _lodash.pick)(v, ['id', 'name', 'kind', 'story']),
148
+ parameters: (0, _lodash.pick)(v.parameters, allowed)
149
+ }));
150
+ } // TODO Fix args stories
151
+
358
152
 
359
153
  (0, _utils.removeProps)(storiesData !== null && storiesData !== void 0 ? storiesData : {}, ['stories', () => true, 'parameters', '__isArgsStory']);
360
154
  Object.values((_storiesData$stories = storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) !== null && _storiesData$stories !== void 0 ? _storiesData$stories : {}).forEach(story => (0, _types.isObject)(story) && 'parameters' in story && (0, _types.isObject)(story.parameters) && delete story.parameters.__isArgsStory);
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.raw = exports.getStorybook = exports.setAddon = exports.clearDecorators = exports.addParameters = exports.addDecorator = exports.configure = exports.storiesOf = exports.forceReRender = exports.clientApi = exports.channel = void 0;
7
7
 
8
+ var _addons = require("@storybook/addons");
9
+
8
10
  var _helpers = require("./helpers");
9
11
 
10
12
  var _api$channel, _api$context;
@@ -16,10 +18,8 @@ const core = require((0, _helpers.resolveFromStorybook)('@storybook/core')); //@
16
18
 
17
19
 
18
20
  const start = (0, _helpers.isStorybookVersionLessThan)(6, 2) ? core.default.start : core.start;
19
- const api = start(() => void 0); //@ts-expect-error: 6.x has { channel }, but 5.x has { context: { channel } }
20
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
21
-
22
- const channel = (_api$channel = api.channel) !== null && _api$channel !== void 0 ? _api$channel : (_api$context = api.context) === null || _api$context === void 0 ? void 0 : _api$context.channel;
21
+ const api = start(() => void 0);
22
+ const channel = (0, _helpers.isStorybookVersionLessThan)(6, 4) ? (_api$channel = api.channel) !== null && _api$channel !== void 0 ? _api$channel : (_api$context = api.context) === null || _api$context === void 0 ? void 0 : _api$context.channel : _addons.addons.getChannel();
23
23
  exports.channel = channel;
24
24
  const clientApi = api.clientApi;
25
25
  exports.clientApi = clientApi;
@@ -38,6 +38,7 @@ const configure = (...args) => {
38
38
  if ((0, _helpers.isStorybookVersionLessThan)(5, 2)) {
39
39
  //NOTE: Storybook <= 5.1 pass args as is
40
40
  //@ts-expect-error: ignore it
41
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
41
42
  return api.configApi.configure(...args);
42
43
  }
43
44
 
@@ -7,9 +7,11 @@ exports.hasDocsAddon = hasDocsAddon;
7
7
  exports.hasSvelteCSFAddon = hasSvelteCSFAddon;
8
8
  exports.getStorybookVersion = getStorybookVersion;
9
9
  exports.isStorybookVersionLessThan = isStorybookVersionLessThan;
10
+ exports.isStorybookVersionGreaterThan = isStorybookVersionGreaterThan;
10
11
  exports.isStorybookVersion = isStorybookVersion;
11
12
  exports.getStorybookFramework = getStorybookFramework;
12
13
  exports.importStorybookConfig = importStorybookConfig;
14
+ exports.isCSFv3Enabled = isCSFv3Enabled;
13
15
  exports.storybookConfigRef = exports.importStorybookCoreEvents = exports.importStorybookCoreCommon = exports.importStorybookClientLogger = exports.resolveFromStorybookCoreServer = exports.resolveFromStorybookCore = exports.resolveFromStorybookBuilderWebpack4 = exports.resolveFromStorybookAddonDocs = exports.resolveFromStorybook = exports.storybookDirRef = void 0;
14
16
 
15
17
  var _path = _interopRequireDefault(require("path"));
@@ -96,17 +98,24 @@ function isStorybookVersionLessThan(major, minor) {
96
98
  return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
97
99
  }
98
100
 
99
- function isStorybookVersion(major, minor) {
101
+ function isStorybookVersionGreaterThan(major, minor) {
100
102
  var _process$env$__CREEVE2;
101
103
 
102
104
  const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
105
+ return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
106
+ }
107
+
108
+ function isStorybookVersion(major, minor) {
109
+ var _process$env$__CREEVE3;
110
+
111
+ const [sbMajor, sbMinor] = ((_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : getStorybookVersion()).split('.');
103
112
  return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
104
113
  }
105
114
 
106
115
  function getStorybookFramework() {
107
- var _process$env$__CREEVE3;
116
+ var _process$env$__CREEVE4;
108
117
 
109
- const framework = (_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : supportedFrameworks.find(framework => {
118
+ const framework = (_process$env$__CREEVE4 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE4 !== void 0 ? _process$env$__CREEVE4 : supportedFrameworks.find(framework => {
110
119
  try {
111
120
  return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
112
121
  } catch (_) {
@@ -125,5 +134,32 @@ const storybookConfigRef = {
125
134
  exports.storybookConfigRef = storybookConfigRef;
126
135
 
127
136
  async function importStorybookConfig() {
128
- return storybookConfigRef.current = (await Promise.resolve(`${require.resolve(`${storybookDirRef.current}/main`)}`).then(s => _interopRequireWildcard(require(s)))).default;
137
+ const configPath = `${storybookDirRef.current}/main`;
138
+
139
+ try {
140
+ return storybookConfigRef.current = (await Promise.resolve(`${require.resolve(configPath)}`).then(s => _interopRequireWildcard(require(s)))).default;
141
+ } catch (_) {
142
+ const storybookUtilsPath = isStorybookVersionLessThan(6, 2) ? '@storybook/core/dist/server/utils' : '@storybook/core-common/dist/cjs/utils';
143
+ const serverRequireModule = isStorybookVersionLessThan(6, 2) ? 'server-require' : 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
144
+
145
+ const {
146
+ getInterpretedFile
147
+ } = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/interpret-files`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
148
+
149
+ const {
150
+ default: serverRequireFallback,
151
+ serverRequire = serverRequireFallback
152
+ } = await Promise.resolve(`${resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)}`).then(s => _interopRequireWildcard(require(s))); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
153
+
154
+ const mainConfigFile = isStorybookVersionLessThan(6, 1) ? configPath : // eslint-disable-next-line @typescript-eslint/no-unsafe-call
155
+ getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
156
+
157
+ return storybookConfigRef.current = serverRequire(mainConfigFile);
158
+ }
159
+ }
160
+
161
+ async function isCSFv3Enabled() {
162
+ var _await$importStoryboo, _await$importStoryboo2, _await$importStoryboo3;
163
+
164
+ return (_await$importStoryboo = (_await$importStoryboo2 = await importStorybookConfig()) === null || _await$importStoryboo2 === void 0 ? void 0 : (_await$importStoryboo3 = _await$importStoryboo2.features) === null || _await$importStoryboo3 === void 0 ? void 0 : _await$importStoryboo3.previewCsfV3) !== null && _await$importStoryboo !== void 0 ? _await$importStoryboo : false;
129
165
  }