creevey 0.9.0-beta.1 → 0.9.0-non-webpack.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/AUTHORS +15 -15
  2. package/CHANGELOG.md +1275 -1275
  3. package/LICENSE +21 -21
  4. package/README.md +7 -0
  5. package/addon/README.md +3 -0
  6. package/addon/package.json +4 -0
  7. package/docs/config.md +212 -212
  8. package/docs/grid.md +10 -10
  9. package/docs/tests.md +63 -63
  10. package/jest.config.js +6 -0
  11. package/lib/cjs/cli.js +5 -0
  12. package/lib/cjs/client/addon/Manager.js +418 -0
  13. package/lib/cjs/client/addon/components/Addon.js +76 -0
  14. package/lib/cjs/client/addon/components/Icons.js +42 -0
  15. package/lib/cjs/client/addon/components/Panel.js +68 -0
  16. package/lib/cjs/client/addon/components/TestSelect.js +63 -0
  17. package/lib/cjs/client/addon/components/Tools.js +114 -0
  18. package/lib/cjs/client/addon/decorator.js +11 -0
  19. package/lib/cjs/client/addon/index.js +31 -0
  20. package/lib/cjs/client/addon/preset.js +81 -0
  21. package/lib/cjs/client/addon/readyForCapture.js +12 -0
  22. package/lib/cjs/client/addon/register.js +100 -0
  23. package/lib/cjs/client/addon/utils.js +38 -0
  24. package/lib/cjs/client/addon/withCreevey.js +558 -0
  25. package/lib/cjs/client/shared/components/ImagesView/BlendView.js +85 -0
  26. package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +88 -0
  27. package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +176 -0
  28. package/lib/cjs/client/shared/components/ImagesView/SlideView.js +179 -0
  29. package/lib/cjs/client/shared/components/ImagesView/SwapView.js +110 -0
  30. package/lib/cjs/client/shared/components/ImagesView/index.js +45 -0
  31. package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +46 -0
  32. package/lib/cjs/client/shared/components/PageFooter/Paging.js +98 -0
  33. package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +78 -0
  34. package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +144 -0
  35. package/lib/cjs/client/shared/components/ResultsPage.js +173 -0
  36. package/lib/cjs/client/shared/creeveyClientApi.js +107 -0
  37. package/lib/cjs/client/shared/helpers.js +482 -0
  38. package/lib/cjs/client/shared/viewMode.js +17 -0
  39. package/lib/cjs/client/web/142.js +2 -0
  40. package/lib/cjs/client/web/142.js.LICENSE.txt +12 -0
  41. package/lib/cjs/client/web/32.js +1 -0
  42. package/lib/cjs/client/web/551.js +1 -0
  43. package/lib/cjs/client/web/566.js +2 -0
  44. package/lib/cjs/client/web/566.js.LICENSE.txt +31 -0
  45. package/lib/cjs/client/web/691.js +2 -0
  46. package/lib/cjs/client/web/691.js.LICENSE.txt +8 -0
  47. package/lib/cjs/client/web/725.js +1 -0
  48. package/lib/cjs/client/web/index.html +19 -0
  49. package/lib/cjs/client/web/main.js +2 -38
  50. package/lib/cjs/client/web/main.js.LICENSE.txt +49 -0
  51. package/lib/cjs/creevey.js +69 -0
  52. package/lib/cjs/index.js +62 -0
  53. package/lib/cjs/server/config.js +96 -0
  54. package/lib/cjs/server/docker.js +146 -0
  55. package/lib/cjs/server/extract.js +50 -0
  56. package/lib/cjs/server/index.js +83 -0
  57. package/lib/cjs/server/loaders/babel/creevey-plugin.js +86 -0
  58. package/lib/cjs/server/loaders/babel/helpers.js +469 -0
  59. package/lib/cjs/server/loaders/babel/register.js +124 -0
  60. package/lib/cjs/server/loaders/hooks/mdx.js +30 -0
  61. package/lib/cjs/server/loaders/hooks/svelte.js +65 -0
  62. package/lib/cjs/server/loaders/webpack/compile.js +293 -0
  63. package/lib/cjs/server/loaders/webpack/creevey-loader.js +179 -0
  64. package/lib/cjs/server/loaders/webpack/dummy-hmr.js +39 -0
  65. package/lib/cjs/server/loaders/webpack/mdx-loader.js +72 -0
  66. package/lib/cjs/server/loaders/webpack/start.js +41 -0
  67. package/lib/cjs/server/logger.js +48 -0
  68. package/lib/cjs/server/master/api.js +71 -0
  69. package/lib/cjs/server/master/index.js +146 -0
  70. package/lib/cjs/server/master/master.js +57 -0
  71. package/lib/cjs/server/master/pool.js +197 -0
  72. package/lib/cjs/server/master/runner.js +281 -0
  73. package/lib/cjs/server/master/server.js +129 -0
  74. package/lib/cjs/server/messages.js +264 -0
  75. package/lib/cjs/server/selenium/browser.js +672 -0
  76. package/lib/cjs/server/selenium/index.js +31 -0
  77. package/lib/cjs/server/selenium/selenoid.js +172 -0
  78. package/lib/cjs/server/stories.js +159 -0
  79. package/lib/cjs/server/storybook/entry.js +70 -0
  80. package/lib/cjs/server/storybook/helpers.js +159 -0
  81. package/lib/cjs/server/storybook/providers/browser.js +74 -0
  82. package/lib/cjs/server/storybook/providers/hybrid.js +84 -0
  83. package/lib/cjs/server/storybook/providers/nodejs.js +239 -0
  84. package/lib/cjs/server/testsFiles/parser.js +72 -0
  85. package/lib/cjs/server/testsFiles/register.js +48 -0
  86. package/lib/cjs/server/update.js +79 -0
  87. package/lib/cjs/server/utils.js +183 -0
  88. package/lib/cjs/server/worker/chai-image.js +142 -0
  89. package/lib/cjs/server/worker/helpers.js +69 -0
  90. package/lib/cjs/server/worker/index.js +15 -0
  91. package/lib/cjs/server/worker/reporter.js +108 -0
  92. package/lib/cjs/server/worker/worker.js +268 -0
  93. package/lib/cjs/shared/index.js +89 -0
  94. package/lib/cjs/shared/serializeRegExp.js +41 -0
  95. package/lib/cjs/types.js +74 -0
  96. package/lib/esm/cli.js +4 -0
  97. package/lib/esm/client/addon/Manager.js +402 -0
  98. package/lib/esm/client/addon/components/Addon.js +58 -0
  99. package/lib/esm/client/addon/components/Icons.js +27 -0
  100. package/lib/esm/client/addon/components/Panel.js +49 -0
  101. package/lib/esm/client/addon/components/TestSelect.js +49 -0
  102. package/lib/esm/client/addon/components/Tools.js +91 -0
  103. package/lib/esm/client/addon/decorator.js +2 -0
  104. package/lib/esm/client/addon/index.js +2 -0
  105. package/lib/esm/client/addon/preset.js +56 -0
  106. package/lib/esm/client/addon/readyForCapture.js +5 -0
  107. package/lib/esm/client/addon/register.js +79 -0
  108. package/lib/esm/client/addon/utils.js +31 -0
  109. package/lib/esm/client/addon/withCreevey.js +534 -0
  110. package/lib/esm/client/shared/components/ImagesView/BlendView.js +63 -0
  111. package/lib/esm/client/shared/components/ImagesView/ImagesView.js +65 -0
  112. package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +151 -0
  113. package/lib/esm/client/shared/components/ImagesView/SlideView.js +154 -0
  114. package/lib/esm/client/shared/components/ImagesView/SwapView.js +88 -0
  115. package/lib/esm/client/shared/components/ImagesView/index.js +5 -0
  116. package/lib/esm/client/shared/components/PageFooter/PageFooter.js +32 -0
  117. package/lib/esm/client/shared/components/PageFooter/Paging.js +84 -0
  118. package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +64 -0
  119. package/lib/esm/client/shared/components/PageHeader/PageHeader.js +120 -0
  120. package/lib/esm/client/shared/components/ResultsPage.js +143 -0
  121. package/lib/esm/client/shared/creeveyClientApi.js +98 -0
  122. package/lib/esm/client/shared/helpers.js +424 -0
  123. package/lib/esm/client/shared/viewMode.js +6 -0
  124. package/lib/esm/creevey.js +54 -0
  125. package/lib/esm/index.js +5 -0
  126. package/lib/esm/server/config.js +73 -0
  127. package/lib/esm/server/docker.js +123 -0
  128. package/lib/esm/server/extract.js +34 -0
  129. package/lib/esm/server/index.js +64 -0
  130. package/lib/esm/server/loaders/babel/creevey-plugin.js +72 -0
  131. package/lib/esm/server/loaders/babel/helpers.js +452 -0
  132. package/lib/esm/server/loaders/babel/register.js +103 -0
  133. package/lib/esm/server/loaders/hooks/mdx.js +15 -0
  134. package/lib/esm/server/loaders/hooks/svelte.js +49 -0
  135. package/lib/esm/server/loaders/webpack/compile.js +270 -0
  136. package/lib/esm/server/loaders/webpack/creevey-loader.js +158 -0
  137. package/lib/esm/server/loaders/webpack/dummy-hmr.js +32 -0
  138. package/lib/esm/server/loaders/webpack/mdx-loader.js +58 -0
  139. package/lib/esm/server/loaders/webpack/start.js +27 -0
  140. package/lib/esm/server/logger.js +20 -0
  141. package/lib/esm/server/master/api.js +60 -0
  142. package/lib/esm/server/master/index.js +125 -0
  143. package/lib/esm/server/master/master.js +38 -0
  144. package/lib/esm/server/master/pool.js +176 -0
  145. package/lib/esm/server/master/runner.js +259 -0
  146. package/lib/esm/server/master/server.js +105 -0
  147. package/lib/esm/server/messages.js +232 -0
  148. package/lib/esm/server/selenium/browser.js +639 -0
  149. package/lib/esm/server/selenium/index.js +2 -0
  150. package/lib/esm/server/selenium/selenoid.js +149 -0
  151. package/lib/esm/server/stories.js +140 -0
  152. package/lib/esm/server/storybook/entry.js +46 -0
  153. package/lib/esm/server/storybook/helpers.js +98 -0
  154. package/lib/esm/server/storybook/providers/browser.js +60 -0
  155. package/lib/esm/server/storybook/providers/hybrid.js +64 -0
  156. package/lib/esm/server/storybook/providers/nodejs.js +217 -0
  157. package/lib/esm/server/testsFiles/parser.js +50 -0
  158. package/lib/esm/server/testsFiles/register.js +35 -0
  159. package/lib/esm/server/update.js +61 -0
  160. package/lib/esm/server/utils.js +142 -0
  161. package/lib/esm/server/worker/chai-image.js +130 -0
  162. package/lib/esm/server/worker/helpers.js +60 -0
  163. package/lib/esm/server/worker/index.js +1 -0
  164. package/lib/esm/server/worker/reporter.js +86 -0
  165. package/lib/esm/server/worker/worker.js +238 -0
  166. package/lib/esm/shared/index.js +66 -0
  167. package/lib/esm/shared/serializeRegExp.js +23 -0
  168. package/lib/esm/types.js +43 -0
  169. package/lib/types/cli.d.ts +1 -1
  170. package/lib/types/client/addon/Manager.d.ts +37 -37
  171. package/lib/types/client/addon/components/Addon.d.ts +8 -8
  172. package/lib/types/client/addon/components/Icons.d.ts +7 -7
  173. package/lib/types/client/addon/components/Panel.d.ts +9 -9
  174. package/lib/types/client/addon/components/TestSelect.d.ts +8 -9
  175. package/lib/types/client/addon/components/Tools.d.ts +6 -6
  176. package/lib/types/client/addon/decorator.d.ts +1 -1
  177. package/lib/types/client/addon/index.d.ts +2 -0
  178. package/lib/types/client/addon/preset.d.ts +23 -24
  179. package/lib/types/client/addon/readyForCapture.d.ts +6 -6
  180. package/lib/types/client/addon/register.d.ts +3 -3
  181. package/lib/types/client/addon/utils.d.ts +2 -2
  182. package/lib/types/client/addon/withCreevey.d.ts +24 -24
  183. package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -3
  184. package/lib/types/client/shared/components/ImagesView/ImagesView.d.ts +24 -25
  185. package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -3
  186. package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -3
  187. package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -3
  188. package/lib/types/client/shared/components/ImagesView/index.d.ts +5 -5
  189. package/lib/types/client/shared/components/PageFooter/PageFooter.d.ts +8 -9
  190. package/lib/types/client/shared/components/PageFooter/Paging.d.ts +7 -8
  191. package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +12 -12
  192. package/lib/types/client/shared/components/PageHeader/PageHeader.d.ts +16 -17
  193. package/lib/types/client/shared/components/ResultsPage.d.ts +18 -18
  194. package/lib/types/client/shared/creeveyClientApi.d.ts +9 -9
  195. package/lib/types/client/shared/helpers.d.ts +46 -46
  196. package/lib/types/client/shared/viewMode.d.ts +4 -4
  197. package/lib/types/client/web/CreeveyApp.d.ts +11 -12
  198. package/lib/types/client/web/CreeveyContext.d.ts +11 -11
  199. package/lib/types/client/web/CreeveyLoader.d.ts +2 -3
  200. package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +19 -19
  201. package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +6 -6
  202. package/lib/types/client/web/CreeveyView/SideBar/SideBar.d.ts +14 -14
  203. package/lib/types/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +12 -13
  204. package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +33 -33
  205. package/lib/types/client/web/CreeveyView/SideBar/TestLink.d.ts +7 -8
  206. package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +10 -10
  207. package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +9 -9
  208. package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +6 -6
  209. package/lib/types/client/web/CreeveyView/SideBar/index.d.ts +1 -1
  210. package/lib/types/client/web/KeyboardEventsContext.d.ts +13 -13
  211. package/lib/types/client/web/index.d.ts +4 -4
  212. package/lib/types/creevey.d.ts +1 -1
  213. package/lib/types/index.d.ts +1 -4
  214. package/lib/types/server/config.d.ts +4 -4
  215. package/lib/types/server/docker.d.ts +7 -7
  216. package/lib/types/server/extract.d.ts +2 -2
  217. package/lib/types/server/index.d.ts +2 -2
  218. package/lib/types/server/loaders/babel/creevey-plugin.d.ts +1 -1
  219. package/lib/types/server/loaders/babel/helpers.d.ts +19 -19
  220. package/lib/types/server/loaders/babel/register.d.ts +5 -5
  221. package/lib/types/server/loaders/hooks/mdx.d.ts +1 -1
  222. package/lib/types/server/loaders/hooks/svelte.d.ts +1 -1
  223. package/lib/types/server/loaders/webpack/compile.d.ts +2 -2
  224. package/lib/types/server/loaders/webpack/creevey-loader.d.ts +4 -2
  225. package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +10 -10
  226. package/lib/types/server/loaders/webpack/mdx-loader.d.ts +6 -6
  227. package/lib/types/server/loaders/webpack/start.d.ts +1 -1
  228. package/lib/types/server/logger.d.ts +10 -6
  229. package/lib/types/server/master/api.d.ts +7 -7
  230. package/lib/types/server/master/index.d.ts +3 -3
  231. package/lib/types/server/master/master.d.ts +7 -7
  232. package/lib/types/server/master/pool.d.ts +31 -31
  233. package/lib/types/server/master/runner.d.ts +26 -26
  234. package/lib/types/server/master/server.d.ts +2 -2
  235. package/lib/types/server/messages.d.ts +27 -27
  236. package/lib/types/server/selenium/browser.d.ts +17 -17
  237. package/lib/types/server/selenium/index.d.ts +2 -2
  238. package/lib/types/server/selenium/selenoid.d.ts +3 -3
  239. package/lib/types/server/stories.d.ts +8 -8
  240. package/lib/types/server/storybook/entry.d.ts +18 -18
  241. package/lib/types/server/storybook/helpers.d.ts +24 -24
  242. package/lib/types/server/storybook/providers/browser.d.ts +4 -4
  243. package/lib/types/server/storybook/providers/hybrid.d.ts +4 -4
  244. package/lib/types/server/storybook/providers/nodejs.d.ts +9 -9
  245. package/lib/types/server/testsFiles/parser.d.ts +12 -12
  246. package/lib/types/server/testsFiles/register.d.ts +2 -2
  247. package/lib/types/server/update.d.ts +2 -2
  248. package/lib/types/server/utils.d.ts +20 -20
  249. package/lib/types/server/worker/chai-image.d.ts +6 -6
  250. package/lib/types/server/worker/helpers.d.ts +8 -8
  251. package/lib/types/server/worker/index.d.ts +1 -1
  252. package/lib/types/server/worker/reporter.d.ts +8 -8
  253. package/lib/types/server/worker/worker.d.ts +4 -4
  254. package/lib/types/{shared.d.ts → shared/index.d.ts} +7 -16
  255. package/lib/types/shared/serializeRegExp.d.ts +9 -0
  256. package/lib/types/types.d.ts +490 -489
  257. package/package.json +115 -102
  258. package/preset.js +9 -9
  259. package/types/babel__register.d.ts +1 -1
  260. package/types/chai.d.ts +12 -12
  261. package/types/event-source-polyfill.d.ts +6 -6
  262. package/types/mdx.d.ts +3 -2
  263. package/types/mocha.d.ts +20 -20
  264. package/types/png.d.ts +4 -4
  265. package/lib/cjs/client/web/1.js +0 -13
  266. package/lib/cjs/client/web/2.js +0 -1
  267. package/storybook-static/stories.json +0 -21
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.extensions = exports.downloadBinary = exports.LOCALHOST_REGEXP = void 0;
7
+ exports.getCreeveyCache = getCreeveyCache;
8
+ exports.isShuttingDown = exports.isInsideDocker = void 0;
9
+ exports.readDirRecursive = readDirRecursive;
10
+ exports.removeProps = removeProps;
11
+ exports.runSequence = runSequence;
12
+ exports.shouldSkip = shouldSkip;
13
+ exports.shutdown = shutdown;
14
+ exports.shutdownWorkers = shutdownWorkers;
15
+ exports.skipOptionKeys = void 0;
16
+ exports.testsToImages = testsToImages;
17
+
18
+ var _fs = require("fs");
19
+
20
+ var _cluster = _interopRequireDefault(require("cluster"));
21
+
22
+ var _types = require("../types");
23
+
24
+ var _messages = require("./messages");
25
+
26
+ var _findCacheDir = _interopRequireDefault(require("find-cache-dir"));
27
+
28
+ var _https = require("https");
29
+
30
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
+
32
+ const isShuttingDown = {
33
+ current: false
34
+ };
35
+ exports.isShuttingDown = isShuttingDown;
36
+ const LOCALHOST_REGEXP = /(localhost|127\.0\.0\.1)/i;
37
+ exports.LOCALHOST_REGEXP = LOCALHOST_REGEXP;
38
+ const extensions = ['.js', '.jsx', '.ts', '.tsx'];
39
+ exports.extensions = extensions;
40
+ const skipOptionKeys = ['in', 'kinds', 'stories', 'tests', 'reason'];
41
+ exports.skipOptionKeys = skipOptionKeys;
42
+
43
+ function matchBy(pattern, value) {
44
+ return typeof pattern == 'string' && pattern == value || Array.isArray(pattern) && pattern.includes(value) || pattern instanceof RegExp && pattern.test(value) || !(0, _types.isDefined)(pattern);
45
+ }
46
+
47
+ function shouldSkip(browser, meta, skipOptions, test) {
48
+ if (typeof skipOptions != 'object') {
49
+ return skipOptions;
50
+ }
51
+
52
+ if (Array.isArray(skipOptions)) {
53
+ for (const skip of skipOptions) {
54
+ const reason = shouldSkip(browser, meta, skip, test);
55
+ if (reason) return reason;
56
+ }
57
+
58
+ return false;
59
+ }
60
+
61
+ let hasSkipOptionKeys = false;
62
+
63
+ for (const skipKey in skipOptions) {
64
+ if (skipOptionKeys.includes(skipKey)) {
65
+ hasSkipOptionKeys = true;
66
+ continue;
67
+ }
68
+
69
+ const reason = shouldSkip(browser, meta, {
70
+ reason: skipKey,
71
+ ...skipOptions[skipKey]
72
+ }, test);
73
+ if (reason) return reason;
74
+ }
75
+
76
+ if (!hasSkipOptionKeys) return false;
77
+ const {
78
+ in: browsers,
79
+ kinds,
80
+ stories,
81
+ tests,
82
+ reason = true
83
+ } = skipOptions;
84
+ const {
85
+ kind,
86
+ story
87
+ } = meta;
88
+ const skipByBrowser = matchBy(browsers, browser);
89
+ const skipByKind = matchBy(kinds, kind);
90
+ const skipByStory = matchBy(stories, story);
91
+ const skipByTest = !(0, _types.isDefined)(test) || matchBy(tests, test);
92
+ return skipByBrowser && skipByKind && skipByStory && skipByTest && reason;
93
+ }
94
+
95
+ async function shutdownWorkers() {
96
+ isShuttingDown.current = true;
97
+ await Promise.all(Object.values(_cluster.default.workers ?? {}).filter(_types.isDefined).filter(worker => worker.isConnected()).map(worker => new Promise(resolve => {
98
+ const timeout = setTimeout(() => worker.kill(), 10000);
99
+ worker.on('exit', () => {
100
+ clearTimeout(timeout);
101
+ resolve();
102
+ });
103
+ (0, _messages.sendShutdownMessage)(worker);
104
+ })));
105
+ (0, _messages.emitShutdownMessage)();
106
+ }
107
+
108
+ function shutdown() {
109
+ // eslint-disable-next-line no-process-exit
110
+ process.exit();
111
+ }
112
+
113
+ function getCreeveyCache() {
114
+ return (0, _findCacheDir.default)({
115
+ name: 'creevey',
116
+ cwd: __dirname
117
+ });
118
+ }
119
+
120
+ async function runSequence(seq, predicate) {
121
+ for (const fn of seq) {
122
+ if (predicate()) await fn();
123
+ }
124
+ }
125
+
126
+ function testsToImages(tests) {
127
+ return new Set([].concat(...tests.filter(_types.isDefined).map(({
128
+ browser,
129
+ testName,
130
+ storyPath,
131
+ results
132
+ }) => {
133
+ var _results$slice$;
134
+
135
+ return Object.keys((results === null || results === void 0 ? void 0 : (_results$slice$ = results.slice(-1)[0]) === null || _results$slice$ === void 0 ? void 0 : _results$slice$.images) ?? {}).map(image => `${[...storyPath, testName, browser, browser == image ? undefined : image].filter(_types.isDefined).join('/')}.png`);
136
+ })));
137
+ } // https://tuhrig.de/how-to-know-you-are-inside-a-docker-container/
138
+
139
+
140
+ const isInsideDocker = (0, _fs.existsSync)('/proc/1/cgroup') && /docker/.test((0, _fs.readFileSync)('/proc/1/cgroup', 'utf8'));
141
+ exports.isInsideDocker = isInsideDocker;
142
+
143
+ const downloadBinary = (downloadUrl, destination) => new Promise((resolve, reject) => (0, _https.get)(downloadUrl, response => {
144
+ if (response.statusCode == 302) {
145
+ const {
146
+ location
147
+ } = response.headers;
148
+ if (!location) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
149
+ return resolve(downloadBinary(location, destination));
150
+ }
151
+
152
+ if (response.statusCode != 200) return reject(new Error(`Couldn't download selenoid. Status code: ${response.statusCode ?? 'UNKNOWN'}`));
153
+ const fileStream = (0, _fs.createWriteStream)(destination);
154
+ response.pipe(fileStream);
155
+ fileStream.on('finish', () => {
156
+ fileStream.close();
157
+ resolve();
158
+ });
159
+ fileStream.on('error', error => {
160
+ (0, _fs.unlink)(destination, _types.noop);
161
+ reject(error);
162
+ });
163
+ }));
164
+
165
+ exports.downloadBinary = downloadBinary;
166
+
167
+ function removeProps(obj, propPath) {
168
+ const [prop, ...restPath] = propPath;
169
+
170
+ if (restPath.length > 0) {
171
+ if (typeof prop == 'string') obj[prop] && removeProps(obj[prop], restPath);
172
+ if ((0, _types.isFunction)(prop)) Object.keys(obj).filter(prop).forEach(key => obj[key] && removeProps(obj[key], restPath));
173
+ } else {
174
+ if (typeof prop == 'string') delete obj[prop];
175
+ if ((0, _types.isFunction)(prop)) Object.keys(obj).filter(prop).forEach(key => delete obj[key]);
176
+ }
177
+ }
178
+
179
+ function readDirRecursive(dirPath) {
180
+ return [].concat(...(0, _fs.readdirSync)(dirPath, {
181
+ withFileTypes: true
182
+ }).map(dirent => dirent.isDirectory() ? readDirRecursive(`${dirPath}/${dirent.name}`) : [`${dirPath}/${dirent.name}`]));
183
+ }
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = _default;
7
+
8
+ var _pngjs = require("pngjs");
9
+
10
+ var _pixelmatch = _interopRequireDefault(require("pixelmatch"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ function normalizeImageSize(image, width, height) {
15
+ const normalizedImage = Buffer.alloc(4 * width * height);
16
+
17
+ for (let y = 0; y < height; y++) {
18
+ for (let x = 0; x < width; x++) {
19
+ const i = (y * width + x) * 4;
20
+
21
+ if (x < image.width && y < image.height) {
22
+ const j = (y * image.width + x) * 4;
23
+ normalizedImage[i + 0] = image.data[j + 0];
24
+ normalizedImage[i + 1] = image.data[j + 1];
25
+ normalizedImage[i + 2] = image.data[j + 2];
26
+ normalizedImage[i + 3] = image.data[j + 3];
27
+ } else {
28
+ normalizedImage[i + 0] = 0;
29
+ normalizedImage[i + 1] = 0;
30
+ normalizedImage[i + 2] = 0;
31
+ normalizedImage[i + 3] = 0;
32
+ }
33
+ }
34
+ }
35
+
36
+ return normalizedImage;
37
+ }
38
+
39
+ function hasDiffPixels(diff) {
40
+ for (let i = 0; i < diff.length; i += 4) {
41
+ if (diff[i + 0] == 255 && diff[i + 1] == 0 && diff[i + 2] == 0 && diff[i + 3] == 255) return true;
42
+ }
43
+
44
+ return false;
45
+ }
46
+
47
+ function compareImages(expect, actual, diffOptions) {
48
+ const expectImage = _pngjs.PNG.sync.read(expect);
49
+
50
+ const actualImage = _pngjs.PNG.sync.read(actual);
51
+
52
+ const width = Math.max(actualImage.width, expectImage.width);
53
+ const height = Math.max(actualImage.height, expectImage.height);
54
+ const diffImage = new _pngjs.PNG({
55
+ width,
56
+ height
57
+ });
58
+ let actualImageData = actualImage.data;
59
+
60
+ if (actualImage.width < width || actualImage.height < height) {
61
+ actualImageData = normalizeImageSize(actualImage, width, height);
62
+ }
63
+
64
+ let expectImageData = expectImage.data;
65
+
66
+ if (expectImage.width < width || expectImage.height < height) {
67
+ expectImageData = normalizeImageSize(expectImage, width, height);
68
+ }
69
+
70
+ (0, _pixelmatch.default)(expectImageData, actualImageData, diffImage.data, width, height, diffOptions);
71
+ return {
72
+ isEqual: !hasDiffPixels(diffImage.data),
73
+ diff: _pngjs.PNG.sync.write(diffImage)
74
+ };
75
+ }
76
+
77
+ function _default(getExpected, diffOptions) {
78
+ return function chaiImage({
79
+ Assertion
80
+ }, utils) {
81
+ async function assertImage(actual, imageName) {
82
+ let onCompare = () => Promise.resolve();
83
+
84
+ let expected = await getExpected(imageName);
85
+ if (!(expected instanceof Buffer) && expected != null) ({
86
+ expected,
87
+ onCompare
88
+ } = expected);
89
+
90
+ if (expected == null) {
91
+ await onCompare(actual);
92
+ return imageName ? `Expected image '${imageName}' does not exists` : 'Expected image does not exists';
93
+ }
94
+
95
+ if (actual.equals(expected)) return await onCompare(actual);
96
+ const {
97
+ isEqual,
98
+ diff
99
+ } = compareImages(expected, actual, diffOptions);
100
+ if (isEqual) return await onCompare(actual);
101
+ await onCompare(actual, expected, diff);
102
+ return imageName ? `Expected image '${imageName}' to match` : 'Expected image to match';
103
+ }
104
+
105
+ utils.addMethod(Assertion.prototype, 'matchImage', async function matchImage(imageName) {
106
+ const actual = utils.flag(this, 'object');
107
+ const errorMessage = await assertImage(typeof actual == 'string' ? Buffer.from(actual, 'base64') : actual, imageName);
108
+
109
+ if (errorMessage) {
110
+ throw createImageError(imageName ? {
111
+ [imageName]: errorMessage
112
+ } : errorMessage);
113
+ }
114
+ });
115
+ utils.addMethod(Assertion.prototype, 'matchImages', async function matchImages() {
116
+ const errors = {};
117
+ await Promise.all(Object.entries(utils.flag(this, 'object')).map(async ([imageName, imageOrBase64]) => {
118
+ let errorMessage;
119
+
120
+ try {
121
+ errorMessage = await assertImage(typeof imageOrBase64 == 'string' ? Buffer.from(imageOrBase64, 'base64') : imageOrBase64, imageName);
122
+ } catch (error) {
123
+ errorMessage = error.stack;
124
+ }
125
+
126
+ if (errorMessage) {
127
+ errors[imageName] = errorMessage;
128
+ }
129
+ }));
130
+
131
+ if (Object.keys(errors).length > 0) {
132
+ throw createImageError(errors);
133
+ }
134
+ });
135
+ };
136
+ }
137
+
138
+ function createImageError(imageErrors) {
139
+ const error = new Error('Expected image to match');
140
+ error.images = imageErrors;
141
+ return error;
142
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addTestsFromStories = addTestsFromStories;
7
+
8
+ var _mocha = require("mocha");
9
+
10
+ var _types = require("../../types");
11
+
12
+ var _stories = require("../stories");
13
+
14
+ function findOrCreateSuite(name, parent) {
15
+ const suite = parent.suites.find(({
16
+ title
17
+ }) => title == name) || new _mocha.Suite(name, parent.ctx);
18
+
19
+ if (!suite.parent) {
20
+ suite.parent = parent;
21
+ parent.addSuite(suite);
22
+ }
23
+
24
+ return suite;
25
+ }
26
+
27
+ function createTest(name, fn, skip = false) {
28
+ const test = new _mocha.Test(name, skip ? undefined : fn);
29
+ test.pending = Boolean(skip); // NOTE Can't define skip reason in mocha https://github.com/mochajs/mocha/issues/2026
30
+
31
+ test.skipReason = skip;
32
+ return test;
33
+ }
34
+
35
+ function addTest(rootSuite, test) {
36
+ const [testName, ...suitePath] = [...test.storyPath, test.testName].reverse().filter(_types.isDefined);
37
+ const suite = suitePath.reduceRight((subSuite, suiteName) => findOrCreateSuite(suiteName, subSuite), rootSuite);
38
+ const mochaTest = createTest(testName, test.fn, test.skip);
39
+ suite.addTest(mochaTest);
40
+ mochaTest.ctx = Object.setPrototypeOf({
41
+ id: test.id,
42
+ story: test.story
43
+ }, suite.ctx);
44
+ return mochaTest;
45
+ }
46
+
47
+ function removeTestOrSuite(testOrSuite) {
48
+ const {
49
+ parent
50
+ } = testOrSuite;
51
+ if (!parent) return;
52
+ if (testOrSuite instanceof _mocha.Test) parent.tests = parent.tests.filter(test => test != testOrSuite);
53
+ if (testOrSuite instanceof _mocha.Suite) parent.suites = parent.suites.filter(suite => suite != testOrSuite);
54
+ if (parent.tests.length == 0 && parent.suites.length == 0) removeTestOrSuite(parent);
55
+ }
56
+
57
+ async function addTestsFromStories(rootSuite, config, {
58
+ browser,
59
+ ...options
60
+ }) {
61
+ const mochaTestsById = new Map();
62
+ const tests = await (0, _stories.loadTestsFromStories)([browser], listener => config.storiesProvider(config, options, listener), testsDiff => Object.entries(testsDiff).forEach(([id, newTest]) => {
63
+ const oldTest = mochaTestsById.get(id);
64
+ mochaTestsById.delete(id);
65
+ if (oldTest) removeTestOrSuite(oldTest);
66
+ if (newTest) mochaTestsById.set(id, addTest(rootSuite, newTest));
67
+ }));
68
+ Object.values(tests).filter(_types.isDefined).forEach(test => mochaTestsById.set(test.id, addTest(rootSuite, test)));
69
+ }
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "default", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _worker.default;
10
+ }
11
+ });
12
+
13
+ var _worker = _interopRequireDefault(require("./worker"));
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.TeamcityReporter = exports.CreeveyReporter = void 0;
7
+
8
+ var _chalk = _interopRequireDefault(require("chalk"));
9
+
10
+ var _mocha = require("mocha");
11
+
12
+ var _loglevelPluginPrefix = _interopRequireDefault(require("loglevel-plugin-prefix"));
13
+
14
+ var _types = require("../../types");
15
+
16
+ var _logger = require("../logger");
17
+
18
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
+
20
+ const testLevels = {
21
+ INFO: _chalk.default.green('PASS'),
22
+ WARN: _chalk.default.yellow('START'),
23
+ ERROR: _chalk.default.red('FAIL')
24
+ };
25
+
26
+ class CreeveyReporter extends _mocha.reporters.Base {
27
+ constructor(runner, options) {
28
+ super(runner);
29
+ const {
30
+ sessionId,
31
+ topLevelSuite
32
+ } = options.reporterOptions;
33
+ const testLogger = (0, _logger.getLogger)(topLevelSuite);
34
+
35
+ _loglevelPluginPrefix.default.apply(testLogger, {
36
+ format(level) {
37
+ return `${testLevels[level]} => (${topLevelSuite}:${_chalk.default.gray(sessionId)})`;
38
+ }
39
+
40
+ });
41
+
42
+ runner.on('test', test => testLogger.warn(_chalk.default.cyan(test.titlePath().join('/'))));
43
+ runner.on('pass', test => testLogger.info(_chalk.default.cyan(test.titlePath().join('/'))));
44
+ runner.on('fail', (test, error) => testLogger.error(_chalk.default.cyan(test.titlePath().join('/')), '\n ', getErrors(error, (error, imageName) => `${_chalk.default.bold(imageName ?? topLevelSuite)}:${error}`, error => `${error.stack ?? error.message}`).join('\n ')));
45
+ }
46
+
47
+ }
48
+
49
+ exports.CreeveyReporter = CreeveyReporter;
50
+
51
+ class TeamcityReporter extends _mocha.reporters.Base {
52
+ constructor(runner, options) {
53
+ super(runner);
54
+ const topLevelSuite = this.escape(options.reporterOptions.topLevelSuite);
55
+ const reporterOptions = options.reporterOptions;
56
+ 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}']`));
57
+ runner.on('test', test => console.log(`##teamcity[testStarted name='${this.escape(test.title)}' flowId='${process.pid}']`));
58
+ runner.on('fail', (test, error) => {
59
+ Object.entries(reporterOptions.images).forEach(([name, image]) => {
60
+ if (!image) return;
61
+ const filePath = test.titlePath().concat(name == topLevelSuite ? [] : [topLevelSuite]).map(this.escape).join('/'); // eslint-disable-next-line @typescript-eslint/no-unused-vars
62
+
63
+ const {
64
+ error,
65
+ ...rest
66
+ } = image;
67
+ Object.values(rest).filter(_types.isDefined).forEach(fileName => {
68
+ console.log(`##teamcity[publishArtifacts '${reporterOptions.reportDir}/${filePath}/${fileName} => report/${filePath}']`);
69
+ console.log(`##teamcity[testMetadata testName='${this.escape(test.title)}' type='image' value='report/${filePath}/${fileName}' flowId='${process.pid}']`);
70
+ });
71
+ }); // Output failed test as passed due TC don't support retry mechanic
72
+ // 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
73
+
74
+ 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.stack ?? '')}' flowId='${process.pid}']`);
75
+ });
76
+ 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}']`));
77
+ runner.on('test end', test => console.log(`##teamcity[testFinished name='${this.escape(test.title)}' flowId='${process.pid}']`));
78
+ runner.on('suite end', suite => suite.root || console.log(`##teamcity[testSuiteFinished name='${this.escape(suite.title)}' flowId='${process.pid}']`));
79
+ runner.on('end', () => console.log(`##teamcity[testSuiteFinished name='${topLevelSuite}' flowId='${process.pid}']`));
80
+ }
81
+
82
+ escape = str => {
83
+ if (!str) return '';
84
+ return str.toString() // eslint-disable-next-line no-control-regex
85
+ .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, "|'");
86
+ };
87
+ }
88
+
89
+ exports.TeamcityReporter = TeamcityReporter;
90
+
91
+ function getErrors(error, imageErrorToString, errorToString) {
92
+ const errors = [];
93
+
94
+ if (!(error instanceof Error)) {
95
+ errors.push(error);
96
+ } else if (!(0, _types.isImageError)(error)) {
97
+ errors.push(errorToString(error));
98
+ } else if (typeof error.images == 'string') {
99
+ errors.push(imageErrorToString(error.images));
100
+ } else {
101
+ const imageErrors = error.images;
102
+ Object.keys(imageErrors).forEach(imageName => {
103
+ errors.push(imageErrorToString(imageErrors[imageName] ?? '', imageName));
104
+ });
105
+ }
106
+
107
+ return errors;
108
+ }