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,65 +0,0 @@
1
- import path from 'path';
2
- import fs, { mkdirSync } from 'fs';
3
- import micromatch from 'micromatch';
4
- import { isDefined } from '../types';
5
-
6
- function tryToLoadTestsData(filename) {
7
- try {
8
- // eslint-disable-next-line @typescript-eslint/no-var-requires
9
- return require(filename);
10
- } catch (_) {
11
- /* noop */
12
- }
13
- }
14
-
15
- const actualRegex = /^(.*)-actual-(\d+)\.png$/i;
16
-
17
- function approve(dirents, srcPath, dstPath, testPaths, isMatch) {
18
- dirents.filter(dirent => dirent.isFile()).map(dirent => actualRegex.exec(dirent.name)).filter(isDefined).filter(([fileName, imageName]) => !testPaths || testPaths.find(([token]) => token == imageName) && isMatch(path.join(srcPath, fileName))).reduce((images, [, imageName, retry]) => {
19
- var _images$get;
20
-
21
- return Number(retry) > ((_images$get = images.get(imageName)) !== null && _images$get !== void 0 ? _images$get : -1) ? images.set(imageName, Number(retry)) : images;
22
- }, new Map()).forEach((retry, imageName) => {
23
- mkdirSync(dstPath, {
24
- recursive: true
25
- });
26
- fs.copyFileSync(path.join(srcPath, `${imageName}-actual-${retry}.png`), path.join(dstPath, `${imageName}.png`));
27
- });
28
- }
29
-
30
- function traverse(srcPath, dstPath, testPaths, isMatch) {
31
- const dirents = fs.readdirSync(srcPath, {
32
- withFileTypes: true
33
- });
34
- approve(dirents, srcPath, dstPath, testPaths, isMatch);
35
- dirents.filter(dirent => dirent.isDirectory()).map(dirent => [dirent.name, testPaths === null || testPaths === void 0 ? void 0 : testPaths.map(([token, ...restPath]) => token == dirent.name ? restPath : null).filter(isDefined)]).filter(([, paths]) => !paths || paths.length > 0).forEach(([dirname, paths]) => traverse(path.join(srcPath, dirname), path.join(dstPath, dirname), paths, isMatch));
36
- }
37
-
38
- export default function update(config, grepPattern) {
39
- const {
40
- reportDir,
41
- screenDir
42
- } = config;
43
- const isMatch = grepPattern ? micromatch.matcher(grepPattern, {
44
- contains: true
45
- }) : () => true;
46
- const testsMeta = tryToLoadTestsData(`${reportDir}/tests.json`);
47
- const testsReport = tryToLoadTestsData(`${reportDir}/data`);
48
- let testPaths = null;
49
-
50
- if (testsMeta && testsReport) {
51
- testPaths = Object.values(testsMeta).filter(isDefined).filter(({
52
- id
53
- }) => {
54
- var _testsReport$id;
55
-
56
- return ((_testsReport$id = testsReport[id]) === null || _testsReport$id === void 0 ? void 0 : _testsReport$id.status) == 'failed';
57
- }).map(({
58
- storyPath,
59
- testName,
60
- browser
61
- }) => [...storyPath, ...(testName ? [testName] : []), browser]);
62
- }
63
-
64
- traverse(reportDir, screenDir, testPaths, value => isMatch(path.relative(reportDir, value)));
65
- }
@@ -1,141 +0,0 @@
1
- import { createWriteStream, existsSync, readFileSync, unlink } from 'fs';
2
- import cluster from 'cluster';
3
- import { isDefined, noop, isFunction } from '../types';
4
- import { emitShutdownMessage, sendShutdownMessage } from './messages';
5
- import findCacheDir from 'find-cache-dir';
6
- import { get } from 'https';
7
- export const isShuttingDown = {
8
- current: false
9
- };
10
- export const LOCALHOST_REGEXP = /(localhost|127\.0\.0\.1)/i;
11
- export const extensions = ['.js', '.jsx', '.ts', '.tsx'];
12
- export const skipOptionKeys = ['in', 'kinds', 'stories', 'tests', 'reason'];
13
-
14
- function matchBy(pattern, value) {
15
- return typeof pattern == 'string' && pattern == value || Array.isArray(pattern) && pattern.includes(value) || pattern instanceof RegExp && pattern.test(value) || !isDefined(pattern);
16
- }
17
-
18
- export function shouldSkip(browser, meta, skipOptions, test) {
19
- if (typeof skipOptions != 'object') {
20
- return skipOptions;
21
- }
22
-
23
- if (Array.isArray(skipOptions)) {
24
- for (const skip of skipOptions) {
25
- const reason = shouldSkip(browser, meta, skip, test);
26
- if (reason) return reason;
27
- }
28
-
29
- return false;
30
- }
31
-
32
- let hasSkipOptionKeys = false;
33
-
34
- for (const skipKey in skipOptions) {
35
- if (skipOptionKeys.includes(skipKey)) {
36
- hasSkipOptionKeys = true;
37
- continue;
38
- }
39
-
40
- const reason = shouldSkip(browser, meta, {
41
- reason: skipKey,
42
- ...skipOptions[skipKey]
43
- }, test);
44
- if (reason) return reason;
45
- }
46
-
47
- if (!hasSkipOptionKeys) return false;
48
- const {
49
- in: browsers,
50
- kinds,
51
- stories,
52
- tests,
53
- reason = true
54
- } = skipOptions;
55
- const {
56
- kind,
57
- story
58
- } = meta;
59
- const skipByBrowser = matchBy(browsers, browser);
60
- const skipByKind = matchBy(kinds, kind);
61
- const skipByStory = matchBy(stories, story);
62
- const skipByTest = !isDefined(test) || matchBy(tests, test);
63
- return skipByBrowser && skipByKind && skipByStory && skipByTest && reason;
64
- }
65
- export async function shutdownWorkers() {
66
- isShuttingDown.current = true;
67
- await Promise.all(Object.values(cluster.workers).filter(isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
68
- const timeout = setTimeout(() => worker.kill(), 10000);
69
- worker.on('exit', () => {
70
- clearTimeout(timeout);
71
- resolve();
72
- });
73
- sendShutdownMessage(worker);
74
- })));
75
- emitShutdownMessage();
76
- }
77
- export function shutdown() {
78
- // eslint-disable-next-line no-process-exit
79
- process.exit();
80
- }
81
- export function getCreeveyCache() {
82
- return findCacheDir({
83
- name: 'creevey',
84
- cwd: __dirname
85
- });
86
- }
87
- export async function runSequence(seq, predicate) {
88
- for (const fn of seq) {
89
- if (predicate()) await fn();
90
- }
91
- }
92
- export function testsToImages(tests) {
93
- return new Set([].concat(...tests.filter(isDefined).map(({
94
- browser,
95
- testName,
96
- storyPath,
97
- results
98
- }) => {
99
- var _results$slice$0$imag, _results$slice$;
100
-
101
- return Object.keys((_results$slice$0$imag = results === null || results === void 0 ? void 0 : (_results$slice$ = results.slice(-1)[0]) === null || _results$slice$ === void 0 ? void 0 : _results$slice$.images) !== null && _results$slice$0$imag !== void 0 ? _results$slice$0$imag : {}).map(image => `${[...storyPath, testName, browser, browser == image ? undefined : image].filter(isDefined).join('/')}.png`);
102
- })));
103
- } // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
104
-
105
- export const isInsideDocker = existsSync('/proc/1/cgroup') && /docker/.test(readFileSync('/proc/1/cgroup', 'utf8'));
106
- export const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => get(downloadUrl, response => {
107
- var _response$statusCode2;
108
-
109
- if (response.statusCode == 302) {
110
- var _response$statusCode;
111
-
112
- const {
113
- location
114
- } = response.headers;
115
- if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${(_response$statusCode = response.statusCode) !== null && _response$statusCode !== void 0 ? _response$statusCode : 'UNKNOWN'}`));
116
- return resolve(downloadBinary(location, destination));
117
- }
118
-
119
- if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${(_response$statusCode2 = response.statusCode) !== null && _response$statusCode2 !== void 0 ? _response$statusCode2 : 'UNKNOWN'}`));
120
- const fileStream = createWriteStream(destination);
121
- response.pipe(fileStream);
122
- fileStream.on('finish', () => {
123
- fileStream.close();
124
- resolve();
125
- });
126
- fileStream.on('error', error => {
127
- unlink(destination, noop);
128
- reject(error);
129
- });
130
- }));
131
- export function removeProps(obj, propPath) {
132
- const [prop, ...restPath] = propPath;
133
-
134
- if (restPath.length > 0) {
135
- if (typeof prop == 'string') obj[prop] && removeProps(obj[prop], restPath);
136
- if (isFunction(prop)) Object.keys(obj).filter(prop).forEach(key => obj[key] && removeProps(obj[key], restPath));
137
- } else {
138
- if (typeof prop == 'string') delete obj[prop];
139
- if (isFunction(prop)) Object.keys(obj).filter(prop).forEach(key => delete obj[key]);
140
- }
141
- }
@@ -1,130 +0,0 @@
1
- import { PNG } from 'pngjs';
2
- import pixelmatch from 'pixelmatch';
3
-
4
- function normalizeImageSize(image, width, height) {
5
- const normalizedImage = Buffer.alloc(4 * width * height);
6
-
7
- for (let y = 0; y < height; y++) {
8
- for (let x = 0; x < width; x++) {
9
- const i = (y * width + x) * 4;
10
-
11
- if (x < image.width && y < image.height) {
12
- const j = (y * image.width + x) * 4;
13
- normalizedImage[i + 0] = image.data[j + 0];
14
- normalizedImage[i + 1] = image.data[j + 1];
15
- normalizedImage[i + 2] = image.data[j + 2];
16
- normalizedImage[i + 3] = image.data[j + 3];
17
- } else {
18
- normalizedImage[i + 0] = 0;
19
- normalizedImage[i + 1] = 0;
20
- normalizedImage[i + 2] = 0;
21
- normalizedImage[i + 3] = 0;
22
- }
23
- }
24
- }
25
-
26
- return normalizedImage;
27
- }
28
-
29
- function hasDiffPixels(diff) {
30
- for (let i = 0; i < diff.length; i += 4) {
31
- if (diff[i + 0] == 255 && diff[i + 1] == 0 && diff[i + 2] == 0 && diff[i + 3] == 255) return true;
32
- }
33
-
34
- return false;
35
- }
36
-
37
- function compareImages(expect, actual, diffOptions) {
38
- const expectImage = PNG.sync.read(expect);
39
- const actualImage = PNG.sync.read(actual);
40
- const width = Math.max(actualImage.width, expectImage.width);
41
- const height = Math.max(actualImage.height, expectImage.height);
42
- const diffImage = new PNG({
43
- width,
44
- height
45
- });
46
- let actualImageData = actualImage.data;
47
-
48
- if (actualImage.width < width || actualImage.height < height) {
49
- actualImageData = normalizeImageSize(actualImage, width, height);
50
- }
51
-
52
- let expectImageData = expectImage.data;
53
-
54
- if (expectImage.width < width || expectImage.height < height) {
55
- expectImageData = normalizeImageSize(expectImage, width, height);
56
- }
57
-
58
- pixelmatch(expectImageData, actualImageData, diffImage.data, width, height, diffOptions);
59
- return {
60
- isEqual: !hasDiffPixels(diffImage.data),
61
- diff: PNG.sync.write(diffImage)
62
- };
63
- }
64
-
65
- export default function (getExpected, diffOptions) {
66
- return function chaiImage({
67
- Assertion
68
- }, utils) {
69
- async function assertImage(actual, imageName) {
70
- let onCompare = () => Promise.resolve();
71
-
72
- let expected = await getExpected(imageName);
73
- if (!(expected instanceof Buffer) && expected != null) ({
74
- expected,
75
- onCompare
76
- } = expected);
77
-
78
- if (expected == null) {
79
- await onCompare(actual);
80
- return imageName ? `Expected image '${imageName}' does not exists` : 'Expected image does not exists';
81
- }
82
-
83
- if (actual.equals(expected)) return await onCompare(actual);
84
- const {
85
- isEqual,
86
- diff
87
- } = compareImages(expected, actual, diffOptions);
88
- if (isEqual) return await onCompare(actual);
89
- await onCompare(actual, expected, diff);
90
- return imageName ? `Expected image '${imageName}' to match` : 'Expected image to match';
91
- }
92
-
93
- utils.addMethod(Assertion.prototype, 'matchImage', async function matchImage(imageName) {
94
- const actual = utils.flag(this, 'object');
95
- const errorMessage = await assertImage(typeof actual == 'string' ? Buffer.from(actual, 'base64') : actual, imageName);
96
-
97
- if (errorMessage) {
98
- throw createImageError(imageName ? {
99
- [imageName]: errorMessage
100
- } : errorMessage);
101
- }
102
- });
103
- utils.addMethod(Assertion.prototype, 'matchImages', async function matchImages() {
104
- const errors = {};
105
- await Promise.all(Object.entries(utils.flag(this, 'object')).map(async ([imageName, imageOrBase64]) => {
106
- let errorMessage;
107
-
108
- try {
109
- errorMessage = await assertImage(typeof imageOrBase64 == 'string' ? Buffer.from(imageOrBase64, 'base64') : imageOrBase64, imageName);
110
- } catch (error) {
111
- errorMessage = error.stack;
112
- }
113
-
114
- if (errorMessage) {
115
- errors[imageName] = errorMessage;
116
- }
117
- }));
118
-
119
- if (Object.keys(errors).length > 0) {
120
- throw createImageError(errors);
121
- }
122
- });
123
- };
124
- }
125
-
126
- function createImageError(imageErrors) {
127
- const error = new Error('Expected image to match');
128
- error.images = imageErrors;
129
- return error;
130
- }
@@ -1,64 +0,0 @@
1
- import { Suite, Test } from 'mocha';
2
- import { isDefined } from '../../types';
3
- import { loadTestsFromStories } from '../stories';
4
-
5
- function findOrCreateSuite(name, parent) {
6
- const suite = parent.suites.find(({
7
- title
8
- }) => title == name) || new Suite(name, parent.ctx);
9
-
10
- if (!suite.parent) {
11
- suite.parent = parent;
12
- parent.addSuite(suite);
13
- }
14
-
15
- return suite;
16
- }
17
-
18
- function createTest(name, fn, skip = false) {
19
- const test = new Test(name, skip ? undefined : fn);
20
- test.pending = Boolean(skip); // NOTE Can't define skip reason in mocha https://github.com/mochajs/mocha/issues/2026
21
-
22
- test.skipReason = skip;
23
- return test;
24
- }
25
-
26
- function addTest(rootSuite, test) {
27
- const [testName, ...suitePath] = [...test.storyPath, test.testName].reverse().filter(isDefined);
28
- const suite = suitePath.reduceRight((subSuite, suiteName) => findOrCreateSuite(suiteName, subSuite), rootSuite);
29
- const mochaTest = createTest(testName, test.fn, test.skip);
30
- suite.addTest(mochaTest);
31
- mochaTest.ctx = Object.setPrototypeOf({
32
- id: test.id,
33
- story: test.story
34
- }, suite.ctx);
35
- return mochaTest;
36
- }
37
-
38
- function removeTestOrSuite(testOrSuite) {
39
- const {
40
- parent
41
- } = testOrSuite;
42
- if (!parent) return;
43
- if (testOrSuite instanceof Test) parent.tests = parent.tests.filter(test => test != testOrSuite);
44
- if (testOrSuite instanceof Suite) parent.suites = parent.suites.filter(suite => suite != testOrSuite);
45
- if (parent.tests.length == 0 && parent.suites.length == 0) removeTestOrSuite(parent);
46
- }
47
-
48
- export async function addTestsFromStories(rootSuite, config, {
49
- browser,
50
- watch,
51
- debug
52
- }) {
53
- const mochaTestsById = new Map();
54
- const tests = await loadTestsFromStories([browser], listener => config.storiesProvider(config, {
55
- watch,
56
- debug
57
- }, listener), testsDiff => Object.entries(testsDiff).forEach(([id, newTest]) => {
58
- const oldTest = mochaTestsById.get(id);
59
- mochaTestsById.delete(id);
60
- if (oldTest) removeTestOrSuite(oldTest);
61
- if (newTest) mochaTestsById.set(id, addTest(rootSuite, newTest));
62
- }));
63
- Object.values(tests).filter(isDefined).forEach(test => mochaTestsById.set(test.id, addTest(rootSuite, test)));
64
- }
@@ -1 +0,0 @@
1
- export { default } from './worker';
@@ -1,98 +0,0 @@
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
- import chalk from 'chalk';
4
- import { reporters } from 'mocha';
5
- import prefix from 'loglevel-plugin-prefix';
6
- import { isDefined, isImageError } from '../../types';
7
- import { getLogger } from '../logger';
8
- const testLevels = {
9
- INFO: chalk.green('PASS'),
10
- WARN: chalk.yellow('START'),
11
- ERROR: chalk.red('FAIL')
12
- };
13
- export class CreeveyReporter extends reporters.Base {
14
- constructor(runner, options) {
15
- super(runner);
16
- const {
17
- sessionId,
18
- topLevelSuite
19
- } = options.reporterOptions;
20
- const testLogger = getLogger(topLevelSuite);
21
- prefix.apply(testLogger, {
22
- format(level) {
23
- return `${testLevels[level]} => (${topLevelSuite}:${chalk.gray(sessionId)})`;
24
- }
25
-
26
- });
27
- runner.on('test', test => testLogger.warn(chalk.cyan(test.titlePath().join('/'))));
28
- runner.on('pass', test => testLogger.info(chalk.cyan(test.titlePath().join('/'))));
29
- runner.on('fail', (test, error) => testLogger.error(chalk.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${chalk.bold(imageName !== null && imageName !== void 0 ? imageName : topLevelSuite)}:${error}`, error => {
30
- var _error$stack;
31
-
32
- return `${(_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message}`;
33
- }).join('\n ')));
34
- }
35
-
36
- }
37
- export class TeamcityReporter extends reporters.Base {
38
- constructor(runner, options) {
39
- super(runner);
40
-
41
- _defineProperty(this, "escape", str => {
42
- if (!str) return '';
43
- return str.toString() // eslint-disable-next-line no-control-regex
44
- .replace(/\x1B.*?m/g, '').replace(/\|/g, '||').replace(/\n/g, '|n').replace(/\r/g, '|r').replace(/\[/g, '|[').replace(/\]/g, '|]').replace(/\u0085/g, '|x').replace(/\u2028/g, '|l').replace(/\u2029/g, '|p').replace(/'/g, "|'");
45
- });
46
-
47
- const topLevelSuite = this.escape(options.reporterOptions.topLevelSuite);
48
- const reporterOptions = options.reporterOptions;
49
- runner.on('suite', suite => suite.root ? console.log(`##teamcity[testSuiteStarted name='${topLevelSuite}' flowId='${process.pid}']`) : console.log(`##teamcity[testSuiteStarted name='${this.escape(suite.title)}' flowId='${process.pid}']`));
50
- runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`));
51
- runner.on('fail', (test, error) => {
52
- var _error$stack2;
53
-
54
- Object.entries(reporterOptions.images).forEach(([name, image]) => {
55
- if (!image) return;
56
- const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/'); // eslint-disable-next-line @typescript-eslint/no-unused-vars
57
-
58
- const {
59
- error,
60
- ...rest
61
- } = image;
62
- Object.values(rest).filter(isDefined).forEach(fileName => {
63
- console.log(`##teamcity[publishArtifacts '${reporterOptions.reportDir}/${filePath}/${fileName} => report/${filePath}']`);
64
- console.log(`##teamcity[testMetadata testName='${this.escape(test.title)}' type='image' value='report/${filePath}/${fileName}' flowId='${process.pid}']`);
65
- });
66
- }); // Output failed test as passed due TC don't support retry mechanic
67
- // https://teamcity-support.jetbrains.com/hc/en-us/community/posts/207216829-Count-test-as-successful-if-at-least-one-try-is-successful?page=1#community_comment_207394125
68
-
69
- reporterOptions.willRetry ? console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`) : console.log(`##teamcity[testFailed name='${this.escape(test.title)}' message='${this.escape(error.message)}' details='${this.escape((_error$stack2 = error.stack) !== null && _error$stack2 !== void 0 ? _error$stack2 : '')}' flowId='${process.pid}']`);
70
- });
71
- runner.on('pending', test => console.log(`##teamcity[testIgnored name='${this.escape(test.title)}' message='${this.escape(typeof test.skipReason == 'boolean' ? test.title : test.skipReason)}' flowId='${process.pid}']`));
72
- runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`));
73
- runner.on('suite end', suite => suite.root || console.log(`##teamcity[testSuiteFinished name='${this.escape(suite.title)}' flowId='${process.pid}']`));
74
- runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`));
75
- }
76
-
77
- }
78
-
79
- function getErrors(error, imageErrorToString, errorToString) {
80
- const errors = [];
81
-
82
- if (!(error instanceof Error)) {
83
- errors.push(error);
84
- } else if (!isImageError(error)) {
85
- errors.push(errorToString(error));
86
- } else if (typeof error.images == 'string') {
87
- errors.push(imageErrorToString(error.images));
88
- } else {
89
- const imageErrors = error.images;
90
- Object.keys(imageErrors).forEach(imageName => {
91
- var _imageErrors$imageNam;
92
-
93
- errors.push(imageErrorToString((_imageErrors$imageNam = imageErrors[imageName]) !== null && _imageErrors$imageNam !== void 0 ? _imageErrors$imageNam : '', imageName));
94
- });
95
- }
96
-
97
- return errors;
98
- }