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