creevey 0.7.39 → 0.9.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 (102) hide show
  1. package/CHANGELOG.md +12 -2
  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 -2
  6. package/lib/cjs/client/addon/preset.js +1 -0
  7. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  8. package/lib/cjs/client/addon/utils.js +1 -41
  9. package/lib/cjs/client/addon/withCreevey.js +313 -41
  10. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +3 -3
  11. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +3 -3
  12. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +4 -3
  13. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +3 -3
  14. package/lib/cjs/client/shared/helpers.js +1 -1
  15. package/lib/cjs/client/web/1.js +2 -2
  16. package/lib/cjs/client/web/2.js +1 -1
  17. package/lib/cjs/client/web/main.js +6 -6
  18. package/lib/cjs/index.js +27 -9
  19. package/lib/cjs/server/config.js +7 -3
  20. package/lib/cjs/server/extract.js +11 -4
  21. package/lib/cjs/server/index.js +2 -4
  22. package/lib/cjs/server/loaders/babel/register.js +2 -1
  23. package/lib/cjs/server/master/index.js +3 -9
  24. package/lib/cjs/server/master/master.js +1 -0
  25. package/lib/cjs/server/master/pool.js +29 -29
  26. package/lib/cjs/server/master/server.js +75 -3
  27. package/lib/cjs/server/messages.js +124 -12
  28. package/lib/cjs/server/parser.js +85 -0
  29. package/lib/cjs/server/selenium/browser.js +119 -21
  30. package/lib/cjs/server/selenium/selenoid.js +1 -1
  31. package/lib/cjs/server/stories.js +49 -58
  32. package/lib/cjs/server/storybook/entry.js +5 -4
  33. package/lib/cjs/server/storybook/helpers.js +11 -3
  34. package/lib/cjs/server/storybook/providers/browser.js +78 -0
  35. package/lib/cjs/server/storybook/providers/hybrid.js +79 -0
  36. package/lib/cjs/server/storybook/{nodejs-provider.js → providers/nodejs.js} +42 -18
  37. package/lib/cjs/server/utils.js +32 -2
  38. package/lib/cjs/server/worker/helpers.js +2 -6
  39. package/lib/cjs/server/worker/worker.js +15 -3
  40. package/lib/cjs/shared.js +107 -0
  41. package/lib/cjs/types.js +5 -0
  42. package/lib/esm/client/addon/Manager.js +3 -3
  43. package/lib/esm/client/addon/preset.js +1 -0
  44. package/lib/esm/client/addon/readyForCapture.js +5 -0
  45. package/lib/esm/client/addon/utils.js +1 -33
  46. package/lib/esm/client/addon/withCreevey.js +303 -41
  47. package/lib/esm/client/shared/components/ImagesView/BlendView.js +2 -3
  48. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +2 -3
  49. package/lib/esm/client/shared/components/ImagesView/SlideView.js +3 -3
  50. package/lib/esm/client/shared/components/ImagesView/SwapView.js +2 -3
  51. package/lib/esm/client/shared/helpers.js +1 -1
  52. package/lib/esm/index.js +6 -3
  53. package/lib/esm/server/config.js +7 -5
  54. package/lib/esm/server/extract.js +8 -4
  55. package/lib/esm/server/index.js +2 -3
  56. package/lib/esm/server/loaders/babel/register.js +3 -2
  57. package/lib/esm/server/master/index.js +4 -10
  58. package/lib/esm/server/master/master.js +1 -0
  59. package/lib/esm/server/master/pool.js +31 -31
  60. package/lib/esm/server/master/server.js +73 -5
  61. package/lib/esm/server/messages.js +118 -12
  62. package/lib/esm/server/parser.js +63 -0
  63. package/lib/esm/server/selenium/browser.js +116 -23
  64. package/lib/esm/server/selenium/selenoid.js +1 -1
  65. package/lib/esm/server/stories.js +51 -58
  66. package/lib/esm/server/storybook/entry.js +4 -4
  67. package/lib/esm/server/storybook/helpers.js +9 -3
  68. package/lib/esm/server/storybook/providers/browser.js +61 -0
  69. package/lib/esm/server/storybook/providers/hybrid.js +63 -0
  70. package/lib/esm/server/storybook/{nodejs-provider.js → providers/nodejs.js} +40 -18
  71. package/lib/esm/server/utils.js +29 -2
  72. package/lib/esm/server/worker/helpers.js +2 -6
  73. package/lib/esm/server/worker/worker.js +16 -4
  74. package/lib/esm/shared.js +76 -0
  75. package/lib/esm/types.js +3 -0
  76. package/lib/types/client/addon/preset.d.ts +2 -0
  77. package/lib/types/client/addon/readyForCapture.d.ts +6 -0
  78. package/lib/types/client/addon/utils.d.ts +1 -5
  79. package/lib/types/client/addon/withCreevey.d.ts +13 -2
  80. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +2 -2
  81. package/lib/types/index.d.ts +2 -1
  82. package/lib/types/server/config.d.ts +1 -1
  83. package/lib/types/server/master/master.d.ts +1 -0
  84. package/lib/types/server/master/pool.d.ts +1 -0
  85. package/lib/types/server/master/server.d.ts +1 -1
  86. package/lib/types/server/messages.d.ts +12 -2
  87. package/lib/types/server/parser.d.ts +12 -0
  88. package/lib/types/server/selenium/browser.d.ts +5 -2
  89. package/lib/types/server/stories.d.ts +1 -2
  90. package/lib/types/server/storybook/entry.d.ts +13 -9
  91. package/lib/types/server/storybook/helpers.d.ts +1 -0
  92. package/lib/types/server/storybook/providers/browser.d.ts +4 -0
  93. package/lib/types/server/storybook/providers/hybrid.d.ts +4 -0
  94. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
  95. package/lib/types/server/utils.d.ts +2 -0
  96. package/lib/types/server/worker/helpers.d.ts +2 -1
  97. package/lib/types/shared.d.ts +16 -0
  98. package/lib/types/types.d.ts +33 -4
  99. package/package.json +28 -18
  100. package/storybook-static/stories.json +4 -513
  101. package/types/mocha.d.ts +1 -0
  102. package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.loadStories = loadStories;
7
+ exports.extractStoriesData = extractStoriesData;
7
8
 
8
9
  var _path = _interopRequireDefault(require("path"));
9
10
 
@@ -11,17 +12,17 @@ var _cluster = require("cluster");
11
12
 
12
13
  var _chokidar = _interopRequireDefault(require("chokidar"));
13
14
 
14
- var _types = require("../../types");
15
+ var _types = require("../../../types");
15
16
 
16
- var _utils = require("../utils");
17
+ var _utils = require("../../utils");
17
18
 
18
- var _messages = require("../messages");
19
+ var _messages = require("../../messages");
19
20
 
20
- var _helpers = require("./helpers");
21
+ var _helpers = require("../helpers");
21
22
 
22
- var _logger = require("../logger");
23
+ var _logger = require("../../logger");
23
24
 
24
- var _stories = require("../stories");
25
+ var _shared = require("../../../shared");
25
26
 
26
27
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
27
28
 
@@ -30,7 +31,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
30
31
  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; }
31
32
 
32
33
  async function initStorybookEnvironment() {
33
- // @ts-ignore
34
+ // @ts-expect-error There is no @types/global-jsdom package
34
35
  (await Promise.resolve().then(() => _interopRequireWildcard(require('global-jsdom')))).default(undefined, {
35
36
  url: 'http://localhost'
36
37
  }); // NOTE Cutoff `jsdom` part from userAgent, because storybook check enviroment and create events channel if runs in browser
@@ -48,7 +49,7 @@ async function initStorybookEnvironment() {
48
49
  if (_cluster.isWorker) logger.warn = _types.noop; // NOTE: disable logger for 5.x storybook
49
50
 
50
51
  logger.debug = _types.noop;
51
- return Promise.resolve().then(() => _interopRequireWildcard(require('./entry')));
52
+ return Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
52
53
  }
53
54
 
54
55
  function watchStories(channel, watcher, initialFiles) {
@@ -59,7 +60,7 @@ function watchStories(channel, watcher, initialFiles) {
59
60
  watcher.on('change', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
60
61
  watcher.on('unlink', filePath => storiesByFiles.set(_path.default.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
61
62
  return data => {
62
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : (0, _stories.flatStories)(data);
63
+ const stories = (0, _helpers.isStorybookVersionLessThan)(6) || (0, _helpers.isStorybookVersionGreaterThan)(6, 3) ? data.stories : (0, _shared.denormalizeStoryParameters)(data);
63
64
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
64
65
  const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
65
66
  const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
@@ -104,13 +105,14 @@ async function loadStoriesDirectly(config, {
104
105
  debug
105
106
  }) {
106
107
  const {
107
- toRequireContext
108
+ toRequireContext,
109
+ normalizeStoriesEntry
108
110
  } = await (0, _helpers.importStorybookCoreCommon)();
109
111
  const {
110
112
  addParameters,
111
113
  configure
112
- } = await Promise.resolve().then(() => _interopRequireWildcard(require('./entry')));
113
- const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('../loaders/babel/register')))).default(config, debug);
114
+ } = await Promise.resolve().then(() => _interopRequireWildcard(require('../entry')));
115
+ const requireContext = await (await Promise.resolve().then(() => _interopRequireWildcard(require('../../loaders/babel/register')))).default(config, debug);
114
116
 
115
117
  const preview = (() => {
116
118
  try {
@@ -123,12 +125,16 @@ async function loadStoriesDirectly(config, {
123
125
  const {
124
126
  stories
125
127
  } = await (0, _helpers.importStorybookConfig)();
126
- const contexts = stories.map(input => {
128
+ const contexts = stories.map(entry => {
129
+ const normalizedEntry = (0, _helpers.isStorybookVersionLessThan)(6, 4) ? entry : normalizeStoriesEntry(entry, {
130
+ configDir: config.storybookDir,
131
+ workingDir: process.cwd()
132
+ });
127
133
  const {
128
134
  path: storiesPath,
129
135
  recursive,
130
136
  match
131
- } = toRequireContext(input);
137
+ } = toRequireContext(normalizedEntry);
132
138
  watcher === null || watcher === void 0 ? void 0 : watcher.add(_path.default.resolve(config.storybookDir, storiesPath));
133
139
  return () => requireContext(storiesPath, recursive, new RegExp(match));
134
140
  });
@@ -182,7 +188,8 @@ async function loadStoriesDirectly(config, {
182
188
  void startStorybook();
183
189
  });
184
190
  void startStorybook();
185
- }
191
+ } // TODO Do we need to support multiple storybooks here?
192
+
186
193
 
187
194
  async function loadStories(config, {
188
195
  watch,
@@ -195,16 +202,16 @@ async function loadStories(config, {
195
202
  } = storybookApi;
196
203
  channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
197
204
  channel.on('storiesUpdated', storiesListener);
198
- let watcher = null;
205
+ let watcher;
199
206
  if (watch) watcher = _chokidar.default.watch([], {
200
207
  ignoreInitial: true
201
208
  });
202
209
  const loadPromise = new Promise(resolve => {
203
210
  channel.once(Events.SET_STORIES, data => {
204
- const stories = (0, _helpers.isStorybookVersionLessThan)(6) ? data.stories : (0, _stories.flatStories)(data);
211
+ const stories = (0, _helpers.isStorybookVersionLessThan)(6) || (0, _helpers.isStorybookVersionGreaterThan)(6, 3) ? data.stories : (0, _shared.denormalizeStoryParameters)(data);
205
212
  const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
206
213
  if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
207
- resolve(data);
214
+ resolve(stories);
208
215
  });
209
216
  });
210
217
  if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
@@ -212,4 +219,21 @@ async function loadStories(config, {
212
219
  debug
213
220
  });
214
221
  return loadPromise;
222
+ }
223
+
224
+ async function extractStoriesData(config, {
225
+ watch,
226
+ debug
227
+ }) {
228
+ const storybookApi = await initStorybookEnvironment();
229
+ const Events = await (0, _helpers.importStorybookCoreEvents)();
230
+ const {
231
+ channel
232
+ } = storybookApi;
233
+ channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
234
+ const loadPromise = new Promise(resolve => channel.once(Events.SET_STORIES, resolve));
235
+ if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
236
+ debug
237
+ });
238
+ return loadPromise;
215
239
  }
@@ -10,7 +10,8 @@ exports.getCreeveyCache = getCreeveyCache;
10
10
  exports.runSequence = runSequence;
11
11
  exports.testsToImages = testsToImages;
12
12
  exports.removeProps = removeProps;
13
- exports.downloadBinary = exports.isInsideDocker = exports.extensions = exports.LOCALHOST_REGEXP = exports.isShuttingDown = void 0;
13
+ exports.readDirRecursive = readDirRecursive;
14
+ exports.downloadBinary = exports.isInsideDocker = exports.skipOptionKeys = exports.extensions = exports.LOCALHOST_REGEXP = exports.isShuttingDown = void 0;
14
15
 
15
16
  var _fs = require("fs");
16
17
 
@@ -34,6 +35,8 @@ const LOCALHOST_REGEXP = /(localhost|127\.0\.0\.1)/i;
34
35
  exports.LOCALHOST_REGEXP = LOCALHOST_REGEXP;
35
36
  const extensions = ['.js', '.jsx', '.ts', '.tsx'];
36
37
  exports.extensions = extensions;
38
+ const skipOptionKeys = ['in', 'kinds', 'stories', 'tests', 'reason'];
39
+ exports.skipOptionKeys = skipOptionKeys;
37
40
 
38
41
  function matchBy(pattern, value) {
39
42
  return typeof pattern == 'string' && pattern == value || Array.isArray(pattern) && pattern.includes(value) || pattern instanceof RegExp && pattern.test(value) || !(0, _types.isDefined)(pattern);
@@ -45,9 +48,30 @@ function shouldSkip(browser, meta, skipOptions, test) {
45
48
  }
46
49
 
47
50
  if (Array.isArray(skipOptions)) {
48
- return skipOptions.map(skipOption => shouldSkip(browser, meta, skipOption, test)).find(Boolean) || false;
51
+ for (const skip of skipOptions) {
52
+ const reason = shouldSkip(browser, meta, skip, test);
53
+ if (reason) return reason;
54
+ }
55
+
56
+ return false;
49
57
  }
50
58
 
59
+ let hasSkipOptionKeys = false;
60
+
61
+ for (const skipKey in skipOptions) {
62
+ if (skipOptionKeys.includes(skipKey)) {
63
+ hasSkipOptionKeys = true;
64
+ continue;
65
+ }
66
+
67
+ const reason = shouldSkip(browser, meta, {
68
+ reason: skipKey,
69
+ ...skipOptions[skipKey]
70
+ }, test);
71
+ if (reason) return reason;
72
+ }
73
+
74
+ if (!hasSkipOptionKeys) return false;
51
75
  const {
52
76
  in: browsers,
53
77
  kinds,
@@ -152,4 +176,10 @@ function removeProps(obj, propPath) {
152
176
  if (typeof prop == 'string') delete obj[prop];
153
177
  if ((0, _types.isFunction)(prop)) Object.keys(obj).filter(prop).forEach(key => delete obj[key]);
154
178
  }
179
+ }
180
+
181
+ function readDirRecursive(dirPath) {
182
+ return [].concat(...(0, _fs.readdirSync)(dirPath, {
183
+ withFileTypes: true
184
+ }).map(dirent => dirent.isDirectory() ? readDirRecursive(`${dirPath}/${dirent.name}`) : [`${dirPath}/${dirent.name}`]));
155
185
  }
@@ -56,14 +56,10 @@ function removeTestOrSuite(testOrSuite) {
56
56
 
57
57
  async function addTestsFromStories(rootSuite, config, {
58
58
  browser,
59
- watch,
60
- debug
59
+ ...options
61
60
  }) {
62
61
  const mochaTestsById = new Map();
63
- const tests = await (0, _stories.loadTestsFromStories)([browser], listener => config.storiesProvider(config, {
64
- watch,
65
- debug
66
- }, listener), testsDiff => Object.entries(testsDiff).forEach(([id, newTest]) => {
62
+ const tests = await (0, _stories.loadTestsFromStories)([browser], listener => config.storiesProvider(config, options, listener), testsDiff => Object.entries(testsDiff).forEach(([id, newTest]) => {
67
63
  const oldTest = mochaTestsById.get(id);
68
64
  mochaTestsById.delete(id);
69
65
  if (oldTest) removeTestOrSuite(oldTest);
@@ -72,6 +72,7 @@ async function worker(config, options) {
72
72
  let retries = 0;
73
73
  let images = {};
74
74
  let error = undefined;
75
+ const screenshots = [];
75
76
  const testScope = [];
76
77
 
77
78
  function runHandler(failures) {
@@ -201,13 +202,23 @@ async function worker(config, options) {
201
202
 
202
203
  _chai.default.use((0, _chaiImage.default)(getExpected, config.diffOptions));
203
204
 
205
+ if ((await (0, _selenium.getBrowser)(config, options.browser)) == null) return;
204
206
  await (0, _helpers.addTestsFromStories)(mocha.suite, config, {
205
207
  browser: options.browser,
206
208
  watch: options.ui,
207
- debug: options.debug
209
+ debug: options.debug,
210
+ port: options.port
208
211
  });
209
- const browserConfig = config.browsers[options.browser];
210
- const browser = await (0, _selenium.getBrowser)(config, browserConfig);
212
+
213
+ try {
214
+ var _await$getBrowser;
215
+
216
+ await ((_await$getBrowser = await (0, _selenium.getBrowser)(config, options.browser)) === null || _await$getBrowser === void 0 ? void 0 : _await$getBrowser.getCurrentUrl());
217
+ } catch (_) {
218
+ await (0, _selenium.closeBrowser)();
219
+ }
220
+
221
+ const browser = await (0, _selenium.getBrowser)(config, options.browser);
211
222
  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();
212
223
  if (browser == null) return;
213
224
  const interval = setInterval(() => void browser.getCurrentUrl().then(url => {
@@ -222,6 +233,7 @@ async function worker(config, options) {
222
233
  this.expect = _chai.default.expect;
223
234
  this.browserName = options.browser;
224
235
  this.testScope = testScope;
236
+ this.screenshots = screenshots;
225
237
  });
226
238
  mocha.suite.beforeEach(_selenium.switchStory);
227
239
  (0, _messages.subscribeOn)('test', message => {
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.deserializeStory = exports.deserializeRawStories = exports.serializeRawStories = exports.deserializeRegExp = exports.serializeRegExp = exports.isSerializedRegExp = exports.denormalizeStoryParameters = exports.combineParameters = void 0;
7
+
8
+ var _lodash = require("lodash");
9
+
10
+ // NOTE: Copy-paste from storybook/api
11
+ const combineParameters = (...parameterSets) => // eslint-disable-next-line @typescript-eslint/no-unsafe-return
12
+ (0, _lodash.mergeWith)({}, ...parameterSets, (_, srcValue) => {
13
+ // Treat arrays as scalars:
14
+ if (Array.isArray(srcValue)) return srcValue;
15
+ return undefined;
16
+ }); // NOTE: Copy-paste from storybook/api
17
+
18
+
19
+ exports.combineParameters = combineParameters;
20
+
21
+ const denormalizeStoryParameters = ({
22
+ globalParameters,
23
+ kindParameters,
24
+ stories
25
+ }) => {
26
+ return (0, _lodash.mapValues)(stories, storyData => {
27
+ var _globalParameters$cre, _kindParameters$story, _kindParameters$story2;
28
+
29
+ storyData.parameters.creevey = combineParameters((_globalParameters$cre = globalParameters.creevey) !== null && _globalParameters$cre !== void 0 ? _globalParameters$cre : {}, (_kindParameters$story = (_kindParameters$story2 = kindParameters[storyData.kind]) === null || _kindParameters$story2 === void 0 ? void 0 : _kindParameters$story2.creevey) !== null && _kindParameters$story !== void 0 ? _kindParameters$story : {}, storyData.parameters.creevey);
30
+ return storyData;
31
+ });
32
+ };
33
+
34
+ exports.denormalizeStoryParameters = denormalizeStoryParameters;
35
+
36
+ const isSerializedRegExp = exp => {
37
+ return typeof exp === 'object' && exp !== null && Reflect.get(exp, '__regexp') === true;
38
+ };
39
+
40
+ exports.isSerializedRegExp = isSerializedRegExp;
41
+
42
+ const serializeRegExp = exp => {
43
+ const {
44
+ source,
45
+ flags
46
+ } = exp;
47
+ return {
48
+ __regexp: true,
49
+ source,
50
+ flags
51
+ };
52
+ };
53
+
54
+ exports.serializeRegExp = serializeRegExp;
55
+
56
+ const deserializeRegExp = ({
57
+ source,
58
+ flags
59
+ }) => {
60
+ return new RegExp(source, flags);
61
+ };
62
+
63
+ exports.deserializeRegExp = deserializeRegExp;
64
+
65
+ const serializeRawStories = stories => {
66
+ return (0, _lodash.mapValues)(stories, storyData => {
67
+ const creevey = storyData.parameters.creevey;
68
+
69
+ if ((creevey === null || creevey === void 0 ? void 0 : creevey.skip) !== undefined) {
70
+ creevey.skip = (0, _lodash.cloneDeepWith)(creevey.skip, value => {
71
+ if (value instanceof RegExp) {
72
+ return serializeRegExp(value);
73
+ }
74
+
75
+ return undefined;
76
+ });
77
+ }
78
+
79
+ return storyData;
80
+ });
81
+ };
82
+
83
+ exports.serializeRawStories = serializeRawStories;
84
+
85
+ const deserializeRawStories = stories => {
86
+ return (0, _lodash.mapValues)(stories, deserializeStory);
87
+ };
88
+
89
+ exports.deserializeRawStories = deserializeRawStories;
90
+
91
+ const deserializeStory = story => {
92
+ const creevey = story.parameters.creevey;
93
+
94
+ if ((creevey === null || creevey === void 0 ? void 0 : creevey.skip) !== undefined) {
95
+ creevey.skip = (0, _lodash.cloneDeepWith)(creevey.skip, value => {
96
+ if (isSerializedRegExp(value)) {
97
+ return deserializeRegExp(value);
98
+ }
99
+
100
+ return undefined;
101
+ });
102
+ }
103
+
104
+ return story;
105
+ };
106
+
107
+ exports.deserializeStory = deserializeStory;
package/lib/cjs/types.js CHANGED
@@ -12,6 +12,7 @@ exports.isFunction = isFunction;
12
12
  exports.isImageError = isImageError;
13
13
  exports.isProcessMessage = isProcessMessage;
14
14
  exports.isWorkerMessage = isWorkerMessage;
15
+ exports.isStoriesMessage = isStoriesMessage;
15
16
  exports.isTestMessage = isTestMessage;
16
17
  exports.isWebpackMessage = isWebpackMessage;
17
18
  exports.isDockerMessage = isDockerMessage;
@@ -56,6 +57,10 @@ function isWorkerMessage(message) {
56
57
  return isProcessMessage(message) && message.scope == 'worker';
57
58
  }
58
59
 
60
+ function isStoriesMessage(message) {
61
+ return isProcessMessage(message) && message.scope == 'stories';
62
+ }
63
+
59
64
  function isTestMessage(message) {
60
65
  return isProcessMessage(message) && message.scope == 'test';
61
66
  }
@@ -31,11 +31,12 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
31
31
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
32
32
 
33
33
  import { SET_STORIES, STORY_RENDERED } from '@storybook/core-events';
34
+ import { denormalizeStoryParameters } from '../../shared';
34
35
  import { isDefined } from '../../types';
35
36
  import { initCreeveyClientApi } from '../shared/creeveyClientApi';
36
37
  import { calcStatus } from '../shared/helpers';
37
38
  import { ADDON_ID } from './register';
38
- import { getEmojiByTestStatus, denormalizeStoryParameters } from './utils';
39
+ import { getEmojiByTestStatus } from './utils';
39
40
  export var CreeveyManager = /*#__PURE__*/function () {
40
41
  function CreeveyManager(storybookApi) {
41
42
  var _this = this;
@@ -229,8 +230,7 @@ export var CreeveyManager = /*#__PURE__*/function () {
229
230
  });
230
231
 
231
232
  _defineProperty(this, "onSetStories", function (data) {
232
- // TODO: Send PR to storybook to fix this
233
- var stories = data.v ? denormalizeStoryParameters(data) : data;
233
+ var stories = data.v ? denormalizeStoryParameters(data) : data.stories;
234
234
  _this.stories = stories;
235
235
  });
236
236
 
@@ -47,6 +47,7 @@ export function managerWebpack(config, options) {
47
47
  DefinePlugin = _ref$DefinePlugin === void 0 ? FallbackDefinePlugin : _ref$DefinePlugin;
48
48
 
49
49
  (_config$plugins = config.plugins) === null || _config$plugins === void 0 ? void 0 : _config$plugins.push(new DefinePlugin({
50
+ __CREEVEY_SERVER_HOST__: options.creeveyHost,
50
51
  __CREEVEY_SERVER_PORT__: (_options$creeveyPort = options.creeveyPort) !== null && _options$creeveyPort !== void 0 ? _options$creeveyPort : 3000,
51
52
  __CREEVEY_CLIENT_PORT__: options.clientPort
52
53
  }));
@@ -0,0 +1,5 @@
1
+ export function readyForCapture() {
2
+ var _window$__CREEVEY_SET, _window;
3
+
4
+ (_window$__CREEVEY_SET = (_window = window).__CREEVEY_SET_READY_FOR_CAPTURE__) === null || _window$__CREEVEY_SET === void 0 ? void 0 : _window$__CREEVEY_SET.call(_window);
5
+ }
@@ -1,10 +1,3 @@
1
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
2
-
3
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
4
-
5
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
- import { mapValues, mergeWith } from 'lodash';
8
1
  export function getEmojiByTestStatus(status) {
9
2
  var skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
10
3
 
@@ -35,29 +28,4 @@ export function getEmojiByTestStatus(status) {
35
28
  return '';
36
29
  }
37
30
  }
38
- } // NOTE: Copy-paste from storybook/api
39
-
40
- export var combineParameters = function combineParameters() {
41
- for (var _len = arguments.length, parameterSets = new Array(_len), _key = 0; _key < _len; _key++) {
42
- parameterSets[_key] = arguments[_key];
43
- }
44
-
45
- return (// eslint-disable-next-line @typescript-eslint/no-unsafe-return
46
- mergeWith.apply(void 0, [{}].concat(parameterSets, [function (_, srcValue) {
47
- // Treat arrays as scalars:
48
- if (Array.isArray(srcValue)) return srcValue;
49
- return undefined;
50
- }]))
51
- );
52
- }; // NOTE: Copy-paste from storybook/api
53
-
54
- export var denormalizeStoryParameters = function denormalizeStoryParameters(_ref) {
55
- var globalParameters = _ref.globalParameters,
56
- kindParameters = _ref.kindParameters,
57
- stories = _ref.stories;
58
- return mapValues(stories, function (storyData) {
59
- return _objectSpread(_objectSpread({}, storyData), {}, {
60
- parameters: combineParameters(globalParameters, kindParameters[storyData.kind], storyData.parameters)
61
- });
62
- });
63
- };
31
+ }