creevey 0.8.0-beta.0 → 0.9.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 (225) hide show
  1. package/CHANGELOG.md +5 -9
  2. package/lib/cjs/client/web/main.js +6 -6
  3. package/lib/types/cli.d.ts +1 -1
  4. package/lib/types/client/addon/Manager.d.ts +37 -37
  5. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  6. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  7. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  8. package/lib/types/client/addon/components/TestSelect.d.ts +9 -9
  9. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  10. package/lib/types/client/addon/decorator.d.ts +1 -1
  11. package/lib/types/client/addon/preset.d.ts +24 -22
  12. package/lib/types/client/addon/readyForCapture.d.ts +6 -0
  13. package/lib/types/client/addon/register.d.ts +3 -3
  14. package/lib/types/client/addon/utils.d.ts +2 -2
  15. package/lib/types/client/addon/withCreevey.d.ts +24 -13
  16. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  17. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +25 -25
  18. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  19. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  20. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  21. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  22. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +9 -9
  23. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +8 -8
  24. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  25. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +17 -17
  26. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  27. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  28. package/lib/types/client/shared/helpers.d.ts +46 -46
  29. package/lib/types/client/shared/viewMode.d.ts +4 -4
  30. package/lib/types/client/web/CreeveyApp.d.ts +12 -12
  31. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  32. package/lib/types/client/web/CreeveyLoader.d.ts +3 -3
  33. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  34. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  35. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  36. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +13 -13
  37. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  38. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +8 -8
  39. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  40. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  41. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  42. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  43. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  44. package/lib/types/client/web/index.d.ts +4 -4
  45. package/lib/types/creevey.d.ts +1 -1
  46. package/lib/types/index.d.ts +4 -2
  47. package/lib/types/server/config.d.ts +4 -4
  48. package/lib/types/server/docker.d.ts +7 -7
  49. package/lib/types/server/extract.d.ts +2 -2
  50. package/lib/types/server/index.d.ts +2 -2
  51. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  52. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  53. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  54. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  55. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  56. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  57. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +2 -2
  58. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  59. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  60. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  61. package/lib/types/server/logger.d.ts +6 -6
  62. package/lib/types/server/master/api.d.ts +7 -7
  63. package/lib/types/server/master/index.d.ts +3 -3
  64. package/lib/types/server/master/master.d.ts +7 -6
  65. package/lib/types/server/master/pool.d.ts +31 -30
  66. package/lib/types/server/master/runner.d.ts +26 -26
  67. package/lib/types/server/master/server.d.ts +2 -2
  68. package/lib/types/server/messages.d.ts +27 -18
  69. package/lib/types/server/selenium/browser.d.ts +17 -14
  70. package/lib/types/server/selenium/index.d.ts +2 -2
  71. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  72. package/lib/types/server/stories.d.ts +8 -8
  73. package/lib/types/server/storybook/entry.d.ts +18 -18
  74. package/lib/types/server/storybook/helpers.d.ts +24 -24
  75. package/lib/types/server/storybook/providers/browser.d.ts +4 -0
  76. package/lib/types/server/storybook/providers/hybrid.d.ts +4 -0
  77. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -0
  78. package/lib/types/server/testsFiles/parser.d.ts +12 -0
  79. package/lib/types/server/testsFiles/register.d.ts +2 -0
  80. package/lib/types/server/update.d.ts +2 -2
  81. package/lib/types/server/utils.d.ts +20 -19
  82. package/lib/types/server/worker/chai-image.d.ts +6 -6
  83. package/lib/types/server/worker/helpers.d.ts +8 -7
  84. package/lib/types/server/worker/index.d.ts +1 -1
  85. package/lib/types/server/worker/reporter.d.ts +8 -8
  86. package/lib/types/server/worker/worker.d.ts +4 -4
  87. package/lib/types/shared.d.ts +16 -4
  88. package/lib/types/types.d.ts +489 -459
  89. package/package.json +16 -7
  90. package/storybook-static/stories.json +21 -0
  91. package/types/mocha.d.ts +1 -0
  92. package/lib/cjs/cli.js +0 -5
  93. package/lib/cjs/client/addon/Manager.js +0 -413
  94. package/lib/cjs/client/addon/components/Addon.js +0 -76
  95. package/lib/cjs/client/addon/components/Icons.js +0 -42
  96. package/lib/cjs/client/addon/components/Panel.js +0 -68
  97. package/lib/cjs/client/addon/components/TestSelect.js +0 -63
  98. package/lib/cjs/client/addon/components/Tools.js +0 -114
  99. package/lib/cjs/client/addon/decorator.js +0 -11
  100. package/lib/cjs/client/addon/preset.js +0 -80
  101. package/lib/cjs/client/addon/register.js +0 -96
  102. package/lib/cjs/client/addon/utils.js +0 -38
  103. package/lib/cjs/client/addon/withCreevey.js +0 -284
  104. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +0 -85
  105. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +0 -88
  106. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +0 -176
  107. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +0 -178
  108. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +0 -110
  109. package/lib/cjs/client/shared/components/ImagesView/index.js +0 -45
  110. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +0 -46
  111. package/lib/cjs/client/shared/components/PageFooter/Paging.js +0 -98
  112. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +0 -78
  113. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +0 -144
  114. package/lib/cjs/client/shared/components/ResultsPage.js +0 -173
  115. package/lib/cjs/client/shared/creeveyClientApi.js +0 -103
  116. package/lib/cjs/client/shared/helpers.js +0 -482
  117. package/lib/cjs/client/shared/viewMode.js +0 -17
  118. package/lib/cjs/client/web/index.html +0 -19
  119. package/lib/cjs/creevey.js +0 -71
  120. package/lib/cjs/index.js +0 -44
  121. package/lib/cjs/server/config.js +0 -92
  122. package/lib/cjs/server/docker.js +0 -150
  123. package/lib/cjs/server/extract.js +0 -43
  124. package/lib/cjs/server/index.js +0 -85
  125. package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
  126. package/lib/cjs/server/loaders/babel/helpers.js +0 -479
  127. package/lib/cjs/server/loaders/babel/register.js +0 -126
  128. package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
  129. package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
  130. package/lib/cjs/server/loaders/webpack/compile.js +0 -286
  131. package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
  132. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
  133. package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
  134. package/lib/cjs/server/loaders/webpack/start.js +0 -41
  135. package/lib/cjs/server/logger.js +0 -47
  136. package/lib/cjs/server/master/api.js +0 -71
  137. package/lib/cjs/server/master/index.js +0 -152
  138. package/lib/cjs/server/master/master.js +0 -56
  139. package/lib/cjs/server/master/pool.js +0 -206
  140. package/lib/cjs/server/master/runner.js +0 -294
  141. package/lib/cjs/server/master/server.js +0 -57
  142. package/lib/cjs/server/messages.js +0 -154
  143. package/lib/cjs/server/selenium/browser.js +0 -582
  144. package/lib/cjs/server/selenium/index.js +0 -31
  145. package/lib/cjs/server/selenium/selenoid.js +0 -174
  146. package/lib/cjs/server/stories.js +0 -167
  147. package/lib/cjs/server/storybook/entry.js +0 -68
  148. package/lib/cjs/server/storybook/helpers.js +0 -165
  149. package/lib/cjs/server/storybook/nodejs-provider.js +0 -220
  150. package/lib/cjs/server/update.js +0 -83
  151. package/lib/cjs/server/utils.js +0 -178
  152. package/lib/cjs/server/worker/chai-image.js +0 -142
  153. package/lib/cjs/server/worker/helpers.js +0 -73
  154. package/lib/cjs/server/worker/index.js +0 -15
  155. package/lib/cjs/server/worker/reporter.js +0 -120
  156. package/lib/cjs/server/worker/worker.js +0 -266
  157. package/lib/cjs/shared.js +0 -35
  158. package/lib/cjs/types.js +0 -69
  159. package/lib/esm/cli.js +0 -4
  160. package/lib/esm/client/addon/Manager.js +0 -397
  161. package/lib/esm/client/addon/components/Addon.js +0 -58
  162. package/lib/esm/client/addon/components/Icons.js +0 -27
  163. package/lib/esm/client/addon/components/Panel.js +0 -49
  164. package/lib/esm/client/addon/components/TestSelect.js +0 -49
  165. package/lib/esm/client/addon/components/Tools.js +0 -91
  166. package/lib/esm/client/addon/decorator.js +0 -2
  167. package/lib/esm/client/addon/preset.js +0 -55
  168. package/lib/esm/client/addon/register.js +0 -75
  169. package/lib/esm/client/addon/utils.js +0 -31
  170. package/lib/esm/client/addon/withCreevey.js +0 -270
  171. package/lib/esm/client/shared/components/ImagesView/BlendView.js +0 -64
  172. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +0 -65
  173. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +0 -152
  174. package/lib/esm/client/shared/components/ImagesView/SlideView.js +0 -154
  175. package/lib/esm/client/shared/components/ImagesView/SwapView.js +0 -89
  176. package/lib/esm/client/shared/components/ImagesView/index.js +0 -5
  177. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +0 -32
  178. package/lib/esm/client/shared/components/PageFooter/Paging.js +0 -84
  179. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +0 -64
  180. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +0 -120
  181. package/lib/esm/client/shared/components/ResultsPage.js +0 -143
  182. package/lib/esm/client/shared/creeveyClientApi.js +0 -94
  183. package/lib/esm/client/shared/helpers.js +0 -424
  184. package/lib/esm/client/shared/viewMode.js +0 -6
  185. package/lib/esm/creevey.js +0 -56
  186. package/lib/esm/index.js +0 -4
  187. package/lib/esm/server/config.js +0 -71
  188. package/lib/esm/server/docker.js +0 -123
  189. package/lib/esm/server/extract.js +0 -30
  190. package/lib/esm/server/index.js +0 -65
  191. package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
  192. package/lib/esm/server/loaders/babel/helpers.js +0 -462
  193. package/lib/esm/server/loaders/babel/register.js +0 -105
  194. package/lib/esm/server/loaders/hooks/mdx.js +0 -15
  195. package/lib/esm/server/loaders/hooks/svelte.js +0 -49
  196. package/lib/esm/server/loaders/webpack/compile.js +0 -263
  197. package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
  198. package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
  199. package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
  200. package/lib/esm/server/loaders/webpack/start.js +0 -27
  201. package/lib/esm/server/logger.js +0 -20
  202. package/lib/esm/server/master/api.js +0 -60
  203. package/lib/esm/server/master/index.js +0 -131
  204. package/lib/esm/server/master/master.js +0 -37
  205. package/lib/esm/server/master/pool.js +0 -187
  206. package/lib/esm/server/master/runner.js +0 -272
  207. package/lib/esm/server/master/server.js +0 -37
  208. package/lib/esm/server/messages.js +0 -128
  209. package/lib/esm/server/selenium/browser.js +0 -554
  210. package/lib/esm/server/selenium/index.js +0 -2
  211. package/lib/esm/server/selenium/selenoid.js +0 -151
  212. package/lib/esm/server/stories.js +0 -147
  213. package/lib/esm/server/storybook/entry.js +0 -44
  214. package/lib/esm/server/storybook/helpers.js +0 -106
  215. package/lib/esm/server/storybook/nodejs-provider.js +0 -200
  216. package/lib/esm/server/update.js +0 -65
  217. package/lib/esm/server/utils.js +0 -141
  218. package/lib/esm/server/worker/chai-image.js +0 -130
  219. package/lib/esm/server/worker/helpers.js +0 -64
  220. package/lib/esm/server/worker/index.js +0 -1
  221. package/lib/esm/server/worker/reporter.js +0 -98
  222. package/lib/esm/server/worker/worker.js +0 -236
  223. package/lib/esm/shared.js +0 -22
  224. package/lib/esm/types.js +0 -40
  225. package/lib/types/server/storybook/nodejs-provider.d.ts +0 -5
@@ -1,151 +0,0 @@
1
- import path from 'path';
2
- import { promisify } from 'util';
3
- import { mkdir, writeFile, copyFile, lstatSync, existsSync } from 'fs';
4
- import { downloadBinary, getCreeveyCache } from '../utils';
5
- import { pullImages, runImage } from '../docker';
6
- import { Octokit } from '@octokit/core';
7
- import { subscribeOn } from '../messages';
8
- import { isWorker } from 'cluster';
9
- import { chmod, exec } from 'shelljs';
10
- const mkdirAsync = promisify(mkdir);
11
- const writeFileAsync = promisify(writeFile);
12
- const copyFileAsync = promisify(copyFile);
13
-
14
- async function createSelenoidConfig(browsers, {
15
- useDocker
16
- }) {
17
- const selenoidConfig = {};
18
- const selenoidConfigDir = path.join(getCreeveyCache(), 'selenoid');
19
- browsers.forEach(({
20
- browserName,
21
- version = 'latest',
22
- dockerImage = `selenoid/${browserName}:${version}`,
23
- webdriverCommand = []
24
- }) => {
25
- if (!selenoidConfig[browserName]) selenoidConfig[browserName] = {
26
- default: version,
27
- versions: {}
28
- };
29
- if (!useDocker && webdriverCommand.length == 0) throw new Error('Please specify "webdriverCommand" browser option with path to browser webdriver');
30
- selenoidConfig[browserName].versions[version] = {
31
- image: useDocker ? dockerImage : webdriverCommand,
32
- port: '4444',
33
- path: !useDocker || ['chrome', 'opera', 'webkit', 'MicrosoftEdge'].includes(browserName) ? '/' : '/wd/hub'
34
- };
35
- });
36
- await mkdirAsync(selenoidConfigDir, {
37
- recursive: true
38
- });
39
- await writeFileAsync(path.join(selenoidConfigDir, 'browsers.json'), JSON.stringify(selenoidConfig));
40
- return selenoidConfigDir;
41
- }
42
-
43
- async function downloadSelenoidBinary(destination) {
44
- var _assets$find;
45
-
46
- const platformNameMapping = {
47
- darwin: 'selenoid_darwin_amd64',
48
- linux: 'selenoid_linux_amd64',
49
- win32: 'selenoid_windows_amd64.exe'
50
- };
51
- const octokit = new Octokit();
52
- const response = await octokit.request('GET /repos/{owner}/{repo}/releases/latest', {
53
- owner: 'aerokube',
54
- repo: 'selenoid'
55
- });
56
- const {
57
- assets
58
- } = response.data;
59
- const {
60
- browser_download_url: downloadUrl,
61
- size: binarySize
62
- } = (_assets$find = assets.find(({
63
- name
64
- }) => platformNameMapping[process.platform] == name)) !== null && _assets$find !== void 0 ? _assets$find : {};
65
- if (existsSync(destination) && lstatSync(destination).size == binarySize) return;
66
-
67
- if (!downloadUrl) {
68
- throw new Error(`Couldn't get download url for selenoid binary. Please download it manually from "https://github.com/aerokube/selenoid/releases/latest" and define "selenoidPath" option in the Creevey config`);
69
- }
70
-
71
- return downloadBinary(downloadUrl, destination);
72
- }
73
-
74
- export async function startSelenoidStandalone(config, debug) {
75
- config.gridUrl = 'http://localhost:4444/wd/hub';
76
- if (isWorker) return;
77
- const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
78
- const selenoidConfigDir = await createSelenoidConfig(browsers, {
79
- useDocker: false
80
- });
81
- const binaryPath = path.join(selenoidConfigDir, process.platform == 'win32' ? 'selenoid.exe' : 'selenoid');
82
-
83
- if (config.selenoidPath) {
84
- await copyFileAsync(path.resolve(config.selenoidPath), binaryPath);
85
- } else {
86
- await downloadSelenoidBinary(binaryPath);
87
- } // TODO Download browser webdrivers
88
-
89
-
90
- try {
91
- if (process.platform != 'win32') chmod('+x', binaryPath);
92
- } catch (_) {
93
- /* noop */
94
- }
95
-
96
- const selenoidProcess = exec(`${binaryPath} -conf ./browsers.json -disable-docker`, {
97
- async: true,
98
- cwd: selenoidConfigDir
99
- });
100
-
101
- if (debug) {
102
- var _selenoidProcess$stdo, _selenoidProcess$stde;
103
-
104
- (_selenoidProcess$stdo = selenoidProcess.stdout) === null || _selenoidProcess$stdo === void 0 ? void 0 : _selenoidProcess$stdo.pipe(process.stdout);
105
- (_selenoidProcess$stde = selenoidProcess.stderr) === null || _selenoidProcess$stde === void 0 ? void 0 : _selenoidProcess$stde.pipe(process.stderr);
106
- }
107
-
108
- subscribeOn('shutdown', () => selenoidProcess.kill());
109
- }
110
- export async function startSelenoidContainer(config, debug) {
111
- const browsers = Object.values(config.browsers).filter(browser => !browser.gridUrl);
112
- const images = [];
113
- let limit = 0;
114
- browsers.forEach(({
115
- browserName,
116
- version = 'latest',
117
- limit: browserLimit = 1,
118
- dockerImage = `selenoid/${browserName}:${version}`
119
- }) => {
120
- limit += browserLimit;
121
- images.push(dockerImage);
122
- });
123
- const selenoidImage = config.dockerImage;
124
- const pullOptions = {
125
- auth: config.dockerAuth,
126
- platform: config.dockerImagePlatform
127
- };
128
-
129
- if (config.pullImages) {
130
- await pullImages([selenoidImage], pullOptions);
131
- await pullImages(images, pullOptions);
132
- } // TODO Allow pass custom options
133
-
134
-
135
- const selenoidOptions = {
136
- ExposedPorts: {
137
- '4444/tcp': {}
138
- },
139
- HostConfig: {
140
- PortBindings: {
141
- '4444/tcp': [{
142
- HostPort: '4444'
143
- }]
144
- },
145
- Binds: ['/var/run/docker.sock:/var/run/docker.sock', `${await createSelenoidConfig(browsers, {
146
- useDocker: true
147
- })}:/etc/selenoid/:ro`]
148
- }
149
- };
150
- return runImage(selenoidImage, ['-limit', String(limit)], selenoidOptions, debug);
151
- }
@@ -1,147 +0,0 @@
1
- import path from 'path';
2
- import { mkdirSync, writeFileSync } from 'fs';
3
- import { createHash } from 'crypto';
4
- import { mapValues, pick } from 'lodash';
5
- import { isDefined, isFunction, isObject } from '../types';
6
- import { shouldSkip, removeProps } from './utils';
7
- import { isStorybookVersionGreaterThan, isStorybookVersionLessThan } from './storybook/helpers';
8
- import { denormalizeStoryParameters } from '../shared';
9
-
10
- function storyTestFabric(delay, testFn) {
11
- return async function storyTest() {
12
- var _testFn$call;
13
-
14
- delay ? await new Promise(resolve => setTimeout(resolve, delay)) : void 0;
15
- await ((_testFn$call = testFn === null || testFn === void 0 ? void 0 : testFn.call(this)) !== null && _testFn$call !== void 0 ? _testFn$call : this.expect(await this.takeScreenshot()).to.matchImage());
16
- };
17
- }
18
-
19
- function createCreeveyTest(browser, storyMeta, skipOptions, testName) {
20
- const {
21
- kind,
22
- name: story,
23
- id: storyId
24
- } = storyMeta;
25
- const path = [kind, story, testName, browser].filter(isDefined);
26
- const skip = skipOptions ? shouldSkip(browser, {
27
- kind,
28
- story
29
- }, skipOptions, testName) : false;
30
- const id = createHash('sha1').update(path.join('/')).digest('hex');
31
- return {
32
- id,
33
- skip,
34
- browser,
35
- testName,
36
- storyPath: [...kind.split('/').map(x => x.trim()), story],
37
- storyId
38
- };
39
- }
40
-
41
- function convertStories(browsers, stories) {
42
- const tests = {};
43
- (Array.isArray(stories) ? stories : Object.values(stories)).forEach(storyMeta => {
44
- // TODO Skip docsOnly stories for now
45
- if (storyMeta.parameters.docsOnly) return;
46
- browsers.forEach(browserName => {
47
- var _storyMeta$parameters;
48
-
49
- const {
50
- delay: delayParam,
51
- tests: storyTests,
52
- skip
53
- } = (_storyMeta$parameters = storyMeta.parameters.creevey) !== null && _storyMeta$parameters !== void 0 ? _storyMeta$parameters : {};
54
- const delay = typeof delayParam == 'number' ? delayParam : delayParam !== null && delayParam !== void 0 && delayParam.for.includes(browserName) ? delayParam.ms : 0; // typeof tests === "undefined" => rootSuite -> kindSuite -> storyTest -> [browsers.png]
55
- // typeof tests === "function" => rootSuite -> kindSuite -> storyTest -> browser -> [images.png]
56
- // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> [browsers.png]
57
- // typeof tests === "object" => rootSuite -> kindSuite -> storySuite -> test -> browser -> [images.png]
58
-
59
- if (!storyTests) {
60
- const test = createCreeveyTest(browserName, storyMeta, skip);
61
- tests[test.id] = { ...test,
62
- storyId: storyMeta.id,
63
- story: storyMeta,
64
- fn: storyTestFabric(delay)
65
- };
66
- return;
67
- }
68
-
69
- Object.entries(storyTests).forEach(([testName, testFn]) => {
70
- const test = createCreeveyTest(browserName, storyMeta, skip, testName);
71
- tests[test.id] = { ...test,
72
- storyId: storyMeta.id,
73
- story: storyMeta,
74
- fn: storyTestFabric(delay, testFn)
75
- };
76
- });
77
- });
78
- });
79
- return tests;
80
- }
81
-
82
- export async function loadTestsFromStories(browsers, provider, update) {
83
- const testIdsByFiles = new Map();
84
- const data = await provider(storiesByFiles => {
85
- const testsDiff = {};
86
- Array.from(storiesByFiles.entries()).forEach(([filename, stories]) => {
87
- var _testIdsByFiles$get$f, _testIdsByFiles$get;
88
-
89
- const tests = convertStories(browsers, stories);
90
- const changed = Object.keys(tests);
91
- const removed = (_testIdsByFiles$get$f = (_testIdsByFiles$get = testIdsByFiles.get(filename)) === null || _testIdsByFiles$get === void 0 ? void 0 : _testIdsByFiles$get.filter(testId => !tests[testId])) !== null && _testIdsByFiles$get$f !== void 0 ? _testIdsByFiles$get$f : [];
92
- if (changed.length == 0) testIdsByFiles.delete(filename);else testIdsByFiles.set(filename, changed);
93
- Object.assign(testsDiff, tests);
94
- removed.forEach(testId => testsDiff[testId] = undefined);
95
- });
96
- update === null || update === void 0 ? void 0 : update(testsDiff);
97
- });
98
- const stories = isStorybookVersionLessThan(6) || isStorybookVersionGreaterThan(6, 3) ? data.stories : denormalizeStoryParameters(data);
99
- const tests = convertStories(browsers, stories);
100
- Object.values(tests).filter(isDefined).forEach(({
101
- id,
102
- story: {
103
- parameters: {
104
- fileName
105
- }
106
- }
107
- }) => {
108
- var _testIdsByFiles$get2;
109
-
110
- return (// TODO Don't use filename as a key, due possible collisions if two require.context with same structure of modules are defined
111
- testIdsByFiles.set(fileName, [...((_testIdsByFiles$get2 = testIdsByFiles.get(fileName)) !== null && _testIdsByFiles$get2 !== void 0 ? _testIdsByFiles$get2 : []), id])
112
- );
113
- });
114
- return tests;
115
- }
116
- export function saveStoriesJson(storiesData, extract) {
117
- var _storiesData$stories;
118
-
119
- const outputDir = typeof extract == 'boolean' ? 'storybook-static' : extract;
120
-
121
- if (!isStorybookVersionLessThan(6)) {
122
- // NOTE Copy-pasted from Storybook's `getStoriesJsonData` method
123
- const allowed = ['fileName', 'docsOnly', 'framework', '__id', '__isArgsStory'];
124
- storiesData.globalParameters = pick(storiesData.globalParameters, allowed); // @ts-expect-error ignore error
125
-
126
- storiesData.kindParameters = mapValues(storiesData.kindParameters, v => pick(v, allowed)); // @ts-expect-error ignore error
127
-
128
- storiesData.stories = mapValues(storiesData.stories, v => ({ ...pick(v, ['id', 'name', 'kind', 'story']),
129
- parameters: pick(v.parameters, allowed)
130
- }));
131
- } // TODO Fix args stories
132
-
133
-
134
- removeProps(storiesData !== null && storiesData !== void 0 ? storiesData : {}, ['stories', () => true, 'parameters', '__isArgsStory']);
135
- Object.values((_storiesData$stories = storiesData === null || storiesData === void 0 ? void 0 : storiesData.stories) !== null && _storiesData$stories !== void 0 ? _storiesData$stories : {}).forEach(story => isObject(story) && 'parameters' in story && isObject(story.parameters) && delete story.parameters.__isArgsStory);
136
- mkdirSync(outputDir, {
137
- recursive: true
138
- });
139
- writeFileSync(path.join(outputDir, 'stories.json'), JSON.stringify(storiesData, null, 2));
140
- }
141
- export function saveTestsJson(tests, dstPath = process.cwd()) {
142
- mkdirSync(dstPath, {
143
- recursive: true
144
- });
145
- writeFileSync(path.join(dstPath, 'tests.json'), // eslint-disable-next-line @typescript-eslint/no-unsafe-return
146
- JSON.stringify(tests, (_, value) => isFunction(value) ? value.toString() : value, 2));
147
- }
@@ -1,44 +0,0 @@
1
- var _api$channel, _api$context;
2
-
3
- import { addons } from '@storybook/addons';
4
- import { getStorybookFramework, isStorybookVersionLessThan, resolveFromStorybook } from './helpers';
5
- const framework = getStorybookFramework(); // eslint-disable-next-line @typescript-eslint/no-var-requires
6
-
7
- const core = require(resolveFromStorybook('@storybook/core')); //@ts-expect-error: 6.2 use named exports
8
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
9
-
10
-
11
- const start = isStorybookVersionLessThan(6, 2) ? core.default.start : core.start;
12
- const api = start(() => void 0);
13
- export const channel = 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.getChannel();
14
- export const clientApi = api.clientApi;
15
- export const forceReRender = api.forceReRender;
16
- export const storiesOf = (kind, m) => {
17
- return clientApi.storiesOf(kind, m).addParameters({
18
- framework
19
- });
20
- };
21
- export const configure = (...args) => {
22
- if (isStorybookVersionLessThan(5, 2)) {
23
- //NOTE: Storybook <= 5.1 pass args as is
24
- //@ts-expect-error: ignore it
25
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
26
- return api.configApi.configure(...args);
27
- }
28
-
29
- if (isStorybookVersionLessThan(6)) {
30
- //NOTE: Storybook <= 5.3 pass `framework` as last argument
31
- //@ts-expect-error: ignore it
32
- return api.configure(...args, framework);
33
- } //NOTE Storybook 6.x pass `framework` as first argument
34
- //@ts-expect-error: ignore it
35
-
36
-
37
- return api.configure(framework, ...args);
38
- };
39
- export const addDecorator = clientApi.addDecorator;
40
- export const addParameters = clientApi.addParameters;
41
- export const clearDecorators = clientApi.clearDecorators;
42
- export const setAddon = clientApi.setAddon;
43
- export const getStorybook = clientApi.getStorybook;
44
- export const raw = clientApi.raw;
@@ -1,106 +0,0 @@
1
- import path from 'path';
2
- import resolveFrom from 'resolve-from';
3
- const supportedFrameworks = ['react', 'vue', 'vue3', 'angular', 'marionette', 'mithril', 'marko', 'html', 'svelte', 'riot', 'ember', 'preact', 'rax', 'aurelia', 'server', 'web-components'];
4
- export const storybookDirRef = {
5
- current: path.resolve('.storybook')
6
- };
7
- export const resolveFromStorybook = modulePath => resolveFrom(storybookDirRef.current, modulePath);
8
- export const resolveFromStorybookAddonDocs = modulePath => resolveFrom(resolveFromStorybook('@storybook/addon-docs'), modulePath);
9
- export const resolveFromStorybookBuilderWebpack4 = modulePath => resolveFrom(resolveFromStorybook('@storybook/builder-webpack4'), modulePath);
10
- export const resolveFromStorybookCore = modulePath => resolveFrom(resolveFromStorybook('@storybook/core'), modulePath);
11
- export const resolveFromStorybookCoreServer = modulePath => resolveFrom(resolveFromStorybook('@storybook/core-server'), modulePath);
12
-
13
- const importFromStorybook = modulePath => import(resolveFromStorybook(modulePath));
14
-
15
- export const importStorybookClientLogger = () => importFromStorybook('@storybook/client-logger');
16
- export const importStorybookCoreCommon = () => importFromStorybook('@storybook/core-common');
17
- export const importStorybookCoreEvents = () => importFromStorybook('@storybook/core-events');
18
- export function hasDocsAddon() {
19
- try {
20
- resolveFromStorybook('@storybook/addon-docs');
21
- return true;
22
- } catch (_) {
23
- return false;
24
- }
25
- }
26
- export function hasSvelteCSFAddon() {
27
- try {
28
- resolveFromStorybook('@storybook/addon-svelte-csf');
29
- return true;
30
- } catch (_) {
31
- return false;
32
- }
33
- }
34
- export function getStorybookVersion() {
35
- // eslint-disable-next-line @typescript-eslint/no-var-requires
36
- const {
37
- version
38
- } = require(resolveFromStorybook('@storybook/core/package.json'));
39
-
40
- return version;
41
- }
42
- export function isStorybookVersionLessThan(major, minor) {
43
- var _process$env$__CREEVE;
44
-
45
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE !== void 0 ? _process$env$__CREEVE : getStorybookVersion()).split('.');
46
- return Number(sbMajor) < major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) < minor;
47
- }
48
- export function isStorybookVersionGreaterThan(major, minor) {
49
- var _process$env$__CREEVE2;
50
-
51
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE2 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE2 !== void 0 ? _process$env$__CREEVE2 : getStorybookVersion()).split('.');
52
- return Number(sbMajor) > major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) > minor;
53
- }
54
- export function isStorybookVersion(major, minor) {
55
- var _process$env$__CREEVE3;
56
-
57
- const [sbMajor, sbMinor] = ((_process$env$__CREEVE3 = process.env.__CREEVEY_STORYBOOK_VERSION__) !== null && _process$env$__CREEVE3 !== void 0 ? _process$env$__CREEVE3 : getStorybookVersion()).split('.');
58
- return Number(sbMajor) == major || minor != undefined && Number(sbMajor) == major && Number(sbMinor) == minor;
59
- }
60
- export function getStorybookFramework() {
61
- var _process$env$__CREEVE4;
62
-
63
- const framework = (_process$env$__CREEVE4 = process.env.__CREEVEY_STORYBOOK_FRAMEWORK__) !== null && _process$env$__CREEVE4 !== void 0 ? _process$env$__CREEVE4 : supportedFrameworks.find(framework => {
64
- try {
65
- return require.resolve(resolveFromStorybook(`@storybook/${framework}`));
66
- } catch (_) {
67
- return false;
68
- }
69
- });
70
- if (!framework) throw new Error("Couldn't detect used Storybook framework. Please ensure that you install `@storybook/<framework>` package");
71
- return framework;
72
- }
73
- export const storybookConfigRef = {
74
- current: {
75
- stories: []
76
- }
77
- };
78
- export async function importStorybookConfig() {
79
- const configPath = `${storybookDirRef.current}/main`;
80
-
81
- try {
82
- return storybookConfigRef.current = (await import(require.resolve(configPath))).default;
83
- } catch (_) {
84
- const storybookUtilsPath = isStorybookVersionLessThan(6, 2) ? '@storybook/core/dist/server/utils' : '@storybook/core-common/dist/cjs/utils';
85
- const serverRequireModule = isStorybookVersionLessThan(6, 2) ? 'server-require' : 'interpret-require'; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
86
-
87
- const {
88
- getInterpretedFile
89
- } = await import(resolveFromStorybook(`${storybookUtilsPath}/interpret-files`)); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
90
-
91
- const {
92
- default: serverRequireFallback,
93
- serverRequire = serverRequireFallback
94
- } = await import(resolveFromStorybook(`${storybookUtilsPath}/${serverRequireModule}`)); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
95
-
96
- const mainConfigFile = isStorybookVersionLessThan(6, 1) ? configPath : // eslint-disable-next-line @typescript-eslint/no-unsafe-call
97
- getInterpretedFile(configPath); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
98
-
99
- return storybookConfigRef.current = serverRequire(mainConfigFile);
100
- }
101
- }
102
- export async function isCSFv3Enabled() {
103
- var _await$importStoryboo, _await$importStoryboo2, _await$importStoryboo3;
104
-
105
- 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;
106
- }
@@ -1,200 +0,0 @@
1
- /* eslint-disable @typescript-eslint/no-var-requires, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/ban-ts-comment */
2
- import path from 'path';
3
- import { isWorker, isMaster } from 'cluster';
4
- import chokidar from 'chokidar';
5
- import { noop } from '../../types';
6
- import { getCreeveyCache } from '../utils';
7
- import { subscribeOn } from '../messages';
8
- import { importStorybookClientLogger, importStorybookConfig, importStorybookCoreCommon, importStorybookCoreEvents, isStorybookVersionGreaterThan, isStorybookVersionLessThan } from './helpers';
9
- import { logger } from '../logger';
10
- import { denormalizeStoryParameters } from '../../shared';
11
-
12
- async function initStorybookEnvironment() {
13
- // @ts-ignore
14
- (await import('global-jsdom')).default(undefined, {
15
- url: 'http://localhost'
16
- }); // NOTE Cutoff `jsdom` part from userAgent, because storybook check enviroment and create events channel if runs in browser
17
- // https://github.com/storybookjs/storybook/blob/v5.2.8/lib/core/src/client/preview/start.js#L98
18
- // Example: "Mozilla/5.0 (linux) AppleWebKit/537.36 (KHTML, like Gecko) jsdom/15.2.1"
19
-
20
- Object.defineProperty(window.navigator, 'userAgent', {
21
- value: window.navigator.userAgent.split(' ').filter(token => !token.startsWith('jsdom')).join(' ')
22
- }); // TODO Look at creevey debug flag
23
-
24
- const {
25
- logger
26
- } = await importStorybookClientLogger(); // NOTE: Disable duplication warnings for >=6.2 storybook
27
-
28
- if (isWorker) logger.warn = noop; // NOTE: disable logger for 5.x storybook
29
-
30
- logger.debug = noop;
31
- return import('./entry');
32
- }
33
-
34
- function watchStories(channel, watcher, initialFiles) {
35
- const watchingFiles = initialFiles;
36
- let storiesByFiles = new Map();
37
- subscribeOn('shutdown', () => void watcher.close());
38
- watcher.add(Array.from(watchingFiles));
39
- watcher.on('change', filePath => storiesByFiles.set(path.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
40
- watcher.on('unlink', filePath => storiesByFiles.set(path.isAbsolute(filePath) ? filePath : `./${filePath.replace(/\\/g, '/')}`, []));
41
- return data => {
42
- const stories = isStorybookVersionLessThan(6) || isStorybookVersionGreaterThan(6, 3) ? data.stories : denormalizeStoryParameters(data);
43
- const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
44
- const addedFiles = Array.from(files).filter(filePath => !watchingFiles.has(filePath));
45
- const removedFiles = Array.from(watchingFiles).filter(filePath => !files.has(filePath));
46
- watcher.add(addedFiles);
47
- addedFiles.forEach(filePath => {
48
- watchingFiles.add(filePath);
49
- storiesByFiles.set(filePath, []);
50
- });
51
- removedFiles.forEach(filePath => watchingFiles.delete(filePath));
52
- Object.values(stories).forEach(story => {
53
- var _storiesByFiles$get;
54
-
55
- return (_storiesByFiles$get = storiesByFiles.get(story.parameters.fileName)) === null || _storiesByFiles$get === void 0 ? void 0 : _storiesByFiles$get.push(story);
56
- });
57
- channel.emit('storiesUpdated', storiesByFiles);
58
- storiesByFiles = new Map();
59
- };
60
- }
61
-
62
- function loadStoriesFromBundle(watch) {
63
- const bundlePath = path.join(getCreeveyCache(), 'storybook/main.js');
64
-
65
- if (watch) {
66
- subscribeOn('webpack', message => {
67
- if (message.type != 'rebuild succeeded') return;
68
- Object.values(global.__CREEVEY_HMR_DATA__).filter(({
69
- callback
70
- }) => callback).forEach(({
71
- data,
72
- callback
73
- }) => callback(data));
74
- delete require.cache[bundlePath];
75
- import(bundlePath);
76
- });
77
- }
78
-
79
- import(bundlePath);
80
- }
81
-
82
- async function loadStoriesDirectly(config, {
83
- watcher,
84
- debug
85
- }) {
86
- const {
87
- toRequireContext,
88
- normalizeStoriesEntry
89
- } = await importStorybookCoreCommon();
90
- const {
91
- addParameters,
92
- configure
93
- } = await import('./entry');
94
- const requireContext = await (await import('../loaders/babel/register')).default(config, debug);
95
-
96
- const preview = (() => {
97
- try {
98
- return require.resolve(`${config.storybookDir}/preview`);
99
- } catch (_) {
100
- /* noop */
101
- }
102
- })();
103
-
104
- const {
105
- stories
106
- } = await importStorybookConfig();
107
- const contexts = stories.map(entry => {
108
- const normalizedEntry = isStorybookVersionLessThan(6, 4) ? entry : normalizeStoriesEntry(entry, {
109
- configDir: config.storybookDir,
110
- workingDir: process.cwd()
111
- });
112
- const {
113
- path: storiesPath,
114
- recursive,
115
- match
116
- } = toRequireContext(normalizedEntry);
117
- watcher === null || watcher === void 0 ? void 0 : watcher.add(path.resolve(config.storybookDir, storiesPath));
118
- return () => requireContext(storiesPath, recursive, new RegExp(match));
119
- });
120
-
121
- let disposeCallback = data => void data;
122
-
123
- Object.assign(module, {
124
- hot: {
125
- data: {},
126
-
127
- accept() {
128
- /* noop */
129
- },
130
-
131
- dispose(callback) {
132
- disposeCallback = callback;
133
- }
134
-
135
- }
136
- });
137
-
138
- async function startStorybook() {
139
- if (preview) {
140
- const {
141
- parameters,
142
- globals,
143
- globalTypes
144
- } = await import(preview);
145
- if (parameters) addParameters(parameters);
146
- if (globals) addParameters({
147
- globals
148
- });
149
- if (globalTypes) addParameters({
150
- globalTypes
151
- });
152
- }
153
-
154
- try {
155
- configure(contexts.map(ctx => ctx()), module, false);
156
- } catch (error) {
157
- if (isMaster) logger.error(error);
158
- }
159
- }
160
-
161
- watcher === null || watcher === void 0 ? void 0 : watcher.add(config.storybookDir);
162
- watcher === null || watcher === void 0 ? void 0 : watcher.on('all', (_event, filename) => {
163
- var _module$hot;
164
-
165
- disposeCallback((_module$hot = module.hot) === null || _module$hot === void 0 ? void 0 : _module$hot.data);
166
- delete require.cache[filename];
167
- void startStorybook();
168
- });
169
- void startStorybook();
170
- }
171
-
172
- export async function loadStories(config, {
173
- watch,
174
- debug
175
- }, storiesListener) {
176
- const storybookApi = await initStorybookEnvironment();
177
- const Events = await importStorybookCoreEvents();
178
- const {
179
- channel
180
- } = storybookApi;
181
- channel.removeAllListeners(Events.CURRENT_STORY_WAS_SET);
182
- channel.on('storiesUpdated', storiesListener);
183
- let watcher = null;
184
- if (watch) watcher = chokidar.watch([], {
185
- ignoreInitial: true
186
- });
187
- const loadPromise = new Promise(resolve => {
188
- channel.once(Events.SET_STORIES, data => {
189
- const stories = isStorybookVersionLessThan(6) || isStorybookVersionGreaterThan(6, 3) ? data.stories : denormalizeStoryParameters(data);
190
- const files = new Set(Object.values(stories).map(story => story.parameters.fileName));
191
- if (watcher) channel.on(Events.SET_STORIES, watchStories(channel, watcher, files));
192
- resolve(data);
193
- });
194
- });
195
- if (config.useWebpackToExtractTests) loadStoriesFromBundle(watch);else void loadStoriesDirectly(config, {
196
- watcher,
197
- debug
198
- });
199
- return loadPromise;
200
- }