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