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
@@ -8,11 +8,15 @@ import readline from "readline";
8
8
  import { spawn } from "node:child_process";
9
9
  import ansiColors from "ansi-colors";
10
10
  import net from "net";
11
- import fs3, { watch } from "fs";
11
+ import fs4, { watch } from "fs";
12
12
  import path4 from "path";
13
13
  import puppeteer from "puppeteer-core";
14
14
  import ansiC2 from "ansi-colors";
15
15
  import crypto from "node:crypto";
16
+ import { WebSocketServer } from "ws";
17
+ import http from "http";
18
+ import url from "url";
19
+ import mime from "mime-types";
16
20
 
17
21
  // src/utils.ts
18
22
  import path from "path";
@@ -123,8 +127,7 @@ var Queue = class {
123
127
 
124
128
  // src/PM/PM_WithEslintAndTsc.ts
125
129
  import ts from "typescript";
126
- import fs2 from "fs";
127
- import path3 from "path";
130
+ import fs3 from "fs";
128
131
  import ansiC from "ansi-colors";
129
132
  import { ESLint } from "eslint";
130
133
  import tsc from "tsc-prog";
@@ -164,10 +167,10 @@ var PM_Base = class {
164
167
  async newPage() {
165
168
  return (await this.browser.newPage()).mainFrame()._id;
166
169
  }
167
- goto(p, url) {
170
+ goto(p, url2) {
168
171
  return new Promise((res) => {
169
172
  this.doInPage(p, async (page) => {
170
- await page?.goto(url);
173
+ await page?.goto(url2);
171
174
  res({});
172
175
  });
173
176
  });
@@ -250,7 +253,6 @@ var PM_Base = class {
250
253
  const filepath = x[0];
251
254
  const contents = x[1];
252
255
  const testName = x[2];
253
- console.log("writing file", filepath);
254
256
  return new Promise(async (res) => {
255
257
  fs.mkdirSync(path2.dirname(filepath), {
256
258
  recursive: true
@@ -390,6 +392,142 @@ var PM_Base = class {
390
392
  }
391
393
  };
392
394
 
395
+ // src/utils/makePrompt.ts
396
+ import fs2 from "fs";
397
+ import path3 from "path";
398
+
399
+ // src/utils/logFiles.ts
400
+ var LOG_FILES = {
401
+ TESTS: "tests.json",
402
+ TYPE_ERRORS: "type_errors.txt",
403
+ LINT_ERRORS: "lint_errors.txt",
404
+ EXIT: "exit.log",
405
+ MESSAGE: "message.txt",
406
+ PROMPT: "prompt.txt",
407
+ STDOUT: "stdout.log",
408
+ STDERR: "stderr.log",
409
+ INFO: "info.log",
410
+ ERROR: "error.log",
411
+ WARN: "warn.log",
412
+ DEBUG: "debug.log"
413
+ };
414
+ var STANDARD_LOGS = {
415
+ TESTS: "tests.json",
416
+ TYPE_ERRORS: "type_errors.txt",
417
+ LINT_ERRORS: "lint_errors.txt",
418
+ EXIT: "exit.log",
419
+ MESSAGE: "message.txt",
420
+ PROMPT: "prompt.txt"
421
+ };
422
+ var RUNTIME_SPECIFIC_LOGS = {
423
+ node: {
424
+ STDOUT: "stdout.log",
425
+ STDERR: "stderr.log"
426
+ },
427
+ web: {
428
+ INFO: "info.log",
429
+ ERROR: "error.log",
430
+ WARN: "warn.log",
431
+ DEBUG: "debug.log"
432
+ },
433
+ pure: {}
434
+ // No runtime-specific logs for pure
435
+ };
436
+ var ALL_LOGS = {
437
+ ...STANDARD_LOGS,
438
+ ...Object.values(RUNTIME_SPECIFIC_LOGS).reduce((acc, logs) => ({ ...acc, ...logs }), {})
439
+ };
440
+ var getRuntimeLogs = (runtime) => {
441
+ return {
442
+ standard: Object.values(STANDARD_LOGS),
443
+ runtimeSpecific: Object.values(RUNTIME_SPECIFIC_LOGS[runtime])
444
+ };
445
+ };
446
+ function getLogFilesForRuntime(runtime) {
447
+ const { standard, runtimeSpecific } = getRuntimeLogs(runtime);
448
+ return [...standard, ...runtimeSpecific];
449
+ }
450
+
451
+ // src/utils/makePrompt.ts
452
+ var makePrompt = async (summary, name, entryPoint, addableFiles, runtime) => {
453
+ summary[entryPoint].prompt = "?";
454
+ const promptPath = promptPather(entryPoint, runtime, name);
455
+ const testDir = path3.join(
456
+ "testeranto",
457
+ "reports",
458
+ name,
459
+ entryPoint.split(".").slice(0, -1).join("."),
460
+ runtime
461
+ );
462
+ if (!fs2.existsSync(testDir)) {
463
+ fs2.mkdirSync(testDir, { recursive: true });
464
+ }
465
+ const testPaths = path3.join(testDir, LOG_FILES.TESTS);
466
+ const lintPath = path3.join(testDir, LOG_FILES.LINT_ERRORS);
467
+ const typePath = path3.join(testDir, LOG_FILES.TYPE_ERRORS);
468
+ const messagePath = path3.join(testDir, LOG_FILES.MESSAGE);
469
+ try {
470
+ await Promise.all([
471
+ fs2.promises.writeFile(
472
+ promptPath,
473
+ `
474
+ ${addableFiles.map((x) => {
475
+ return `/add ${x}`;
476
+ }).join("\n")}
477
+
478
+ /read node_modules/testeranto/docs/index.md
479
+ /read node_modules/testeranto/docs/style.md
480
+ /read node_modules/testeranto/docs/testing.ai.txt
481
+ /read node_modules/testeranto/src/CoreTypes.ts
482
+
483
+ /read ${testPaths}
484
+ /read ${typePath}
485
+ /read ${lintPath}
486
+
487
+ /read ${getLogFilesForRuntime(runtime).map((p) => `${testDir}/${p}`).join(" ")}
488
+ `
489
+ ),
490
+ fs2.promises.writeFile(
491
+ messagePath,
492
+ `
493
+ There are 3 types of test reports.
494
+ 1) bdd (highest priority)
495
+ 2) type checker
496
+ 3) static analysis (lowest priority)
497
+
498
+ "tests.json" is the detailed result of the bdd tests.
499
+ if these files do not exist, then something has gone badly wrong and needs to be addressed.
500
+
501
+ "type_errors.txt" is the result of the type checker.
502
+ if this file does not exist, then type check passed without errors;
503
+
504
+ "lint_errors.txt" is the result of the static analysis.
505
+ if this file does not exist, then static analysis passed without errors;
506
+
507
+ BDD failures are the highest priority. Focus on passing BDD tests before addressing other concerns.
508
+ Do not add error throwing/catching to the tests themselves.
509
+ `
510
+ )
511
+ ]);
512
+ } catch (e) {
513
+ console.error(`Failed to write prompt files at ${testDir}`);
514
+ console.error(e);
515
+ throw e;
516
+ }
517
+ summary[entryPoint].prompt = `aider --model deepseek/deepseek-chat --load testeranto/${name}/reports/${runtime}/${entryPoint.split(".").slice(0, -1).join(".")}/prompt.txt`;
518
+ };
519
+ var makePromptInternal = (summary, name, entryPoint, addableFiles, runTime) => {
520
+ if (runTime === "node") {
521
+ return makePrompt(summary, name, entryPoint, addableFiles, "node");
522
+ }
523
+ if (runTime === "web") {
524
+ return makePrompt(summary, name, entryPoint, addableFiles, "web");
525
+ }
526
+ if (runTime === "pure") {
527
+ return makePrompt(summary, name, entryPoint, addableFiles, "pure");
528
+ }
529
+ };
530
+
393
531
  // src/PM/PM_WithEslintAndTsc.ts
394
532
  var eslint = new ESLint();
395
533
  var formatter = await eslint.loadFormatter(
@@ -452,7 +590,7 @@ var PM_WithEslintAndTsc = class extends PM_Base {
452
590
  );
453
591
  }
454
592
  });
455
- fs2.writeFileSync(tscPath, results.join("\n"));
593
+ fs3.writeFileSync(tscPath, results.join("\n"));
456
594
  this.typeCheckIsNowDone(entrypoint, results.length);
457
595
  };
458
596
  this.eslintCheck = async (entrypoint, platform, addableFiles) => {
@@ -467,93 +605,25 @@ var PM_WithEslintAndTsc = class extends PM_Base {
467
605
  process.exit(-1);
468
606
  }
469
607
  const filepath = lintPather(entrypoint, platform, this.name);
470
- if (fs2.existsSync(filepath))
471
- fs2.rmSync(filepath);
608
+ if (fs3.existsSync(filepath))
609
+ fs3.rmSync(filepath);
472
610
  const results = (await eslint.lintFiles(addableFiles)).filter((r) => r.messages.length).filter((r) => {
473
611
  return r.messages[0].ruleId !== null;
474
612
  }).map((r) => {
475
613
  delete r.source;
476
614
  return r;
477
615
  });
478
- fs2.writeFileSync(filepath, await formatter.format(results));
616
+ fs3.writeFileSync(filepath, await formatter.format(results));
479
617
  this.lintIsNowDone(entrypoint, results.length);
480
618
  };
481
619
  this.makePrompt = async (entryPoint, addableFiles, platform) => {
482
- this.summary[entryPoint].prompt = "?";
483
- const promptPath = promptPather(entryPoint, platform, this.name);
484
- const testPaths = path3.join(
485
- "testeranto",
486
- "reports",
487
- this.name,
488
- entryPoint.split(".").slice(0, -1).join("."),
489
- platform,
490
- `tests.json`
491
- );
492
- const featuresPath = path3.join(
493
- "testeranto",
494
- "reports",
495
- this.name,
496
- platform,
497
- entryPoint.split(".").slice(0, -1).join("."),
498
- `featurePrompt.txt`
499
- );
500
- const logPath = path3.join(
501
- "testeranto",
502
- "reports",
620
+ await makePromptInternal(
621
+ this.summary,
503
622
  this.name,
504
- entryPoint.split(".").slice(0, -1).join("."),
505
- platform,
506
- `logs.txt`
623
+ entryPoint,
624
+ addableFiles,
625
+ platform
507
626
  );
508
- const lintPath = path3.join(
509
- "testeranto",
510
- "reports",
511
- this.name,
512
- entryPoint.split(".").slice(0, -1).join("."),
513
- platform,
514
- `lint_errors.txt`
515
- );
516
- const typePath = path3.join(
517
- "testeranto",
518
- "reports",
519
- this.name,
520
- entryPoint.split(".").slice(0, -1).join("."),
521
- platform,
522
- `type_errors.txt`
523
- );
524
- const messagePath = path3.join(
525
- "testeranto",
526
- "reports",
527
- this.name,
528
- entryPoint.split(".").slice(0, -1).join("."),
529
- platform,
530
- `message.txt`
531
- );
532
- fs2.writeFileSync(
533
- promptPath,
534
- `
535
- ${addableFiles.map((x) => {
536
- return `/add ${x}`;
537
- }).join("\n")}
538
-
539
- /read node_modules/testeranto/docs/index.md
540
- /read node_modules/testeranto/docs/style.md
541
- /read node_modules/testeranto/docs/testing.ai.txt
542
- /read node_modules/testeranto/src/CoreTypes.ts
543
-
544
- /read ${testPaths}
545
- /read ${logPath}
546
- /read ${typePath}
547
- /read ${lintPath}
548
- `
549
- );
550
- fs2.writeFileSync(
551
- messagePath,
552
- `
553
- Fix the failing tests described in ${testPaths} and ${logPath}. Focus on the bdd tests before all other concerns. You may add any debugging you think is necessary.
554
- `
555
- );
556
- this.summary[entryPoint].prompt = `aider --model deepseek/deepseek-chat --load testeranto/${this.name}/reports/${platform}/${entryPoint.split(".").slice(0, -1).join(".")}/prompt.txt`;
557
627
  this.checkForShutdown();
558
628
  };
559
629
  this.typeCheckIsRunning = (src) => {
@@ -615,10 +685,13 @@ Fix the failing tests described in ${testPaths} and ${logPath}. Focus on the bdd
615
685
  this.checkForShutdown();
616
686
  };
617
687
  this.writeBigBoard = () => {
618
- fs2.writeFileSync(
619
- `./testeranto/reports/${this.name}/summary.json`,
620
- JSON.stringify(this.summary, null, 2)
621
- );
688
+ const summaryPath = `./testeranto/reports/${this.name}/summary.json`;
689
+ const summaryData = JSON.stringify(this.summary, null, 2);
690
+ fs3.writeFileSync(summaryPath, summaryData);
691
+ this.broadcast({
692
+ type: "summaryUpdate",
693
+ data: this.summary
694
+ });
622
695
  };
623
696
  this.name = name;
624
697
  this.mode = mode2;
@@ -651,10 +724,80 @@ var changes = {};
651
724
  var fileHashes = {};
652
725
  var files2 = {};
653
726
  var screenshots2 = {};
727
+ function runtimeLogs(runtime, reportDest) {
728
+ const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
729
+ try {
730
+ if (!fs4.existsSync(safeDest)) {
731
+ fs4.mkdirSync(safeDest, { recursive: true });
732
+ }
733
+ if (runtime === "node") {
734
+ return {
735
+ stdout: fs4.createWriteStream(`${safeDest}/stdout.log`),
736
+ stderr: fs4.createWriteStream(`${safeDest}/stderr.log`),
737
+ exit: fs4.createWriteStream(`${safeDest}/exit.log`)
738
+ };
739
+ } else if (runtime === "web") {
740
+ return {
741
+ info: fs4.createWriteStream(`${safeDest}/info.log`),
742
+ warn: fs4.createWriteStream(`${safeDest}/warn.log`),
743
+ error: fs4.createWriteStream(`${safeDest}/error.log`),
744
+ debug: fs4.createWriteStream(`${safeDest}/debug.log`),
745
+ exit: fs4.createWriteStream(`${safeDest}/exit.log`)
746
+ };
747
+ } else if (runtime === "pure") {
748
+ return {
749
+ exit: fs4.createWriteStream(`${safeDest}/exit.log`)
750
+ };
751
+ } else {
752
+ throw `unknown runtime: ${runtime}`;
753
+ }
754
+ } catch (e) {
755
+ console.error(`Failed to create log streams in ${safeDest}:`, e);
756
+ throw e;
757
+ }
758
+ }
759
+ function createLogStreams(reportDest, runtime) {
760
+ if (!fs4.existsSync(reportDest)) {
761
+ fs4.mkdirSync(reportDest, { recursive: true });
762
+ }
763
+ const streams = runtimeLogs(runtime, reportDest);
764
+ const safeDest = reportDest || `testeranto/reports/default_${Date.now()}`;
765
+ try {
766
+ if (!fs4.existsSync(safeDest)) {
767
+ fs4.mkdirSync(safeDest, { recursive: true });
768
+ }
769
+ const streams2 = runtimeLogs(runtime, safeDest);
770
+ return {
771
+ ...streams2,
772
+ closeAll: () => {
773
+ Object.values(streams2).forEach(
774
+ (stream) => !stream.closed && stream.close()
775
+ );
776
+ },
777
+ writeExitCode: (code, error) => {
778
+ if (error) {
779
+ streams2.exit.write(`Error: ${error.message}
780
+ `);
781
+ if (error.stack) {
782
+ streams2.exit.write(`Stack Trace:
783
+ ${error.stack}
784
+ `);
785
+ }
786
+ }
787
+ streams2.exit.write(`${code}
788
+ `);
789
+ },
790
+ exit: streams2.exit
791
+ };
792
+ } catch (e) {
793
+ console.error(`Failed to create log streams in ${safeDest}:`, e);
794
+ throw e;
795
+ }
796
+ }
654
797
  async function fileHash(filePath, algorithm = "md5") {
655
798
  return new Promise((resolve, reject) => {
656
799
  const hash = crypto.createHash(algorithm);
657
- const fileStream = fs3.createReadStream(filePath);
800
+ const fileStream = fs4.createReadStream(filePath);
658
801
  fileStream.on("data", (data) => {
659
802
  hash.update(data);
660
803
  });
@@ -669,20 +812,26 @@ async function fileHash(filePath, algorithm = "md5") {
669
812
  }
670
813
  var statusMessagePretty = (failures, test, runtime) => {
671
814
  if (failures === 0) {
815
+ console.log(ansiC2.green(ansiC2.inverse(`${runtime} > ${test}`)));
816
+ } else if (failures > 0) {
672
817
  console.log(
673
- ansiC2.green(ansiC2.inverse(`${runtime} > ${test} completed successfully`))
818
+ ansiC2.red(
819
+ ansiC2.inverse(
820
+ `${runtime} > ${test} failed ${failures} times (exit code: ${failures})`
821
+ )
822
+ )
674
823
  );
675
824
  } else {
676
825
  console.log(
677
- ansiC2.red(ansiC2.inverse(`${runtime} > ${test} failed ${failures} times`))
826
+ ansiC2.red(ansiC2.inverse(`${runtime} > ${test} crashed (exit code: -1)`))
678
827
  );
679
828
  }
680
829
  };
681
830
  async function writeFileAndCreateDir(filePath, data) {
682
831
  const dirPath = path4.dirname(filePath);
683
832
  try {
684
- await fs3.promises.mkdir(dirPath, { recursive: true });
685
- await fs3.writeFileSync(filePath, data);
833
+ await fs4.promises.mkdir(dirPath, { recursive: true });
834
+ await fs4.writeFileSync(filePath, data);
686
835
  } catch (error) {
687
836
  console.error(`Error writing file: ${error}`);
688
837
  }
@@ -707,7 +856,7 @@ function isValidUrl(string) {
707
856
  async function pollForFile(path5, timeout = 2e3) {
708
857
  const intervalObj = setInterval(function() {
709
858
  const file = path5;
710
- const fileExists = fs3.existsSync(file);
859
+ const fileExists = fs4.existsSync(file);
711
860
  if (fileExists) {
712
861
  clearInterval(intervalObj);
713
862
  }
@@ -716,6 +865,12 @@ async function pollForFile(path5, timeout = 2e3) {
716
865
  var PM_Main = class extends PM_WithEslintAndTsc {
717
866
  constructor(configs, name, mode2) {
718
867
  super(configs, name, mode2);
868
+ this.logStreams = {};
869
+ this.sidecars = {};
870
+ this.clients = /* @__PURE__ */ new Set();
871
+ this.runningProcesses = /* @__PURE__ */ new Map();
872
+ this.allProcesses = /* @__PURE__ */ new Map();
873
+ this.processLogs = /* @__PURE__ */ new Map();
719
874
  this.getRunnables = (tests, testName, payload = {
720
875
  nodeEntryPoints: {},
721
876
  nodeEntryPointSidecars: {},
@@ -730,11 +885,11 @@ var PM_Main = class extends PM_WithEslintAndTsc {
730
885
  console.log(ansiC2.green(ansiC2.inverse(`pure < ${src}`)));
731
886
  this.bddTestIsRunning(src);
732
887
  const reportDest = `testeranto/reports/${this.name}/${src.split(".").slice(0, -1).join(".")}/pure`;
733
- if (!fs3.existsSync(reportDest)) {
734
- fs3.mkdirSync(reportDest, { recursive: true });
888
+ if (!fs4.existsSync(reportDest)) {
889
+ fs4.mkdirSync(reportDest, { recursive: true });
735
890
  }
736
891
  const destFolder = dest.replace(".mjs", "");
737
- let argz = "";
892
+ let argz2 = "";
738
893
  const testConfig = this.configs.tests.find((t) => {
739
894
  return t[0] === src;
740
895
  });
@@ -745,7 +900,7 @@ var PM_Main = class extends PM_WithEslintAndTsc {
745
900
  const testConfigResource = testConfig[2];
746
901
  const portsToUse = [];
747
902
  if (testConfigResource.ports === 0) {
748
- argz = JSON.stringify({
903
+ argz2 = JSON.stringify({
749
904
  scheduled: true,
750
905
  name: src,
751
906
  ports: portsToUse,
@@ -761,7 +916,7 @@ var PM_Main = class extends PM_WithEslintAndTsc {
761
916
  portsToUse.push(openPorts[i][0]);
762
917
  this.ports[openPorts[i][0]] = src;
763
918
  }
764
- argz = JSON.stringify({
919
+ argz2 = JSON.stringify({
765
920
  scheduled: true,
766
921
  name: src,
767
922
  ports: portsToUse,
@@ -770,22 +925,24 @@ var PM_Main = class extends PM_WithEslintAndTsc {
770
925
  });
771
926
  } else {
772
927
  this.queue.push(src);
773
- return;
928
+ return [Math.random(), argz2];
774
929
  }
775
930
  } else {
776
931
  console.error("negative port makes no sense", src);
777
932
  process.exit(-1);
778
933
  }
779
934
  const builtfile = dest;
935
+ const logs = createLogStreams(reportDest, "pure");
780
936
  try {
781
937
  await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
938
+ const originalConsole = { ...console };
782
939
  return module.default.then((defaultModule) => {
783
- defaultModule.receiveTestResourceConfig(argz).then(async (results) => {
940
+ defaultModule.receiveTestResourceConfig(argz2).then(async (results) => {
784
941
  statusMessagePretty(results.fails, src, "pure");
785
942
  this.bddTestIsNowDone(src, results.fails);
786
943
  }).catch((e1) => {
787
944
  console.log(
788
- ansiC2.red(`launchPure - ${src} errored with: ${e1}`)
945
+ ansiC2.red(`launchPure - ${src} errored with: ${e1.stack}`)
789
946
  );
790
947
  this.bddTestIsNowDone(src, -1);
791
948
  statusMessagePretty(-1, src, "pure");
@@ -793,27 +950,29 @@ var PM_Main = class extends PM_WithEslintAndTsc {
793
950
  }).catch((e2) => {
794
951
  console.log(
795
952
  ansiColors.red(
796
- `pure ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
953
+ `pure ! ${src} failed to execute. No "tests.json" file was generated. Check the logs for more info`
797
954
  )
798
955
  );
799
- this.writeFileSync(`${reportDest}/logs.txt`, e2.stack, src);
956
+ logs.exit.write(e2.stack);
957
+ logs.exit.write(-1);
800
958
  this.bddTestIsNowDone(src, -1);
801
959
  statusMessagePretty(-1, src, "pure");
802
960
  }).finally((x) => {
803
961
  });
804
962
  });
805
963
  } catch (e3) {
964
+ logs.writeExitCode(-1, e3);
806
965
  console.log(
807
966
  ansiC2.red(
808
967
  ansiC2.inverse(
809
- `${src} 1 errored with: ${e3}. Check ${reportDest}/logs.txt for more info`
968
+ `${src} 1 errored with: ${e3}. Check logs for more info`
810
969
  )
811
970
  )
812
971
  );
813
- this.writeFileSync(`${reportDest}/logs.txt`, e3.stack, src);
972
+ logs.exit.write(e3.stack);
973
+ logs.exit.write(-1);
814
974
  this.bddTestIsNowDone(src, -1);
815
975
  statusMessagePretty(-1, src, "pure");
816
- console.log("III) PURE IS EXITING BADLY WITH error", e3);
817
976
  }
818
977
  for (let i = 0; i <= portsToUse.length; i++) {
819
978
  if (portsToUse[i]) {
@@ -825,8 +984,8 @@ var PM_Main = class extends PM_WithEslintAndTsc {
825
984
  console.log(ansiC2.green(ansiC2.inverse(`node < ${src}`)));
826
985
  this.bddTestIsRunning(src);
827
986
  const reportDest = `testeranto/reports/${this.name}/${src.split(".").slice(0, -1).join(".")}/node`;
828
- if (!fs3.existsSync(reportDest)) {
829
- fs3.mkdirSync(reportDest, { recursive: true });
987
+ if (!fs4.existsSync(reportDest)) {
988
+ fs4.mkdirSync(reportDest, { recursive: true });
830
989
  }
831
990
  let testResources = "";
832
991
  const testConfig = this.configs.tests.find((t) => {
@@ -872,7 +1031,7 @@ var PM_Main = class extends PM_WithEslintAndTsc {
872
1031
  )
873
1032
  );
874
1033
  this.queue.push(src);
875
- return;
1034
+ return [Math.random(), argz];
876
1035
  }
877
1036
  } else {
878
1037
  console.error("negative port makes no sense", src);
@@ -931,41 +1090,46 @@ var PM_Main = class extends PM_WithEslintAndTsc {
931
1090
  }
932
1091
  });
933
1092
  });
934
- const oStream = fs3.createWriteStream(`${reportDest}/logs.txt`);
935
- const errFile = `${reportDest}/logs.txt`;
936
- if (fs3.existsSync(errFile)) {
937
- fs3.rmSync(errFile);
938
- }
1093
+ const logs = createLogStreams(reportDest, "node");
939
1094
  server.listen(ipcfile, () => {
940
- child.stderr?.on("data", (data) => {
941
- oStream.write(`stderr > ${data}`);
942
- });
943
1095
  child.stdout?.on("data", (data) => {
944
- oStream.write(`stdout > ${data}`);
1096
+ logs.stdout?.write(data);
1097
+ });
1098
+ child.stderr?.on("data", (data) => {
1099
+ logs.stderr?.write(data);
945
1100
  });
946
1101
  child.on("error", (err) => {
947
1102
  });
948
1103
  child.on("close", (code) => {
1104
+ const exitCode = code === null ? -1 : code;
1105
+ if (exitCode < 0) {
1106
+ logs.writeExitCode(
1107
+ exitCode,
1108
+ new Error("Process crashed or was terminated")
1109
+ );
1110
+ } else {
1111
+ logs.writeExitCode(exitCode);
1112
+ }
1113
+ logs.closeAll();
949
1114
  server.close();
950
1115
  if (!files2[src]) {
951
1116
  files2[src] = /* @__PURE__ */ new Set();
952
1117
  }
953
- if (code === 255) {
1118
+ if (exitCode === 255) {
954
1119
  console.log(
955
1120
  ansiColors.red(
956
- `node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1121
+ `node ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/stderr.log for more info`
957
1122
  )
958
1123
  );
959
1124
  this.bddTestIsNowDone(src, -1);
960
1125
  statusMessagePretty(-1, src, "node");
961
- oStream.close();
962
1126
  return;
963
- } else if (code === 0) {
1127
+ } else if (exitCode === 0) {
964
1128
  this.bddTestIsNowDone(src, 0);
965
1129
  statusMessagePretty(0, src, "node");
966
1130
  } else {
967
- this.bddTestIsNowDone(src, code);
968
- statusMessagePretty(code, src, "node");
1131
+ this.bddTestIsNowDone(src, exitCode);
1132
+ statusMessagePretty(exitCode, src, "node");
969
1133
  }
970
1134
  haltReturns = true;
971
1135
  });
@@ -983,11 +1147,10 @@ var PM_Main = class extends PM_WithEslintAndTsc {
983
1147
  console.log(
984
1148
  ansiC2.red(
985
1149
  ansiC2.inverse(
986
- `${src} errored with: ${e.name}. Check ${errFile} for more info`
1150
+ `${src} errored with: ${e.name}. Check error logs for more info`
987
1151
  )
988
1152
  )
989
1153
  );
990
- this.writeFileSync(`${reportDest}/logs.txt`, e.toString(), src);
991
1154
  this.bddTestIsNowDone(src, -1);
992
1155
  statusMessagePretty(-1, src, "node");
993
1156
  });
@@ -998,9 +1161,7 @@ var PM_Main = class extends PM_WithEslintAndTsc {
998
1161
  const dest = src.split(".").slice(0, -1).join(".");
999
1162
  const destFolder = dest.replace(".mjs", "");
1000
1163
  console.log(ansiC2.green(ansiC2.inverse(`launchWebSideCar ${src}`)));
1001
- const fileStreams2 = [];
1002
- const doneFileStream2 = [];
1003
- const oStream = fs3.createWriteStream(`${destFolder}/logs.txt`);
1164
+ const logs = createLogStreams(dest, "web");
1004
1165
  return new Promise((res, rej) => {
1005
1166
  this.browser.newPage().then(async (page) => {
1006
1167
  this.mapping().forEach(async ([command, func]) => {
@@ -1014,34 +1175,44 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1014
1175
  Promise.all(screenshots2[src] || []).then(() => {
1015
1176
  delete screenshots2[src];
1016
1177
  page.close();
1017
- oStream.close();
1018
1178
  });
1019
1179
  };
1020
1180
  page.on("pageerror", (err) => {
1021
1181
  console.debug(`Error from ${src}: [${err.name}] `);
1022
- oStream.write(err.name);
1023
- oStream.write("\n");
1182
+ console.debug(`Error from ${src}: [${err.name}] `);
1024
1183
  if (err.cause) {
1025
1184
  console.debug(`Error from ${src} cause: [${err.cause}] `);
1026
- oStream.write(err.cause);
1027
- oStream.write("\n");
1028
1185
  }
1029
1186
  if (err.stack) {
1030
1187
  console.debug(`Error from stack ${src}: [${err.stack}] `);
1031
- oStream.write(err.stack);
1032
- oStream.write("\n");
1033
1188
  }
1034
1189
  console.debug(`Error from message ${src}: [${err.message}] `);
1035
- oStream.write(err.message);
1036
- oStream.write("\n");
1037
1190
  this.bddTestIsNowDone(src, -1);
1038
1191
  close();
1039
1192
  });
1040
1193
  page.on("console", (log) => {
1041
- oStream.write(log.text());
1042
- oStream.write(JSON.stringify(log.location()));
1043
- oStream.write(JSON.stringify(log.stackTrace()));
1044
- oStream.write("\n");
1194
+ const msg = `${log.text()}
1195
+ ${JSON.stringify(
1196
+ log.location()
1197
+ )}
1198
+ ${JSON.stringify(log.stackTrace())}
1199
+ `;
1200
+ switch (log.type()) {
1201
+ case "info":
1202
+ logs.info?.write(msg);
1203
+ break;
1204
+ case "warn":
1205
+ logs.warn?.write(msg);
1206
+ break;
1207
+ case "error":
1208
+ logs.error?.write(msg);
1209
+ break;
1210
+ case "debug":
1211
+ logs.debug?.write(msg);
1212
+ break;
1213
+ default:
1214
+ break;
1215
+ }
1045
1216
  });
1046
1217
  await page.goto(`file://${`${destFolder}.html`}`, {});
1047
1218
  const webArgz = JSON.stringify({
@@ -1087,13 +1258,14 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1087
1258
  console.log(ansiC2.green(ansiC2.inverse(`launchNodeSideCar ${sidecar[0]}`)));
1088
1259
  const destFolder = dest.replace(".ts", "");
1089
1260
  const reportDest = `testeranto/reports/${this.name}/${src.split(".").slice(0, -1).join(".")}/node`;
1090
- const argz = {
1261
+ const argz2 = {
1091
1262
  name: sidecar[0],
1092
1263
  ports: [],
1093
1264
  fs: destFolder,
1094
1265
  browserWSEndpoint: this.browser.wsEndpoint()
1095
1266
  };
1096
1267
  const testReq = sidecar[2];
1268
+ const logs = createLogStreams(dest, "node");
1097
1269
  const portsToUse = [];
1098
1270
  if (testReq.ports === 0) {
1099
1271
  } else if (testReq.ports > 0) {
@@ -1102,10 +1274,10 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1102
1274
  );
1103
1275
  if (openPorts.length >= testReq.ports) {
1104
1276
  for (let i = 0; i < testReq.ports; i++) {
1105
- portsToUse.push(openPorts[i][0]);
1277
+ portsToUse.push(Number(openPorts[i][0]));
1106
1278
  this.ports[openPorts[i][0]] = src;
1107
1279
  }
1108
- argz.ports = portsToUse;
1280
+ argz2.ports = portsToUse;
1109
1281
  const builtfile = destFolder + ".mjs";
1110
1282
  let haltReturns = false;
1111
1283
  let buffer = new Buffer("");
@@ -1142,22 +1314,13 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1142
1314
  });
1143
1315
  });
1144
1316
  });
1145
- const oStream = fs3.createWriteStream(`${reportDest}/logs.txt`);
1146
- const child = spawn("node", [builtfile, JSON.stringify(argz)], {
1317
+ const child = spawn("node", [builtfile, JSON.stringify(argz2)], {
1147
1318
  stdio: ["pipe", "pipe", "pipe", "ipc"]
1148
1319
  // silent: true
1149
1320
  });
1150
1321
  const p = "/tmp/tpipe" + Math.random();
1151
- const errFile = `${reportDest}/logs.txt`;
1152
1322
  server.listen(p, () => {
1153
- child.stderr?.on("data", (data) => {
1154
- oStream.write(`stderr > ${data}`);
1155
- });
1156
- child.stdout?.on("data", (data) => {
1157
- oStream.write(`stdout > ${data}`);
1158
- });
1159
1323
  child.on("close", (code) => {
1160
- oStream.close();
1161
1324
  server.close();
1162
1325
  haltReturns = true;
1163
1326
  });
@@ -1170,24 +1333,24 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1170
1333
  }
1171
1334
  });
1172
1335
  child.on("error", (e) => {
1173
- if (fs3.existsSync(p)) {
1174
- fs3.rmSync(p);
1336
+ if (fs4.existsSync(p)) {
1337
+ fs4.rmSync(p);
1175
1338
  }
1176
1339
  haltReturns = true;
1177
1340
  console.log(
1178
1341
  ansiC2.red(
1179
1342
  ansiC2.inverse(
1180
- `launchNodeSideCar - ${src} errored with: ${e.name}. Check ${errFile}for more info`
1343
+ `launchNodeSideCar - ${src} errored with: ${e.name}. Check logs for more info`
1181
1344
  )
1182
1345
  )
1183
1346
  );
1184
- this.writeFileSync(`${reportDest}/logs.txt`, e.toString(), src);
1347
+ logs.error?.write(e.toString() + "\n");
1185
1348
  });
1186
1349
  });
1187
1350
  child.send({ path: p });
1188
1351
  const r = Math.random();
1189
1352
  this.nodeSidecars[r] = child;
1190
- return [r, argz];
1353
+ return [r, argz2];
1191
1354
  } else {
1192
1355
  console.log(
1193
1356
  ansiC2.red(
@@ -1195,7 +1358,7 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1195
1358
  )
1196
1359
  );
1197
1360
  this.queue.push(sidecar[0]);
1198
- return [Math.random(), argz];
1361
+ return [Math.random(), argz2];
1199
1362
  }
1200
1363
  } else {
1201
1364
  console.error("negative port makes no sense", sidecar[0]);
@@ -1213,13 +1376,13 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1213
1376
  const dest = process.cwd() + `/testeranto/bundles/pure/${this.name}/${sidecar[0]}`;
1214
1377
  const builtfile = dest.split(".").slice(0, -1).concat("mjs").join(".");
1215
1378
  const destFolder = dest.replace(".mjs", "");
1216
- let argz;
1379
+ let argz2;
1217
1380
  const z = sidecar[2];
1218
1381
  const testConfigResource = sidecar[2];
1219
1382
  const src = sidecar[0];
1220
1383
  const portsToUse = [];
1221
1384
  if (testConfigResource.ports === 0) {
1222
- argz = {
1385
+ argz2 = {
1223
1386
  // scheduled: true,
1224
1387
  name: src,
1225
1388
  ports: portsToUse,
@@ -1232,10 +1395,10 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1232
1395
  );
1233
1396
  if (openPorts.length >= testConfigResource.ports) {
1234
1397
  for (let i = 0; i < testConfigResource.ports; i++) {
1235
- portsToUse.push(openPorts[i][0]);
1398
+ portsToUse.push(Number(openPorts[i][0]));
1236
1399
  this.ports[openPorts[i][0]] = src;
1237
1400
  }
1238
- argz = {
1401
+ argz2 = {
1239
1402
  // scheduled: true,
1240
1403
  name: src,
1241
1404
  // ports: [3333],
@@ -1245,24 +1408,25 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1245
1408
  };
1246
1409
  } else {
1247
1410
  this.queue.push(src);
1248
- return;
1249
1411
  }
1250
1412
  } else {
1251
1413
  console.error("negative port makes no sense", src);
1252
1414
  process.exit(-1);
1253
1415
  }
1254
1416
  await import(`${builtfile}?cacheBust=${Date.now()}`).then((module) => {
1417
+ if (!this.pureSidecars)
1418
+ this.pureSidecars = {};
1255
1419
  this.pureSidecars[r] = module.default;
1256
- this.pureSidecars[r].start(argz);
1420
+ this.pureSidecars[r].start(argz2);
1257
1421
  });
1258
- return [r, argz];
1422
+ return [r, argz2];
1259
1423
  };
1260
1424
  this.launchWeb = async (src, dest) => {
1261
1425
  console.log(ansiC2.green(ansiC2.inverse(`web < ${src}`)));
1262
1426
  this.bddTestIsRunning(src);
1263
1427
  const reportDest = `testeranto/reports/${this.name}/${src.split(".").slice(0, -1).join(".")}/web`;
1264
- if (!fs3.existsSync(reportDest)) {
1265
- fs3.mkdirSync(reportDest, { recursive: true });
1428
+ if (!fs4.existsSync(reportDest)) {
1429
+ fs4.mkdirSync(reportDest, { recursive: true });
1266
1430
  }
1267
1431
  const destFolder = dest.replace(".mjs", "");
1268
1432
  const webArgz = JSON.stringify({
@@ -1272,9 +1436,33 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1272
1436
  browserWSEndpoint: this.browser.wsEndpoint()
1273
1437
  });
1274
1438
  const d = `${dest}?cacheBust=${Date.now()}`;
1275
- const ofile = `${reportDest}/logs.txt`;
1276
- const oStream = fs3.createWriteStream(ofile);
1439
+ const logs = createLogStreams(reportDest, "web");
1277
1440
  this.browser.newPage().then((page) => {
1441
+ page.on("console", (log) => {
1442
+ const msg = `${log.text()}
1443
+ `;
1444
+ switch (log.type()) {
1445
+ case "info":
1446
+ logs.info?.write(msg);
1447
+ break;
1448
+ case "warn":
1449
+ logs.warn?.write(msg);
1450
+ break;
1451
+ case "error":
1452
+ logs.error?.write(msg);
1453
+ break;
1454
+ case "debug":
1455
+ logs.debug?.write(msg);
1456
+ break;
1457
+ default:
1458
+ break;
1459
+ }
1460
+ });
1461
+ page.on("close", () => {
1462
+ logs.writeExitCode(0);
1463
+ logs.closeAll();
1464
+ logs.closeAll();
1465
+ });
1278
1466
  this.mapping().forEach(async ([command, func]) => {
1279
1467
  if (command === "page") {
1280
1468
  page.exposeFunction(command, (x) => {
@@ -1298,46 +1486,19 @@ var PM_Main = class extends PM_WithEslintAndTsc {
1298
1486
  Promise.all(screenshots2[src] || []).then(() => {
1299
1487
  delete screenshots2[src];
1300
1488
  page.close();
1301
- oStream.close();
1302
1489
  });
1303
1490
  return;
1304
1491
  };
1305
1492
  page.on("pageerror", (err) => {
1493
+ logs.writeExitCode(-1, err);
1306
1494
  console.log(
1307
1495
  ansiColors.red(
1308
- `web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1496
+ `web ! ${src} failed to execute No "tests.json" file was generated. Check ${reportDest}/error.log for more info`
1309
1497
  )
1310
1498
  );
1311
- oStream.write(err.name);
1312
- oStream.write("\n");
1313
- if (err.cause) {
1314
- oStream.write(err.cause);
1315
- oStream.write("\n");
1316
- }
1317
- if (err.stack) {
1318
- oStream.write(err.stack);
1319
- oStream.write("\n");
1320
- }
1321
- if (err.message) {
1322
- oStream.write(err.message);
1323
- oStream.write("\n");
1324
- }
1325
1499
  this.bddTestIsNowDone(src, -1);
1326
1500
  close();
1327
1501
  });
1328
- page.on("console", (log) => {
1329
- if (oStream.closed) {
1330
- console.log("missed console message: ", log.text());
1331
- return;
1332
- } else {
1333
- oStream.write(log.text());
1334
- oStream.write("\n");
1335
- oStream.write(JSON.stringify(log.location()));
1336
- oStream.write("\n");
1337
- oStream.write(JSON.stringify(log.stackTrace()));
1338
- oStream.write("\n");
1339
- }
1340
- });
1341
1502
  await page.goto(`file://${`${destFolder}.html`}`, {});
1342
1503
  await page.evaluate(
1343
1504
  `
@@ -1357,7 +1518,7 @@ import('${d}').then(async (x) => {
1357
1518
  console.log(
1358
1519
  ansiC2.red(
1359
1520
  ansiC2.inverse(
1360
- `web ! ${src} failed to execute. No "tests.json" file was generated. Check ${reportDest}/logs.txt for more info`
1521
+ `web ! ${src} failed to execute. No "tests.json" file was generated. Check logs for more info`
1361
1522
  )
1362
1523
  )
1363
1524
  );
@@ -1376,9 +1537,19 @@ import('${d}').then(async (x) => {
1376
1537
  "strings",
1377
1538
  srcTest.split(".").slice(0, -1).join(".") + ".features.txt"
1378
1539
  );
1379
- const testReport = JSON.parse(
1380
- fs3.readFileSync(`${reportDest}/tests.json`).toString()
1381
- );
1540
+ const testReportPath = `${reportDest}/tests.json`;
1541
+ if (!fs4.existsSync(testReportPath)) {
1542
+ console.error(`tests.json not found at: ${testReportPath}`);
1543
+ return;
1544
+ }
1545
+ const testReport = JSON.parse(fs4.readFileSync(testReportPath, "utf8"));
1546
+ if (testReport.tests) {
1547
+ testReport.tests.forEach((test) => {
1548
+ test.fullPath = path4.resolve(process.cwd(), srcTest);
1549
+ });
1550
+ }
1551
+ testReport.fullPath = path4.resolve(process.cwd(), srcTest);
1552
+ fs4.writeFileSync(testReportPath, JSON.stringify(testReport, null, 2));
1382
1553
  testReport.features.reduce(async (mm, featureStringKey) => {
1383
1554
  const accum = await mm;
1384
1555
  const isUrl = isValidUrl(featureStringKey);
@@ -1397,14 +1568,14 @@ import('${d}').then(async (x) => {
1397
1568
  accum.files.push(newPath);
1398
1569
  }
1399
1570
  } else {
1400
- await fs3.promises.mkdir(path4.dirname(featureDestination), {
1571
+ await fs4.promises.mkdir(path4.dirname(featureDestination), {
1401
1572
  recursive: true
1402
1573
  });
1403
1574
  accum.strings.push(featureStringKey);
1404
1575
  }
1405
1576
  return accum;
1406
1577
  }, Promise.resolve({ files: [], strings: [] })).then(({ files: files3, strings }) => {
1407
- fs3.writeFileSync(
1578
+ fs4.writeFileSync(
1408
1579
  `testeranto/reports/${this.name}/${srcTest.split(".").slice(0, -1).join(".")}/${platform}/featurePrompt.txt`,
1409
1580
  files3.map((f) => {
1410
1581
  return `/read ${f}`;
@@ -1460,10 +1631,16 @@ import('${d}').then(async (x) => {
1460
1631
  });
1461
1632
  this.writeBigBoard();
1462
1633
  if (!inflight) {
1463
- this.browser.disconnect().then(() => {
1464
- console.log(ansiC2.inverse(`${this.name} has been tested. Goodbye.`));
1465
- process.exit();
1466
- });
1634
+ if (this.browser) {
1635
+ if (this.browser) {
1636
+ this.browser.disconnect().then(() => {
1637
+ console.log(
1638
+ ansiC2.inverse(`${this.name} has been tested. Goodbye.`)
1639
+ );
1640
+ process.exit();
1641
+ });
1642
+ }
1643
+ }
1467
1644
  }
1468
1645
  };
1469
1646
  this.launchers = {};
@@ -1475,6 +1652,185 @@ import('${d}').then(async (x) => {
1475
1652
  this.configs.ports.forEach((element) => {
1476
1653
  this.ports[element] = "";
1477
1654
  });
1655
+ this.httpServer = http.createServer(this.requestHandler.bind(this));
1656
+ this.wss = new WebSocketServer({ server: this.httpServer });
1657
+ this.wss.on("connection", (ws) => {
1658
+ this.clients.add(ws);
1659
+ console.log("Client connected");
1660
+ ws.on("message", (data) => {
1661
+ try {
1662
+ const message = JSON.parse(data.toString());
1663
+ if (message.type === "executeCommand") {
1664
+ if (message.command && message.command.trim().startsWith("aider")) {
1665
+ console.log(`Executing command: ${message.command}`);
1666
+ const processId = Date.now().toString();
1667
+ const child = spawn(message.command, {
1668
+ shell: true,
1669
+ cwd: process.cwd()
1670
+ });
1671
+ this.runningProcesses.set(processId, child);
1672
+ this.allProcesses.set(processId, {
1673
+ child,
1674
+ status: "running",
1675
+ command: message.command,
1676
+ pid: child.pid,
1677
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1678
+ });
1679
+ this.processLogs.set(processId, []);
1680
+ this.broadcast({
1681
+ type: "processStarted",
1682
+ processId,
1683
+ command: message.command,
1684
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
1685
+ logs: []
1686
+ });
1687
+ child.stdout?.on("data", (data2) => {
1688
+ const logData = data2.toString();
1689
+ const logs = this.processLogs.get(processId) || [];
1690
+ logs.push(logData);
1691
+ this.processLogs.set(processId, logs);
1692
+ this.broadcast({
1693
+ type: "processStdout",
1694
+ processId,
1695
+ data: logData,
1696
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1697
+ });
1698
+ });
1699
+ child.stderr?.on("data", (data2) => {
1700
+ const logData = data2.toString();
1701
+ const logs = this.processLogs.get(processId) || [];
1702
+ logs.push(logData);
1703
+ this.processLogs.set(processId, logs);
1704
+ this.broadcast({
1705
+ type: "processStderr",
1706
+ processId,
1707
+ data: logData,
1708
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1709
+ });
1710
+ });
1711
+ child.on("error", (error) => {
1712
+ console.error(`Failed to execute command: ${error}`);
1713
+ this.runningProcesses.delete(processId);
1714
+ const processInfo = this.allProcesses.get(processId);
1715
+ if (processInfo) {
1716
+ this.allProcesses.set(processId, {
1717
+ ...processInfo,
1718
+ status: "error",
1719
+ error: error.message
1720
+ });
1721
+ }
1722
+ this.broadcast({
1723
+ type: "processError",
1724
+ processId,
1725
+ error: error.message,
1726
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1727
+ });
1728
+ });
1729
+ child.on("exit", (code) => {
1730
+ console.log(`Command exited with code ${code}`);
1731
+ this.runningProcesses.delete(processId);
1732
+ const processInfo = this.allProcesses.get(processId);
1733
+ if (processInfo) {
1734
+ this.allProcesses.set(processId, {
1735
+ ...processInfo,
1736
+ status: "exited",
1737
+ exitCode: code
1738
+ });
1739
+ }
1740
+ this.broadcast({
1741
+ type: "processExited",
1742
+ processId,
1743
+ exitCode: code,
1744
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1745
+ });
1746
+ });
1747
+ } else {
1748
+ console.error('Invalid command: must start with "aider"');
1749
+ }
1750
+ } else if (message.type === "getRunningProcesses") {
1751
+ const processes = Array.from(this.allProcesses.entries()).map(
1752
+ ([id, procInfo]) => ({
1753
+ processId: id,
1754
+ command: procInfo.command,
1755
+ pid: procInfo.pid,
1756
+ status: procInfo.status,
1757
+ exitCode: procInfo.exitCode,
1758
+ error: procInfo.error,
1759
+ timestamp: procInfo.timestamp,
1760
+ logs: this.processLogs.get(id) || []
1761
+ })
1762
+ );
1763
+ ws.send(
1764
+ JSON.stringify({
1765
+ type: "runningProcesses",
1766
+ processes
1767
+ })
1768
+ );
1769
+ } else if (message.type === "getProcess") {
1770
+ const processId = message.processId;
1771
+ const procInfo = this.allProcesses.get(processId);
1772
+ if (procInfo) {
1773
+ ws.send(
1774
+ JSON.stringify({
1775
+ type: "processData",
1776
+ processId,
1777
+ command: procInfo.command,
1778
+ pid: procInfo.pid,
1779
+ status: procInfo.status,
1780
+ exitCode: procInfo.exitCode,
1781
+ error: procInfo.error,
1782
+ timestamp: procInfo.timestamp,
1783
+ logs: this.processLogs.get(processId) || []
1784
+ })
1785
+ );
1786
+ }
1787
+ } else if (message.type === "stdin") {
1788
+ const processId = message.processId;
1789
+ const data2 = message.data;
1790
+ console.log("Received stdin for process", processId, ":", data2);
1791
+ const childProcess = this.runningProcesses.get(processId);
1792
+ if (childProcess && childProcess.stdin) {
1793
+ console.log("Writing to process stdin");
1794
+ childProcess.stdin.write(data2);
1795
+ } else {
1796
+ console.log(
1797
+ "Cannot write to stdin - process not found or no stdin:",
1798
+ {
1799
+ processExists: !!childProcess,
1800
+ stdinExists: childProcess?.stdin ? true : false
1801
+ }
1802
+ );
1803
+ }
1804
+ } else if (message.type === "killProcess") {
1805
+ const processId = message.processId;
1806
+ console.log("Received killProcess for process", processId);
1807
+ const childProcess = this.runningProcesses.get(processId);
1808
+ if (childProcess) {
1809
+ console.log("Killing process");
1810
+ childProcess.kill("SIGTERM");
1811
+ } else {
1812
+ console.log("Cannot kill process - process not found:", {
1813
+ processExists: !!childProcess
1814
+ });
1815
+ }
1816
+ }
1817
+ } catch (error) {
1818
+ console.error("Error handling WebSocket message:", error);
1819
+ }
1820
+ });
1821
+ ws.on("close", () => {
1822
+ this.clients.delete(ws);
1823
+ console.log("Client disconnected");
1824
+ });
1825
+ ws.on("error", (error) => {
1826
+ console.error("WebSocket error:", error);
1827
+ this.clients.delete(ws);
1828
+ });
1829
+ });
1830
+ const httpPort = Number(process.env.HTTP_PORT) || 3e3;
1831
+ this.httpServer.listen(httpPort, () => {
1832
+ console.log(`HTTP server running on http://localhost:${httpPort}`);
1833
+ });
1478
1834
  }
1479
1835
  async stopSideCar(uid) {
1480
1836
  console.log(ansiC2.green(ansiC2.inverse(`stopSideCar ${uid}`)));
@@ -1552,8 +1908,8 @@ import('${d}').then(async (x) => {
1552
1908
  this.mapping().forEach(async ([command, func]) => {
1553
1909
  globalThis[command] = func;
1554
1910
  });
1555
- if (!fs3.existsSync(`testeranto/reports/${this.name}`)) {
1556
- fs3.mkdirSync(`testeranto/reports/${this.name}`);
1911
+ if (!fs4.existsSync(`testeranto/reports/${this.name}`)) {
1912
+ fs4.mkdirSync(`testeranto/reports/${this.name}`);
1557
1913
  }
1558
1914
  const executablePath = "/opt/homebrew/bin/chromium";
1559
1915
  try {
@@ -1562,16 +1918,18 @@ import('${d}').then(async (x) => {
1562
1918
  waitForInitialPage: false,
1563
1919
  executablePath,
1564
1920
  headless: true,
1921
+ defaultViewport: null,
1922
+ // Disable default 800x600 viewport
1565
1923
  dumpio: false,
1566
1924
  devtools: false,
1567
1925
  args: [
1568
- "--disable-features=site-per-process",
1569
1926
  "--allow-file-access-from-files",
1570
1927
  "--allow-insecure-localhost",
1571
1928
  "--allow-running-insecure-content",
1572
1929
  "--auto-open-devtools-for-tabs",
1573
1930
  "--disable-dev-shm-usage",
1574
1931
  "--disable-extensions",
1932
+ "--disable-features=site-per-process",
1575
1933
  "--disable-gpu",
1576
1934
  "--disable-setuid-sandbox",
1577
1935
  "--disable-site-isolation-trials",
@@ -1581,6 +1939,7 @@ import('${d}').then(async (x) => {
1581
1939
  "--no-startup-window",
1582
1940
  "--reduce-security-for-testing",
1583
1941
  "--remote-allow-origins=*",
1942
+ "--start-maximized",
1584
1943
  "--unsafely-treat-insecure-origin-as-secure=*",
1585
1944
  `--remote-debugging-port=3234`
1586
1945
  // "--disable-features=IsolateOrigins,site-per-process",
@@ -1630,7 +1989,7 @@ import('${d}').then(async (x) => {
1630
1989
  ]
1631
1990
  ].forEach(
1632
1991
  async ([eps, launcher, runtime, watcher]) => {
1633
- const metafile = `./testeranto/bundles/${runtime}/${this.name}/metafile.json`;
1992
+ const metafile = `./testeranto/metafiles/${runtime}/${this.name}.json`;
1634
1993
  await pollForFile(metafile);
1635
1994
  Object.entries(eps).forEach(
1636
1995
  async ([inputFile, outputFile]) => {
@@ -1700,13 +2059,22 @@ import('${d}').then(async (x) => {
1700
2059
  this.nodeMetafileWatcher.close();
1701
2060
  this.webMetafileWatcher.close();
1702
2061
  this.importMetafileWatcher.close();
2062
+ Object.values(this.logStreams || {}).forEach((logs) => logs.closeAll());
2063
+ this.wss.close(() => {
2064
+ console.log("WebSocket server closed");
2065
+ });
2066
+ this.clients.forEach((client) => {
2067
+ client.terminate();
2068
+ });
2069
+ this.clients.clear();
2070
+ this.httpServer.close(() => {
2071
+ console.log("HTTP server closed");
2072
+ });
1703
2073
  this.checkForShutdown();
1704
2074
  }
1705
2075
  async metafileOutputs(platform) {
1706
2076
  const metafile = JSON.parse(
1707
- fs3.readFileSync(
1708
- `./testeranto/bundles/${platform}/${this.name}/metafile.json`
1709
- ).toString()
2077
+ fs4.readFileSync(`./testeranto/metafiles/${platform}/${this.name}.json`).toString()
1710
2078
  ).metafile;
1711
2079
  if (!metafile)
1712
2080
  return;
@@ -1717,7 +2085,7 @@ import('${d}').then(async (x) => {
1717
2085
  return false;
1718
2086
  }
1719
2087
  const addableFiles = Object.keys(outputs[k].inputs).filter((i) => {
1720
- if (!fs3.existsSync(i))
2088
+ if (!fs4.existsSync(i))
1721
2089
  return false;
1722
2090
  if (i.startsWith("node_modules"))
1723
2091
  return false;
@@ -1726,8 +2094,8 @@ import('${d}').then(async (x) => {
1726
2094
  return true;
1727
2095
  });
1728
2096
  const f = `${k.split(".").slice(0, -1).join(".")}/`;
1729
- if (!fs3.existsSync(f)) {
1730
- fs3.mkdirSync(f);
2097
+ if (!fs4.existsSync(f)) {
2098
+ fs4.mkdirSync(f);
1731
2099
  }
1732
2100
  const entrypoint = outputs[k].entryPoint;
1733
2101
  if (entrypoint) {
@@ -1746,6 +2114,121 @@ import('${d}').then(async (x) => {
1746
2114
  }
1747
2115
  });
1748
2116
  }
2117
+ requestHandler(req, res) {
2118
+ const parsedUrl = url.parse(req.url || "/");
2119
+ let pathname = parsedUrl.pathname || "/";
2120
+ if (pathname === "/") {
2121
+ pathname = "/index.html";
2122
+ }
2123
+ let filePath = pathname.substring(1);
2124
+ if (filePath.startsWith("reports/")) {
2125
+ filePath = `testeranto/${filePath}`;
2126
+ } else if (filePath.startsWith("metafiles/")) {
2127
+ filePath = `testeranto/${filePath}`;
2128
+ } else if (filePath === "projects.json") {
2129
+ filePath = `testeranto/${filePath}`;
2130
+ } else {
2131
+ const possiblePaths = [
2132
+ `dist/${filePath}`,
2133
+ `testeranto/dist/${filePath}`,
2134
+ `../dist/${filePath}`,
2135
+ `./${filePath}`
2136
+ ];
2137
+ let foundPath = null;
2138
+ for (const possiblePath of possiblePaths) {
2139
+ if (fs4.existsSync(possiblePath)) {
2140
+ foundPath = possiblePath;
2141
+ break;
2142
+ }
2143
+ }
2144
+ if (foundPath) {
2145
+ filePath = foundPath;
2146
+ } else {
2147
+ const indexPath = this.findIndexHtml();
2148
+ if (indexPath) {
2149
+ fs4.readFile(indexPath, (err, data) => {
2150
+ if (err) {
2151
+ res.writeHead(404, { "Content-Type": "text/plain" });
2152
+ res.end("404 Not Found");
2153
+ return;
2154
+ }
2155
+ res.writeHead(200, { "Content-Type": "text/html" });
2156
+ res.end(data);
2157
+ });
2158
+ return;
2159
+ } else {
2160
+ res.writeHead(404, { "Content-Type": "text/plain" });
2161
+ res.end("404 Not Found");
2162
+ return;
2163
+ }
2164
+ }
2165
+ }
2166
+ fs4.exists(filePath, (exists) => {
2167
+ if (!exists) {
2168
+ if (!pathname.includes(".") && pathname !== "/") {
2169
+ const indexPath = this.findIndexHtml();
2170
+ if (indexPath) {
2171
+ fs4.readFile(indexPath, (err, data) => {
2172
+ if (err) {
2173
+ res.writeHead(404, { "Content-Type": "text/plain" });
2174
+ res.end("404 Not Found");
2175
+ return;
2176
+ }
2177
+ res.writeHead(200, { "Content-Type": "text/html" });
2178
+ res.end(data);
2179
+ });
2180
+ return;
2181
+ } else {
2182
+ res.writeHead(200, { "Content-Type": "text/html" });
2183
+ res.end(`
2184
+ <html>
2185
+ <body>
2186
+ <h1>Testeranto is running</h1>
2187
+ <p>Frontend files are not built yet. Run 'npm run build' to build the frontend.</p>
2188
+ </body>
2189
+ </html>
2190
+ `);
2191
+ return;
2192
+ }
2193
+ }
2194
+ res.writeHead(404, { "Content-Type": "text/plain" });
2195
+ res.end("404 Not Found");
2196
+ return;
2197
+ }
2198
+ fs4.readFile(filePath, (err, data) => {
2199
+ if (err) {
2200
+ res.writeHead(500, { "Content-Type": "text/plain" });
2201
+ res.end("500 Internal Server Error");
2202
+ return;
2203
+ }
2204
+ const mimeType = mime.lookup(filePath) || "application/octet-stream";
2205
+ res.writeHead(200, { "Content-Type": mimeType });
2206
+ res.end(data);
2207
+ });
2208
+ });
2209
+ }
2210
+ findIndexHtml() {
2211
+ const possiblePaths = [
2212
+ "dist/index.html",
2213
+ "testeranto/dist/index.html",
2214
+ "../dist/index.html",
2215
+ "./index.html"
2216
+ ];
2217
+ for (const path5 of possiblePaths) {
2218
+ if (fs4.existsSync(path5)) {
2219
+ return path5;
2220
+ }
2221
+ }
2222
+ return null;
2223
+ }
2224
+ broadcast(message) {
2225
+ const data = typeof message === "string" ? message : JSON.stringify(message);
2226
+ this.clients.forEach((client) => {
2227
+ if (client.readyState === 1) {
2228
+ client.send(data);
2229
+ }
2230
+ });
2231
+ }
1749
2232
  checkQueue() {
1750
2233
  const x = this.queue.pop();
1751
2234
  if (!x) {