creevey 0.8.0-beta.0 → 0.8.0-beta.1

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 (196) hide show
  1. package/CHANGELOG.md +25 -8
  2. package/README.md +8 -0
  3. package/addon/README.md +3 -0
  4. package/addon/package.json +4 -0
  5. package/jest.config.js +6 -0
  6. package/lib/cjs/client/addon/Manager.js +122 -271
  7. package/lib/cjs/client/addon/components/Addon.js +17 -38
  8. package/lib/cjs/client/addon/components/Icons.js +11 -7
  9. package/lib/cjs/client/addon/components/Panel.js +17 -13
  10. package/lib/cjs/client/addon/components/TestSelect.js +11 -9
  11. package/lib/cjs/client/addon/components/Tools.js +21 -40
  12. package/lib/cjs/client/addon/decorator.js +1 -1
  13. package/lib/cjs/client/addon/index.js +31 -0
  14. package/lib/cjs/client/addon/preset.ie11.js +74 -0
  15. package/lib/cjs/client/addon/preset.js +13 -31
  16. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  17. package/lib/cjs/client/addon/register.js +46 -70
  18. package/lib/cjs/client/addon/utils.js +6 -2
  19. package/lib/cjs/client/addon/withCreevey.js +221 -155
  20. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +26 -24
  21. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +22 -18
  22. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +44 -66
  23. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +38 -50
  24. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -45
  25. package/lib/cjs/client/shared/components/ImagesView/index.js +9 -9
  26. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +12 -8
  27. package/lib/cjs/client/shared/components/PageFooter/Paging.js +14 -18
  28. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +22 -18
  29. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +42 -67
  30. package/lib/cjs/client/shared/components/ResultsPage.js +39 -69
  31. package/lib/cjs/client/shared/creeveyClientApi.js +55 -82
  32. package/lib/cjs/client/shared/helpers.js +140 -211
  33. package/lib/cjs/client/shared/viewMode.js +5 -5
  34. package/lib/cjs/client/web/142.js +2 -0
  35. package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
  36. package/lib/cjs/client/web/32.js +1 -0
  37. package/lib/cjs/client/web/551.js +1 -0
  38. package/lib/cjs/client/web/566.js +2 -0
  39. package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
  40. package/lib/cjs/client/web/691.js +2 -0
  41. package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
  42. package/lib/cjs/client/web/725.js +1 -0
  43. package/lib/cjs/client/web/main.js +2 -38
  44. package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
  45. package/lib/cjs/creevey.js +3 -5
  46. package/lib/cjs/index.js +10 -15
  47. package/lib/cjs/server/config.js +5 -4
  48. package/lib/cjs/server/docker.js +3 -7
  49. package/lib/cjs/server/extract.js +7 -4
  50. package/lib/cjs/server/index.js +3 -5
  51. package/lib/cjs/server/loaders/babel/creevey-plugin.js +1 -3
  52. package/lib/cjs/server/loaders/babel/helpers.js +13 -23
  53. package/lib/cjs/server/loaders/babel/register.js +2 -4
  54. package/lib/cjs/server/loaders/webpack/compile.js +33 -50
  55. package/lib/cjs/server/loaders/webpack/creevey-loader.js +20 -22
  56. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +2 -7
  57. package/lib/cjs/server/loaders/webpack/mdx-loader.js +2 -2
  58. package/lib/cjs/server/loaders/webpack/start.js +1 -1
  59. package/lib/cjs/server/logger.js +2 -1
  60. package/lib/cjs/server/master/index.js +4 -4
  61. package/lib/cjs/server/master/master.js +1 -0
  62. package/lib/cjs/server/master/pool.js +38 -47
  63. package/lib/cjs/server/master/runner.js +53 -66
  64. package/lib/cjs/server/master/server.js +78 -4
  65. package/lib/cjs/server/messages.js +128 -18
  66. package/lib/cjs/server/selenium/browser.js +129 -55
  67. package/lib/cjs/server/selenium/selenoid.js +5 -7
  68. package/lib/cjs/server/stories.js +58 -72
  69. package/lib/cjs/server/storybook/entry.js +7 -22
  70. package/lib/cjs/server/storybook/helpers.js +18 -25
  71. package/lib/cjs/server/storybook/providers/browser.js +74 -0
  72. package/lib/cjs/server/storybook/{nodejs-provider.js → providers/nodejs.js} +37 -20
  73. package/lib/cjs/server/update.js +1 -5
  74. package/lib/cjs/server/utils.js +12 -14
  75. package/lib/cjs/server/worker/helpers.js +2 -6
  76. package/lib/cjs/server/worker/reporter.js +8 -20
  77. package/lib/cjs/server/worker/worker.js +21 -19
  78. package/lib/cjs/shared/index.js +101 -0
  79. package/lib/cjs/shared/serializeRegExp.js +42 -0
  80. package/lib/cjs/types.js +11 -6
  81. package/lib/esm/client/addon/Manager.js +122 -271
  82. package/lib/esm/client/addon/components/Addon.js +15 -34
  83. package/lib/esm/client/addon/components/Icons.js +10 -6
  84. package/lib/esm/client/addon/components/Panel.js +17 -13
  85. package/lib/esm/client/addon/components/TestSelect.js +11 -9
  86. package/lib/esm/client/addon/components/Tools.js +19 -36
  87. package/lib/esm/client/addon/decorator.js +1 -1
  88. package/lib/esm/client/addon/index.js +2 -0
  89. package/lib/esm/client/addon/preset.ie11.js +59 -0
  90. package/lib/esm/client/addon/preset.js +12 -26
  91. package/lib/esm/client/addon/readyForCapture.js +5 -0
  92. package/lib/esm/client/addon/register.js +42 -66
  93. package/lib/esm/client/addon/utils.js +3 -2
  94. package/lib/esm/client/addon/withCreevey.js +209 -156
  95. package/lib/esm/client/shared/components/ImagesView/BlendView.js +23 -20
  96. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +21 -17
  97. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +42 -63
  98. package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
  99. package/lib/esm/client/shared/components/ImagesView/SwapView.js +24 -42
  100. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
  101. package/lib/esm/client/shared/components/PageFooter/Paging.js +14 -18
  102. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +22 -18
  103. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +37 -60
  104. package/lib/esm/client/shared/components/ResultsPage.js +36 -64
  105. package/lib/esm/client/shared/creeveyClientApi.js +57 -84
  106. package/lib/esm/client/shared/helpers.js +124 -195
  107. package/lib/esm/client/shared/viewMode.js +4 -4
  108. package/lib/esm/creevey.js +3 -5
  109. package/lib/esm/index.js +2 -3
  110. package/lib/esm/server/config.js +4 -5
  111. package/lib/esm/server/docker.js +2 -2
  112. package/lib/esm/server/extract.js +6 -4
  113. package/lib/esm/server/index.js +3 -4
  114. package/lib/esm/server/loaders/babel/creevey-plugin.js +1 -3
  115. package/lib/esm/server/loaders/babel/helpers.js +12 -22
  116. package/lib/esm/server/loaders/babel/register.js +3 -5
  117. package/lib/esm/server/loaders/webpack/compile.js +34 -51
  118. package/lib/esm/server/loaders/webpack/creevey-loader.js +9 -10
  119. package/lib/esm/server/loaders/webpack/dummy-hmr.js +2 -6
  120. package/lib/esm/server/loaders/webpack/mdx-loader.js +2 -2
  121. package/lib/esm/server/loaders/webpack/start.js +1 -1
  122. package/lib/esm/server/master/index.js +4 -4
  123. package/lib/esm/server/master/master.js +1 -0
  124. package/lib/esm/server/master/pool.js +38 -49
  125. package/lib/esm/server/master/runner.js +53 -66
  126. package/lib/esm/server/master/server.js +76 -6
  127. package/lib/esm/server/messages.js +118 -14
  128. package/lib/esm/server/selenium/browser.js +126 -57
  129. package/lib/esm/server/selenium/selenoid.js +4 -6
  130. package/lib/esm/server/stories.js +58 -70
  131. package/lib/esm/server/storybook/entry.js +5 -22
  132. package/lib/esm/server/storybook/helpers.js +10 -19
  133. package/lib/esm/server/storybook/providers/browser.js +60 -0
  134. package/lib/esm/server/storybook/{nodejs-provider.js → providers/nodejs.js} +35 -19
  135. package/lib/esm/server/update.js +1 -5
  136. package/lib/esm/server/utils.js +5 -9
  137. package/lib/esm/server/worker/helpers.js +2 -6
  138. package/lib/esm/server/worker/reporter.js +8 -20
  139. package/lib/esm/server/worker/worker.js +22 -20
  140. package/lib/esm/shared/index.js +78 -0
  141. package/lib/esm/shared/serializeRegExp.js +24 -0
  142. package/lib/esm/types.js +3 -0
  143. package/lib/types/client/addon/Manager.d.ts +2 -2
  144. package/lib/types/client/addon/components/TestSelect.d.ts +0 -1
  145. package/lib/types/client/addon/index.d.ts +2 -0
  146. package/lib/types/client/addon/preset.d.ts +2 -1
  147. package/lib/types/client/addon/preset.ie11.d.ts +10 -0
  148. package/lib/types/client/addon/readyForCapture.d.ts +6 -0
  149. package/lib/types/client/addon/utils.d.ts +1 -0
  150. package/lib/types/client/addon/withCreevey.d.ts +13 -2
  151. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  152. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +0 -1
  153. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  154. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  155. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  156. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +0 -1
  157. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +0 -1
  158. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +1 -1
  159. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +0 -1
  160. package/lib/types/client/shared/components/ResultsPage.d.ts +1 -1
  161. package/lib/types/client/web/CreeveyApp.d.ts +0 -1
  162. package/lib/types/client/web/CreeveyLoader.d.ts +1 -2
  163. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  164. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +0 -1
  165. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
  166. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +0 -1
  167. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +1 -1
  168. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +1 -1
  169. package/lib/types/index.d.ts +0 -1
  170. package/lib/types/server/loaders/babel/register.d.ts +1 -1
  171. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  172. package/lib/types/server/logger.d.ts +6 -2
  173. package/lib/types/server/master/master.d.ts +1 -0
  174. package/lib/types/server/master/pool.d.ts +1 -0
  175. package/lib/types/server/master/server.d.ts +1 -1
  176. package/lib/types/server/messages.d.ts +17 -6
  177. package/lib/types/server/selenium/browser.d.ts +5 -2
  178. package/lib/types/server/stories.d.ts +2 -2
  179. package/lib/types/server/storybook/entry.d.ts +1 -2
  180. package/lib/types/server/storybook/providers/browser.d.ts +4 -0
  181. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
  182. package/lib/types/server/worker/helpers.d.ts +2 -1
  183. package/lib/types/shared/index.d.ts +7 -0
  184. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  185. package/lib/types/types.d.ts +31 -3
  186. package/package.json +121 -103
  187. package/preset/ie11.js +5 -0
  188. package/{preset.js → preset/index.js} +2 -2
  189. package/types/mdx.d.ts +3 -2
  190. package/types/mocha.d.ts +1 -0
  191. package/lib/cjs/client/web/1.js +0 -13
  192. package/lib/cjs/client/web/2.js +0 -1
  193. package/lib/cjs/shared.js +0 -35
  194. package/lib/esm/shared.js +0 -22
  195. package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
  196. package/lib/types/shared.d.ts +0 -4
@@ -1,5 +1,3 @@
1
- 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; }
2
-
3
1
  import path from 'path';
4
2
  import { copyFile, mkdir } from 'fs';
5
3
  import { promisify } from 'util';
@@ -9,63 +7,40 @@ import Pool from './pool';
9
7
  const copyFileAsync = promisify(copyFile);
10
8
  const mkdirAsync = promisify(mkdir);
11
9
  export default class Runner extends EventEmitter {
10
+ pools = {};
11
+ tests = {};
12
+
12
13
  get isRunning() {
13
14
  return Object.values(this.pools).some(pool => pool.isRunning);
14
15
  }
15
16
 
16
17
  constructor(config) {
17
18
  super();
19
+ this.failFast = config.failFast;
20
+ this.screenDir = config.screenDir;
21
+ this.reportDir = config.reportDir;
22
+ this.browsers = Object.keys(config.browsers);
23
+ this.browsers.map(browser => this.pools[browser] = new Pool(config, browser)).map(pool => pool.on('test', this.handlePoolMessage));
24
+ }
18
25
 
19
- _defineProperty(this, "failFast", void 0);
20
-
21
- _defineProperty(this, "screenDir", void 0);
22
-
23
- _defineProperty(this, "reportDir", void 0);
24
-
25
- _defineProperty(this, "browsers", void 0);
26
-
27
- _defineProperty(this, "pools", {});
28
-
29
- _defineProperty(this, "tests", {});
30
-
31
- _defineProperty(this, "handlePoolMessage", message => {
32
- const {
33
- id,
34
- status,
35
- result
36
- } = message;
37
- const test = this.tests[id];
38
- if (!test) return;
39
- const {
40
- browser,
41
- testName,
42
- storyPath,
43
- storyId
44
- } = test; // TODO Handle 'retrying' status
45
-
46
- test.status = status == 'retrying' ? 'failed' : status;
47
-
48
- if (!result) {
49
- this.sendUpdate({
50
- tests: {
51
- [id]: {
52
- id,
53
- browser,
54
- testName,
55
- storyPath,
56
- status: test.status,
57
- storyId
58
- }
59
- }
60
- });
61
- return;
62
- }
26
+ handlePoolMessage = message => {
27
+ const {
28
+ id,
29
+ status,
30
+ result
31
+ } = message;
32
+ const test = this.tests[id];
33
+ if (!test) return;
34
+ const {
35
+ browser,
36
+ testName,
37
+ storyPath,
38
+ storyId
39
+ } = test; // TODO Handle 'retrying' status
63
40
 
64
- if (!test.results) {
65
- test.results = [];
66
- }
41
+ test.status = status == 'retrying' ? 'failed' : status;
67
42
 
68
- test.results.push(result);
43
+ if (!result) {
69
44
  this.sendUpdate({
70
45
  tests: {
71
46
  [id]: {
@@ -74,29 +49,41 @@ export default class Runner extends EventEmitter {
74
49
  testName,
75
50
  storyPath,
76
51
  status: test.status,
77
- results: [result],
78
52
  storyId
79
53
  }
80
54
  }
81
55
  });
82
- if (this.failFast && status == 'failed') this.stop();
83
- });
56
+ return;
57
+ }
84
58
 
85
- _defineProperty(this, "handlePoolStop", () => {
86
- if (!this.isRunning) {
87
- this.sendUpdate({
88
- isRunning: false
89
- });
90
- this.emit('stop');
59
+ if (!test.results) {
60
+ test.results = [];
61
+ }
62
+
63
+ test.results.push(result);
64
+ this.sendUpdate({
65
+ tests: {
66
+ [id]: {
67
+ id,
68
+ browser,
69
+ testName,
70
+ storyPath,
71
+ status: test.status,
72
+ results: [result],
73
+ storyId
74
+ }
91
75
  }
92
76
  });
93
-
94
- this.failFast = config.failFast;
95
- this.screenDir = config.screenDir;
96
- this.reportDir = config.reportDir;
97
- this.browsers = Object.keys(config.browsers);
98
- this.browsers.map(browser => this.pools[browser] = new Pool(config, browser)).map(pool => pool.on('test', this.handlePoolMessage));
99
- }
77
+ if (this.failFast && status == 'failed') this.stop();
78
+ };
79
+ handlePoolStop = () => {
80
+ if (!this.isRunning) {
81
+ this.sendUpdate({
82
+ isRunning: false
83
+ });
84
+ this.emit('stop');
85
+ }
86
+ };
100
87
 
101
88
  async init() {
102
89
  await Promise.all(Object.values(this.pools).map(pool => pool.init()));
@@ -1,22 +1,90 @@
1
1
  import path from 'path';
2
2
  import http from 'http';
3
+ import cluster from 'cluster';
3
4
  import Koa from 'koa';
5
+ import cors from '@koa/cors';
4
6
  import serve from 'koa-static';
5
7
  import mount from 'koa-mount';
8
+ import body from 'koa-bodyparser';
6
9
  import WebSocket from 'ws';
7
- import { subscribeOn } from '../messages';
8
- import { noop } from '../../types';
10
+ import { emitStoriesMessage, sendStoriesMessage, subscribeOn, subscribeOnWorker } from '../messages';
11
+ import { isDefined, noop } from '../../types';
9
12
  import { logger } from '../logger';
10
- export default function server(reportDir, port) {
13
+ import { deserializeStory } from '../../shared';
14
+ export default function server(reportDir, port, ui) {
11
15
  let resolveApi = noop;
16
+ let setStoriesCounter = 0;
12
17
  const creeveyApi = new Promise(resolve => resolveApi = resolve);
13
18
  const app = new Koa();
14
19
  const server = http.createServer(app.callback());
15
20
  const wss = new WebSocket.Server({
16
21
  server
17
22
  });
18
- app.use(async (_, next) => {
19
- await creeveyApi;
23
+ app.use(cors());
24
+ app.use(body());
25
+ app.use(async (ctx, next) => {
26
+ if (ctx.method == 'GET' && ctx.path == '/ping') {
27
+ ctx.body = 'pong';
28
+ return;
29
+ }
30
+
31
+ await next();
32
+ });
33
+
34
+ if (ui) {
35
+ app.use(async (_, next) => {
36
+ await creeveyApi;
37
+ await next();
38
+ });
39
+ }
40
+
41
+ app.use(async (ctx, next) => {
42
+ if (ctx.method == 'POST' && ctx.path == '/stories') {
43
+ const {
44
+ setStoriesCounter: counter,
45
+ stories
46
+ } = ctx.request.body;
47
+ if (setStoriesCounter >= counter) return;
48
+ const deserializedStories = stories.map(([file, stories]) => [file, stories.map(deserializeStory)]);
49
+ setStoriesCounter = counter;
50
+ emitStoriesMessage({
51
+ type: 'update',
52
+ payload: deserializedStories
53
+ });
54
+ Object.values(cluster.workers ?? {}).filter(isDefined).filter(worker => worker.isConnected()).forEach(worker => sendStoriesMessage(worker, {
55
+ type: 'update',
56
+ payload: deserializedStories
57
+ }));
58
+ return;
59
+ }
60
+
61
+ await next();
62
+ });
63
+ app.use(async (ctx, next) => {
64
+ if (ctx.method == 'POST' && ctx.path == '/capture') {
65
+ const {
66
+ workerId,
67
+ options
68
+ } = ctx.request.body;
69
+ const worker = Object.values(cluster.workers ?? {}).filter(isDefined).find(worker => worker.process.pid == workerId); // NOTE: Hypothetical case when someone send to us capture req and we don't have a worker with browser session for it
70
+
71
+ if (!worker) return;
72
+ await new Promise(resolve => {
73
+ const unsubscribe = subscribeOnWorker(worker, 'stories', message => {
74
+ if (message.type != 'capture') return;
75
+ unsubscribe();
76
+ resolve();
77
+ });
78
+ sendStoriesMessage(worker, {
79
+ type: 'capture',
80
+ payload: options
81
+ });
82
+ }); // TODO Pass screenshot result to show it in inspector
83
+
84
+ ctx.body = 'Ok';
85
+ return;
86
+ }
87
+
20
88
  await next();
21
89
  });
22
90
  app.use(serve(path.join(__dirname, '../../client/web')));
@@ -30,7 +98,9 @@ export default function server(reportDir, port) {
30
98
  void creeveyApi.then(api => {
31
99
  api.subscribe(wss);
32
100
  wss.on('connection', ws => {
33
- ws.on('message', message => api.handleMessage(ws, message));
101
+ ws.on('message', (message, isBinary) => {
102
+ api.handleMessage(ws, isBinary ? message : message.toString());
103
+ });
34
104
  });
35
105
  });
36
106
  return resolveApi;
@@ -1,10 +1,10 @@
1
1
  import cluster from 'cluster';
2
2
 
3
3
  function emitMessage(message) {
4
- var _process$send, _process$send2, _process;
4
+ var _process$send, _process;
5
5
 
6
6
  if (cluster.isWorker && !process.connected) return false;
7
- return (_process$send = (_process$send2 = (_process = process).send) === null || _process$send2 === void 0 ? void 0 : _process$send2.call(_process, message)) !== null && _process$send !== void 0 ? _process$send : // @ts-expect-error: wrong typings `process.emit` return boolean
7
+ return ((_process$send = (_process = process).send) === null || _process$send === void 0 ? void 0 : _process$send.call(_process, message)) ?? // @ts-expect-error: wrong typings `process.emit` return boolean
8
8
  process.emit('message', message);
9
9
  }
10
10
 
@@ -14,6 +14,12 @@ export function emitWorkerMessage(message) {
14
14
  ...message
15
15
  });
16
16
  }
17
+ export function emitStoriesMessage(message) {
18
+ return emitMessage({
19
+ scope: 'stories',
20
+ ...message
21
+ });
22
+ }
17
23
  export function emitTestMessage(message) {
18
24
  return emitMessage({
19
25
  scope: 'test',
@@ -37,19 +43,28 @@ export function emitShutdownMessage() {
37
43
  scope: 'shutdown'
38
44
  });
39
45
  }
40
- const handlers = Object.assign(Object.create(null), {
41
- worker: new Set(),
42
- test: new Set(),
43
- webpack: new Set(),
44
- docker: new Set(),
45
- shutdown: new Set()
46
- });
46
+
47
+ function createHandlers() {
48
+ return Object.assign(Object.create(null), {
49
+ worker: new Set(),
50
+ stories: new Set(),
51
+ test: new Set(),
52
+ webpack: new Set(),
53
+ docker: new Set(),
54
+ shutdown: new Set()
55
+ });
56
+ }
57
+
58
+ const handlers = createHandlers();
47
59
 
48
60
  const handler = message => {
49
61
  switch (message.scope) {
50
62
  case 'worker':
51
63
  return handlers.worker.forEach(h => h(message));
52
64
 
65
+ case 'stories':
66
+ return handlers.stories.forEach(h => h(message));
67
+
53
68
  case 'test':
54
69
  return handlers.test.forEach(h => h(message));
55
70
 
@@ -65,26 +80,34 @@ const handler = message => {
65
80
  };
66
81
 
67
82
  process.on('message', handler);
68
- export function sendTestMessage(target, message) {
83
+ export function sendStoriesMessage(target, message) {
69
84
  var _target$send;
70
85
 
71
86
  (_target$send = target.send) === null || _target$send === void 0 ? void 0 : _target$send.call(target, {
72
- scope: 'test',
87
+ scope: 'stories',
73
88
  ...message
74
89
  });
75
90
  }
76
- export function sendDockerMessage(target, message) {
91
+ export function sendTestMessage(target, message) {
77
92
  var _target$send2;
78
93
 
79
94
  (_target$send2 = target.send) === null || _target$send2 === void 0 ? void 0 : _target$send2.call(target, {
80
- scope: 'docker',
95
+ scope: 'test',
81
96
  ...message
82
97
  });
83
98
  }
84
- export function sendShutdownMessage(target) {
99
+ export function sendDockerMessage(target, message) {
85
100
  var _target$send3;
86
101
 
87
102
  (_target$send3 = target.send) === null || _target$send3 === void 0 ? void 0 : _target$send3.call(target, {
103
+ scope: 'docker',
104
+ ...message
105
+ });
106
+ }
107
+ export function sendShutdownMessage(target) {
108
+ var _target$send4;
109
+
110
+ (_target$send4 = target.send) === null || _target$send4 === void 0 ? void 0 : _target$send4.call(target, {
88
111
  scope: 'shutdown'
89
112
  });
90
113
  }
@@ -97,6 +120,13 @@ export function subscribeOn(scope, handler) {
97
120
  return () => handlers.worker.delete(workerHandler);
98
121
  }
99
122
 
123
+ case 'stories':
124
+ {
125
+ const storiesHandler = handler;
126
+ handlers.stories.add(storiesHandler);
127
+ return () => handlers.stories.delete(storiesHandler);
128
+ }
129
+
100
130
  case 'test':
101
131
  {
102
132
  const testHandler = handler;
@@ -125,4 +155,78 @@ export function subscribeOn(scope, handler) {
125
155
  return () => handlers.shutdown.delete(shutdownHandler);
126
156
  }
127
157
  }
158
+ }
159
+ const workers = new Map();
160
+ export function subscribeOnWorker(worker, scope, handler) {
161
+ const workerHandlers = workers.get(worker) ?? createHandlers();
162
+
163
+ if (!workers.has(worker)) {
164
+ workers.set(worker, workerHandlers);
165
+ worker.once('exit', () => workers.delete(worker));
166
+ worker.on('message', message => {
167
+ switch (message.scope) {
168
+ case 'worker':
169
+ return workerHandlers.worker.forEach(h => h(message));
170
+
171
+ case 'stories':
172
+ return workerHandlers.stories.forEach(h => h(message));
173
+
174
+ case 'test':
175
+ return workerHandlers.test.forEach(h => h(message));
176
+
177
+ case 'webpack':
178
+ return workerHandlers.webpack.forEach(h => h(message));
179
+
180
+ case 'docker':
181
+ return workerHandlers.docker.forEach(h => h(message));
182
+
183
+ case 'shutdown':
184
+ return workerHandlers.shutdown.forEach(h => h(message));
185
+ }
186
+ });
187
+ }
188
+
189
+ switch (scope) {
190
+ case 'worker':
191
+ {
192
+ const workerHandler = handler;
193
+ workerHandlers.worker.add(workerHandler);
194
+ return () => workerHandlers.worker.delete(workerHandler);
195
+ }
196
+
197
+ case 'stories':
198
+ {
199
+ const storiesHandler = handler;
200
+ workerHandlers.stories.add(storiesHandler);
201
+ return () => workerHandlers.stories.delete(storiesHandler);
202
+ }
203
+
204
+ case 'test':
205
+ {
206
+ const testHandler = handler;
207
+ workerHandlers.test.add(testHandler);
208
+ return () => workerHandlers.test.delete(testHandler);
209
+ }
210
+
211
+ case 'webpack':
212
+ {
213
+ const webpackHandler = handler;
214
+ workerHandlers.webpack.add(webpackHandler);
215
+ return () => workerHandlers.webpack.delete(webpackHandler);
216
+ }
217
+
218
+ case 'docker':
219
+ {
220
+ const dockerHandler = handler;
221
+ workerHandlers.docker.add(dockerHandler);
222
+ return () => workerHandlers.docker.delete(dockerHandler);
223
+ }
224
+
225
+ case 'shutdown':
226
+ {
227
+ const shutdownHandler = handler;
228
+ workerHandlers.shutdown.add(shutdownHandler);
229
+ return () => workerHandlers.shutdown.delete(shutdownHandler);
230
+ }
231
+ }
128
232
  }