testeranto 0.177.0 → 0.197.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 (546) hide show
  1. package/ALL_LICENSES.txt +11246 -0
  2. package/LICENSE +21 -0
  3. package/README.md +24 -4
  4. package/default-project.json +44 -0
  5. package/design-editor/DesignEditor.tsx +247 -0
  6. package/design-editor/index.ts +2 -0
  7. package/design-editor/server.ts +121 -0
  8. package/design-editor/types.ts +16 -0
  9. package/designs/default-project.json +210 -0
  10. package/dist/common/design-editor/DesignEditor.js +239 -0
  11. package/dist/common/design-editor/index.js +18 -0
  12. package/dist/common/design-editor/server.js +98 -0
  13. package/dist/common/design-editor/types.js +2 -0
  14. package/dist/common/src/App.js +53 -0
  15. package/dist/common/src/Node.js +4 -8
  16. package/dist/common/src/PM/PM_WithEslintAndTsc.js +10 -34
  17. package/dist/common/src/PM/base.js +1 -1
  18. package/dist/common/src/PM/main.js +581 -113
  19. package/dist/common/src/PM/node.js +4 -2
  20. package/dist/common/src/PM/nodeSidecar.js +1 -0
  21. package/dist/common/src/PM/pure.js +20 -57
  22. package/dist/common/src/PM/pureSidecar.js +1 -1
  23. package/dist/common/src/PM/types.js +1 -0
  24. package/dist/common/src/PM/web.js +7 -4
  25. package/dist/common/src/Pure.js +1 -1
  26. package/dist/common/src/Pure.test.js +49 -79
  27. package/dist/common/src/ReportServer.js +8 -2
  28. package/dist/common/src/build.js +31 -40
  29. package/dist/common/src/components/DesignEditorPage.js +169 -0
  30. package/dist/common/src/components/SunriseAnimation.js +291 -0
  31. package/dist/common/src/components/SunriseAnimation.test/interface.js +67 -0
  32. package/dist/common/src/components/SunriseAnimation.test/types.js +2 -0
  33. package/dist/common/src/components/TestStatusBadge.js +1 -21
  34. package/dist/common/src/components/pure/AppFrame.js +69 -0
  35. package/dist/common/src/components/pure/AppFrame.test/implementation.js +63 -0
  36. package/dist/common/src/components/pure/AppFrame.test/index.js +14 -0
  37. package/dist/common/src/components/pure/AppFrame.test/specification.js +25 -0
  38. package/dist/common/src/components/pure/AppFrame.test/types.js +3 -0
  39. package/dist/common/src/components/pure/FeaturesReporterView.js +23 -0
  40. package/dist/common/src/components/pure/FeaturesReporterView.test/implementation.js +84 -0
  41. package/dist/common/src/components/pure/FeaturesReporterView.test/index.js +14 -0
  42. package/dist/common/src/components/pure/FeaturesReporterView.test/specification.js +27 -0
  43. package/dist/common/src/components/pure/FeaturesReporterView.test/types.js +2 -0
  44. package/dist/common/src/components/pure/ModalContent.js +86 -0
  45. package/dist/common/src/components/pure/ModalContent.test/implementation.js +35 -0
  46. package/dist/common/src/components/pure/ModalContent.test/index.js +58 -0
  47. package/dist/common/src/components/pure/ModalContent.test/specification.js +19 -0
  48. package/dist/common/src/components/pure/ModalContent.test/types.js +4 -0
  49. package/dist/common/src/{NavBar.js → components/pure/NavBar.js} +9 -10
  50. package/dist/common/src/components/pure/ProcessManager.js +112 -0
  51. package/dist/common/src/components/pure/ProcessManagerView.js +237 -0
  52. package/dist/common/src/components/pure/ProjectPageView.js +53 -76
  53. package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +167 -54
  54. package/dist/common/src/components/pure/ProjectPageView.test/index.js +5 -1
  55. package/dist/common/src/components/pure/ProjectPageView.test/specification.js +15 -2
  56. package/dist/common/src/components/pure/ProjectPageView.test/types.js +2 -0
  57. package/dist/common/src/components/pure/ProjectsPageView.js +72 -0
  58. package/dist/common/src/components/pure/SettingsButton.js +13 -0
  59. package/dist/common/src/components/pure/SingleProcessView.js +214 -0
  60. package/dist/common/src/components/pure/TestPageView.js +513 -0
  61. package/dist/common/src/components/pure/TestPageView.test/implementation.js +157 -0
  62. package/dist/common/src/components/pure/TestPageView.test/index.js +15 -0
  63. package/dist/common/src/components/pure/TestPageView.test/specification.js +26 -0
  64. package/dist/common/src/components/pure/TestPageView.test/types.js +4 -0
  65. package/dist/common/src/components/pure/ThemeCard.js +15 -0
  66. package/dist/common/src/components/stateful/FeaturesReporter.js +59 -0
  67. package/dist/common/src/components/stateful/FileTree.js +40 -0
  68. package/dist/common/src/components/stateful/ProcessManagerPage.js +112 -0
  69. package/dist/common/src/components/stateful/ProjectPage.js +101 -0
  70. package/dist/common/src/components/stateful/ProjectsPage.js +118 -0
  71. package/dist/common/src/components/stateful/SettingsPage.js +72 -0
  72. package/dist/common/src/components/stateful/SingleProcessPage.js +147 -0
  73. package/dist/common/src/components/stateful/TestPage.js +229 -0
  74. package/dist/common/src/components/stateful/TextEditorPage.js +154 -0
  75. package/dist/common/src/defaultConfig.js +1 -0
  76. package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +3 -4
  77. package/dist/common/src/esbuildConfigs/web.js +1 -1
  78. package/dist/common/src/lib/BaseSuite.js +7 -3
  79. package/dist/common/src/lib/BaseSuite.test/mock.js +17 -41
  80. package/dist/common/src/lib/BaseSuite.test/test.js +33 -42
  81. package/dist/common/src/lib/Sidecar.js +1 -0
  82. package/dist/common/src/lib/abstractBase.js +40 -13
  83. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +12 -12
  84. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +15 -13
  85. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.mock.js +28 -17
  86. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.pure.js +2 -2
  87. package/dist/common/src/lib/basebuilder.js +29 -35
  88. package/dist/common/src/lib/classBuilder.js +5 -3
  89. package/dist/common/src/lib/core.js +3 -6
  90. package/dist/common/src/lib/core.test/MockCore.js +0 -14
  91. package/dist/common/src/lib/core.test/core.test.adapter.js +2 -9
  92. package/dist/common/src/lib/core.test/core.test.implementation.js +3 -7
  93. package/dist/common/src/lib/index.js +13 -14
  94. package/dist/common/src/lib/pmProxy.js +37 -16
  95. package/dist/common/src/lib/pmProxy.test/adapter.js +20 -4
  96. package/dist/common/src/lib/pmProxy.test/implementation.js +93 -34
  97. package/dist/common/src/lib/pmProxy.test/mockPMBase.js +9 -0
  98. package/dist/common/src/lib/pmProxy.test/specification.js +3 -0
  99. package/dist/common/src/mothership/index.js +5 -0
  100. package/dist/common/src/mothership/test.js +44 -25
  101. package/dist/common/src/types/features.js +34 -0
  102. package/dist/common/src/utils/api.js +57 -27
  103. package/dist/common/src/utils/featureUtils.js +29 -0
  104. package/dist/common/src/utils/logFiles.js +51 -0
  105. package/dist/common/src/utils/makePrompt.js +116 -0
  106. package/dist/common/src/web.html.js +2 -6
  107. package/dist/common/testeranto.config.js +54 -24
  108. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  109. package/dist/module/design-editor/DesignEditor.js +203 -0
  110. package/dist/module/design-editor/index.js +2 -0
  111. package/dist/module/design-editor/server.js +92 -0
  112. package/dist/module/design-editor/types.js +1 -0
  113. package/dist/module/src/App.js +19 -17
  114. package/dist/module/src/Node.js +4 -8
  115. package/dist/module/src/PM/PM_WithEslintAndTsc.js +11 -35
  116. package/dist/module/src/PM/base.js +1 -1
  117. package/dist/module/src/PM/main.js +577 -109
  118. package/dist/module/src/PM/node.js +4 -2
  119. package/dist/module/src/PM/nodeSidecar.js +1 -0
  120. package/dist/module/src/PM/pure.js +20 -57
  121. package/dist/module/src/PM/pureSidecar.js +1 -1
  122. package/dist/module/src/PM/types.js +1 -0
  123. package/dist/module/src/PM/web.js +7 -4
  124. package/dist/module/src/Pure.js +1 -1
  125. package/dist/module/src/Pure.test.js +49 -79
  126. package/dist/module/src/ReportServer.js +8 -2
  127. package/dist/module/src/build.js +26 -38
  128. package/dist/module/src/components/DesignEditorPage.js +132 -0
  129. package/dist/module/src/components/SunriseAnimation.test/interface.js +32 -1
  130. package/dist/module/src/components/SunriseAnimation.test/types.js +1 -0
  131. package/dist/module/src/components/TestStatusBadge.js +1 -21
  132. package/dist/module/src/components/pure/AppFrame.js +32 -0
  133. package/dist/module/src/components/pure/AppFrame.test/implementation.js +57 -0
  134. package/dist/module/src/components/pure/AppFrame.test/index.js +9 -0
  135. package/dist/module/src/components/pure/AppFrame.test/specification.js +21 -0
  136. package/dist/module/src/components/pure/AppFrame.test/types.js +2 -0
  137. package/dist/module/src/components/pure/FeaturesReporterView.js +16 -0
  138. package/dist/module/src/components/pure/FeaturesReporterView.test/implementation.js +81 -0
  139. package/dist/module/src/components/pure/FeaturesReporterView.test/index.js +9 -0
  140. package/dist/module/src/components/pure/FeaturesReporterView.test/specification.js +23 -0
  141. package/dist/module/src/components/pure/FeaturesReporterView.test/types.js +1 -0
  142. package/dist/module/src/components/pure/ModalContent.js +79 -0
  143. package/dist/module/src/components/pure/ModalContent.test/implementation.js +32 -0
  144. package/dist/module/src/components/pure/ModalContent.test/index.js +53 -0
  145. package/dist/module/src/components/pure/ModalContent.test/specification.js +15 -0
  146. package/dist/module/src/components/pure/ModalContent.test/types.js +3 -0
  147. package/dist/module/src/{NavBar.js → components/pure/NavBar.js} +10 -11
  148. package/dist/module/src/components/pure/ProcessManager.js +75 -0
  149. package/dist/module/src/components/pure/ProcessManagerView.js +200 -0
  150. package/dist/module/src/components/pure/ProjectPageView.js +54 -77
  151. package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +167 -54
  152. package/dist/module/src/components/pure/ProjectPageView.test/index.js +5 -1
  153. package/dist/module/src/components/pure/ProjectPageView.test/specification.js +15 -2
  154. package/dist/module/src/components/pure/ProjectPageView.test/types.js +2 -0
  155. package/dist/module/src/components/pure/ProjectsPageView.js +21 -14
  156. package/dist/module/src/components/pure/SettingsButton.js +6 -0
  157. package/dist/module/src/components/pure/SingleProcessView.js +214 -0
  158. package/dist/module/src/components/pure/TestPageView.js +470 -142
  159. package/dist/module/src/components/pure/TestPageView.test/implementation.js +121 -0
  160. package/dist/module/src/components/pure/TestPageView.test/index.js +10 -0
  161. package/dist/module/src/components/pure/TestPageView.test/specification.js +22 -0
  162. package/dist/module/src/components/pure/TestPageView.test/types.js +3 -0
  163. package/dist/module/src/components/pure/ThemeCard.js +8 -0
  164. package/dist/module/src/components/stateful/FeaturesReporter.js +22 -0
  165. package/dist/module/src/components/stateful/FileTree.js +33 -0
  166. package/dist/module/src/components/stateful/ProcessManagerPage.js +75 -0
  167. package/dist/module/src/components/stateful/ProjectPage.js +7 -6
  168. package/dist/module/src/components/stateful/ProjectsPage.js +32 -6
  169. package/dist/module/src/components/stateful/SettingsPage.js +35 -0
  170. package/dist/module/src/components/stateful/SingleProcessPage.js +110 -0
  171. package/dist/module/src/components/stateful/TestPage.js +123 -13
  172. package/dist/module/src/components/stateful/TextEditorPage.js +117 -0
  173. package/dist/module/src/defaultConfig.js +1 -0
  174. package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +3 -4
  175. package/dist/module/src/esbuildConfigs/web.js +1 -1
  176. package/dist/module/src/lib/BaseSuite.js +7 -3
  177. package/dist/module/src/lib/BaseSuite.test/mock.js +17 -41
  178. package/dist/module/src/lib/BaseSuite.test/test.js +33 -42
  179. package/dist/module/src/lib/Sidecar.js +1 -0
  180. package/dist/module/src/lib/abstractBase.js +40 -13
  181. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.adapter.js +12 -12
  182. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +15 -13
  183. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.mock.js +28 -17
  184. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.pure.js +1 -1
  185. package/dist/module/src/lib/basebuilder.js +29 -35
  186. package/dist/module/src/lib/classBuilder.js +5 -3
  187. package/dist/module/src/lib/core.js +3 -6
  188. package/dist/module/src/lib/core.test/MockCore.js +0 -14
  189. package/dist/module/src/lib/core.test/core.test.adapter.js +2 -9
  190. package/dist/module/src/lib/core.test/core.test.implementation.js +3 -7
  191. package/dist/module/src/lib/index.js +13 -14
  192. package/dist/module/src/lib/pmProxy.js +37 -16
  193. package/dist/module/src/lib/pmProxy.test/adapter.js +20 -4
  194. package/dist/module/src/lib/pmProxy.test/implementation.js +93 -34
  195. package/dist/module/src/lib/pmProxy.test/mockPMBase.js +9 -0
  196. package/dist/module/src/lib/pmProxy.test/specification.js +3 -0
  197. package/dist/module/src/mothership/index.js +5 -0
  198. package/dist/module/src/mothership/test.js +44 -25
  199. package/dist/module/src/types/features.js +31 -0
  200. package/dist/module/src/utils/api.js +56 -25
  201. package/dist/module/src/utils/featureUtils.js +24 -0
  202. package/dist/module/src/utils/logFiles.js +46 -0
  203. package/dist/module/src/utils/makePrompt.js +109 -0
  204. package/dist/module/src/web.html.js +2 -6
  205. package/dist/module/testeranto.config.js +54 -24
  206. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  207. package/dist/prebuild/App.css +53 -80
  208. package/dist/prebuild/App.js +15520 -4397
  209. package/dist/prebuild/ReportServer.mjs +104 -6
  210. package/dist/prebuild/build.mjs +95 -108
  211. package/dist/prebuild/mothership/index.mjs +5 -0
  212. package/dist/prebuild/run.mjs +704 -221
  213. package/dist/types/design-editor/DesignEditor.d.ts +18 -0
  214. package/dist/types/design-editor/server.d.ts +1 -0
  215. package/dist/types/src/App.d.ts +1 -0
  216. package/dist/types/src/PM/index.d.ts +1 -1
  217. package/dist/types/src/PM/main.d.ts +37 -3
  218. package/dist/types/src/PM/pure.d.ts +10 -7
  219. package/dist/types/src/PM/web.d.ts +1 -1
  220. package/dist/types/src/Pure.test.d.ts +13 -1
  221. package/dist/types/src/Types.d.ts +1 -0
  222. package/dist/types/src/components/DesignEditorPage.d.ts +1 -0
  223. package/dist/types/src/components/SunriseAnimation.d.ts +5 -0
  224. package/dist/types/src/components/SunriseAnimation.test/interface.d.ts +11 -0
  225. package/dist/types/src/components/SunriseAnimation.test/types.d.ts +39 -0
  226. package/dist/types/src/components/pure/AppFrame.d.ts +11 -0
  227. package/dist/types/src/components/pure/AppFrame.test/implementation.d.ts +3 -0
  228. package/dist/types/src/components/pure/AppFrame.test/index.d.ts +5 -0
  229. package/dist/types/src/components/pure/AppFrame.test/specification.d.ts +3 -0
  230. package/dist/types/src/components/pure/AppFrame.test/types.d.ts +33 -0
  231. package/dist/types/src/components/pure/FeaturesReporterView.d.ts +7 -0
  232. package/dist/types/src/components/pure/FeaturesReporterView.test/implementation.d.ts +3 -0
  233. package/dist/types/src/components/pure/FeaturesReporterView.test/index.d.ts +2 -0
  234. package/dist/types/src/components/pure/FeaturesReporterView.test/specification.d.ts +3 -0
  235. package/dist/types/src/components/pure/FeaturesReporterView.test/types.d.ts +54 -0
  236. package/dist/types/src/components/pure/ModalContent.d.ts +7 -0
  237. package/dist/types/src/components/pure/ModalContent.test/implementation.d.ts +3 -0
  238. package/dist/types/src/components/pure/ModalContent.test/index.d.ts +3 -0
  239. package/dist/types/src/components/pure/ModalContent.test/specification.d.ts +3 -0
  240. package/dist/types/src/components/pure/ModalContent.test/types.d.ts +45 -0
  241. package/dist/types/src/{NavBar.d.ts → components/pure/NavBar.d.ts} +4 -0
  242. package/dist/types/src/components/pure/ProcessManager.d.ts +8 -0
  243. package/dist/types/src/components/pure/ProcessManagerView.d.ts +20 -0
  244. package/dist/types/src/components/pure/ProjectPageView.d.ts +7 -7
  245. package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +1 -2
  246. package/dist/types/src/components/pure/ProjectPageView.test/types.d.ts +29 -11
  247. package/dist/types/src/components/pure/ProjectsPageView.d.ts +29 -0
  248. package/dist/types/src/components/pure/SettingsButton.d.ts +2 -0
  249. package/dist/types/src/components/pure/SingleProcessView.d.ts +0 -0
  250. package/dist/types/src/components/pure/TestPageView.d.ts +15 -0
  251. package/dist/types/src/components/pure/TestPageView.test/implementation.d.ts +12 -0
  252. package/dist/types/src/components/pure/TestPageView.test/index.d.ts +3 -0
  253. package/dist/types/src/components/pure/TestPageView.test/specification.d.ts +11 -0
  254. package/dist/types/src/components/pure/TestPageView.test/types.d.ts +65 -0
  255. package/dist/types/src/components/pure/ThemeCard.d.ts +9 -0
  256. package/dist/types/src/components/stateful/FeaturesReporter.d.ts +2 -0
  257. package/dist/types/src/components/stateful/FileTree.d.ts +8 -0
  258. package/dist/types/src/components/stateful/ProcessManagerPage.d.ts +2 -0
  259. package/dist/types/src/components/stateful/ProjectPage.d.ts +1 -0
  260. package/dist/types/src/components/stateful/ProjectsPage.d.ts +1 -0
  261. package/dist/types/src/components/stateful/SettingsPage.d.ts +2 -0
  262. package/dist/types/src/components/stateful/SingleProcessPage.d.ts +2 -0
  263. package/dist/types/src/components/stateful/TestPage.d.ts +1 -0
  264. package/dist/types/src/components/stateful/TextEditorPage.d.ts +1 -0
  265. package/dist/types/src/lib/BaseSuite.test/mock.d.ts +3 -3
  266. package/dist/types/src/lib/abstractBase.d.ts +1 -1
  267. package/dist/types/src/lib/abstractBase.test/MockGiven.d.ts +1 -1
  268. package/dist/types/src/lib/baseBuilder.test/baseBuilder.test.pure.d.ts +1 -1
  269. package/dist/types/src/lib/basebuilder.d.ts +1 -1
  270. package/dist/types/src/lib/index.d.ts +8 -8
  271. package/dist/types/src/lib/pmProxy.test/mockPMBase.d.ts +1 -1
  272. package/dist/types/src/types/features.d.ts +7 -0
  273. package/dist/types/src/utils/api.d.ts +1 -5
  274. package/dist/types/src/utils/featureUtils.d.ts +6 -0
  275. package/dist/types/src/utils/logFiles.d.ts +71 -0
  276. package/dist/types/src/utils/makePrompt.d.ts +2 -0
  277. package/dist/types/src/web.html.d.ts +1 -1
  278. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  279. package/docs/index.md +17 -0
  280. package/docs/test-page-components.md +91 -0
  281. package/docs/testing.prompt.txt +1 -3
  282. package/index.d.ts +38 -13
  283. package/marketing.md +166 -0
  284. package/package.json +38 -11
  285. package/src/App.tsx +22 -25
  286. package/src/Node.ts +6 -9
  287. package/src/PM/PM_WithEslintAndTsc.ts +16 -97
  288. package/src/PM/__tests__/nodeSidecar.testeranto.ts +2 -0
  289. package/src/PM/base.ts +1 -3
  290. package/src/PM/index.ts +1 -1
  291. package/src/PM/main.ts +673 -128
  292. package/src/PM/node.ts +5 -2
  293. package/src/PM/nodeSidecar.ts +1 -0
  294. package/src/PM/pure.ts +28 -72
  295. package/src/PM/pureSidecar.ts +1 -1
  296. package/src/PM/types.ts +0 -0
  297. package/src/PM/web.ts +9 -4
  298. package/src/Pure.test.ts +66 -101
  299. package/src/Pure.ts +1 -1
  300. package/src/README.md +85 -0
  301. package/src/ReportServer.ts +10 -3
  302. package/src/Types.ts +1 -0
  303. package/src/app.scss +169 -0
  304. package/src/build.ts +33 -55
  305. package/src/components/DesignEditorPage.tsx +169 -0
  306. package/src/components/{pure/ProjectPageView.test/index.ts → SunriseAnimation.test/index.tsx} +7 -4
  307. package/src/components/SunriseAnimation.test/interface.ts +49 -0
  308. package/src/components/SunriseAnimation.test/types.ts +53 -0
  309. package/src/components/TestStatusBadge.tsx +2 -23
  310. package/src/components/pure/AppFrame.test/implementation.tsx +72 -0
  311. package/src/components/pure/AppFrame.test/index.tsx +22 -0
  312. package/src/components/pure/AppFrame.test/specification.ts +35 -0
  313. package/src/components/pure/AppFrame.test/types.ts +65 -0
  314. package/src/components/pure/AppFrame.tsx +134 -0
  315. package/src/components/pure/FeaturesReporterView.test/implementation.tsx +106 -0
  316. package/src/components/pure/FeaturesReporterView.test/index.tsx +18 -0
  317. package/src/components/pure/FeaturesReporterView.test/specification.ts +39 -0
  318. package/src/components/pure/FeaturesReporterView.test/types.ts +77 -0
  319. package/src/components/pure/FeaturesReporterView.tsx +37 -0
  320. package/src/components/pure/ModalContent.test/implementation.tsx +45 -0
  321. package/src/components/pure/ModalContent.test/index.tsx +67 -0
  322. package/src/components/pure/ModalContent.test/specification.ts +27 -0
  323. package/src/components/pure/ModalContent.test/types.ts +72 -0
  324. package/src/components/pure/ModalContent.tsx +182 -0
  325. package/src/{NavBar.tsx → components/pure/NavBar.tsx} +31 -15
  326. package/src/components/pure/ProcessManager.tsx +117 -0
  327. package/src/components/pure/ProcessManagerView.tsx +414 -0
  328. package/src/components/pure/ProjectPageView.test/implementation.tsx +186 -57
  329. package/src/components/pure/ProjectPageView.test/index.tsx +18 -0
  330. package/src/components/pure/ProjectPageView.test/specification.ts +15 -2
  331. package/src/components/pure/ProjectPageView.test/types.ts +57 -13
  332. package/src/components/pure/ProjectPageView.tsx +155 -121
  333. package/src/components/pure/ProjectsPageView.tsx +73 -32
  334. package/src/components/pure/SettingsButton.md +1 -0
  335. package/src/components/pure/SettingsButton.tsx +11 -0
  336. package/src/components/pure/SingleProcessView.tsx +235 -0
  337. package/src/components/pure/TestPageView.test/implementation.ts +162 -0
  338. package/src/components/pure/TestPageView.test/index.tsx +20 -0
  339. package/src/components/pure/TestPageView.test/specification.ts +58 -0
  340. package/src/components/pure/TestPageView.test/types.ts +92 -0
  341. package/src/components/pure/TestPageView.tsx +1009 -299
  342. package/src/components/pure/ThemeCard.tsx +34 -0
  343. package/src/components/stateful/FeaturesReporter.tsx +24 -0
  344. package/src/components/stateful/FileTree.tsx +66 -0
  345. package/src/components/stateful/ProcessManagerPage.tsx +108 -0
  346. package/src/components/stateful/ProjectPage.tsx +10 -8
  347. package/src/components/stateful/ProjectsPage.tsx +36 -7
  348. package/src/components/stateful/SettingsPage.tsx +82 -0
  349. package/src/components/stateful/SingleProcessPage.tsx +155 -0
  350. package/src/components/stateful/TestPage.tsx +147 -30
  351. package/src/components/stateful/TextEditorPage.tsx +170 -0
  352. package/src/defaultConfig.ts +1 -0
  353. package/src/esbuildConfigs/inputFilesPlugin.ts +3 -4
  354. package/src/esbuildConfigs/web.ts +2 -1
  355. package/src/lib/BaseSuite.test/mock.ts +21 -68
  356. package/src/lib/BaseSuite.test/test.ts +39 -65
  357. package/src/lib/BaseSuite.ts +9 -3
  358. package/src/lib/Sidecar.ts +2 -0
  359. package/src/lib/abstractBase.test/MockGiven.ts +1 -1
  360. package/src/lib/abstractBase.ts +47 -20
  361. package/src/lib/baseBuilder.test/baseBuilder.test.adapter.ts +14 -13
  362. package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +17 -14
  363. package/src/lib/baseBuilder.test/baseBuilder.test.mock.ts +27 -17
  364. package/src/lib/baseBuilder.test/baseBuilder.test.pure.ts +1 -1
  365. package/src/lib/basebuilder.ts +48 -54
  366. package/src/lib/classBuilder.ts +11 -10
  367. package/src/lib/core.test/MockCore.ts +0 -23
  368. package/src/lib/core.test/core.test.adapter.ts +6 -12
  369. package/src/lib/core.test/core.test.implementation.ts +7 -10
  370. package/src/lib/core.ts +5 -20
  371. package/src/lib/index.ts +28 -27
  372. package/src/lib/pmProxy.test/adapter.ts +18 -4
  373. package/src/lib/pmProxy.test/implementation.ts +130 -46
  374. package/src/lib/pmProxy.test/mockPMBase.ts +12 -1
  375. package/src/lib/pmProxy.test/specification.ts +11 -0
  376. package/src/lib/pmProxy.ts +42 -17
  377. package/src/lib/types.ts +2 -0
  378. package/src/mothership/index.ts +6 -0
  379. package/src/mothership/test.ts +53 -26
  380. package/src/style.md +2 -0
  381. package/src/style.scss +3 -486
  382. package/src/templates/frontpage.html +331 -0
  383. package/src/templates/frontpage.md +79 -0
  384. package/src/themes.scss +48 -16
  385. package/src/types/features.ts +38 -0
  386. package/src/utils/api.ts +66 -33
  387. package/src/utils/featureUtils.tsx +42 -0
  388. package/src/utils/logFiles.ts +60 -0
  389. package/src/utils/makePrompt.ts +149 -0
  390. package/src/web.html.ts +6 -6
  391. package/stargazers.txt +15 -0
  392. package/stargzers.js +68 -0
  393. package/testeranto/App.css +53 -80
  394. package/testeranto/App.js +15520 -4397
  395. package/testeranto/bundles/node/core/chunk-4CSH4UJE.mjs +872 -0
  396. package/testeranto/bundles/node/core/chunk-4JTDLQVA.mjs +253 -0
  397. package/testeranto/bundles/node/core/chunk-C3APFDUV.mjs +70 -0
  398. package/testeranto/bundles/node/core/src/lib/BaseSuite.test/node.test.mjs +295 -0
  399. package/testeranto/bundles/node/core/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +243 -0
  400. package/testeranto/bundles/node/core/src/lib/classBuilder.test/classBuilder.test.mjs +411 -0
  401. package/testeranto/bundles/node/core/src/lib/core.test/core.test.mjs +494 -0
  402. package/testeranto/bundles/node/core/src/lib/pmProxy.test/index.mjs +4755 -0
  403. package/testeranto/bundles/pure/core/chunk-62UVCSQC.mjs +1022 -0
  404. package/testeranto/bundles/pure/core/src/Pure.test.mjs +410 -0
  405. package/testeranto/bundles/pure/core/src/lib/BaseSuite.test/pure.test.mjs +352 -0
  406. package/testeranto/bundles/pure/core/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +241 -0
  407. package/testeranto/bundles/web/core/src/components/pure/FeaturesReporterView.test/index.html +15 -0
  408. package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.html +1 -5
  409. package/testeranto/bundles/web/core/src/components/pure/TestPageView.test/index.html +15 -0
  410. package/testeranto/bundles/web/core/src/lib/BaseSuite.test/web.test.html +15 -0
  411. package/testeranto/bundles/web/core/src/lib/baseBuilder.test/baseBuilder.test.web.html +15 -0
  412. package/testeranto/metafiles/node/core.json +2906 -0
  413. package/testeranto/metafiles/pure/core.json +860 -0
  414. package/testeranto/metafiles/web/core.json +546 -0
  415. package/testeranto/reports/core/config.json +103 -2
  416. package/testeranto/reports/core/src/Pure.test/pure/exit.log +0 -0
  417. package/testeranto/reports/core/src/Pure.test/pure/lint_errors.txt +0 -0
  418. package/testeranto/reports/core/src/Pure.test/pure/message.txt +17 -0
  419. package/testeranto/reports/core/src/Pure.test/pure/prompt.txt +14 -0
  420. package/testeranto/reports/core/src/Pure.test/pure/type_errors.txt +71 -0
  421. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/debug.log +0 -0
  422. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/error.log +3 -0
  423. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/exit.log +1 -0
  424. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/info.log +0 -0
  425. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/warn.log +0 -0
  426. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/debug.log +0 -0
  427. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/error.log +3 -0
  428. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/exit.log +1 -0
  429. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/info.log +0 -0
  430. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/warn.log +0 -0
  431. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/debug.log +0 -0
  432. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/error.log +3 -0
  433. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/exit.log +1 -0
  434. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/info.log +0 -0
  435. package/testeranto/reports/core/src/components/pure/TestPageView.test/index/web/warn.log +0 -0
  436. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/exit.log +1 -0
  437. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -0
  438. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/message.txt +17 -0
  439. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/prompt.txt +14 -0
  440. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/stderr.log +0 -0
  441. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/stdout.log +0 -0
  442. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/tests.json +31 -0
  443. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/type_errors.txt +61 -0
  444. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/exit.log +0 -0
  445. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -0
  446. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/message.txt +17 -0
  447. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +15 -0
  448. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +61 -0
  449. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/debug.log +0 -0
  450. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/error.log +3 -0
  451. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/exit.log +1 -0
  452. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/info.log +0 -0
  453. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/warn.log +0 -0
  454. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/exit.log +1 -0
  455. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +10 -0
  456. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/message.txt +17 -0
  457. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +17 -0
  458. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/stderr.log +0 -0
  459. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/stdout.log +6 -0
  460. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
  461. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-1/butThen/artifact_test.txt +1 -0
  462. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +71 -0
  463. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +42 -0
  464. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/exit.log +0 -0
  465. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +10 -0
  466. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/message.txt +17 -0
  467. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +17 -0
  468. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +42 -0
  469. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/debug.log +0 -0
  470. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/error.log +3 -0
  471. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/exit.log +1 -0
  472. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/info.log +0 -0
  473. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/warn.log +0 -0
  474. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/exit.log +1 -0
  475. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.txt +0 -0
  476. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/message.txt +17 -0
  477. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +17 -0
  478. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/stderr.log +0 -0
  479. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/stdout.log +619 -0
  480. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/tests.json +165 -0
  481. package/testeranto/reports/core/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +88 -0
  482. package/testeranto/reports/core/src/lib/core.test/core.test/node/exit.log +1 -0
  483. package/testeranto/reports/core/src/lib/core.test/core.test/node/lint_errors.txt +21 -0
  484. package/testeranto/reports/core/src/lib/core.test/core.test/node/message.txt +17 -0
  485. package/testeranto/reports/core/src/lib/core.test/core.test/node/prompt.txt +19 -0
  486. package/testeranto/reports/core/src/lib/core.test/core.test/node/stderr.log +0 -0
  487. package/testeranto/reports/core/src/lib/core.test/core.test/node/stdout.log +0 -0
  488. package/testeranto/reports/core/src/lib/core.test/core.test/node/type_errors.txt +45 -0
  489. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/exit.log +1 -0
  490. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/lint_errors.txt +15 -0
  491. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/message.txt +17 -0
  492. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/prompt.txt +17 -0
  493. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stderr.log +88 -0
  494. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stdout.log +10 -0
  495. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/tests.json +152 -0
  496. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/type_errors.txt +52 -0
  497. package/testeranto/reports/core/summary.json +74 -5
  498. package/testeranto/reportsweb_build_errors +546 -0
  499. package/testeranto.config.ts +58 -25
  500. package/tsc.log +378 -211
  501. package/tsconfig.common.json +4 -2
  502. package/tsconfig.json +9 -6
  503. package/tsconfig.module.json +3 -2
  504. package/tsconfig.types.json +3 -1
  505. package/dist/common/src/components/pure/ProjectPageView.test/adapter.js +0 -20
  506. package/dist/common/src/lib/dailyAnimation.js +0 -130
  507. package/dist/module/src/Footer.js +0 -5
  508. package/dist/module/src/ProjectPage.js +0 -319
  509. package/dist/module/src/ProjectsPage.js +0 -1
  510. package/dist/module/src/SettingsButton.js +0 -157
  511. package/dist/module/src/TestPage.js +0 -271
  512. package/dist/module/src/TestReport.js +0 -368
  513. package/dist/module/src/components/pure/ProjectPageView.test/adapter.js +0 -17
  514. package/dist/module/src/lib/dailyAnimation.js +0 -130
  515. package/dist/types/src/components/pure/ProjectPageView.test/adapter.d.ts +0 -3
  516. package/dist/types/testeranto.config.d.ts +0 -3
  517. package/docs/testing.ai.txt +0 -106
  518. package/docs.html +0 -572
  519. package/example.css +0 -351
  520. package/index.html +0 -284
  521. package/scripts/compile-docs.js +0 -140
  522. package/src/App.scss +0 -132
  523. package/src/Footer.tsx +0 -8
  524. package/src/Project.scss +0 -1
  525. package/src/ProjectPage.tsx +0 -459
  526. package/src/ProjectsPage.tsx +0 -1
  527. package/src/ReportApp.scss +0 -1
  528. package/src/SettingsButton.tsx +0 -268
  529. package/src/TestPage.tsx +0 -476
  530. package/src/TestReport.scss +0 -24
  531. package/src/TestReport.tsx +0 -411
  532. package/src/components/pure/ProjectPageView.test/adapter.ts +0 -21
  533. package/src/fonts.scss +0 -55
  534. package/src/lib/dailyAnimation.ts +0 -147
  535. package/style.css +0 -12156
  536. package/testeranto/bundles/node/core/metafile.json +0 -8
  537. package/testeranto/bundles/pure/core/metafile.json +0 -8
  538. package/testeranto/bundles/web/core/metafile.json +0 -15086
  539. package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.mjs +0 -39991
  540. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +0 -18
  541. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/logs.txt +0 -59
  542. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -2
  543. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -27
  544. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/suite-0/given-basicRender/then-0/butThen/happyPath.png +0 -0
  545. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +0 -50
  546. /package/dist/types/src/{lib/dailyAnimation.d.ts → PM/types.d.ts} +0 -0
package/src/PM/main.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  /* eslint-disable no-async-promise-executor */
3
3
  /* eslint-disable @typescript-eslint/no-explicit-any */
4
4
  /* eslint-disable @typescript-eslint/no-unused-vars */
5
+
5
6
  import { ChildProcess, spawn } from "node:child_process";
6
7
  import ansiColors from "ansi-colors";
7
8
  import net from "net";
@@ -11,6 +12,10 @@ import path from "path";
11
12
  import puppeteer, { ConsoleMessage } from "puppeteer-core";
12
13
  import ansiC from "ansi-colors";
13
14
  import crypto from "node:crypto";
15
+ import { WebSocketServer } from "ws";
16
+ import http from "http";
17
+ import url from "url";
18
+ import mime from "mime-types";
14
19
 
15
20
  import {
16
21
  IFinalResults,
@@ -37,6 +42,113 @@ const fileHashes = {};
37
42
  const files: Record<string, Set<string>> = {};
38
43
  const screenshots: Record<string, Promise<Uint8Array>[]> = {};
39
44
 
45
+ type LogStreams = {
46
+ closeAll: () => void;
47
+ writeExitCode: (code: number, error?: Error) => void;
48
+ stdout?: fs.WriteStream;
49
+ stderr?: fs.WriteStream;
50
+ info?: fs.WriteStream;
51
+ warn?: fs.WriteStream;
52
+ error?: fs.WriteStream;
53
+ debug?: fs.WriteStream;
54
+ exit: fs.WriteStream;
55
+ };
56
+
57
+ function runtimeLogs(
58
+ runtime: IRunTime,
59
+ reportDest: string
60
+ ): Record<string, fs.WriteStream> {
61
+ const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
62
+
63
+ try {
64
+ if (!fs.existsSync(safeDest)) {
65
+ fs.mkdirSync(safeDest, { recursive: true });
66
+ }
67
+
68
+ if (runtime === "node") {
69
+ return {
70
+ stdout: fs.createWriteStream(`${safeDest}/stdout.log`),
71
+ stderr: fs.createWriteStream(`${safeDest}/stderr.log`),
72
+ exit: fs.createWriteStream(`${safeDest}/exit.log`),
73
+ };
74
+ } else if (runtime === "web") {
75
+ return {
76
+ info: fs.createWriteStream(`${safeDest}/info.log`),
77
+ warn: fs.createWriteStream(`${safeDest}/warn.log`),
78
+ error: fs.createWriteStream(`${safeDest}/error.log`),
79
+ debug: fs.createWriteStream(`${safeDest}/debug.log`),
80
+ exit: fs.createWriteStream(`${safeDest}/exit.log`),
81
+ };
82
+ } else if (runtime === "pure") {
83
+ return {
84
+ exit: fs.createWriteStream(`${safeDest}/exit.log`),
85
+ };
86
+ } else {
87
+ throw `unknown runtime: ${runtime}`;
88
+ }
89
+ } catch (e) {
90
+ console.error(`Failed to create log streams in ${safeDest}:`, e);
91
+ throw e;
92
+ }
93
+ }
94
+
95
+ function createLogStreams(reportDest: string, runtime: IRunTime): LogStreams {
96
+ // Create directory if it doesn't exist
97
+ if (!fs.existsSync(reportDest)) {
98
+ fs.mkdirSync(reportDest, { recursive: true });
99
+ }
100
+
101
+ const streams = runtimeLogs(runtime, reportDest);
102
+
103
+ // const streams = {
104
+ // exit: fs.createWriteStream(`${reportDest}/exit.log`),
105
+ const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
106
+
107
+ try {
108
+ if (!fs.existsSync(safeDest)) {
109
+ fs.mkdirSync(safeDest, { recursive: true });
110
+ }
111
+
112
+ const streams = runtimeLogs(runtime, safeDest);
113
+ // const streams = {
114
+ // exit: fs.createWriteStream(`${safeDest}/exit.log`),
115
+ // ...(runtime === "node" || runtime === "pure"
116
+ // ? {
117
+ // stdout: fs.createWriteStream(`${safeDest}/stdout.log`),
118
+ // stderr: fs.createWriteStream(`${safeDest}/stderr.log`),
119
+ // }
120
+ // : {
121
+ // info: fs.createWriteStream(`${safeDest}/info.log`),
122
+ // warn: fs.createWriteStream(`${safeDest}/warn.log`),
123
+ // error: fs.createWriteStream(`${safeDest}/error.log`),
124
+ // debug: fs.createWriteStream(`${safeDest}/debug.log`),
125
+ // }),
126
+ // };
127
+
128
+ return {
129
+ ...streams,
130
+ closeAll: () => {
131
+ Object.values(streams).forEach(
132
+ (stream) => !stream.closed && stream.close()
133
+ );
134
+ },
135
+ writeExitCode: (code: number, error?: Error) => {
136
+ if (error) {
137
+ streams.exit.write(`Error: ${error.message}\n`);
138
+ if (error.stack) {
139
+ streams.exit.write(`Stack Trace:\n${error.stack}\n`);
140
+ }
141
+ }
142
+ streams.exit.write(`${code}\n`);
143
+ },
144
+ exit: streams.exit,
145
+ };
146
+ } catch (e) {
147
+ console.error(`Failed to create log streams in ${safeDest}:`, e);
148
+ throw e;
149
+ }
150
+ }
151
+
40
152
  async function fileHash(filePath, algorithm = "md5") {
41
153
  return new Promise<string>((resolve, reject) => {
42
154
  const hash = crypto.createHash(algorithm);
@@ -63,12 +175,18 @@ const statusMessagePretty = (
63
175
  runtime: IRunTime
64
176
  ) => {
65
177
  if (failures === 0) {
178
+ console.log(ansiC.green(ansiC.inverse(`${runtime} > ${test}`)));
179
+ } else if (failures > 0) {
66
180
  console.log(
67
- ansiC.green(ansiC.inverse(`${runtime} > ${test} completed successfully`))
181
+ ansiC.red(
182
+ ansiC.inverse(
183
+ `${runtime} > ${test} failed ${failures} times (exit code: ${failures})`
184
+ )
185
+ )
68
186
  );
69
187
  } else {
70
188
  console.log(
71
- ansiC.red(ansiC.inverse(`${runtime} > ${test} failed ${failures} times`))
189
+ ansiC.red(ansiC.inverse(`${runtime} > ${test} crashed (exit code: -1)`))
72
190
  );
73
191
  }
74
192
  };
@@ -117,14 +235,34 @@ async function pollForFile(path, timeout = 2000) {
117
235
  export class PM_Main extends PM_WithEslintAndTsc {
118
236
  ports: Record<number, string>;
119
237
  queue: string[];
238
+ logStreams: Record<string, ReturnType<typeof createLogStreams>> = {};
120
239
  webMetafileWatcher: fs.FSWatcher;
121
240
  nodeMetafileWatcher: fs.FSWatcher;
122
241
  importMetafileWatcher: fs.FSWatcher;
123
242
  pureSidecars: Record<number, Sidecar>;
124
243
  nodeSidecars: Record<number, ChildProcess>;
125
244
  webSidecars: Record<number, Page>;
245
+ sidecars: Record<number, any> = {};
126
246
  launchers: Record<string, () => void>;
127
247
 
248
+ wss: WebSocketServer;
249
+ clients: Set<any> = new Set();
250
+ httpServer: http.Server;
251
+ runningProcesses: Map<string, ChildProcess> = new Map();
252
+ allProcesses: Map<
253
+ string,
254
+ {
255
+ child?: ChildProcess;
256
+ status: "running" | "exited" | "error";
257
+ exitCode?: number;
258
+ error?: string;
259
+ command: string;
260
+ pid?: number;
261
+ timestamp: string;
262
+ }
263
+ > = new Map();
264
+ processLogs: Map<string, string[]> = new Map();
265
+
128
266
  constructor(configs: IBuiltConfig, name: string, mode: "once" | "dev") {
129
267
  super(configs, name, mode);
130
268
 
@@ -139,6 +277,222 @@ export class PM_Main extends PM_WithEslintAndTsc {
139
277
  this.configs.ports.forEach((element) => {
140
278
  this.ports[element] = ""; // set ports as open
141
279
  });
280
+
281
+ // Create HTTP server
282
+ this.httpServer = http.createServer(this.requestHandler.bind(this));
283
+
284
+ // Start WebSocket server attached to the HTTP server
285
+ this.wss = new WebSocketServer({ server: this.httpServer });
286
+
287
+ this.wss.on("connection", (ws) => {
288
+ this.clients.add(ws);
289
+ console.log("Client connected");
290
+
291
+ ws.on("message", (data) => {
292
+ try {
293
+ const message = JSON.parse(data.toString());
294
+ if (message.type === "executeCommand") {
295
+ // Validate the command starts with 'aider'
296
+ if (message.command && message.command.trim().startsWith("aider")) {
297
+ console.log(`Executing command: ${message.command}`);
298
+ // Execute the command
299
+ const processId = Date.now().toString();
300
+ const child = spawn(message.command, {
301
+ shell: true,
302
+ cwd: process.cwd(),
303
+ });
304
+
305
+ // Track the process in both maps
306
+ this.runningProcesses.set(processId, child);
307
+ this.allProcesses.set(processId, {
308
+ child,
309
+ status: "running",
310
+ command: message.command,
311
+ pid: child.pid,
312
+ timestamp: new Date().toISOString(),
313
+ });
314
+
315
+ // Initialize logs for this process
316
+ this.processLogs.set(processId, []);
317
+
318
+ // Broadcast process started
319
+ this.broadcast({
320
+ type: "processStarted",
321
+ processId,
322
+ command: message.command,
323
+ timestamp: new Date().toISOString(),
324
+ logs: [],
325
+ });
326
+
327
+ // Capture stdout and stderr
328
+ child.stdout?.on("data", (data) => {
329
+ const logData = data.toString();
330
+ // Add to stored logs
331
+ const logs = this.processLogs.get(processId) || [];
332
+ logs.push(logData);
333
+ this.processLogs.set(processId, logs);
334
+
335
+ this.broadcast({
336
+ type: "processStdout",
337
+ processId,
338
+ data: logData,
339
+ timestamp: new Date().toISOString(),
340
+ });
341
+ });
342
+
343
+ child.stderr?.on("data", (data) => {
344
+ const logData = data.toString();
345
+ // Add to stored logs
346
+ const logs = this.processLogs.get(processId) || [];
347
+ logs.push(logData);
348
+ this.processLogs.set(processId, logs);
349
+
350
+ this.broadcast({
351
+ type: "processStderr",
352
+ processId,
353
+ data: logData,
354
+ timestamp: new Date().toISOString(),
355
+ });
356
+ });
357
+
358
+ child.on("error", (error) => {
359
+ console.error(`Failed to execute command: ${error}`);
360
+ this.runningProcesses.delete(processId);
361
+ // Update the process status to error
362
+ const processInfo = this.allProcesses.get(processId);
363
+ if (processInfo) {
364
+ this.allProcesses.set(processId, {
365
+ ...processInfo,
366
+ status: "error",
367
+ error: error.message,
368
+ });
369
+ }
370
+ this.broadcast({
371
+ type: "processError",
372
+ processId,
373
+ error: error.message,
374
+ timestamp: new Date().toISOString(),
375
+ });
376
+ });
377
+
378
+ child.on("exit", (code) => {
379
+ console.log(`Command exited with code ${code}`);
380
+ // Remove from running processes but keep in allProcesses
381
+ this.runningProcesses.delete(processId);
382
+ // Update the process status to exited
383
+ const processInfo = this.allProcesses.get(processId);
384
+ if (processInfo) {
385
+ this.allProcesses.set(processId, {
386
+ ...processInfo,
387
+ status: "exited",
388
+ exitCode: code,
389
+ });
390
+ }
391
+ this.broadcast({
392
+ type: "processExited",
393
+ processId,
394
+ exitCode: code,
395
+ timestamp: new Date().toISOString(),
396
+ });
397
+ });
398
+ } else {
399
+ console.error('Invalid command: must start with "aider"');
400
+ }
401
+ } else if (message.type === "getRunningProcesses") {
402
+ // Send list of all processes (both running and completed) with their full logs
403
+ const processes = Array.from(this.allProcesses.entries()).map(
404
+ ([id, procInfo]) => ({
405
+ processId: id,
406
+ command: procInfo.command,
407
+ pid: procInfo.pid,
408
+ status: procInfo.status,
409
+ exitCode: procInfo.exitCode,
410
+ error: procInfo.error,
411
+ timestamp: procInfo.timestamp,
412
+ logs: this.processLogs.get(id) || [],
413
+ })
414
+ );
415
+ ws.send(
416
+ JSON.stringify({
417
+ type: "runningProcesses",
418
+ processes,
419
+ })
420
+ );
421
+ } else if (message.type === "getProcess") {
422
+ // Send specific process with full logs
423
+ const processId = message.processId;
424
+ const procInfo = this.allProcesses.get(processId);
425
+ if (procInfo) {
426
+ ws.send(
427
+ JSON.stringify({
428
+ type: "processData",
429
+ processId,
430
+ command: procInfo.command,
431
+ pid: procInfo.pid,
432
+ status: procInfo.status,
433
+ exitCode: procInfo.exitCode,
434
+ error: procInfo.error,
435
+ timestamp: procInfo.timestamp,
436
+ logs: this.processLogs.get(processId) || [],
437
+ })
438
+ );
439
+ }
440
+ } else if (message.type === "stdin") {
441
+ // Handle stdin input for a process
442
+ const processId = message.processId;
443
+ const data = message.data;
444
+ console.log("Received stdin for process", processId, ":", data);
445
+ const childProcess = this.runningProcesses.get(processId);
446
+
447
+ if (childProcess && childProcess.stdin) {
448
+ console.log("Writing to process stdin");
449
+ childProcess.stdin.write(data);
450
+ } else {
451
+ console.log(
452
+ "Cannot write to stdin - process not found or no stdin:",
453
+ {
454
+ processExists: !!childProcess,
455
+ stdinExists: childProcess?.stdin ? true : false,
456
+ }
457
+ );
458
+ }
459
+ } else if (message.type === "killProcess") {
460
+ // Handle killing a process
461
+ const processId = message.processId;
462
+ console.log("Received killProcess for process", processId);
463
+ const childProcess = this.runningProcesses.get(processId);
464
+
465
+ if (childProcess) {
466
+ console.log("Killing process");
467
+ childProcess.kill("SIGTERM");
468
+ // The process exit handler will update the status and broadcast the change
469
+ } else {
470
+ console.log("Cannot kill process - process not found:", {
471
+ processExists: !!childProcess,
472
+ });
473
+ }
474
+ }
475
+ } catch (error) {
476
+ console.error("Error handling WebSocket message:", error);
477
+ }
478
+ });
479
+
480
+ ws.on("close", () => {
481
+ this.clients.delete(ws);
482
+ console.log("Client disconnected");
483
+ });
484
+
485
+ ws.on("error", (error) => {
486
+ console.error("WebSocket error:", error);
487
+ this.clients.delete(ws);
488
+ });
489
+ });
490
+
491
+ // Start HTTP server
492
+ const httpPort = Number(process.env.HTTP_PORT) || 3000;
493
+ this.httpServer.listen(httpPort, () => {
494
+ console.log(`HTTP server running on http://localhost:${httpPort}`);
495
+ });
142
496
  }
143
497
 
144
498
  async stopSideCar(uid: number): Promise<any> {
@@ -243,17 +597,18 @@ export class PM_Main extends PM_WithEslintAndTsc {
243
597
  waitForInitialPage: false,
244
598
  executablePath,
245
599
  headless: true,
600
+ defaultViewport: null, // Disable default 800x600 viewport
246
601
  dumpio: false,
247
602
  devtools: false,
248
603
 
249
604
  args: [
250
- "--disable-features=site-per-process",
251
605
  "--allow-file-access-from-files",
252
606
  "--allow-insecure-localhost",
253
607
  "--allow-running-insecure-content",
254
608
  "--auto-open-devtools-for-tabs",
255
609
  "--disable-dev-shm-usage",
256
610
  "--disable-extensions",
611
+ "--disable-features=site-per-process",
257
612
  "--disable-gpu",
258
613
  "--disable-setuid-sandbox",
259
614
  "--disable-site-isolation-trials",
@@ -263,6 +618,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
263
618
  "--no-startup-window",
264
619
  "--reduce-security-for-testing",
265
620
  "--remote-allow-origins=*",
621
+ "--start-maximized",
266
622
  "--unsafely-treat-insecure-origin-as-secure=*",
267
623
  `--remote-debugging-port=3234`,
268
624
  // "--disable-features=IsolateOrigins,site-per-process",
@@ -320,7 +676,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
320
676
  IRunTime,
321
677
  (f: fs.FSWatcher) => void
322
678
  ]) => {
323
- const metafile = `./testeranto/bundles/${runtime}/${this.name}/metafile.json`;
679
+ const metafile = `./testeranto/metafiles/${runtime}/${this.name}.json`;
324
680
 
325
681
  await pollForFile(metafile);
326
682
 
@@ -404,6 +760,26 @@ export class PM_Main extends PM_WithEslintAndTsc {
404
760
  this.nodeMetafileWatcher.close();
405
761
  this.webMetafileWatcher.close();
406
762
  this.importMetafileWatcher.close();
763
+
764
+ // Close any remaining log streams
765
+ Object.values(this.logStreams || {}).forEach((logs) => logs.closeAll());
766
+
767
+ // Close WebSocket server
768
+ this.wss.close(() => {
769
+ console.log("WebSocket server closed");
770
+ });
771
+
772
+ // Close all client connections
773
+ this.clients.forEach((client) => {
774
+ client.terminate();
775
+ });
776
+ this.clients.clear();
777
+
778
+ // Close HTTP server
779
+ this.httpServer.close(() => {
780
+ console.log("HTTP server closed");
781
+ });
782
+
407
783
  this.checkForShutdown();
408
784
  }
409
785
 
@@ -425,9 +801,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
425
801
  async metafileOutputs(platform: IRunTime) {
426
802
  const metafile = JSON.parse(
427
803
  fs
428
- .readFileSync(
429
- `./testeranto/bundles/${platform}/${this.name}/metafile.json`
430
- )
804
+ .readFileSync(`./testeranto/metafiles/${platform}/${this.name}.json`)
431
805
  .toString()
432
806
  ).metafile;
433
807
 
@@ -533,7 +907,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
533
907
  });
534
908
  } else {
535
909
  this.queue.push(src);
536
- return;
910
+ return [Math.random(), argz];
537
911
  }
538
912
  } else {
539
913
  console.error("negative port makes no sense", src);
@@ -571,8 +945,24 @@ export class PM_Main extends PM_WithEslintAndTsc {
571
945
  // })
572
946
  // );
573
947
 
948
+ const logs = createLogStreams(reportDest, "pure");
949
+
574
950
  try {
575
951
  await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
952
+ // Override console methods to redirect logs
953
+ // Only override stdout/stderr methods for pure runtime
954
+ const originalConsole = { ...console };
955
+
956
+ // console.log = (...args) => {
957
+ // logs.stdout.write(args.join(" ") + "\n");
958
+ // originalConsole.log(...args);
959
+ // };
960
+
961
+ // console.error = (...args) => {
962
+ // logs.stderr.write(args.join(" ") + "\n");
963
+ // originalConsole.error(...args);
964
+ // };
965
+
576
966
  return module.default
577
967
  .then((defaultModule) => {
578
968
  defaultModule
@@ -586,7 +976,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
586
976
  })
587
977
  .catch((e1) => {
588
978
  console.log(
589
- ansiC.red(`launchPure - ${src} errored with: ${e1}`)
979
+ ansiC.red(`launchPure - ${src} errored with: ${e1.stack}`)
590
980
  );
591
981
  this.bddTestIsNowDone(src, -1);
592
982
  statusMessagePretty(-1, src, "pure");
@@ -598,11 +988,12 @@ export class PM_Main extends PM_WithEslintAndTsc {
598
988
  .catch((e2) => {
599
989
  console.log(
600
990
  ansiColors.red(
601
- `pure ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
991
+ `pure ! ${src} failed to execute. No "tests.json" file was generated. Check the logs for more info`
602
992
  )
603
993
  );
604
994
 
605
- this.writeFileSync(`${reportDest}/logs.txt`, e2.stack, src);
995
+ logs.exit.write(e2.stack);
996
+ logs.exit.write(-1);
606
997
  this.bddTestIsNowDone(src, -1);
607
998
  statusMessagePretty(-1, src, "pure");
608
999
  // console.error(e);
@@ -616,17 +1007,19 @@ export class PM_Main extends PM_WithEslintAndTsc {
616
1007
  });
617
1008
  });
618
1009
  } catch (e3) {
1010
+ logs.writeExitCode(-1, e3);
619
1011
  console.log(
620
1012
  ansiC.red(
621
1013
  ansiC.inverse(
622
- `${src} 1 errored with: ${e3}. Check ${reportDest}/logs.txt for more info`
1014
+ `${src} 1 errored with: ${e3}. Check logs for more info`
623
1015
  )
624
1016
  )
625
1017
  );
626
- this.writeFileSync(`${reportDest}/logs.txt`, e3.stack, src);
1018
+
1019
+ logs.exit.write(e3.stack);
1020
+ logs.exit.write(-1);
627
1021
  this.bddTestIsNowDone(src, -1);
628
1022
  statusMessagePretty(-1, src, "pure");
629
- console.log("III) PURE IS EXITING BADLY WITH error", e3);
630
1023
  }
631
1024
 
632
1025
  for (let i = 0; i <= portsToUse.length; i++) {
@@ -644,7 +1037,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
644
1037
  .split(".")
645
1038
  .slice(0, -1)
646
1039
  .join(".")}/node`;
647
-
648
1040
  if (!fs.existsSync(reportDest)) {
649
1041
  fs.mkdirSync(reportDest, { recursive: true });
650
1042
  }
@@ -683,7 +1075,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
683
1075
 
684
1076
  if (openPorts.length >= testConfigResource.ports) {
685
1077
  for (let i = 0; i < testConfigResource.ports; i++) {
686
- portsToUse.push(openPorts[i][0]);
1078
+ portsToUse.push(openPorts[i][0]); // Convert string port to number
687
1079
 
688
1080
  this.ports[openPorts[i][0]] = src; // port is now claimed
689
1081
  }
@@ -702,7 +1094,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
702
1094
  )
703
1095
  );
704
1096
  this.queue.push(src);
705
- return;
1097
+ return [Math.random(), argz]; // Add this return
706
1098
  }
707
1099
  } else {
708
1100
  console.error("negative port makes no sense", src);
@@ -775,52 +1167,50 @@ export class PM_Main extends PM_WithEslintAndTsc {
775
1167
  });
776
1168
  });
777
1169
 
778
- const oStream = fs.createWriteStream(`${reportDest}/logs.txt`);
779
-
780
- const errFile = `${reportDest}/logs.txt`;
781
-
782
- if (fs.existsSync(errFile)) {
783
- fs.rmSync(errFile);
784
- }
1170
+ const logs = createLogStreams(reportDest, "node");
785
1171
 
786
1172
  server.listen(ipcfile, () => {
787
- child.stderr?.on("data", (data) => {
788
- oStream.write(`stderr > ${data}`);
789
- });
1173
+ // Only handle stdout/stderr for node runtime
790
1174
  child.stdout?.on("data", (data) => {
791
- oStream.write(`stdout > ${data}`);
1175
+ logs.stdout?.write(data); // Add null check
1176
+ });
1177
+
1178
+ child.stderr?.on("data", (data) => {
1179
+ logs.stderr?.write(data); // Add null check
792
1180
  });
793
1181
  child.on("error", (err) => {});
794
1182
  child.on("close", (code) => {
795
- // oStream.close();
1183
+ const exitCode = code === null ? -1 : code;
1184
+ if (exitCode < 0) {
1185
+ logs.writeExitCode(
1186
+ exitCode,
1187
+ new Error("Process crashed or was terminated")
1188
+ );
1189
+ } else {
1190
+ logs.writeExitCode(exitCode);
1191
+ }
1192
+ logs.closeAll();
796
1193
  server.close();
797
1194
 
798
1195
  if (!files[src]) {
799
1196
  files[src] = new Set();
800
1197
  }
801
- // files[src].add(filepath);
802
-
803
- // fs.writeFileSync(
804
- // reportDest + "/manifest.json",
805
- // JSON.stringify(Array.from(files[src]))
806
- // );
807
1198
 
808
- if (code === 255) {
1199
+ if (exitCode === 255) {
809
1200
  console.log(
810
1201
  ansiColors.red(
811
- `node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1202
+ `node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/stderr.log for more info`
812
1203
  )
813
1204
  );
814
1205
  this.bddTestIsNowDone(src, -1);
815
1206
  statusMessagePretty(-1, src, "node");
816
- oStream.close();
817
1207
  return;
818
- } else if (code === 0) {
1208
+ } else if (exitCode === 0) {
819
1209
  this.bddTestIsNowDone(src, 0);
820
1210
  statusMessagePretty(0, src, "node");
821
1211
  } else {
822
- this.bddTestIsNowDone(src, code);
823
- statusMessagePretty(code, src, "node");
1212
+ this.bddTestIsNowDone(src, exitCode);
1213
+ statusMessagePretty(exitCode, src, "node");
824
1214
  }
825
1215
 
826
1216
  haltReturns = true;
@@ -842,11 +1232,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
842
1232
  console.log(
843
1233
  ansiC.red(
844
1234
  ansiC.inverse(
845
- `${src} errored with: ${e.name}. Check ${errFile} for more info`
1235
+ `${src} errored with: ${e.name}. Check error logs for more info`
846
1236
  )
847
1237
  )
848
1238
  );
849
- this.writeFileSync(`${reportDest}/logs.txt`, e.toString(), src);
850
1239
  this.bddTestIsNowDone(src, -1);
851
1240
  statusMessagePretty(-1, src, "node");
852
1241
  });
@@ -855,7 +1244,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
855
1244
 
856
1245
  launchWebSideCar = async (
857
1246
  testConfig: ITestTypes
858
- ): Promise<[number, ITTestResourceConfiguration]> => {
1247
+ ): Promise<[number, Page]> => {
859
1248
  const src = testConfig[0];
860
1249
  const dest = src.split(".").slice(0, -1).join(".");
861
1250
  // const d = dest + ".mjs";
@@ -864,10 +1253,10 @@ export class PM_Main extends PM_WithEslintAndTsc {
864
1253
 
865
1254
  console.log(ansiC.green(ansiC.inverse(`launchWebSideCar ${src}`)));
866
1255
 
867
- const fileStreams2: fs.WriteStream[] = [];
868
- const doneFileStream2: Promise<any>[] = [];
1256
+ // const fileStreams2: fs.WriteStream[] = [];
1257
+ // const doneFileStream2: Promise<any>[] = [];
869
1258
 
870
- const oStream = fs.createWriteStream(`${destFolder}/logs.txt`);
1259
+ const logs = createLogStreams(dest, "web");
871
1260
 
872
1261
  return new Promise((res, rej) => {
873
1262
  this.browser
@@ -893,40 +1282,43 @@ export class PM_Main extends PM_WithEslintAndTsc {
893
1282
  Promise.all(screenshots[src] || []).then(() => {
894
1283
  delete screenshots[src];
895
1284
  page.close();
896
- oStream.close();
897
1285
  });
898
1286
  };
899
1287
 
900
1288
  page.on("pageerror", (err: Error) => {
901
1289
  console.debug(`Error from ${src}: [${err.name}] `);
902
- oStream.write(err.name);
903
- oStream.write("\n");
904
-
1290
+ console.debug(`Error from ${src}: [${err.name}] `);
905
1291
  if (err.cause) {
906
1292
  console.debug(`Error from ${src} cause: [${err.cause}] `);
907
- oStream.write(err.cause);
908
- oStream.write("\n");
909
1293
  }
910
-
911
1294
  if (err.stack) {
912
1295
  console.debug(`Error from stack ${src}: [${err.stack}] `);
913
- oStream.write(err.stack);
914
- oStream.write("\n");
915
1296
  }
916
-
917
1297
  console.debug(`Error from message ${src}: [${err.message}] `);
918
- oStream.write(err.message);
919
- oStream.write("\n");
920
-
921
1298
  this.bddTestIsNowDone(src, -1);
922
1299
  close();
923
1300
  });
924
1301
 
925
1302
  page.on("console", (log: ConsoleMessage) => {
926
- oStream.write(log.text());
927
- oStream.write(JSON.stringify(log.location()));
928
- oStream.write(JSON.stringify(log.stackTrace()));
929
- oStream.write("\n");
1303
+ const msg = `${log.text()}\n${JSON.stringify(
1304
+ log.location()
1305
+ )}\n${JSON.stringify(log.stackTrace())}\n`;
1306
+ switch (log.type()) {
1307
+ case "info":
1308
+ logs.info?.write(msg);
1309
+ break;
1310
+ case "warn":
1311
+ logs.warn?.write(msg);
1312
+ break;
1313
+ case "error":
1314
+ logs.error?.write(msg);
1315
+ break;
1316
+ case "debug":
1317
+ logs.debug?.write(msg);
1318
+ break;
1319
+ default:
1320
+ break;
1321
+ }
930
1322
  });
931
1323
 
932
1324
  await page.goto(`file://${`${destFolder}.html`}`, {});
@@ -978,7 +1370,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
978
1370
  .then(async (page) => {
979
1371
  await page.goto(`file://${`${dest}.html`}`, {});
980
1372
 
981
- /* @ts-ignore:next-line */
982
1373
  res([Math.random(), page]);
983
1374
  });
984
1375
  });
@@ -1009,6 +1400,8 @@ export class PM_Main extends PM_WithEslintAndTsc {
1009
1400
 
1010
1401
  const testReq: { ports: number } = sidecar[2];
1011
1402
 
1403
+ const logs = createLogStreams(dest, "node");
1404
+
1012
1405
  const portsToUse: number[] = [];
1013
1406
  if (testReq.ports === 0) {
1014
1407
  // argz = {
@@ -1024,7 +1417,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
1024
1417
 
1025
1418
  if (openPorts.length >= testReq.ports) {
1026
1419
  for (let i = 0; i < testReq.ports; i++) {
1027
- portsToUse.push(openPorts[i][0]);
1420
+ portsToUse.push(Number(openPorts[i][0])); // Convert string port to number
1028
1421
 
1029
1422
  this.ports[openPorts[i][0]] = src; // port is now closed
1030
1423
  }
@@ -1076,8 +1469,6 @@ export class PM_Main extends PM_WithEslintAndTsc {
1076
1469
  });
1077
1470
  });
1078
1471
 
1079
- const oStream = fs.createWriteStream(`${reportDest}/logs.txt`);
1080
-
1081
1472
  const child = spawn("node", [builtfile, JSON.stringify(argz)], {
1082
1473
  stdio: ["pipe", "pipe", "pipe", "ipc"],
1083
1474
  // silent: true
@@ -1085,19 +1476,9 @@ export class PM_Main extends PM_WithEslintAndTsc {
1085
1476
 
1086
1477
  const p = "/tmp/tpipe" + Math.random();
1087
1478
 
1088
- const errFile = `${reportDest}/logs.txt`;
1089
-
1090
1479
  server.listen(p, () => {
1091
- child.stderr?.on("data", (data) => {
1092
- oStream.write(`stderr > ${data}`);
1093
- });
1094
- child.stdout?.on("data", (data) => {
1095
- oStream.write(`stdout > ${data}`);
1096
- });
1097
1480
  child.on("close", (code) => {
1098
- oStream.close();
1099
1481
  server.close();
1100
-
1101
1482
  haltReturns = true;
1102
1483
  });
1103
1484
  child.on("exit", (code) => {
@@ -1119,11 +1500,11 @@ export class PM_Main extends PM_WithEslintAndTsc {
1119
1500
  console.log(
1120
1501
  ansiC.red(
1121
1502
  ansiC.inverse(
1122
- `launchNodeSideCar - ${src} errored with: ${e.name}. Check ${errFile}for more info`
1503
+ `launchNodeSideCar - ${src} errored with: ${e.name}. Check logs for more info`
1123
1504
  )
1124
1505
  )
1125
1506
  );
1126
- this.writeFileSync(`${reportDest}/logs.txt`, e.toString(), src);
1507
+ logs.error?.write(e.toString() + "\n");
1127
1508
  // this.bddTestIsNowDone(src, -1);
1128
1509
  // statusMessagePretty(-1, src);
1129
1510
  });
@@ -1190,7 +1571,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
1190
1571
  );
1191
1572
  if (openPorts.length >= testConfigResource.ports) {
1192
1573
  for (let i = 0; i < testConfigResource.ports; i++) {
1193
- portsToUse.push(openPorts[i][0]);
1574
+ portsToUse.push(Number(openPorts[i][0]));
1194
1575
 
1195
1576
  this.ports[openPorts[i][0]] = src; // port is now claimed
1196
1577
  }
@@ -1205,7 +1586,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
1205
1586
  };
1206
1587
  } else {
1207
1588
  this.queue.push(src);
1208
- return;
1589
+ // return;
1209
1590
  }
1210
1591
  } else {
1211
1592
  console.error("negative port makes no sense", src);
@@ -1215,6 +1596,7 @@ export class PM_Main extends PM_WithEslintAndTsc {
1215
1596
  // const builtfile = dest + ".mjs";
1216
1597
 
1217
1598
  await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
1599
+ if (!this.pureSidecars) this.pureSidecars = {};
1218
1600
  this.pureSidecars[r] = module.default;
1219
1601
  this.pureSidecars[r].start(argz);
1220
1602
  });
@@ -1250,12 +1632,37 @@ export class PM_Main extends PM_WithEslintAndTsc {
1250
1632
 
1251
1633
  const d = `${dest}?cacheBust=${Date.now()}`;
1252
1634
 
1253
- const ofile = `${reportDest}/logs.txt`;
1254
- const oStream = fs.createWriteStream(ofile);
1635
+ const logs = createLogStreams(reportDest, "web");
1255
1636
 
1256
1637
  this.browser
1257
1638
  .newPage()
1258
1639
  .then((page) => {
1640
+ page.on("console", (log: ConsoleMessage) => {
1641
+ const msg = `${log.text()}\n`;
1642
+
1643
+ switch (log.type()) {
1644
+ case "info":
1645
+ logs.info?.write(msg);
1646
+ break;
1647
+ case "warn":
1648
+ logs.warn?.write(msg);
1649
+ break;
1650
+ case "error":
1651
+ logs.error?.write(msg);
1652
+ break;
1653
+ case "debug":
1654
+ logs.debug?.write(msg);
1655
+ break;
1656
+ default:
1657
+ break;
1658
+ }
1659
+ });
1660
+
1661
+ page.on("close", () => {
1662
+ logs.writeExitCode(0); // Web tests exit with 0 unless there's an error
1663
+ logs.closeAll();
1664
+ logs.closeAll();
1665
+ });
1259
1666
  this.mapping().forEach(async ([command, func]) => {
1260
1667
  if (command === "page") {
1261
1668
  page.exposeFunction(command, (x?) => {
@@ -1288,55 +1695,23 @@ export class PM_Main extends PM_WithEslintAndTsc {
1288
1695
  Promise.all(screenshots[src] || []).then(() => {
1289
1696
  delete screenshots[src];
1290
1697
  page.close();
1291
- oStream.close();
1292
1698
  });
1293
1699
 
1294
1700
  return;
1295
1701
  };
1296
1702
 
1297
1703
  page.on("pageerror", (err: Error) => {
1704
+ logs.writeExitCode(-1, err);
1298
1705
  console.log(
1299
1706
  ansiColors.red(
1300
- `web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1707
+ `web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/error.log for more info`
1301
1708
  )
1302
1709
  );
1303
-
1304
- oStream.write(err.name);
1305
- oStream.write("\n");
1306
-
1307
- if (err.cause) {
1308
- oStream.write(err.cause);
1309
- oStream.write("\n");
1310
- }
1311
-
1312
- if (err.stack) {
1313
- oStream.write(err.stack);
1314
- oStream.write("\n");
1315
- }
1316
-
1317
- if (err.message) {
1318
- oStream.write(err.message);
1319
- oStream.write("\n");
1320
- }
1321
-
1322
1710
  this.bddTestIsNowDone(src, -1);
1323
1711
  close();
1324
1712
  });
1325
1713
 
1326
- page.on("console", (log: ConsoleMessage) => {
1327
- // console.log("console message: ", log.text());
1328
- if (oStream.closed) {
1329
- console.log("missed console message: ", log.text());
1330
- return;
1331
- } else {
1332
- oStream.write(log.text());
1333
- oStream.write("\n");
1334
- oStream.write(JSON.stringify(log.location()));
1335
- oStream.write("\n");
1336
- oStream.write(JSON.stringify(log.stackTrace()));
1337
- oStream.write("\n");
1338
- }
1339
- });
1714
+ // page.on("console", (log: ConsoleMessage) => {});
1340
1715
 
1341
1716
  await page.goto(`file://${`${destFolder}.html`}`, {});
1342
1717
 
@@ -1363,7 +1738,7 @@ import('${d}').then(async (x) => {
1363
1738
  console.log(
1364
1739
  ansiC.red(
1365
1740
  ansiC.inverse(
1366
- `web ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1741
+ `web ! ${src} failed to execute. No "tests.json" file was generated. Check logs for more info`
1367
1742
  )
1368
1743
  )
1369
1744
  );
@@ -1391,9 +1766,28 @@ import('${d}').then(async (x) => {
1391
1766
  srcTest.split(".").slice(0, -1).join(".") + ".features.txt"
1392
1767
  );
1393
1768
 
1394
- const testReport = JSON.parse(
1395
- fs.readFileSync(`${reportDest}/tests.json`).toString()
1396
- );
1769
+ // Read and parse the test report
1770
+ const testReportPath = `${reportDest}/tests.json`;
1771
+ if (!fs.existsSync(testReportPath)) {
1772
+ console.error(`tests.json not found at: ${testReportPath}`);
1773
+ return;
1774
+ }
1775
+
1776
+ const testReport = JSON.parse(fs.readFileSync(testReportPath, "utf8"));
1777
+
1778
+ // Add full path information to each test
1779
+ if (testReport.tests) {
1780
+ testReport.tests.forEach((test) => {
1781
+ // Add the full path to each test
1782
+ test.fullPath = path.resolve(process.cwd(), srcTest);
1783
+ });
1784
+ }
1785
+
1786
+ // Add full path to the report itself
1787
+ testReport.fullPath = path.resolve(process.cwd(), srcTest);
1788
+
1789
+ // Write the modified report back
1790
+ fs.writeFileSync(testReportPath, JSON.stringify(testReport, null, 2));
1397
1791
 
1398
1792
  testReport.features
1399
1793
  .reduce(async (mm, featureStringKey) => {
@@ -1451,7 +1845,7 @@ import('${d}').then(async (x) => {
1451
1845
  }, Promise.resolve({ files: [] as string[], strings: [] as string[] }))
1452
1846
 
1453
1847
  .then(({ files, strings }: { files: string[]; strings: string[] }) => {
1454
- // Markdown files must be referenced in the prompt but string style features are already present in the test.json file
1848
+ // Markdown files must be referenced in the prompt but string style features are already present in the tests.json file
1455
1849
 
1456
1850
  fs.writeFileSync(
1457
1851
  `testeranto/reports/${this.name}/${srcTest
@@ -1478,6 +1872,151 @@ import('${d}').then(async (x) => {
1478
1872
  this.writeBigBoard();
1479
1873
  };
1480
1874
 
1875
+ requestHandler(req: http.IncomingMessage, res: http.ServerResponse) {
1876
+ // Parse the URL
1877
+ const parsedUrl = url.parse(req.url || "/");
1878
+ let pathname = parsedUrl.pathname || "/";
1879
+
1880
+ // Handle root path
1881
+ if (pathname === "/") {
1882
+ pathname = "/index.html";
1883
+ }
1884
+
1885
+ // Remove leading slash
1886
+ let filePath = pathname.substring(1);
1887
+
1888
+ // Determine which directory to serve from
1889
+ if (filePath.startsWith("reports/")) {
1890
+ // Serve from reports directory
1891
+ filePath = `testeranto/${filePath}`;
1892
+ } else if (filePath.startsWith("metafiles/")) {
1893
+ // Serve from metafiles directory
1894
+ filePath = `testeranto/${filePath}`;
1895
+ } else if (filePath === "projects.json") {
1896
+ // Serve projects.json
1897
+ filePath = `testeranto/${filePath}`;
1898
+ } else {
1899
+ // For frontend assets, try multiple possible locations
1900
+ // First, try the dist directory
1901
+ const possiblePaths = [
1902
+ `dist/${filePath}`,
1903
+ `testeranto/dist/${filePath}`,
1904
+ `../dist/${filePath}`,
1905
+ `./${filePath}`,
1906
+ ];
1907
+
1908
+ // Find the first existing file
1909
+ let foundPath = null;
1910
+ for (const possiblePath of possiblePaths) {
1911
+ if (fs.existsSync(possiblePath)) {
1912
+ foundPath = possiblePath;
1913
+ break;
1914
+ }
1915
+ }
1916
+
1917
+ if (foundPath) {
1918
+ filePath = foundPath;
1919
+ } else {
1920
+ // If no file found, serve index.html for SPA routing
1921
+ const indexPath = this.findIndexHtml();
1922
+ if (indexPath) {
1923
+ fs.readFile(indexPath, (err, data) => {
1924
+ if (err) {
1925
+ res.writeHead(404, { "Content-Type": "text/plain" });
1926
+ res.end("404 Not Found");
1927
+ return;
1928
+ }
1929
+ res.writeHead(200, { "Content-Type": "text/html" });
1930
+ res.end(data);
1931
+ });
1932
+ return;
1933
+ } else {
1934
+ res.writeHead(404, { "Content-Type": "text/plain" });
1935
+ res.end("404 Not Found");
1936
+ return;
1937
+ }
1938
+ }
1939
+ }
1940
+
1941
+ // Check if file exists
1942
+ fs.exists(filePath, (exists) => {
1943
+ if (!exists) {
1944
+ // For SPA routing, serve index.html if the path looks like a route
1945
+ if (!pathname.includes(".") && pathname !== "/") {
1946
+ const indexPath = this.findIndexHtml();
1947
+ if (indexPath) {
1948
+ fs.readFile(indexPath, (err, data) => {
1949
+ if (err) {
1950
+ res.writeHead(404, { "Content-Type": "text/plain" });
1951
+ res.end("404 Not Found");
1952
+ return;
1953
+ }
1954
+ res.writeHead(200, { "Content-Type": "text/html" });
1955
+ res.end(data);
1956
+ });
1957
+ return;
1958
+ } else {
1959
+ // Serve a simple message if index.html is not found
1960
+ res.writeHead(200, { "Content-Type": "text/html" });
1961
+ res.end(`
1962
+ <html>
1963
+ <body>
1964
+ <h1>Testeranto is running</h1>
1965
+ <p>Frontend files are not built yet. Run 'npm run build' to build the frontend.</p>
1966
+ </body>
1967
+ </html>
1968
+ `);
1969
+ return;
1970
+ }
1971
+ }
1972
+ res.writeHead(404, { "Content-Type": "text/plain" });
1973
+ res.end("404 Not Found");
1974
+ return;
1975
+ }
1976
+
1977
+ // Read and serve the file
1978
+ fs.readFile(filePath, (err, data) => {
1979
+ if (err) {
1980
+ res.writeHead(500, { "Content-Type": "text/plain" });
1981
+ res.end("500 Internal Server Error");
1982
+ return;
1983
+ }
1984
+
1985
+ // Get MIME type
1986
+ const mimeType = mime.lookup(filePath) || "application/octet-stream";
1987
+ res.writeHead(200, { "Content-Type": mimeType });
1988
+ res.end(data);
1989
+ });
1990
+ });
1991
+ }
1992
+
1993
+ findIndexHtml(): string | null {
1994
+ const possiblePaths = [
1995
+ "dist/index.html",
1996
+ "testeranto/dist/index.html",
1997
+ "../dist/index.html",
1998
+ "./index.html",
1999
+ ];
2000
+
2001
+ for (const path of possiblePaths) {
2002
+ if (fs.existsSync(path)) {
2003
+ return path;
2004
+ }
2005
+ }
2006
+ return null;
2007
+ }
2008
+
2009
+ broadcast(message: any) {
2010
+ const data =
2011
+ typeof message === "string" ? message : JSON.stringify(message);
2012
+ this.clients.forEach((client) => {
2013
+ if (client.readyState === 1) {
2014
+ // WebSocket.OPEN
2015
+ client.send(data);
2016
+ }
2017
+ });
2018
+ }
2019
+
1481
2020
  checkQueue() {
1482
2021
  const x = this.queue.pop();
1483
2022
  if (!x) {
@@ -1544,10 +2083,16 @@ import('${d}').then(async (x) => {
1544
2083
  this.writeBigBoard();
1545
2084
 
1546
2085
  if (!inflight) {
1547
- this.browser.disconnect().then(() => {
1548
- console.log(ansiC.inverse(`${this.name} has been tested. Goodbye.`));
1549
- process.exit();
1550
- });
2086
+ if (this.browser) {
2087
+ if (this.browser) {
2088
+ this.browser.disconnect().then(() => {
2089
+ console.log(
2090
+ ansiC.inverse(`${this.name} has been tested. Goodbye.`)
2091
+ );
2092
+ process.exit();
2093
+ });
2094
+ }
2095
+ }
1551
2096
  }
1552
2097
  };
1553
2098
  }