testeranto 0.47.33 → 0.47.52

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 (309) hide show
  1. package/.nvmrc +1 -0
  2. package/Bundle.Dockerfile +45 -0
  3. package/README.md +86 -11
  4. package/Report.Dockerfile +43 -0
  5. package/dist/cjs-shim.js +12 -0
  6. package/dist/common/Features.js +3 -37
  7. package/dist/common/Init.js +30 -0
  8. package/dist/common/Node.js +15 -66
  9. package/dist/common/PM/index.js +7 -0
  10. package/dist/common/PM/main.js +641 -0
  11. package/dist/common/PM/node.js +88 -0
  12. package/dist/common/PM/web.js +132 -0
  13. package/dist/common/Project.js +109 -637
  14. package/dist/common/Puppeteer.js +103 -0
  15. package/dist/common/Reporter.js +112 -0
  16. package/dist/common/Scheduler.js +1 -0
  17. package/dist/common/SubPackages/puppeteer.js +21 -0
  18. package/dist/common/{subPackages → SubPackages}/react/component/node.js +4 -4
  19. package/dist/common/{subPackages → SubPackages}/react/component/web.js +4 -4
  20. package/dist/common/SubPackages/react/jsx/index.js +25 -0
  21. package/dist/common/SubPackages/react/jsx/node.js +10 -0
  22. package/dist/common/SubPackages/react/jsx/web.js +10 -0
  23. package/dist/common/{subPackages/react-dom/jsx → SubPackages/react-dom/component}/node.js +6 -6
  24. package/dist/common/SubPackages/react-dom/component/web.js +93 -0
  25. package/dist/common/SubPackages/react-dom/jsx/index.js +2 -0
  26. package/dist/common/SubPackages/react-dom/jsx/node.js +39 -0
  27. package/dist/common/SubPackages/react-dom/jsx/web.js +118 -0
  28. package/dist/common/SubPackages/react-test-renderer/MemoExoticComponent/node.js +44 -0
  29. package/dist/common/SubPackages/react-test-renderer/component/index.js +2 -0
  30. package/dist/common/{subPackages/react-test-renderer/component/index.js → SubPackages/react-test-renderer/component/interface.js} +23 -33
  31. package/dist/common/{subPackages/react-test-renderer/jsx → SubPackages/react-test-renderer/component}/node.js +3 -5
  32. package/dist/common/{subPackages/react/jsx → SubPackages/react-test-renderer/component}/web.js +3 -5
  33. package/dist/common/SubPackages/react-test-renderer/fc/node.js +50 -0
  34. package/dist/common/SubPackages/react-test-renderer/fc/web.js +50 -0
  35. package/dist/common/{subPackages → SubPackages}/react-test-renderer/jsx/index.js +7 -3
  36. package/dist/common/SubPackages/react-test-renderer/jsx/node.js +10 -0
  37. package/dist/common/SubPackages/react-test-renderer/jsx/web.js +10 -0
  38. package/dist/common/SubPackages/react-test-renderer/jsx-promised/index.js +42 -0
  39. package/dist/common/{subPackages/react/jsx → SubPackages/react-test-renderer/jsx-promised}/node.js +2 -2
  40. package/dist/common/TaskManBackEnd.js +174 -0
  41. package/dist/common/Web.js +31 -108
  42. package/dist/common/esbuildConfigs/features.js +14 -0
  43. package/dist/common/esbuildConfigs/index.js +21 -0
  44. package/dist/common/esbuildConfigs/inputFilesPlugin.js +49 -0
  45. package/dist/common/esbuildConfigs/node.js +39 -0
  46. package/dist/common/esbuildConfigs/report.js +14 -0
  47. package/dist/common/esbuildConfigs/tests.js +13 -0
  48. package/dist/common/esbuildConfigs/web.js +57 -0
  49. package/dist/common/lib/abstractBase.js +553 -0
  50. package/dist/common/lib/basebuilder.js +79 -0
  51. package/dist/common/lib/classBuilder.js +42 -0
  52. package/dist/common/lib/core.js +75 -0
  53. package/dist/common/lib/index.js +22 -0
  54. package/dist/common/lib/types.js +2 -0
  55. package/dist/common/mongooseSchemas.js +56 -0
  56. package/dist/common/preload.js +14 -27
  57. package/dist/common/puppeteerConfiger.js +24 -0
  58. package/dist/common/report.html.js +31 -0
  59. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  60. package/dist/common/utils.js +16 -0
  61. package/dist/common/web.html.js +22 -0
  62. package/dist/module/ExampleTab.js +112 -0
  63. package/dist/module/Features.js +2 -35
  64. package/dist/module/Init.js +25 -0
  65. package/dist/module/Node.js +15 -66
  66. package/dist/module/PM/index.js +3 -0
  67. package/dist/module/PM/main.js +611 -0
  68. package/dist/module/PM/node.js +81 -0
  69. package/dist/module/PM/web.js +125 -0
  70. package/dist/module/Project.js +110 -615
  71. package/dist/module/Puppeteer.js +98 -0
  72. package/dist/module/Reporter.js +107 -0
  73. package/dist/module/Scheduler.js +1 -0
  74. package/dist/module/SubPackages/puppeteer.js +16 -0
  75. package/dist/module/{subPackages → SubPackages}/react/component/node.js +3 -3
  76. package/dist/module/{subPackages → SubPackages}/react/component/web.js +3 -3
  77. package/dist/module/SubPackages/react/jsx/index.js +19 -0
  78. package/dist/module/SubPackages/react/jsx/node.js +5 -0
  79. package/dist/module/SubPackages/react/jsx/web.js +5 -0
  80. package/dist/module/{subPackages → SubPackages}/react-dom/component/node.js +7 -7
  81. package/dist/module/SubPackages/react-dom/component/web.js +88 -0
  82. package/dist/module/SubPackages/react-dom/jsx/node.js +31 -0
  83. package/dist/module/SubPackages/react-dom/jsx/web.js +90 -0
  84. package/dist/module/SubPackages/react-test-renderer/MemoExoticComponent/node.js +16 -0
  85. package/dist/module/SubPackages/react-test-renderer/component/index.js +1 -0
  86. package/dist/module/SubPackages/react-test-renderer/component/interface.js +39 -0
  87. package/dist/module/{subPackages → SubPackages}/react-test-renderer/component/node.js +2 -2
  88. package/dist/module/{subPackages → SubPackages}/react-test-renderer/component/web.js +2 -2
  89. package/dist/module/{subPackages → SubPackages}/react-test-renderer/fc/node.js +3 -3
  90. package/dist/module/SubPackages/react-test-renderer/fc/web.js +22 -0
  91. package/dist/module/{subPackages → SubPackages}/react-test-renderer/jsx/index.js +7 -3
  92. package/dist/module/SubPackages/react-test-renderer/jsx/node.js +5 -0
  93. package/dist/module/SubPackages/react-test-renderer/jsx/web.js +5 -0
  94. package/dist/module/SubPackages/react-test-renderer/jsx-promised/index.js +16 -0
  95. package/dist/module/{subPackages/react-test-renderer/jsx → SubPackages/react-test-renderer/jsx-promised}/node.js +1 -1
  96. package/dist/module/TaskManBackEnd.js +169 -0
  97. package/dist/module/TaskManFrontEnd.js +600 -0
  98. package/dist/module/Web.js +31 -108
  99. package/dist/module/esbuildConfigs/features.js +12 -0
  100. package/dist/module/esbuildConfigs/index.js +19 -0
  101. package/dist/module/esbuildConfigs/inputFilesPlugin.js +44 -0
  102. package/dist/module/esbuildConfigs/node.js +34 -0
  103. package/dist/module/esbuildConfigs/report.js +14 -0
  104. package/dist/module/esbuildConfigs/tests.js +11 -0
  105. package/dist/module/esbuildConfigs/web.js +52 -0
  106. package/dist/module/lib/abstractBase.js +545 -0
  107. package/dist/module/lib/basebuilder.js +75 -0
  108. package/dist/module/lib/classBuilder.js +38 -0
  109. package/dist/module/lib/core.js +72 -0
  110. package/dist/module/lib/index.js +18 -0
  111. package/dist/module/lib/types.js +1 -0
  112. package/dist/module/mongooseSchemas.js +50 -0
  113. package/dist/module/preload.js +15 -26
  114. package/dist/module/puppeteerConfiger.js +19 -0
  115. package/dist/module/report.html.js +29 -0
  116. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  117. package/dist/module/utils.js +9 -0
  118. package/dist/module/web.html.js +20 -0
  119. package/dist/prebuild/TaskManBackEnd.mjs +174 -0
  120. package/dist/prebuild/TaskManFrontEnd.css +12301 -0
  121. package/dist/prebuild/TaskManFrontEnd.js +81264 -0
  122. package/dist/types/Features.d.ts +1 -34
  123. package/dist/types/Init.d.ts +2 -0
  124. package/dist/types/Node.d.ts +5 -11
  125. package/dist/types/PM/index.d.ts +20 -0
  126. package/dist/types/PM/main.d.ts +31 -0
  127. package/dist/types/PM/node.d.ts +27 -0
  128. package/dist/types/PM/web.d.ts +25 -0
  129. package/dist/types/Project.d.ts +3 -29
  130. package/dist/types/Puppeteer.d.ts +2 -0
  131. package/dist/types/Reporter.d.ts +1 -0
  132. package/dist/types/Scheduler.d.ts +0 -0
  133. package/dist/types/SubPackages/puppeteer.d.ts +6 -0
  134. package/dist/types/SubPackages/react/component/node.d.ts +7 -0
  135. package/dist/types/SubPackages/react/component/web.d.ts +7 -0
  136. package/dist/types/SubPackages/react/jsx/index.d.ts +12 -0
  137. package/dist/types/SubPackages/react/jsx/node.d.ts +4 -0
  138. package/dist/types/SubPackages/react/jsx/web.d.ts +4 -0
  139. package/dist/types/SubPackages/react-dom/component/node.d.ts +12 -0
  140. package/dist/types/SubPackages/react-dom/component/web.d.ts +11 -0
  141. package/dist/types/SubPackages/react-dom/jsx/index.d.ts +6 -0
  142. package/dist/types/SubPackages/react-dom/jsx/node.d.ts +6 -0
  143. package/dist/types/SubPackages/react-dom/jsx/web.d.ts +5 -0
  144. package/dist/types/SubPackages/react-test-renderer/MemoExoticComponent/node.d.ts +5 -0
  145. package/dist/types/SubPackages/react-test-renderer/component/index.d.ts +13 -0
  146. package/dist/types/SubPackages/react-test-renderer/component/interface.d.ts +9 -0
  147. package/dist/types/SubPackages/react-test-renderer/component/node.d.ts +8 -0
  148. package/dist/types/SubPackages/react-test-renderer/component/web.d.ts +3 -0
  149. package/dist/types/SubPackages/react-test-renderer/fc/node.d.ts +8 -0
  150. package/dist/types/SubPackages/react-test-renderer/fc/web.d.ts +8 -0
  151. package/dist/types/{subPackages → SubPackages}/react-test-renderer/jsx/index.d.ts +5 -4
  152. package/dist/types/SubPackages/react-test-renderer/jsx/node.d.ts +8 -0
  153. package/dist/types/SubPackages/react-test-renderer/jsx/web.d.ts +8 -0
  154. package/dist/types/SubPackages/react-test-renderer/jsx-promised/index.d.ts +15 -0
  155. package/dist/types/SubPackages/react-test-renderer/jsx-promised/node.d.ts +4 -0
  156. package/dist/types/SubPackages/react-test-renderer/jsx-promised/web.d.ts +4 -0
  157. package/dist/types/TaskManBackEnd.d.ts +3 -0
  158. package/dist/types/Types.d.ts +49 -16
  159. package/dist/types/Web.d.ts +5 -11
  160. package/dist/types/esbuildConfigs/features.d.ts +4 -0
  161. package/dist/types/esbuildConfigs/index.d.ts +4 -0
  162. package/dist/types/esbuildConfigs/inputFilesPlugin.d.ts +5 -0
  163. package/dist/types/esbuildConfigs/node.d.ts +4 -0
  164. package/dist/types/esbuildConfigs/report.d.ts +0 -0
  165. package/dist/types/esbuildConfigs/tests.d.ts +4 -0
  166. package/dist/types/esbuildConfigs/web.d.ts +4 -0
  167. package/dist/types/lib/abstractBase.d.ts +104 -0
  168. package/dist/types/lib/basebuilder.d.ts +27 -0
  169. package/dist/types/lib/classBuilder.d.ts +7 -0
  170. package/dist/types/lib/core.d.ts +8 -0
  171. package/dist/types/lib/index.d.ts +59 -0
  172. package/dist/types/lib/types.d.ts +62 -0
  173. package/dist/types/mongooseSchemas.d.ts +124 -0
  174. package/dist/types/preload.d.ts +0 -1
  175. package/dist/types/puppeteerConfiger.d.ts +4 -0
  176. package/dist/types/report.html.d.ts +2 -0
  177. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  178. package/dist/types/utils.d.ts +2 -0
  179. package/dist/types/web.html.d.ts +2 -0
  180. package/index.html +30 -0
  181. package/package.json +150 -78
  182. package/src/ExampleTab.tsx +219 -0
  183. package/src/Features.ts +2 -58
  184. package/src/Init.ts +51 -0
  185. package/src/Node.ts +71 -157
  186. package/src/PM/index.ts +25 -0
  187. package/src/PM/main.ts +830 -0
  188. package/src/PM/node.ts +128 -0
  189. package/src/PM/web.ts +166 -0
  190. package/src/Project.ts +158 -797
  191. package/src/Puppeteer.ts +141 -0
  192. package/src/Reporter.ts +126 -0
  193. package/src/Scheduler.ts +0 -0
  194. package/src/SubPackages/puppeteer.ts +51 -0
  195. package/src/SubPackages/react/component/node.ts +43 -0
  196. package/src/SubPackages/react/component/web.ts +43 -0
  197. package/src/SubPackages/react/jsx/index.ts +42 -0
  198. package/src/SubPackages/react/jsx/node.ts +26 -0
  199. package/src/SubPackages/react/jsx/web.ts +30 -0
  200. package/src/{subPackages → SubPackages}/react-dom/component/node.ts +24 -44
  201. package/src/SubPackages/react-dom/component/web.ts +143 -0
  202. package/src/SubPackages/react-dom/jsx/index.ts +6 -0
  203. package/src/SubPackages/react-dom/jsx/node.ts +68 -0
  204. package/src/SubPackages/react-dom/jsx/web.ts +139 -0
  205. package/src/SubPackages/react-test-renderer/MemoExoticComponent/node.ts +38 -0
  206. package/src/SubPackages/react-test-renderer/component/index.ts +23 -0
  207. package/src/SubPackages/react-test-renderer/component/interface.ts +48 -0
  208. package/src/SubPackages/react-test-renderer/component/node.ts +17 -0
  209. package/src/SubPackages/react-test-renderer/component/web.ts +17 -0
  210. package/src/SubPackages/react-test-renderer/fc/node.ts +49 -0
  211. package/src/SubPackages/react-test-renderer/fc/web.ts +48 -0
  212. package/src/SubPackages/react-test-renderer/jsx/index.ts +48 -0
  213. package/src/SubPackages/react-test-renderer/jsx/node.ts +20 -0
  214. package/src/SubPackages/react-test-renderer/jsx/web.ts +20 -0
  215. package/src/SubPackages/react-test-renderer/jsx-promised/index.ts +40 -0
  216. package/src/SubPackages/react-test-renderer/jsx-promised/node.ts +19 -0
  217. package/src/SubPackages/react-test-renderer/jsx-promised/web.ts +22 -0
  218. package/src/TaskManBackEnd.ts +228 -0
  219. package/src/TaskManFrontEnd.tsx +1222 -0
  220. package/src/Types.ts +222 -17
  221. package/src/Web.ts +86 -217
  222. package/src/cjs-shim.js +12 -0
  223. package/src/esbuildConfigs/features.ts +17 -0
  224. package/src/esbuildConfigs/index.ts +23 -0
  225. package/src/esbuildConfigs/inputFilesPlugin.ts +65 -0
  226. package/src/esbuildConfigs/node.ts +62 -0
  227. package/src/esbuildConfigs/report.ts +15 -0
  228. package/src/esbuildConfigs/tests.ts +14 -0
  229. package/src/esbuildConfigs/web.ts +79 -0
  230. package/src/lib/abstractBase.ts +910 -0
  231. package/src/lib/basebuilder.ts +214 -0
  232. package/src/lib/classBuilder.ts +131 -0
  233. package/src/lib/core.ts +224 -0
  234. package/src/lib/index.ts +226 -0
  235. package/src/lib/types.ts +303 -0
  236. package/src/mongooseSchemas.ts +105 -0
  237. package/src/preload.ts +14 -28
  238. package/src/puppeteerConfiger.ts +26 -0
  239. package/src/report.html.ts +29 -0
  240. package/src/utils.ts +15 -0
  241. package/src/web.html.ts +20 -0
  242. package/tests/Rectangle.test.ts +189 -0
  243. package/trash/TaskMan.Dockerfile +23 -0
  244. package/trash/TaskMan1.Dockerfile +43 -0
  245. package/trash/devBot.dockerfile +12 -0
  246. package/trash/docker-compose-dev.yml +9 -0
  247. package/trash/docker-compose-prod.yml +18 -0
  248. package/trash/electronBuild.ts +32 -0
  249. package/tsconfig.json +18 -6
  250. package/tsconfig.module.json +14 -4
  251. package/tsconfig.types.json +13 -4
  252. package/dist/common/NodeWriter.js +0 -56
  253. package/dist/common/core.js +0 -396
  254. package/dist/common/electron.js +0 -52
  255. package/dist/common/subPackages/react/jsx/index.js +0 -26
  256. package/dist/common/subPackages/react-dom/component/node.js +0 -101
  257. package/dist/common/subPackages/react-dom/component/web.js +0 -61
  258. package/dist/common/subPackages/react-dom/jsx/web.js +0 -76
  259. package/dist/common/subPackages/react-test-renderer/component/node.js +0 -8
  260. package/dist/common/subPackages/react-test-renderer/component/web.js +0 -8
  261. package/dist/module/NodeWriter.js +0 -50
  262. package/dist/module/Report.js +0 -186
  263. package/dist/module/core.js +0 -387
  264. package/dist/module/electron.js +0 -47
  265. package/dist/module/subPackages/react/jsx/index.js +0 -22
  266. package/dist/module/subPackages/react/jsx/node.js +0 -5
  267. package/dist/module/subPackages/react/jsx/web.js +0 -5
  268. package/dist/module/subPackages/react-dom/component/web.js +0 -56
  269. package/dist/module/subPackages/react-dom/jsx/node.js +0 -93
  270. package/dist/module/subPackages/react-dom/jsx/web.js +0 -48
  271. package/dist/module/subPackages/react-test-renderer/component/index.js +0 -52
  272. package/dist/types/NodeWriter.d.ts +0 -2
  273. package/dist/types/core.d.ts +0 -220
  274. package/dist/types/subPackages/react/component/node.d.ts +0 -12
  275. package/dist/types/subPackages/react/component/web.d.ts +0 -12
  276. package/dist/types/subPackages/react/jsx/index.d.ts +0 -15
  277. package/dist/types/subPackages/react/jsx/node.d.ts +0 -4
  278. package/dist/types/subPackages/react/jsx/web.d.ts +0 -4
  279. package/dist/types/subPackages/react-dom/component/node.d.ts +0 -14
  280. package/dist/types/subPackages/react-dom/component/web.d.ts +0 -19
  281. package/dist/types/subPackages/react-dom/jsx/node.d.ts +0 -14
  282. package/dist/types/subPackages/react-dom/jsx/web.d.ts +0 -15
  283. package/dist/types/subPackages/react-test-renderer/component/index.d.ts +0 -20
  284. package/dist/types/subPackages/react-test-renderer/component/node.d.ts +0 -9
  285. package/dist/types/subPackages/react-test-renderer/component/web.d.ts +0 -9
  286. package/dist/types/subPackages/react-test-renderer/jsx/node.d.ts +0 -4
  287. package/dist/types/subPackages/react-test-renderer/jsx/web.d.ts +0 -4
  288. package/src/NodeWriter.ts +0 -72
  289. package/src/Report.tsx +0 -392
  290. package/src/core.ts +0 -1396
  291. package/src/electron.ts +0 -59
  292. package/src/subPackages/react/component/node.ts +0 -75
  293. package/src/subPackages/react/component/web.ts +0 -80
  294. package/src/subPackages/react/jsx/index.ts +0 -64
  295. package/src/subPackages/react/jsx/node.ts +0 -29
  296. package/src/subPackages/react/jsx/web.ts +0 -29
  297. package/src/subPackages/react-dom/component/web.ts +0 -129
  298. package/src/subPackages/react-dom/jsx/node.ts +0 -150
  299. package/src/subPackages/react-dom/jsx/web.ts +0 -117
  300. package/src/subPackages/react-test-renderer/component/index.ts +0 -101
  301. package/src/subPackages/react-test-renderer/component/node.ts +0 -30
  302. package/src/subPackages/react-test-renderer/component/web.ts +0 -30
  303. package/src/subPackages/react-test-renderer/fc/node.tsx +0 -77
  304. package/src/subPackages/react-test-renderer/jsx/index.ts +0 -51
  305. package/src/subPackages/react-test-renderer/jsx/node.ts +0 -31
  306. package/src/subPackages/react-test-renderer/jsx/web.ts +0 -31
  307. /package/dist/common/{subPackages/react-test-renderer/jsx → SubPackages/react-test-renderer/jsx-promised}/web.js +0 -0
  308. /package/dist/{types/electron.d.ts → module/SubPackages/react-dom/jsx/index.js} +0 -0
  309. /package/dist/module/{subPackages/react-test-renderer/jsx → SubPackages/react-test-renderer/jsx-promised}/web.js +0 -0
@@ -1,638 +1,133 @@
1
- import { WebSocketServer } from 'ws';
2
1
  import esbuild from "esbuild";
3
2
  import fs from "fs";
4
3
  import path from "path";
5
- import fsExists from "fs.promises.exists";
6
- import pm2 from "pm2";
7
- import readline from 'readline';
4
+ import readline from "readline";
5
+ import { glob } from "glob";
6
+ import esbuildNodeConfiger from "./esbuildConfigs/node.js";
7
+ import esbuildWebConfiger from "./esbuildConfigs/web.js";
8
+ import webHtmlFrame from "./web.html.js";
9
+ var mode = process.argv[2] === "-dev" ? "DEV" : "PROD";
8
10
  readline.emitKeypressEvents(process.stdin);
9
11
  if (process.stdin.isTTY)
10
12
  process.stdin.setRawMode(true);
11
- const TIMEOUT = 2000;
12
- const OPEN_PORT = "";
13
- let webSocketServer;
14
- const getRunnables = (tests, payload = [new Set(), new Set()]) => {
15
- return tests.reduce((pt, cv, cndx, cry) => {
16
- if (cv[1] === "node") {
17
- pt[0].add(cv[0]);
18
- }
19
- else if (cv[1] === "web") {
20
- pt[1].add(cv[0]);
21
- }
22
- if (cv[2].length) {
23
- getRunnables(cv[2], payload);
24
- }
25
- return pt;
26
- }, payload);
13
+ process.stdin.on("keypress", (str, key) => {
14
+ if (key.name === "q") {
15
+ console.log("Testeranto-EsBuild is shutting down...");
16
+ mode = "PROD";
17
+ onDone();
18
+ }
19
+ });
20
+ let nodeDone, webDone = false;
21
+ const onNodeDone = () => {
22
+ nodeDone = true;
23
+ onDone();
24
+ };
25
+ const onWebDone = () => {
26
+ webDone = true;
27
+ onDone();
28
+ };
29
+ const onDone = () => {
30
+ console.log(JSON.stringify({
31
+ nodeDone,
32
+ webDone,
33
+ mode,
34
+ }, null, 2));
35
+ if (nodeDone && webDone && mode === "PROD") {
36
+ console.log("Testeranto-EsBuild is all done. Goodbye!");
37
+ process.exit();
38
+ }
39
+ else {
40
+ console.log("Testeranto-EsBuild is still working...");
41
+ }
27
42
  };
28
43
  export class ITProject {
29
- constructor(config) {
30
- this.exitCodes = {};
44
+ constructor(configs) {
31
45
  this.mode = `up`;
32
- this.ports = {};
33
- this.websockets = {};
34
- this.resourceQueue = [];
35
- this.spinCycle = 0;
36
- this.spinAnimation = "←↖↑↗→↘↓↙";
37
- this.mainLoop = async () => {
38
- if (this.clearScreen) {
39
- console.clear();
40
- }
41
- const procsTable = [];
42
- pm2.list((err, procs) => {
43
- procs.forEach((proc) => {
44
- var _a, _b;
45
- procsTable.push({
46
- name: proc.name,
47
- pid: proc.pid,
48
- pm_id: proc.pm_id,
49
- mem: (_a = proc.monit) === null || _a === void 0 ? void 0 : _a.memory,
50
- cpu: (_b = proc.monit) === null || _b === void 0 ? void 0 : _b.cpu,
51
- "exit code": this.exitCodes[proc.name]
46
+ this.config = configs;
47
+ fs.writeFileSync(`${this.config.outdir}/testeranto.json`, JSON.stringify(Object.assign(Object.assign({}, this.config), { buildDir: process.cwd() + "/" + this.config.outdir }), null, 2));
48
+ Promise.resolve(Promise.all([...this.getSecondaryEndpointsPoints("web")].map(async (sourceFilePath) => {
49
+ const sourceFileSplit = sourceFilePath.split("/");
50
+ const sourceDir = sourceFileSplit.slice(0, -1);
51
+ const sourceFileName = sourceFileSplit[sourceFileSplit.length - 1];
52
+ const sourceFileNameMinusJs = sourceFileName
53
+ .split(".")
54
+ .slice(0, -1)
55
+ .join(".");
56
+ const htmlFilePath = path.normalize(`${process.cwd()}/${this.config.outdir}/web/${sourceDir.join("/")}/${sourceFileNameMinusJs}.html`);
57
+ const jsfilePath = `./${sourceFileNameMinusJs}.mjs`;
58
+ return fs.promises
59
+ .mkdir(path.dirname(htmlFilePath), { recursive: true })
60
+ .then((x) => fs.writeFileSync(htmlFilePath, webHtmlFrame(jsfilePath, htmlFilePath)));
61
+ })));
62
+ const [nodeEntryPoints, webEntryPoints] = getRunnables(this.config.tests);
63
+ console.log(`this.getSecondaryEndpointsPoints("web")`, this.getSecondaryEndpointsPoints("web"));
64
+ glob(`./${this.config.outdir}/chunk-*.mjs`, {
65
+ ignore: "node_modules/**",
66
+ }).then((chunks) => {
67
+ chunks.forEach((chunk) => {
68
+ fs.unlinkSync(chunk);
69
+ });
70
+ });
71
+ Promise.all([
72
+ esbuild
73
+ .context(esbuildNodeConfiger(this.config, nodeEntryPoints))
74
+ .then(async (nodeContext) => {
75
+ if (mode == "DEV") {
76
+ await nodeContext.watch().then((v) => {
77
+ onNodeDone();
52
78
  });
53
- });
54
- console.table(procsTable);
55
- console.table(this.resourceQueue);
56
- console.log("webSocketServer.clients", Object.keys(this.websockets));
57
- const resourceRequest = this.resourceQueue.pop();
58
- if (!resourceRequest) {
59
- if (!this.devMode && this.mode === "up") {
60
- this.initiateShutdown("resource request queue is empty");
61
- }
62
- if (this.mode === "down" &&
63
- (procsTable.every((p) => p.pid === 0 || p.pid === undefined) ||
64
- procsTable.length === 0)) {
65
- this.shutdown();
66
- }
67
79
  }
68
80
  else {
69
- if (resourceRequest.protocol === "ipc") {
70
- this.allocateViaIpc(resourceRequest);
71
- }
72
- else if (resourceRequest.protocol === "ws") {
73
- this.allocateViaWs(resourceRequest);
74
- }
81
+ nodeContext.rebuild().then((v) => {
82
+ onNodeDone();
83
+ });
75
84
  }
76
- if (this.devMode) {
77
- if (this.mode === "up") {
78
- console.log(this.spinner(), "Running tests while watching for changes. Use 'q' to initiate shutdown");
79
- }
80
- else {
81
- console.log(this.spinner(), "Shutdown is in progress. Please wait.");
82
- }
85
+ return nodeContext;
86
+ }),
87
+ esbuild
88
+ .context(esbuildWebConfiger(this.config, webEntryPoints))
89
+ .then(async (webContext) => {
90
+ if (mode == "DEV") {
91
+ await webContext.watch().then((v) => {
92
+ onWebDone();
93
+ });
83
94
  }
84
95
  else {
85
- if (this.mode === "up") {
86
- console.log(this.spinner(), "Running tests without watching for changes. Use 'q' to initiate shutdown");
87
- }
88
- else {
89
- console.log(this.spinner(), "Shutdown is in progress. Please wait.");
90
- }
91
- }
92
- });
93
- };
94
- this.clearScreen = config.clearScreen;
95
- this.devMode = config.devMode;
96
- Object.values(config.ports).forEach((port) => {
97
- this.ports[port] = OPEN_PORT;
98
- });
99
- const testPath = `${process.cwd()}/${config.tests}`;
100
- const featurePath = `${process.cwd()}/${config.features}`;
101
- process.on('SIGINT', () => this.initiateShutdown("CTRL+C"));
102
- process.on('SIGQUIT', () => this.initiateShutdown("Keyboard quit"));
103
- process.on('SIGTERM', () => this.initiateShutdown("'kill' command"));
104
- process.stdin.on('keypress', (str, key) => {
105
- if (key.name === 'q') {
106
- this.initiateShutdown("'q' command");
107
- }
108
- });
109
- process.stdin.on('keypress', (str, key) => {
110
- if (key.name === 'x') {
111
- console.log("Shutting down hard!");
112
- process.exit(-1);
113
- }
114
- });
115
- import(testPath).then((tests) => {
116
- this.tests = tests.default;
117
- import(featurePath).then((features) => {
118
- this.features = features.default;
119
- Promise.resolve(Promise.all([
120
- ...this.getSecondaryEndpointsPoints("web")
121
- ]
122
- .map(async (sourceFilePath) => {
123
- const sourceFileSplit = sourceFilePath.split("/");
124
- const sourceDir = sourceFileSplit.slice(0, -1);
125
- const sourceFileName = sourceFileSplit[sourceFileSplit.length - 1];
126
- const sourceFileNameMinusJs = sourceFileName.split(".").slice(0, -1).join(".");
127
- const htmlFilePath = path.normalize(`${process.cwd()}/${config.outdir}/${sourceDir.join("/")}/${sourceFileNameMinusJs}.html`);
128
- const jsfilePath = `./${sourceFileNameMinusJs}.mjs`;
129
- return fs.promises.mkdir(path.dirname(htmlFilePath), { recursive: true }).then(x => fs.writeFileSync(htmlFilePath, `
130
- <!DOCTYPE html>
131
- <html lang="en">
132
- <head>
133
- <script type="module" src="${jsfilePath}"></script>
134
- </head>
135
-
136
- <body>
137
- <h1>${htmlFilePath}</h1>
138
- <div id="root">
139
-
140
- </div>
141
- </body>
142
-
143
- <footer></footer>
144
-
145
- </html>
146
- `));
147
- })));
148
- const [nodeEntryPoints, webEntryPoints] = getRunnables(this.tests);
149
- const esbuildConfigNode = {
150
- define: {
151
- "process.env.FLUENTFFMPEG_COV": "0"
152
- },
153
- absWorkingDir: process.cwd(),
154
- banner: {
155
- js: `import { createRequire } from 'module';const require = createRequire(import.meta.url);`
156
- },
157
- target: "esnext",
158
- // packages: "external",
159
- format: "esm",
160
- splitting: true,
161
- outExtension: { '.js': '.mjs' },
162
- platform: "node",
163
- external: ["tests.test.js", "features.test.js", "react"],
164
- outbase: config.outbase,
165
- outdir: config.outdir,
166
- jsx: 'transform',
167
- entryPoints: [...nodeEntryPoints],
168
- bundle: true,
169
- minify: config.minify === true,
170
- write: true,
171
- loader: {
172
- '.js': 'jsx',
173
- '.png': 'binary',
174
- '.jpg': 'binary',
175
- },
176
- plugins: [
177
- ...(config.plugins || []),
178
- {
179
- name: 'rebuild-notify',
180
- setup(build) {
181
- build.onEnd(result => {
182
- console.log(`node build ended with ${result.errors.length} errors`);
183
- console.log(result);
184
- result.errors.length !== 0 && process.exit(-1);
185
- // HERE: somehow restart the server from here, e.g., by sending a signal that you trap and react to inside the server.
186
- });
187
- }
188
- },
189
- ],
190
- };
191
- const esbuildConfigWeb = {
192
- // packages: "external",
193
- target: "esnext",
194
- format: "esm",
195
- splitting: true,
196
- outExtension: { '.js': '.mjs' },
197
- alias: {
198
- react: path.resolve("./node_modules/react")
199
- },
200
- external: [
201
- // "url",
202
- "electron",
203
- "path",
204
- "fs",
205
- // "react",
206
- "stream",
207
- "tests.test.js", "features.test.js"
208
- ],
209
- platform: "browser",
210
- outbase: config.outbase,
211
- outdir: config.outdir,
212
- jsx: 'transform',
213
- entryPoints: [
214
- ...webEntryPoints,
215
- testPath,
216
- featurePath,
217
- ],
218
- bundle: true,
219
- minify: config.minify === true,
220
- write: true,
221
- loader: {
222
- '.js': 'jsx',
223
- '.png': 'binary',
224
- '.jpg': 'binary',
225
- },
226
- plugins: [
227
- ...(config.plugins || []),
228
- {
229
- name: 'rebuild-notify',
230
- setup(build) {
231
- build.onEnd(result => {
232
- console.log(`web build ended with ${result.errors.length} errors`);
233
- console.log(result);
234
- result.errors.length !== 0 && process.exit(-1);
235
- // HERE: somehow restart the server from here, e.g., by sending a signal that you trap and react to inside the server.
236
- });
237
- }
238
- },
239
- ],
240
- };
241
- esbuild.build({
242
- bundle: true,
243
- entryPoints: ["./node_modules/testeranto/dist/module/Report.js"],
244
- minify: config.minify === true,
245
- outbase: config.outbase,
246
- write: true,
247
- outfile: `${config.outdir}/Report.js`,
248
- external: ["tests.test.js", "features.test.js"]
249
- });
250
- fs.writeFileSync(`${config.outdir}/report.html`, `
251
- <!DOCTYPE html>
252
- <html lang="en">
253
-
254
- <head>
255
- <meta name="description" content="Webpage description goes here" />
256
- <meta charset="utf-8" />
257
- <title>kokomoBay - testeranto</title>
258
- <meta name="viewport" content="width=device-width, initial-scale=1" />
259
- <meta name="author" content="" />
260
- <link rel="stylesheet" href="./Report.css" />
261
-
262
- <script type="importmap">
263
- {
264
- "imports": {
265
- "tests.test.js": "./tests.test.js",
266
- "features.test.js": "./features.test.js"
267
- }
268
- }
269
- </script>
270
-
271
-
272
- <script src="./Report.js"></script>
273
- </head>
274
-
275
- <body>
276
- <div id="root">
277
- react is loading
278
- </div>
279
- </body>
280
-
281
- </html>
282
- `);
283
- Promise.all([
284
- esbuild.context(esbuildConfigNode).then(async (nodeContext) => {
285
- await nodeContext.watch();
286
- }),
287
- esbuild.context(esbuildConfigWeb).then(async (esbuildWeb) => {
288
- await esbuildWeb.watch();
289
- })
290
- ]).then(() => {
291
- if (config.devMode === false) {
292
- console.log("Your tests were built but not run because devMode was false. Exiting gracefully");
293
- process.exit(0);
294
- }
295
- else {
296
- pm2.connect(async (err) => {
297
- if (err) {
298
- console.error(err);
299
- process.exit(-1);
300
- }
301
- else {
302
- console.log(`pm2 is connected`);
303
- }
304
- // run a websocket as an alternative to node IPC
305
- webSocketServer = new WebSocketServer({
306
- port: 8080,
307
- host: "localhost",
308
- });
309
- webSocketServer.on('open', () => {
310
- console.log('open');
311
- // process.exit()
312
- });
313
- webSocketServer.on('close', (data) => {
314
- console.log('webSocketServer close: %s', data);
315
- // process.exit()
316
- });
317
- webSocketServer.on('listening', () => {
318
- console.log("webSocketServer listening", webSocketServer.address());
319
- // process.exit()
320
- });
321
- webSocketServer.on('connection', (webSocket) => {
322
- console.log('webSocketServer connection');
323
- webSocket.on('message', (webSocketData) => {
324
- // console.log('webSocket message: %s', webSocketData);
325
- const payload = JSON.parse(webSocketData.valueOf().toString());
326
- // console.log('webSocket payload', JSON.stringify(payload.data.testResourceConfiguration.name, null, 2));
327
- // as {
328
- // type: string,
329
- // data: ITTestResourceRequirement & {
330
- // testResourceConfiguration: {
331
- // name: string;
332
- // }
333
- // }
334
- // };
335
- const messageType = payload.type;
336
- if (messageType === "testeranto:hola") {
337
- const name = payload.data.requirement.name;
338
- const requestedResources = payload.data;
339
- this.websockets[name] = webSocket;
340
- console.log('hola WS! connected: ' + name + ' in ' + Object.getOwnPropertyNames(this.websockets));
341
- this.requestResource(requestedResources.requirement, 'ws');
342
- }
343
- else if (messageType === "testeranto:adios") {
344
- console.log("adios WS", payload.data.testResourceConfiguration.name);
345
- this.releaseTestResourceWs(payload);
346
- }
347
- });
348
- });
349
- const makePath = (fPath, rt) => {
350
- return path.resolve("./" + config.outdir + "/" + fPath.replace(path.extname(fPath), "") + ".mjs");
351
- };
352
- const bootInterval = setInterval(async () => {
353
- const filesToLookup = this.tests
354
- .map(([p, rt]) => {
355
- const filepath = makePath(p, rt);
356
- return {
357
- filepath,
358
- exists: fsExists(filepath),
359
- };
360
- });
361
- const allFilesExist = (await Promise.all(filesToLookup.map((f) => f.exists))).every((b) => b);
362
- if (!allFilesExist) {
363
- console.log(this.spinner(), "waiting for files to build...");
364
- filesToLookup.forEach((f) => {
365
- console.log(f.exists, "\t", f.filepath);
366
- });
367
- }
368
- else {
369
- clearInterval(bootInterval);
370
- pm2.launchBus((err, pm2_bus) => {
371
- pm2_bus.on("testeranto:hola", (packet) => {
372
- console.log("hola IPC", packet);
373
- this.requestResource(packet.data.requirement, 'ipc');
374
- });
375
- pm2_bus.on("testeranto:adios", (payload) => {
376
- this.releaseTestResourcePm2(payload.data);
377
- });
378
- });
379
- this
380
- .tests
381
- .reduce((m, [inputFilePath, runtime]) => {
382
- const script = makePath(inputFilePath, runtime);
383
- const partialTestResourceByCommandLineArg = `${script} '${JSON.stringify({
384
- name: inputFilePath,
385
- ports: [],
386
- fs: path.resolve(process.cwd(), config.outdir, inputFilePath),
387
- })}'`;
388
- if (runtime === "web") {
389
- const fileAsList = inputFilePath.split("/");
390
- const fileListHead = fileAsList.slice(0, -1);
391
- const fname = fileAsList[fileAsList.length - 1];
392
- const fnameOnly = fname.split(".").slice(0, -1).join(".");
393
- const htmlFile = [config.outdir, ...fileListHead, `${fnameOnly}.html`].join("/");
394
- const jsFile = path.resolve(htmlFile.split(".html")[0] + ".mjs");
395
- console.log("watching", jsFile);
396
- pm2.start({
397
- script: `yarn electron node_modules/testeranto/dist/common/electron.js ${htmlFile} '${JSON.stringify({
398
- scheduled: true,
399
- name: inputFilePath,
400
- ports: [],
401
- fs: path.resolve(process.cwd(), config.outdir, inputFilePath),
402
- })}'`,
403
- name: inputFilePath,
404
- autorestart: false,
405
- args: partialTestResourceByCommandLineArg,
406
- watch: [jsFile],
407
- }, (err, proc) => {
408
- if (err) {
409
- console.error(err);
410
- return pm2.disconnect();
411
- }
412
- });
413
- }
414
- else if (runtime === "node") {
415
- const resolvedPath = path.resolve(script);
416
- console.log("watching", resolvedPath);
417
- pm2.start({
418
- name: inputFilePath,
419
- script: `node ${resolvedPath} '${JSON.stringify({
420
- scheduled: true,
421
- name: inputFilePath,
422
- ports: [],
423
- fs: path.resolve(process.cwd(), config.outdir, inputFilePath),
424
- })}'`,
425
- autorestart: false,
426
- watch: [resolvedPath],
427
- args: partialTestResourceByCommandLineArg
428
- }, (err, proc) => {
429
- if (err) {
430
- console.error(err);
431
- return pm2.disconnect();
432
- }
433
- });
434
- }
435
- this.exitCodes[inputFilePath] = null;
436
- return [inputFilePath, ...m];
437
- }, []);
438
- setInterval(this.mainLoop, TIMEOUT).unref();
439
- }
440
- }, TIMEOUT).unref();
441
- });
442
- }
443
- });
444
- });
445
- });
446
- }
447
- requestResource(requirement, protocol) {
448
- this.resourceQueue.push({ requirement, protocol });
449
- }
450
- getSecondaryEndpointsPoints(runtime) {
451
- if (runtime) {
452
- return this.tests
453
- .filter((t) => {
454
- return (t[1] === runtime);
455
- })
456
- .map((tc) => tc[0]);
457
- }
458
- return this.tests
459
- .map((tc) => tc[0]);
460
- }
461
- initiateShutdown(reason) {
462
- console.log("Shutdown initiated because", reason);
463
- this.mode = "down";
464
- }
465
- shutdown() {
466
- let i = 0;
467
- new Promise((res, reh) => {
468
- console.log("final results: ");
469
- const procsTable = [];
470
- pm2.list((err, procs) => {
471
- procs.forEach((proc, ndx) => {
472
- const exitCode = this.exitCodes[proc.name];
473
- if (exitCode !== 0) {
474
- i++;
475
- }
476
- procsTable.push({
477
- name: proc.name,
478
- pm_id: proc.pm_id,
479
- exitCode
480
- });
481
- if (ndx === procs.length - 1) {
482
- console.table(procsTable);
483
- res(i);
484
- }
485
- });
486
- });
487
- }).then((failures) => {
488
- console.log("Stopping PM2");
489
- pm2.stop("all", (e) => console.error(e));
490
- // pm2.killDaemon((e) => console.error(e));
491
- pm2.disconnect();
492
- console.log(`gracefully exiting with ${failures} failures`);
493
- process.exit(failures);
494
- });
495
- }
496
- spinner() {
497
- this.spinCycle = (this.spinCycle + 1) % this.spinAnimation.length;
498
- return this.spinAnimation[this.spinCycle];
499
- }
500
- async releaseTestResourceWs(payload) {
501
- const name = payload.data.testResourceConfiguration.name;
502
- const failed = payload.data.failed;
503
- this.exitCodes[name] = failed;
504
- Object.keys(this.ports).forEach((port) => {
505
- if (this.ports[port] === name) {
506
- this.ports[port] = OPEN_PORT;
507
- }
508
- });
509
- }
510
- async releaseTestResourcePm2(payload) {
511
- const name = payload.testResourceConfiguration.name;
512
- const failed = payload.failed;
513
- this.exitCodes[name] = failed;
514
- pm2.list((err, processes) => {
515
- processes.forEach((proc) => {
516
- if (proc.name === name) {
517
- Object.keys(this.ports).forEach((port) => {
518
- if (this.ports[port] === name) {
519
- this.ports[port] = OPEN_PORT;
520
- }
96
+ webContext.rebuild().then((v) => {
97
+ onWebDone();
521
98
  });
522
99
  }
523
- });
524
- });
100
+ return webContext;
101
+ }),
102
+ ]);
525
103
  }
526
- allocateViaWs(resourceRequest) {
527
- const name = resourceRequest.requirement.name;
528
- const testResourceRequirement = resourceRequest.requirement;
529
- const websocket = this.websockets[name];
530
- if ((testResourceRequirement === null || testResourceRequirement === void 0 ? void 0 : testResourceRequirement.ports) === 0) {
531
- websocket.send(JSON.stringify({
532
- data: {
533
- testResourceConfiguration: {
534
- ports: [],
535
- },
536
- }
537
- }));
538
- }
539
- else if (((testResourceRequirement === null || testResourceRequirement === void 0 ? void 0 : testResourceRequirement.ports) || 0) > 0) {
540
- // clear any port-slots associated with this job
541
- Object.values(this.ports).forEach((jobMaybe, portNumber) => {
542
- if (jobMaybe && jobMaybe === name) {
543
- this.ports[portNumber] = OPEN_PORT;
544
- }
545
- });
546
- // find a list of open ports
547
- const foundOpenPorts = Object.keys(this.ports).filter((p) => this.ports[p] === OPEN_PORT);
548
- if (foundOpenPorts.length >= testResourceRequirement.ports) {
549
- const selectionOfPorts = foundOpenPorts.slice(0, testResourceRequirement.ports);
550
- websocket.send(JSON.stringify({
551
- data: {
552
- testResourceConfiguration: {
553
- ports: selectionOfPorts,
554
- },
555
- }
556
- }));
557
- // mark the selected ports as occupied
558
- for (const foundOpenPort of selectionOfPorts) {
559
- this.ports[foundOpenPort] = name;
104
+ getSecondaryEndpointsPoints(runtime) {
105
+ const meta = (ts, st) => {
106
+ ts.forEach((t) => {
107
+ console.log("getSecondaryEndpointsPoints", t);
108
+ if (t[1] === runtime) {
109
+ st.add(t[0]);
560
110
  }
561
- }
562
- else {
563
- console.log(`no port was open so send the ${name} job to the back of the resourceQueue`);
564
- this.resourceQueue.push(resourceRequest);
565
- }
566
- }
567
- }
568
- allocateViaIpc(resourceRequest) {
569
- const pName = resourceRequest.requirement.name;
570
- const testResourceRequirement = resourceRequest.requirement;
571
- pm2.list((err, processes) => {
572
- console.error(err);
573
- processes.forEach((p) => {
574
- if (p.name === pName && p.pid) {
575
- const message = {
576
- // these fields must be present
577
- id: p.pid,
578
- topic: "some topic",
579
- type: "process:msg",
580
- // Data to be sent
581
- data: {
582
- testResourceConfiguration: {
583
- ports: [],
584
- // fs: fPath,
585
- },
586
- id: p.pm_id,
587
- },
588
- };
589
- if ((testResourceRequirement === null || testResourceRequirement === void 0 ? void 0 : testResourceRequirement.ports) === 0) {
590
- pm2.sendDataToProcessId(p.pm_id, message, function (err, res) {
591
- // console.log("sendDataToProcessId", err, res, message);
592
- });
593
- }
594
- if (((testResourceRequirement === null || testResourceRequirement === void 0 ? void 0 : testResourceRequirement.ports) || 0) > 0) {
595
- // clear any port-slots associated with this job
596
- Object.values(this.ports).forEach((jobMaybe, portNumber) => {
597
- if (jobMaybe && jobMaybe === pName) {
598
- this.ports[portNumber] = OPEN_PORT;
599
- }
600
- });
601
- // find a list of open ports
602
- const foundOpenPorts = Object.keys(this.ports).filter((p) => this.ports[p] === OPEN_PORT);
603
- // if there are enough open port-slots...
604
- if (foundOpenPorts.length >= testResourceRequirement.ports) {
605
- const selectionOfPorts = foundOpenPorts.slice(0, testResourceRequirement.ports);
606
- const message = {
607
- // these fields must be present
608
- id: p.pid,
609
- topic: "some topic",
610
- // process:msg will be send as 'message' on target process
611
- type: "process:msg",
612
- // Data to be sent
613
- data: {
614
- testResourceConfiguration: {
615
- // fs: fPath,
616
- ports: selectionOfPorts,
617
- },
618
- id: p.pid,
619
- },
620
- };
621
- pm2.sendDataToProcessId(p.pm_id, message, function (err, res) {
622
- // no-op
623
- });
624
- // mark the selected ports as occupied
625
- for (const foundOpenPort of selectionOfPorts) {
626
- this.ports[foundOpenPort] = p.pid.toString();
627
- }
628
- }
629
- else {
630
- console.log(`no port was open so send the ${p.pid} job to the back of the resourceQueue`);
631
- this.resourceQueue.push(resourceRequest);
632
- }
633
- }
111
+ if (Array.isArray(t[3])) {
112
+ meta(t[3], st);
634
113
  }
635
114
  });
636
- });
115
+ return st;
116
+ };
117
+ return Array.from(meta(this.config.tests, new Set()));
637
118
  }
638
119
  }
120
+ const getRunnables = (tests, payload = [new Set(), new Set()]) => {
121
+ return tests.reduce((pt, cv, cndx, cry) => {
122
+ if (cv[1] === "node") {
123
+ pt[0].add(cv[0]);
124
+ }
125
+ else if (cv[1] === "web") {
126
+ pt[1].add(cv[0]);
127
+ }
128
+ if (cv[3].length) {
129
+ getRunnables(cv[3], payload);
130
+ }
131
+ return pt;
132
+ }, payload);
133
+ };