testeranto 0.200.0 → 0.202.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 (376) hide show
  1. package/README.md +26 -1
  2. package/bundle.js +3 -2
  3. package/design-editor/DesignEditor.tsx +40 -241
  4. package/dist/common/design-editor/DesignEditor.js +33 -198
  5. package/dist/common/src/App.js +158 -16
  6. package/dist/common/src/PM/PM_WithBuild.js +135 -0
  7. package/dist/common/src/PM/PM_WithEslintAndTsc.js +79 -67
  8. package/dist/common/src/PM/PM_WithGit.js +517 -0
  9. package/dist/common/src/PM/PM_WithProcesses.js +519 -0
  10. package/dist/common/src/PM/PM_WithWebSocket.js +535 -0
  11. package/dist/common/src/PM/base.js +62 -0
  12. package/dist/common/src/PM/main.js +533 -1676
  13. package/dist/common/src/PM/metafileOutputs.js +78 -0
  14. package/dist/common/src/PM/node.js +0 -6
  15. package/dist/common/src/PM/pure.js +0 -8
  16. package/dist/common/src/PM/types.js +1 -0
  17. package/dist/common/src/PM/utils.js +210 -0
  18. package/dist/common/src/PM/web.js +0 -6
  19. package/dist/common/src/ReportServer.js +0 -10
  20. package/dist/common/src/ReportServerLib.js +0 -140
  21. package/dist/common/src/components/pure/AppFrame.js +68 -56
  22. package/dist/common/src/components/pure/ArtifactTree.js +80 -0
  23. package/dist/common/src/components/pure/BuildLogViewer.js +106 -0
  24. package/dist/common/src/components/pure/DebugEnv.js +30 -0
  25. package/dist/common/src/components/pure/FileTree.js +34 -0
  26. package/dist/common/src/components/pure/FileTreeItem.js +29 -0
  27. package/dist/common/src/components/pure/GitHubLoginButton.js +18 -0
  28. package/dist/common/src/components/pure/GitIntegrationView.js +342 -0
  29. package/dist/common/src/components/pure/ProcessManager.js +1 -0
  30. package/dist/common/src/components/pure/ProcessManagerView.js +73 -74
  31. package/dist/common/src/components/pure/ProjectPageView.js +4 -117
  32. package/dist/common/src/components/pure/Settings.js +121 -0
  33. package/dist/common/src/components/pure/Settings.test.js +34 -0
  34. package/dist/common/src/components/pure/SignIn.js +22 -0
  35. package/dist/common/src/components/pure/SingleProcessView.js +166 -213
  36. package/dist/common/src/components/pure/TestPageView.js +113 -368
  37. package/dist/common/src/components/pure/TestPageView_utils.js +117 -0
  38. package/dist/common/src/components/pure/TestTable.js +33 -0
  39. package/dist/common/src/components/pure/ToastNotification.js +14 -0
  40. package/dist/common/src/components/pure/UserProfile.js +27 -0
  41. package/dist/common/src/components/stateful/AuthCallbackPage.js +51 -0
  42. package/dist/common/src/components/stateful/FeaturesReporter.js +2 -1
  43. package/dist/common/src/components/stateful/FileTree.js +58 -39
  44. package/dist/common/src/components/stateful/GitIntegrationPage.js +12 -0
  45. package/dist/common/src/components/stateful/ProcessManagerPage.js +13 -15
  46. package/dist/common/src/components/stateful/ProjectPage.js +6 -5
  47. package/dist/common/src/components/stateful/ProjectsPage.js +17 -19
  48. package/dist/common/src/components/stateful/SingleProcessPage.js +16 -26
  49. package/dist/common/src/components/stateful/TestPage.js +7 -5
  50. package/dist/common/src/hooks/useGitMode.js +21 -0
  51. package/dist/common/src/lib/BaseSuite.test/mock.js +15 -8
  52. package/dist/common/src/lib/BaseSuite.test/test.js +56 -80
  53. package/dist/common/src/lib/Tiposkripto.js +24 -0
  54. package/dist/common/src/lib/Tiposkripto.test/MockTiposkripto.js +154 -10
  55. package/dist/common/src/lib/Tiposkripto.test/Tiposkripto.adapter.js +6 -12
  56. package/dist/common/src/lib/Tiposkripto.test/Tiposkripto.implementation.js +63 -23
  57. package/dist/common/src/lib/Tiposkripto.test/Tiposkripto.specification.js +14 -6
  58. package/dist/common/src/lib/pmProxy.test/specification.js +167 -52
  59. package/dist/common/src/services/FileService.js +505 -0
  60. package/dist/common/src/services/GitHubAuthService.js +184 -0
  61. package/dist/common/src/testeranto.js +38 -97
  62. package/dist/common/src/utils/api.js +12 -8
  63. package/dist/common/src/utils/gitTest.js +27 -0
  64. package/dist/common/src/utils.js +23 -13
  65. package/dist/common/testeranto.config.js +21 -17
  66. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  67. package/dist/module/design-editor/DesignEditor.js +33 -199
  68. package/dist/module/src/App.js +121 -15
  69. package/dist/module/src/PM/PM_WithBuild.js +128 -0
  70. package/dist/module/src/PM/PM_WithEslintAndTsc.js +79 -67
  71. package/dist/module/src/PM/PM_WithGit.js +477 -0
  72. package/dist/module/src/PM/PM_WithProcesses.js +479 -0
  73. package/dist/module/src/PM/PM_WithWebSocket.js +528 -0
  74. package/dist/module/src/PM/base.js +62 -0
  75. package/dist/module/src/PM/main.js +533 -1676
  76. package/dist/module/src/PM/metafileOutputs.js +78 -0
  77. package/dist/module/src/PM/node.js +0 -6
  78. package/dist/module/src/PM/pure.js +0 -8
  79. package/dist/module/src/PM/types.js +1 -1
  80. package/dist/module/src/PM/utils.js +196 -0
  81. package/dist/module/src/PM/web.js +0 -6
  82. package/dist/module/src/ReportServer.js +1 -9
  83. package/dist/module/src/ReportServerLib.js +1 -134
  84. package/dist/module/src/components/pure/AppFrame.js +66 -24
  85. package/dist/module/src/components/pure/ArtifactTree.js +80 -0
  86. package/dist/module/src/components/pure/BuildLogViewer.js +99 -0
  87. package/dist/module/src/components/pure/DebugEnv.js +23 -0
  88. package/dist/module/src/components/pure/FileTree.js +27 -0
  89. package/dist/module/src/components/pure/FileTreeItem.js +22 -0
  90. package/dist/module/src/components/pure/GitHubLoginButton.js +11 -0
  91. package/dist/module/src/components/pure/GitIntegrationView.js +305 -0
  92. package/dist/module/src/components/pure/ProcessManager.js +1 -0
  93. package/dist/module/src/components/pure/ProcessManagerView.js +74 -75
  94. package/dist/module/src/components/pure/ProjectPageView.js +5 -118
  95. package/dist/module/src/components/pure/Settings.js +84 -0
  96. package/dist/module/src/components/pure/Settings.test.js +29 -0
  97. package/dist/module/src/components/pure/SignIn.js +15 -0
  98. package/dist/module/src/components/pure/SingleProcessView.js +130 -214
  99. package/dist/module/src/components/pure/TestPageView.js +97 -352
  100. package/dist/module/src/components/pure/TestPageView_utils.js +109 -0
  101. package/dist/module/src/components/pure/TestTable.js +26 -0
  102. package/dist/module/src/components/pure/ToastNotification.js +7 -0
  103. package/dist/module/src/components/pure/UserProfile.js +20 -0
  104. package/dist/module/src/components/stateful/AuthCallbackPage.js +14 -0
  105. package/dist/module/src/components/stateful/FeaturesReporter.js +2 -1
  106. package/dist/module/src/components/stateful/FileTree.js +59 -33
  107. package/dist/module/src/components/stateful/GitIntegrationPage.js +5 -0
  108. package/dist/module/src/components/stateful/ProcessManagerPage.js +13 -15
  109. package/dist/module/src/components/stateful/ProjectPage.js +6 -5
  110. package/dist/module/src/components/stateful/ProjectsPage.js +16 -18
  111. package/dist/module/src/components/stateful/SingleProcessPage.js +16 -26
  112. package/dist/module/src/components/stateful/TestPage.js +8 -6
  113. package/dist/module/src/hooks/useGitMode.js +17 -0
  114. package/dist/module/src/lib/BaseSuite.test/mock.js +15 -8
  115. package/dist/module/src/lib/BaseSuite.test/test.js +56 -80
  116. package/dist/module/src/lib/Tiposkripto.js +24 -0
  117. package/dist/module/src/lib/Tiposkripto.test/MockTiposkripto.js +154 -10
  118. package/dist/module/src/lib/Tiposkripto.test/Tiposkripto.adapter.js +6 -12
  119. package/dist/module/src/lib/Tiposkripto.test/Tiposkripto.implementation.js +63 -23
  120. package/dist/module/src/lib/Tiposkripto.test/Tiposkripto.specification.js +14 -6
  121. package/dist/module/src/lib/pmProxy.test/specification.js +167 -52
  122. package/dist/module/src/services/FileService.js +468 -0
  123. package/dist/module/src/services/GitHubAuthService.js +180 -0
  124. package/dist/module/src/testeranto.js +38 -97
  125. package/dist/module/src/utils/api.js +10 -7
  126. package/dist/module/src/utils/gitTest.js +23 -0
  127. package/dist/module/src/utils.js +21 -12
  128. package/dist/module/testeranto.config.js +21 -17
  129. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  130. package/dist/prebuild/App.css +94 -121
  131. package/dist/prebuild/App.js +44601 -11225
  132. package/dist/prebuild/testeranto.mjs +4106 -0
  133. package/dist/types/design-editor/DesignEditor.d.ts +1 -18
  134. package/dist/types/src/App.d.ts +18 -0
  135. package/dist/types/src/PM/PM_WithBuild.d.ts +13 -0
  136. package/dist/types/src/PM/PM_WithEslintAndTsc.d.ts +2 -4
  137. package/dist/types/src/PM/PM_WithGit.d.ts +27 -0
  138. package/dist/types/src/PM/PM_WithProcesses.d.ts +29 -0
  139. package/dist/types/src/PM/PM_WithWebSocket.d.ts +108 -0
  140. package/dist/types/src/PM/base.d.ts +1 -1
  141. package/dist/types/src/PM/index.d.ts +0 -2
  142. package/dist/types/src/PM/main.d.ts +6 -77
  143. package/dist/types/src/PM/metafileOutputs.d.ts +0 -0
  144. package/dist/types/src/PM/node.d.ts +0 -2
  145. package/dist/types/src/PM/pure.d.ts +0 -2
  146. package/dist/types/src/PM/types.d.ts +118 -0
  147. package/dist/types/src/PM/utils.d.ts +35 -0
  148. package/dist/types/src/PM/web.d.ts +0 -2
  149. package/dist/types/src/Pure.d.ts +6 -1
  150. package/dist/types/src/ReportServer.d.ts +0 -1
  151. package/dist/types/src/ReportServerLib.d.ts +0 -1
  152. package/dist/types/src/Types.d.ts +1 -0
  153. package/dist/types/src/components/pure/ArtifactTree.d.ts +0 -0
  154. package/dist/types/src/components/pure/BuildLogViewer.d.ts +7 -0
  155. package/dist/types/src/components/pure/DebugEnv.d.ts +2 -0
  156. package/dist/types/src/components/pure/FileTree.d.ts +6 -0
  157. package/dist/types/src/components/pure/FileTreeItem.d.ts +8 -0
  158. package/dist/types/src/components/pure/GitHubLoginButton.d.ts +8 -0
  159. package/dist/types/src/components/pure/GitIntegrationView.d.ts +1 -0
  160. package/dist/types/src/components/pure/Settings.d.ts +1 -0
  161. package/dist/types/src/components/pure/Settings.test.d.ts +1 -0
  162. package/dist/types/src/components/pure/SignIn.d.ts +1 -0
  163. package/dist/types/src/components/pure/SingleProcessView.d.ts +10 -0
  164. package/dist/types/src/components/pure/TestPageView.d.ts +2 -1
  165. package/dist/types/src/components/pure/TestPageView_utils.d.ts +23 -0
  166. package/dist/types/src/components/pure/TestTable.d.ts +16 -0
  167. package/dist/types/src/components/pure/ToastNotification.d.ts +6 -0
  168. package/dist/types/src/components/pure/UserProfile.d.ts +2 -0
  169. package/dist/types/src/components/stateful/AuthCallbackPage.d.ts +2 -0
  170. package/dist/types/src/components/stateful/FileTree.d.ts +0 -8
  171. package/dist/types/src/components/stateful/GitIntegrationPage.d.ts +1 -0
  172. package/dist/types/src/hooks/useGitMode.d.ts +7 -0
  173. package/dist/types/src/lib/BaseSuite.test/mock.d.ts +2 -2
  174. package/dist/types/src/lib/BaseSuite.test/test.d.ts +4 -3
  175. package/dist/types/src/lib/Tiposkripto.d.ts +2 -0
  176. package/dist/types/src/lib/Tiposkripto.test/MockTiposkripto.d.ts +3 -0
  177. package/dist/types/src/lib/Tiposkripto.test/Tiposkripto.types.d.ts +5 -0
  178. package/dist/types/src/lib/index.d.ts +6 -0
  179. package/dist/types/src/services/FileService.d.ts +34 -0
  180. package/dist/types/src/services/GitHubAuthService.d.ts +32 -0
  181. package/dist/types/src/utils/api.d.ts +1 -0
  182. package/dist/types/src/utils/gitTest.d.ts +11 -0
  183. package/dist/types/src/utils.d.ts +3 -3
  184. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  185. package/example/__pycache__/Calculator.cpython-313.pyc +0 -0
  186. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/README.md +187 -0
  187. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_given.go +163 -0
  188. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_suite.go +85 -0
  189. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_then.go +21 -0
  190. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/base_when.go +21 -0
  191. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/golingvu.go +554 -0
  192. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/test_adapter.go +33 -0
  193. package/example/vendor/github.com/adamwong246/testeranto/src/golingvu/types.go +72 -0
  194. package/example/vendor/modules.txt +5 -0
  195. package/git-integration-plan.md +395 -0
  196. package/package.json +26 -14
  197. package/src/App.tsx +169 -18
  198. package/src/PM/PM_WithBuild.ts +171 -0
  199. package/src/PM/PM_WithEslintAndTsc.ts +109 -86
  200. package/src/PM/PM_WithGit.ts +585 -0
  201. package/src/PM/PM_WithProcesses.ts +639 -0
  202. package/src/PM/PM_WithWebSocket.ts +631 -0
  203. package/src/PM/base.ts +63 -1
  204. package/src/PM/index.ts +8 -5
  205. package/src/PM/main.ts +672 -2050
  206. package/src/PM/metafileOutputs.ts +90 -0
  207. package/src/PM/node.ts +18 -18
  208. package/src/PM/pure.ts +5 -13
  209. package/src/PM/types.ts +145 -0
  210. package/src/PM/utils.ts +256 -0
  211. package/src/PM/web.ts +8 -8
  212. package/src/README.md +122 -0
  213. package/src/ReportServer.ts +0 -12
  214. package/src/ReportServerLib.ts +0 -147
  215. package/src/Types.ts +1 -0
  216. package/src/app.scss +14 -164
  217. package/src/components/pure/AppFrame.tsx +237 -71
  218. package/src/components/pure/ArtifactTree.tsx +82 -0
  219. package/src/components/pure/BuildLogViewer.tsx +168 -0
  220. package/src/components/pure/DebugEnv.tsx +30 -0
  221. package/src/components/pure/FileTree.tsx +58 -0
  222. package/src/components/pure/FileTreeItem.tsx +49 -0
  223. package/src/components/pure/GitHubLoginButton.tsx +31 -0
  224. package/src/components/pure/GitIntegrationView.tsx +443 -0
  225. package/src/components/pure/ProcessManager.tsx +6 -5
  226. package/src/components/pure/ProcessManagerView.tsx +162 -166
  227. package/src/components/pure/ProjectPageView.tsx +6 -224
  228. package/src/components/pure/Settings.test.tsx +34 -0
  229. package/src/components/pure/Settings.tsx +163 -0
  230. package/src/components/pure/SignIn.tsx +33 -0
  231. package/src/components/pure/SingleProcessView.tsx +231 -235
  232. package/src/components/pure/TestPageView.test/specification.ts +1 -0
  233. package/src/components/pure/TestPageView.tsx +317 -826
  234. package/src/components/pure/TestPageView_utils.tsx +285 -0
  235. package/src/components/pure/TestTable.tsx +88 -0
  236. package/src/components/pure/ToastNotification.tsx +19 -0
  237. package/src/components/pure/UserProfile.tsx +44 -0
  238. package/src/components/stateful/AuthCallbackPage.tsx +21 -0
  239. package/src/components/stateful/FeaturesReporter.tsx +3 -1
  240. package/src/components/stateful/FileTree.tsx +58 -58
  241. package/src/components/stateful/GitIntegrationPage.tsx +8 -0
  242. package/src/components/stateful/ProcessManagerPage.tsx +13 -17
  243. package/src/components/stateful/ProjectPage.tsx +6 -5
  244. package/src/components/stateful/ProjectsPage.tsx +17 -19
  245. package/src/components/stateful/SVGEditor/CircleForm.tsx +68 -0
  246. package/src/components/stateful/SVGEditor/GroupForm.tsx +56 -0
  247. package/src/components/stateful/SVGEditor/RectForm.tsx +74 -0
  248. package/src/components/stateful/SVGEditor/SVGAttributeField.tsx +29 -0
  249. package/src/components/stateful/SVGEditor/SVGAttributesEditor.tsx +73 -0
  250. package/src/components/stateful/SVGEditor/SVGEditorControls.tsx +45 -0
  251. package/src/components/stateful/SVGEditor/SVGElementForm.tsx +45 -0
  252. package/src/components/stateful/SVGEditor/SVGPreview.tsx +225 -0
  253. package/src/components/stateful/SVGEditor/SVGTextEditor.tsx +166 -0
  254. package/src/components/stateful/SVGEditor/SVGTree.tsx +159 -0
  255. package/src/components/stateful/SVGEditor/SVGTypes.ts +36 -0
  256. package/src/components/stateful/SVGEditor/svg.xsd.xml +3038 -0
  257. package/src/components/stateful/SVGEditorPage.tsx +503 -0
  258. package/src/components/stateful/SingleProcessPage.tsx +18 -31
  259. package/src/components/stateful/TestPage.tsx +25 -22
  260. package/src/golingvu/golingvu.go +38 -2
  261. package/src/hooks/useGitMode.ts +20 -0
  262. package/src/lib/BaseSuite.test/mock.ts +16 -10
  263. package/src/lib/BaseSuite.test/test.ts +144 -103
  264. package/src/lib/Tiposkripto.test/MockTiposkripto.ts +178 -14
  265. package/src/lib/Tiposkripto.test/Tiposkripto.adapter.ts +9 -14
  266. package/src/lib/Tiposkripto.test/Tiposkripto.implementation.ts +78 -38
  267. package/src/lib/Tiposkripto.test/Tiposkripto.specification.ts +51 -9
  268. package/src/lib/Tiposkripto.test/Tiposkripto.types.ts +5 -0
  269. package/src/lib/Tiposkripto.ts +27 -0
  270. package/src/lib/index.ts +7 -0
  271. package/src/lib/pmProxy.test/specification.ts +168 -166
  272. package/src/pitono/PM/__pycache__/python.cpython-313.pyc +0 -0
  273. package/src/pitono/__pycache__/Pitono.cpython-313.pyc +0 -0
  274. package/src/pitono/__pycache__/__init__.cpython-313.pyc +0 -0
  275. package/src/pitono/__pycache__/base_given.cpython-313.pyc +0 -0
  276. package/src/pitono/__pycache__/base_suite.cpython-313.pyc +0 -0
  277. package/src/pitono/__pycache__/base_then.cpython-313.pyc +0 -0
  278. package/src/pitono/__pycache__/base_when.cpython-313.pyc +0 -0
  279. package/src/pitono/__pycache__/core_generator.cpython-313.pyc +0 -0
  280. package/src/pitono/__pycache__/simple_adapter.cpython-313.pyc +0 -0
  281. package/src/pitono/__pycache__/types.cpython-313.pyc +0 -0
  282. package/src/services/FileService.ts +542 -0
  283. package/src/services/GitHubAuthService.ts +240 -0
  284. package/src/testeranto.ts +62 -140
  285. package/src/utils/api.ts +15 -13
  286. package/src/utils/gitTest.ts +29 -0
  287. package/src/utils.ts +21 -12
  288. package/testeranto/App.css +94 -121
  289. package/testeranto/App.js +44601 -11225
  290. package/testeranto/bundles/golang/core/Calculator.golingvu.go +53 -0
  291. package/testeranto/bundles/golang/core/Calculator.golingvu.golingvu.go +53 -0
  292. package/testeranto/bundles/node/core/chunk-RIM6RECA.mjs +1170 -0
  293. package/testeranto/bundles/node/core/chunk-VXVF7WFO.mjs +4321 -0
  294. package/testeranto/bundles/node/core/example/Calculator.test.mjs +503 -0
  295. package/testeranto/bundles/node/core/src/lib/BaseSuite.test/node.test.mjs +94 -1231
  296. package/testeranto/bundles/node/core/src/lib/TipoSkripto.test/TipoSkripto.mjs +574 -0
  297. package/testeranto/bundles/node/core/src/lib/pmProxy.test/index.mjs +482 -0
  298. package/testeranto/bundles/pure/core/chunk-XYOCRDEQ.mjs +1080 -0
  299. package/testeranto/bundles/pure/core/src/Pure.test.mjs +410 -0
  300. package/testeranto/bundles/pure/core/src/lib/BaseSuite.test/pure.test.mjs +93 -1146
  301. package/testeranto/bundles/python/core/Calculator.pitono.test.py +24 -0
  302. package/testeranto/bundles/python/core/test_example.py +24 -0
  303. package/testeranto/bundles/web/core/MPLUSRounded1c-Black-O75GP5JI.ttf +0 -0
  304. package/testeranto/bundles/web/core/MPLUSRounded1c-Bold-R524Q5BH.ttf +0 -0
  305. package/testeranto/bundles/web/core/MPLUSRounded1c-ExtraBold-C6GRMYVT.ttf +0 -0
  306. package/testeranto/bundles/web/core/MPLUSRounded1c-Light-WKN65Y2C.ttf +0 -0
  307. package/testeranto/bundles/web/core/MPLUSRounded1c-Medium-ZC4DWL7C.ttf +0 -0
  308. package/testeranto/bundles/web/core/MPLUSRounded1c-Regular-DT6EKZ3S.ttf +0 -0
  309. package/testeranto/bundles/web/core/MPLUSRounded1c-Thin-YWDNVG6M.ttf +0 -0
  310. package/testeranto/bundles/web/core/chunk-DFRN4SYZ.mjs +2297 -0
  311. package/testeranto/bundles/web/core/chunk-JMDLMADH.mjs +27996 -0
  312. package/testeranto/bundles/web/core/chunk-LQMU5NCG.mjs +3082 -0
  313. package/testeranto/bundles/web/core/chunk-Q5TONB2Z.mjs +6874 -0
  314. package/testeranto/bundles/web/core/src/components/pure/FeaturesReporterView.test/index.mjs +164 -0
  315. package/testeranto/bundles/web/core/src/components/pure/ModalContent.test/index.css +11697 -0
  316. package/testeranto/bundles/web/core/src/components/pure/ModalContent.test/index.mjs +336 -0
  317. package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.css +11697 -0
  318. package/testeranto/bundles/web/core/src/components/pure/ProjectPageView.test/index.mjs +517 -0
  319. package/testeranto/bundles/web/core/src/lib/BaseSuite.test/web.test.mjs +107 -1134
  320. package/testeranto/metafiles/golang/core.json +3 -3
  321. package/testeranto/metafiles/node/core.json +474 -31
  322. package/testeranto/metafiles/pure/core.json +144 -28
  323. package/testeranto/metafiles/python/core.json +11 -0
  324. package/testeranto/metafiles/web/core.json +15829 -45
  325. package/testeranto/reports/core/config.json +40 -0
  326. package/testeranto/reports/core/src/Pure.test/pure/exit.log +0 -0
  327. package/testeranto/reports/core/src/Pure.test/pure/lint_errors.txt +0 -0
  328. package/testeranto/reports/core/src/Pure.test/pure/prompt.txt +14 -0
  329. package/testeranto/reports/core/src/Pure.test/pure/type_errors.txt +73 -0
  330. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/debug.log +0 -0
  331. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/error.log +91 -0
  332. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/exit.log +1 -0
  333. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/info.log +2 -0
  334. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/tests.json +68 -0
  335. package/testeranto/reports/core/src/components/pure/FeaturesReporterView.test/index/web/warn.log +0 -0
  336. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/debug.log +0 -0
  337. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/error.log +30 -0
  338. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/exit.log +1 -0
  339. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/info.log +2 -0
  340. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/tests.json +88 -0
  341. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/warn.log +0 -0
  342. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -6
  343. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/prompt.txt +0 -11
  344. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/stdout.log +1 -0
  345. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/tests.json +1 -1
  346. package/testeranto/reports/core/src/lib/BaseSuite.test/node.test/node/type_errors.txt +35 -38
  347. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -2
  348. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +0 -10
  349. package/testeranto/reports/core/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +40 -38
  350. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/tests.json +1 -1
  351. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/exit.log +1 -0
  352. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/lint_errors.txt +0 -0
  353. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/message.txt +17 -0
  354. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/prompt.txt +17 -0
  355. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stderr.log +55 -0
  356. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/stdout.log +191 -0
  357. package/testeranto/reports/core/src/lib/TipoSkripto.test/TipoSkripto/node/type_errors.txt +71 -0
  358. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/exit.log +1 -0
  359. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/lint_errors.txt +15 -0
  360. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/message.txt +17 -0
  361. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/prompt.txt +17 -0
  362. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stderr.log +20 -0
  363. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/stdout.log +4 -0
  364. package/testeranto/reports/core/src/lib/pmProxy.test/index/node/type_errors.txt +49 -0
  365. package/testeranto/reports/core/summary.json +34 -6
  366. package/testeranto.config.ts +26 -20
  367. package/tsc.log +141 -91
  368. package/tsconfig.json +6 -2
  369. package/dist/prebuild/ReportServer.mjs +0 -227
  370. package/dist/prebuild/mothership/index.mjs +0 -22
  371. package/dist/types/design-editor/server.d.ts +0 -1
  372. package/testeranto/bundles/web/core/src/lib/BaseSuite.test/web.test.html +0 -15
  373. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +0 -2
  374. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/prompt.txt +0 -25
  375. package/testeranto/reports/core/src/lib/BaseSuite.test/web.test/web/type_errors.txt +0 -56
  376. /package/testeranto/reports/core/src/{lib/BaseSuite.test/web.test/web → Pure.test/pure}/message.txt +0 -0
@@ -1,4 +1,6 @@
1
1
  "use strict";
2
+ /* eslint-disable @typescript-eslint/no-unused-vars */
3
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
4
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
5
  if (k2 === undefined) k2 = k;
4
6
  var desc = Object.getOwnPropertyDescriptor(m, k);
@@ -34,49 +36,27 @@ var __importStar = (this && this.__importStar) || (function () {
34
36
  })();
35
37
  Object.defineProperty(exports, "__esModule", { value: true });
36
38
  exports.TestPageView = void 0;
37
- /* eslint-disable @typescript-eslint/no-unused-vars */
38
- /* eslint-disable @typescript-eslint/no-explicit-any */
39
39
  const react_1 = __importStar(require("react"));
40
- const react_bootstrap_1 = require("react-bootstrap");
41
40
  const react_router_dom_1 = require("react-router-dom");
41
+ const App_1 = require("../../App");
42
42
  const logFiles_1 = require("../../utils/logFiles");
43
- const react_bootstrap_2 = require("react-bootstrap");
43
+ const react_bootstrap_1 = require("react-bootstrap");
44
44
  const react_2 = require("@monaco-editor/react");
45
45
  const NavBar_1 = require("./NavBar");
46
- const TestStatusBadge_1 = require("../TestStatusBadge");
47
- const FileTree = ({ data, onSelect, level = 0, selectedSourcePath }) => {
48
- const [expanded, setExpanded] = (0, react_1.useState)({});
49
- const toggleExpand = (path) => {
50
- setExpanded((prev) => (Object.assign(Object.assign({}, prev), { [path]: !prev[path] })));
51
- };
52
- return (react_1.default.createElement("div", null, Object.entries(data).map(([name, node]) => {
53
- const path = Object.keys(expanded).find((k) => k.endsWith(name)) || name;
54
- const isExpanded = expanded[path];
55
- if (node.__isFile) {
56
- return (react_1.default.createElement(FileTreeItem, { key: name, name: name, isFile: true, level: level, isSelected: selectedSourcePath === path, onClick: () => onSelect(path, node.content) }));
57
- }
58
- else {
59
- return (react_1.default.createElement("div", { key: name },
60
- react_1.default.createElement("div", { className: "d-flex align-items-center py-1 text-dark", style: {
61
- paddingLeft: `${level * 16}px`,
62
- cursor: 'pointer',
63
- fontSize: '0.875rem'
64
- }, onClick: () => toggleExpand(path) },
65
- react_1.default.createElement("i", { className: `bi ${isExpanded ? 'bi-folder2-open' : 'bi-folder'} me-1` }),
66
- react_1.default.createElement("span", null, name)),
67
- isExpanded && (react_1.default.createElement(FileTree, { data: node, onSelect: onSelect, level: level + 1, selectedSourcePath: selectedSourcePath }))));
68
- }
69
- })));
70
- };
71
- const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsExist, errorCounts, logs, }) => {
46
+ const FileTreeItem_1 = require("./FileTreeItem");
47
+ const FileTree_1 = require("./FileTree");
48
+ const ToastNotification_1 = require("./ToastNotification");
49
+ const TestPageView_utils_1 = require("./TestPageView_utils");
50
+ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsExist, errorCounts, logs, isWebSocketConnected, }) => {
72
51
  const navigate = (0, react_router_dom_1.useNavigate)();
73
52
  const [showAiderModal, setShowAiderModal] = (0, react_1.useState)(false);
74
- const [messageOption, setMessageOption] = (0, react_1.useState)('default');
75
- const [customMessage, setCustomMessage] = (0, react_1.useState)(typeof logs['message.txt'] === 'string' ? logs['message.txt'] : 'make a script that prints hello');
53
+ const [messageOption, setMessageOption] = (0, react_1.useState)("default");
54
+ const [customMessage, setCustomMessage] = (0, react_1.useState)(typeof logs["message.txt"] === "string"
55
+ ? logs["message.txt"]
56
+ : "make a script that prints hello");
76
57
  const [showToast, setShowToast] = (0, react_1.useState)(false);
77
- const [toastMessage, setToastMessage] = (0, react_1.useState)('');
78
- const [toastVariant, setToastVariant] = (0, react_1.useState)('success');
79
- const [ws, setWs] = (0, react_1.useState)(null);
58
+ const [toastMessage, setToastMessage] = (0, react_1.useState)("");
59
+ const [toastVariant, setToastVariant] = (0, react_1.useState)("success");
80
60
  const [expandedSections, setExpandedSections] = (0, react_1.useState)({
81
61
  standardLogs: true,
82
62
  runtimeLogs: true,
@@ -97,11 +77,13 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
97
77
  // Collect all input files from metafile outputs related to this test
98
78
  Object.entries(metafile.outputs || {}).forEach(([outputPath, output]) => {
99
79
  // Normalize paths for comparison
100
- const normalizedTestName = testName.replace(/\\/g, '/');
101
- const normalizedEntryPoint = output.entryPoint ? output.entryPoint.replace(/\\/g, '/') : '';
80
+ const normalizedTestName = testName.replace(/\\/g, "/");
81
+ const normalizedEntryPoint = output.entryPoint
82
+ ? output.entryPoint.replace(/\\/g, "/")
83
+ : "";
102
84
  if (normalizedEntryPoint.includes(normalizedTestName)) {
103
85
  Object.keys(output.inputs || {}).forEach((inputPath) => {
104
- sourceFilesSet.add(inputPath.replace(/\\/g, '/'));
86
+ sourceFilesSet.add(inputPath.replace(/\\/g, "/"));
105
87
  });
106
88
  }
107
89
  });
@@ -109,151 +91,29 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
109
91
  const filteredErrors = (((_b = logs.build_logs) === null || _b === void 0 ? void 0 : _b.errors) || []).filter((err) => {
110
92
  if (!err.location || !err.location.file)
111
93
  return false;
112
- return sourceFilesSet.has(err.location.file.replace(/\\/g, '/'));
94
+ return sourceFilesSet.has(err.location.file.replace(/\\/g, "/"));
113
95
  });
114
96
  const filteredWarnings = (((_c = logs.build_logs) === null || _c === void 0 ? void 0 : _c.warnings) || []).filter((warn) => {
115
97
  if (!warn.location || !warn.location.file)
116
98
  return false;
117
- return sourceFilesSet.has(warn.location.file.replace(/\\/g, '/'));
99
+ return sourceFilesSet.has(warn.location.file.replace(/\\/g, "/"));
118
100
  });
119
101
  setBuildErrors({ errors: filteredErrors, warnings: filteredWarnings });
120
102
  }, [logs, testName]);
121
103
  // Update customMessage when logs change
122
104
  (0, react_1.useEffect)(() => {
123
- if (typeof logs['message.txt'] === 'string' && logs['message.txt'].trim()) {
124
- setCustomMessage(logs['message.txt']);
105
+ if (typeof logs["message.txt"] === "string" && logs["message.txt"].trim()) {
106
+ setCustomMessage(logs["message.txt"]);
125
107
  }
126
108
  }, [logs]);
127
- // Set up WebSocket connection
128
- (0, react_1.useEffect)(() => {
129
- const wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
130
- const wsUrl = `${wsProtocol}//${window.location.host}`;
131
- const websocket = new WebSocket(wsUrl);
132
- setWs(websocket);
133
- return () => {
134
- websocket.close();
135
- };
136
- }, []);
109
+ // Use the centralized WebSocket from App context
110
+ const wsContext = (0, App_1.useWebSocket)();
111
+ const ws = wsContext === null || wsContext === void 0 ? void 0 : wsContext.ws;
137
112
  const [activeTab, setActiveTab] = react_1.default.useState("tests.json");
138
113
  const [selectedFile, setSelectedFile] = (0, react_1.useState)(null);
139
114
  const [selectedSourcePath, setSelectedSourcePath] = (0, react_1.useState)(null);
140
115
  const [editorTheme, setEditorTheme] = (0, react_1.useState)("vs-dark");
141
- // Determine language from file extension
142
- const getLanguage = (path) => {
143
- var _a;
144
- const ext = (_a = path.split(".").pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
145
- switch (ext) {
146
- case "ts":
147
- return "typescript";
148
- case "tsx":
149
- return "typescript";
150
- case "js":
151
- return "javascript";
152
- case "json":
153
- return "json";
154
- case "md":
155
- return "markdown";
156
- default:
157
- return "plaintext";
158
- }
159
- };
160
- const renderTestResults = (testData) => {
161
- return (react_1.default.createElement("div", { className: "test-results" },
162
- testData.givens.map((given, i) => (react_1.default.createElement("div", { key: i, className: "mb-4 card" },
163
- react_1.default.createElement("div", { className: "card-header bg-primary text-white" },
164
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
165
- react_1.default.createElement("div", null,
166
- react_1.default.createElement("h4", null,
167
- "Given: ",
168
- given.name),
169
- given.features && given.features.length > 0 && (react_1.default.createElement("div", { className: "mt-1" },
170
- react_1.default.createElement("small", null, "Features:"),
171
- react_1.default.createElement("ul", { className: "list-unstyled" }, given.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer", className: "text-white" }, new URL(feature).hostname)) : (react_1.default.createElement("span", { className: "text-white" }, feature))))))))),
172
- given.artifacts && given.artifacts.length > 0 && (react_1.default.createElement("div", { className: "dropdown" },
173
- react_1.default.createElement("button", { className: "btn btn-sm btn-light dropdown-toggle", type: "button", "data-bs-toggle": "dropdown" },
174
- "Artifacts (",
175
- given.artifacts.length,
176
- ")"),
177
- react_1.default.createElement("ul", { className: "dropdown-menu dropdown-menu-end" }, given.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
178
- react_1.default.createElement("a", { className: "dropdown-item", href: `reports/${projectName}/${testName
179
- .split(".")
180
- .slice(0, -1)
181
- .join(".")}/${runtime}/${artifact}`, target: "_blank", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))),
182
- react_1.default.createElement("div", { className: "card-body" },
183
- given.whens.map((when, j) => (react_1.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error
184
- ? "bg-danger text-white"
185
- : "bg-success text-white"}` },
186
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-start" },
187
- react_1.default.createElement("div", null,
188
- react_1.default.createElement("div", null,
189
- react_1.default.createElement("strong", null, "When:"),
190
- " ",
191
- when.name,
192
- when.features && when.features.length > 0 && (react_1.default.createElement("div", { className: "mt-2" },
193
- react_1.default.createElement("small", null, "Features:"),
194
- react_1.default.createElement("ul", { className: "list-unstyled" }, when.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer" }, new URL(feature).hostname)) : (feature))))))),
195
- when.error && react_1.default.createElement("pre", { className: "mt-2" }, when.error))),
196
- when.artifacts && when.artifacts.length > 0 && (react_1.default.createElement("div", { className: "ms-3" },
197
- react_1.default.createElement("strong", null, "Artifacts:"),
198
- react_1.default.createElement("ul", { className: "list-unstyled" }, when.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
199
- react_1.default.createElement("a", { href: `reports/${projectName}/${testName
200
- .split(".")
201
- .slice(0, -1)
202
- .join(".")}/${runtime}/${artifact}`, target: "_blank", className: "text-white", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))))),
203
- given.thens.map((then, k) => (react_1.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error
204
- ? "bg-danger text-white"
205
- : "bg-success text-white"}` },
206
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-start" },
207
- react_1.default.createElement("div", null,
208
- react_1.default.createElement("div", null,
209
- react_1.default.createElement("strong", null, "Then:"),
210
- " ",
211
- then.name,
212
- then.features && then.features.length > 0 && (react_1.default.createElement("div", { className: "mt-2" },
213
- react_1.default.createElement("small", null, "Features:"),
214
- react_1.default.createElement("ul", { className: "list-unstyled" }, then.features.map((feature, fi) => (react_1.default.createElement("li", { key: fi }, feature.startsWith("http") ? (react_1.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer" }, new URL(feature).hostname)) : (feature))))))),
215
- then.error && react_1.default.createElement("pre", { className: "mt-2" }, then.error))),
216
- then.artifacts && then.artifacts.length > 0 && (react_1.default.createElement("div", { className: "ms-3" },
217
- react_1.default.createElement("strong", null, "Artifacts:"),
218
- react_1.default.createElement("ul", { className: "list-unstyled" }, then.artifacts.map((artifact, ai) => (react_1.default.createElement("li", { key: ai },
219
- react_1.default.createElement("a", { href: `reports/${projectName}/${testName
220
- .split(".")
221
- .slice(0, -1)
222
- .join(".")}/${runtime}/${artifact}`, target: "_blank", className: "text-white", rel: "noopener noreferrer" }, artifact.split("/").pop()))))))))))))))),
223
- (buildErrors.errors.length > 0 || buildErrors.warnings.length > 0) && (react_1.default.createElement("div", { className: "mb-4 card border-danger" },
224
- react_1.default.createElement("div", { className: "card-header bg-danger text-white" },
225
- react_1.default.createElement("h4", null, "Build Errors and Warnings")),
226
- react_1.default.createElement("div", { className: "card-body" },
227
- buildErrors.errors.length > 0 && (react_1.default.createElement(react_1.default.Fragment, null,
228
- react_1.default.createElement("h5", null, "Errors"),
229
- react_1.default.createElement("ul", null, buildErrors.errors.map((error, idx) => (react_1.default.createElement("li", { key: `build-error-${idx}` },
230
- react_1.default.createElement("strong", null, error.text),
231
- error.location && (react_1.default.createElement("div", null,
232
- "File: ",
233
- error.location.file,
234
- " Line: ",
235
- error.location.line,
236
- " Column: ",
237
- error.location.column)))))))),
238
- buildErrors.warnings.length > 0 && (react_1.default.createElement(react_1.default.Fragment, null,
239
- react_1.default.createElement("h5", null, "Warnings"),
240
- react_1.default.createElement("ul", null, buildErrors.warnings.map((warning, idx) => (react_1.default.createElement("li", { key: `build-warning-${idx}` },
241
- react_1.default.createElement("strong", null, warning.text),
242
- warning.location && (react_1.default.createElement("div", null,
243
- "File: ",
244
- warning.location.file,
245
- " Line: ",
246
- warning.location.line,
247
- " Column: ",
248
- warning.location.column)))))))))))));
249
- };
250
- console.log("Rendering TestPageView with logs:", {
251
- logKeys: Object.keys(logs),
252
- sourceFiles: logs.source_files ? Object.keys(logs.source_files) : null,
253
- selectedFile,
254
- activeTab,
255
- });
256
- return (react_1.default.createElement(react_bootstrap_2.Container, { fluid: true, className: "px-0" },
116
+ return (react_1.default.createElement(react_bootstrap_1.Container, { fluid: true, className: "px-0" },
257
117
  react_1.default.createElement(NavBar_1.NavBar, { title: decodedTestPath, backLink: `/projects/${projectName}`, navItems: [
258
118
  {
259
119
  label: "",
@@ -267,29 +127,34 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
267
127
  },
268
128
  className: "pe-none d-flex align-items-center gap-2",
269
129
  },
270
- ], rightContent: react_1.default.createElement(react_bootstrap_2.Button, { variant: "info", onClick: () => setShowAiderModal(true), className: "ms-2", title: "AI Assistant" }, "\uD83E\uDD16") }),
271
- react_1.default.createElement(react_bootstrap_2.Modal, { show: showAiderModal, onHide: () => setShowAiderModal(false), size: "lg", onShow: () => setMessageOption('default') },
272
- react_1.default.createElement(react_bootstrap_2.Modal.Header, { closeButton: true },
273
- react_1.default.createElement(react_bootstrap_2.Modal.Title, null, "Aider")),
274
- react_1.default.createElement(react_bootstrap_2.Modal.Body, null,
130
+ ], rightContent: react_1.default.createElement(react_bootstrap_1.Button, { variant: "info", onClick: () => setShowAiderModal(true), className: "ms-2 position-relative", title: isWebSocketConnected
131
+ ? "AI Assistant"
132
+ : "AI Assistant (WebSocket not connected)", disabled: !isWebSocketConnected },
133
+ "\uD83E\uDD16",
134
+ !isWebSocketConnected && (react_1.default.createElement("span", { className: "position-absolute top-0 start-100 translate-middle p-1 bg-danger border border-light rounded-circle", title: "WebSocket disconnected" },
135
+ react_1.default.createElement("span", { className: "visually-hidden" }, "WebSocket disconnected")))) }),
136
+ react_1.default.createElement(react_bootstrap_1.Modal, { show: showAiderModal, onHide: () => setShowAiderModal(false), size: "lg", onShow: () => setMessageOption("default") },
137
+ react_1.default.createElement(react_bootstrap_1.Modal.Header, { closeButton: true },
138
+ react_1.default.createElement(react_bootstrap_1.Modal.Title, null, "Aider")),
139
+ react_1.default.createElement(react_bootstrap_1.Modal.Body, null,
275
140
  react_1.default.createElement("div", { className: "mb-3" },
276
141
  react_1.default.createElement("div", { className: "form-check" },
277
- react_1.default.createElement("input", { className: "form-check-input", type: "radio", name: "messageOption", id: "defaultMessage", value: "default", checked: messageOption === 'default', onChange: () => setMessageOption('default') }),
142
+ react_1.default.createElement("input", { className: "form-check-input", type: "radio", name: "messageOption", id: "defaultMessage", value: "default", checked: messageOption === "default", onChange: () => setMessageOption("default") }),
278
143
  react_1.default.createElement("label", { className: "form-check-label", htmlFor: "defaultMessage" }, "Use default message.txt")),
279
144
  react_1.default.createElement("div", { className: "form-check" },
280
- react_1.default.createElement("input", { className: "form-check-input", type: "radio", name: "messageOption", id: "customMessage", value: "custom", checked: messageOption === 'custom', onChange: () => setMessageOption('custom') }),
145
+ react_1.default.createElement("input", { className: "form-check-input", type: "radio", name: "messageOption", id: "customMessage", value: "custom", checked: messageOption === "custom", onChange: () => setMessageOption("custom") }),
281
146
  react_1.default.createElement("label", { className: "form-check-label", htmlFor: "customMessage" }, "Use custom message")),
282
- messageOption === 'custom' && (react_1.default.createElement("div", { className: "mt-2" },
283
- react_1.default.createElement("textarea", { className: "form-control", rows: 8, placeholder: "Enter your custom message", value: customMessage, onChange: (e) => setCustomMessage(e.target.value), style: { minHeight: '500px' } }))))),
284
- react_1.default.createElement(react_bootstrap_2.Modal.Footer, null,
285
- react_1.default.createElement(react_bootstrap_2.Button, { variant: "primary", onClick: async () => {
147
+ messageOption === "custom" && (react_1.default.createElement("div", { className: "mt-2" },
148
+ react_1.default.createElement("textarea", { className: "form-control", rows: 8, placeholder: "Enter your custom message", value: customMessage, onChange: (e) => setCustomMessage(e.target.value), style: { minHeight: "500px" } }))))),
149
+ react_1.default.createElement(react_bootstrap_1.Modal.Footer, null,
150
+ react_1.default.createElement(react_bootstrap_1.Button, { variant: "primary", onClick: async () => {
286
151
  try {
287
152
  const promptPath = `testeranto/reports/${projectName}/${testName
288
153
  .split(".")
289
154
  .slice(0, -1)
290
155
  .join(".")}/${runtime}/prompt.txt`;
291
156
  let command = `aider --load ${promptPath}`;
292
- if (messageOption === 'default') {
157
+ if (messageOption === "default") {
293
158
  const messagePath = `testeranto/reports/${projectName}/${testName
294
159
  .split(".")
295
160
  .slice(0, -1)
@@ -299,60 +164,65 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
299
164
  else {
300
165
  command += ` --message "${customMessage}"`;
301
166
  }
302
- // Send command to server via WebSocket
303
- const ws = new WebSocket(`ws://${window.location.host}`);
304
- ws.onopen = () => {
167
+ // Send command to server via the centralized WebSocket
168
+ if (isWebSocketConnected && ws) {
305
169
  ws.send(JSON.stringify({
306
- type: 'executeCommand',
307
- command: command
170
+ type: "executeCommand",
171
+ command: command,
308
172
  }));
309
- setToastMessage('Command sent to server');
310
- setToastVariant('success');
173
+ setToastMessage("Command sent to server");
174
+ setToastVariant("success");
311
175
  setShowToast(true);
312
176
  setShowAiderModal(false);
313
- ws.close();
314
177
  // Navigate to process manager page
315
178
  setTimeout(() => {
316
- navigate('/processes');
179
+ navigate("/processes");
317
180
  }, 1000);
318
- };
319
- ws.onerror = (error) => {
320
- setToastMessage('Failed to connect to server');
321
- setToastVariant('danger');
181
+ }
182
+ else {
183
+ setToastMessage("WebSocket connection not ready");
184
+ setToastVariant("danger");
322
185
  setShowToast(true);
323
- };
186
+ }
324
187
  }
325
188
  catch (err) {
326
189
  console.error("WebSocket error:", err);
327
- setToastMessage('Error preparing command');
328
- setToastVariant('danger');
190
+ setToastMessage("Error preparing command");
191
+ setToastVariant("danger");
329
192
  setShowToast(true);
330
193
  }
331
194
  } }, "Run Aider Command"))),
332
- react_1.default.createElement(react_bootstrap_2.Row, { className: "g-0" },
333
- react_1.default.createElement(react_bootstrap_2.Col, { sm: 3, className: "border-end", style: {
195
+ react_1.default.createElement(react_bootstrap_1.Row, { className: "g-0" },
196
+ react_1.default.createElement(react_bootstrap_1.Col, { sm: 3, className: "border-end", style: {
334
197
  height: "calc(100vh - 56px)",
335
198
  overflow: "auto",
336
- backgroundColor: '#f8f9fa'
199
+ backgroundColor: "#f8f9fa",
337
200
  } },
338
201
  react_1.default.createElement("div", { className: "p-2 border-bottom" },
339
202
  react_1.default.createElement("small", { className: "fw-bold text-muted" }, "EXPLORER")),
340
203
  react_1.default.createElement("div", { className: "p-2" },
341
- react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: 'pointer', fontSize: '0.875rem' }, onClick: () => setExpandedSections(prev => (Object.assign(Object.assign({}, prev), { standardLogs: !prev.standardLogs }))) },
342
- react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.standardLogs ? 'down' : 'right'} me-1` }),
204
+ react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: "pointer", fontSize: "0.875rem" }, onClick: () => setExpandedSections((prev) => (Object.assign(Object.assign({}, prev), { standardLogs: !prev.standardLogs }))) },
205
+ react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.standardLogs ? "down" : "right"} me-1` }),
343
206
  react_1.default.createElement("span", null, "Standard Logs")),
344
207
  expandedSections.standardLogs && (react_1.default.createElement("div", null, Object.values(logFiles_1.STANDARD_LOGS).map((logName) => {
345
208
  const logContent = logs ? logs[logName] : undefined;
346
209
  const exists = logContent !== undefined &&
347
- ((typeof logContent === "string" && logContent.trim() !== "") ||
348
- (typeof logContent === "object" && logContent !== null && Object.keys(logContent).length > 0));
349
- return (react_1.default.createElement(FileTreeItem, { key: logName, name: logName, isFile: true, level: 1, isSelected: activeTab === logName, exists: exists, onClick: () => {
210
+ ((typeof logContent === "string" &&
211
+ logContent.trim() !== "") ||
212
+ (typeof logContent === "object" &&
213
+ logContent !== null &&
214
+ Object.keys(logContent).length > 0));
215
+ return (react_1.default.createElement(FileTreeItem_1.FileTreeItem, { key: logName, name: logName, isFile: true, level: 1, isSelected: activeTab === logName, exists: exists, onClick: () => {
350
216
  if (exists) {
351
217
  setActiveTab(logName);
352
218
  setSelectedFile({
353
219
  path: logName,
354
- content: typeof logContent === "string" ? logContent : JSON.stringify(logContent, null, 2),
355
- language: logName.endsWith(".json") ? "json" : "plaintext",
220
+ content: typeof logContent === "string"
221
+ ? logContent
222
+ : JSON.stringify(logContent, null, 2),
223
+ language: logName.endsWith(".json")
224
+ ? "json"
225
+ : "plaintext",
356
226
  });
357
227
  }
358
228
  else {
@@ -365,23 +235,32 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
365
235
  }
366
236
  } }));
367
237
  })))),
368
- runtime && logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime] &&
369
- Object.values(logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime]).length > 0 && (react_1.default.createElement("div", { className: "p-2" },
370
- react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: 'pointer', fontSize: '0.875rem' }, onClick: () => setExpandedSections(prev => (Object.assign(Object.assign({}, prev), { runtimeLogs: !prev.runtimeLogs }))) },
371
- react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.runtimeLogs ? 'down' : 'right'} me-1` }),
238
+ runtime &&
239
+ logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime] &&
240
+ Object.values(logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime])
241
+ .length > 0 && (react_1.default.createElement("div", { className: "p-2" },
242
+ react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: "pointer", fontSize: "0.875rem" }, onClick: () => setExpandedSections((prev) => (Object.assign(Object.assign({}, prev), { runtimeLogs: !prev.runtimeLogs }))) },
243
+ react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.runtimeLogs ? "down" : "right"} me-1` }),
372
244
  react_1.default.createElement("span", null, "Runtime Logs")),
373
245
  expandedSections.runtimeLogs && (react_1.default.createElement("div", null, Object.values(logFiles_1.RUNTIME_SPECIFIC_LOGS[runtime]).map((logName) => {
374
246
  const logContent = logs ? logs[logName] : undefined;
375
247
  const exists = logContent !== undefined &&
376
- ((typeof logContent === "string" && logContent.trim() !== "") ||
377
- (typeof logContent === "object" && logContent !== null && Object.keys(logContent).length > 0));
378
- return (react_1.default.createElement(FileTreeItem, { key: logName, name: logName, isFile: true, level: 1, isSelected: activeTab === logName, exists: exists, onClick: () => {
248
+ ((typeof logContent === "string" &&
249
+ logContent.trim() !== "") ||
250
+ (typeof logContent === "object" &&
251
+ logContent !== null &&
252
+ Object.keys(logContent).length > 0));
253
+ return (react_1.default.createElement(FileTreeItem_1.FileTreeItem, { key: logName, name: logName, isFile: true, level: 1, isSelected: activeTab === logName, exists: exists, onClick: () => {
379
254
  if (exists) {
380
255
  setActiveTab(logName);
381
256
  setSelectedFile({
382
257
  path: logName,
383
- content: typeof logContent === "string" ? logContent : JSON.stringify(logContent, null, 2),
384
- language: logName.endsWith(".json") ? "json" : "plaintext",
258
+ content: typeof logContent === "string"
259
+ ? logContent
260
+ : JSON.stringify(logContent, null, 2),
261
+ language: logName.endsWith(".json")
262
+ ? "json"
263
+ : "plaintext",
385
264
  });
386
265
  }
387
266
  else {
@@ -395,20 +274,20 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
395
274
  } }));
396
275
  }))))),
397
276
  logs && logs.source_files && (react_1.default.createElement("div", { className: "p-2" },
398
- react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: 'pointer', fontSize: '0.875rem' }, onClick: () => setExpandedSections(prev => (Object.assign(Object.assign({}, prev), { sourceFiles: !prev.sourceFiles }))) },
399
- react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.sourceFiles ? 'down' : 'right'} me-1` }),
277
+ react_1.default.createElement("div", { className: "d-flex align-items-center text-muted mb-1", style: { cursor: "pointer", fontSize: "0.875rem" }, onClick: () => setExpandedSections((prev) => (Object.assign(Object.assign({}, prev), { sourceFiles: !prev.sourceFiles }))) },
278
+ react_1.default.createElement("i", { className: `bi bi-chevron-${expandedSections.sourceFiles ? "down" : "right"} me-1` }),
400
279
  react_1.default.createElement("span", null, "Source Files")),
401
280
  expandedSections.sourceFiles && (react_1.default.createElement("div", null,
402
- react_1.default.createElement(FileTree, { data: logs.source_files, onSelect: (path, content) => {
281
+ react_1.default.createElement(FileTree_1.FileTree, { data: logs.source_files, onSelect: (path, content) => {
403
282
  setActiveTab("source_file");
404
283
  setSelectedSourcePath(path);
405
284
  setSelectedFile({
406
285
  path,
407
286
  content,
408
- language: getLanguage(path),
287
+ language: (0, TestPageView_utils_1.getLanguage)(path),
409
288
  });
410
289
  }, level: 1, selectedSourcePath: selectedSourcePath })))))),
411
- react_1.default.createElement(react_bootstrap_2.Col, { sm: 6, className: "border-end p-0", style: { height: "calc(100vh - 56px)", overflow: "hidden" } },
290
+ react_1.default.createElement(react_bootstrap_1.Col, { sm: 6, className: "border-end p-0", style: { height: "calc(100vh - 56px)", overflow: "hidden" } },
412
291
  react_1.default.createElement(react_2.Editor, { height: "100%", path: (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path) || "empty", defaultLanguage: (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.language) || "plaintext", value: (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.content) || "// Select a file to view its contents", theme: editorTheme, options: {
413
292
  minimap: { enabled: false },
414
293
  fontSize: 14,
@@ -416,13 +295,13 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
416
295
  automaticLayout: true,
417
296
  readOnly: !(selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.includes("source_files")),
418
297
  } })),
419
- react_1.default.createElement(react_bootstrap_2.Col, { sm: 3, className: "p-0 border-start", style: { height: "calc(100vh - 56px)", overflow: "auto" } },
298
+ react_1.default.createElement(react_bootstrap_1.Col, { sm: 3, className: "p-0 border-start", style: { height: "calc(100vh - 56px)", overflow: "auto" } },
420
299
  react_1.default.createElement("div", { className: "p-3" },
421
300
  (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.endsWith("tests.json")) && (react_1.default.createElement("div", { className: "test-results-preview" }, typeof selectedFile.content === "string"
422
- ? renderTestResults(JSON.parse(selectedFile.content))
423
- : renderTestResults(selectedFile.content))),
301
+ ? (0, TestPageView_utils_1.renderTestResults)(JSON.parse(selectedFile.content), buildErrors, projectName, testName, runtime)
302
+ : (0, TestPageView_utils_1.renderTestResults)(selectedFile.content, buildErrors, projectName, testName, runtime))),
424
303
  (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.match(/\.(png|jpg|jpeg|gif|svg)$/i)) && (react_1.default.createElement("div", { className: "text-center" },
425
- react_1.default.createElement("img", { src: selectedFile.content, alt: selectedFile.path, className: "img-fluid", style: { maxHeight: '300px' } }),
304
+ react_1.default.createElement("img", { src: selectedFile.content, alt: selectedFile.path, className: "img-fluid", style: { maxHeight: "300px" } }),
426
305
  react_1.default.createElement("div", { className: "mt-2" },
427
306
  react_1.default.createElement("a", { href: selectedFile.content, target: "_blank", rel: "noopener noreferrer", className: "btn btn-sm btn-outline-primary" }, "Open Full Size")))),
428
307
  (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.endsWith("build.json")) && (react_1.default.createElement("div", null,
@@ -437,7 +316,7 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
437
316
  "Errors (",
438
317
  buildData.errors.length,
439
318
  ")"),
440
- react_1.default.createElement("ul", { className: "list-unstyled" }, buildData.errors.map((error, index) => (react_1.default.createElement("li", { key: index, className: "mb-2 p-2 bg-light rounded" },
319
+ react_1.default.createElement("ul", { className: "list-unstyled" }, buildData.errors.map((error, index) => (react_1.default.createElement("li", { key: index, className: "mb-2 p-2 rounded" },
441
320
  react_1.default.createElement("div", { className: "text-danger fw-bold" }, error.text),
442
321
  error.location && (react_1.default.createElement("div", { className: "small text-muted" },
443
322
  "File: ",
@@ -454,7 +333,7 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
454
333
  "Warnings (",
455
334
  buildData.warnings.length,
456
335
  ")"),
457
- react_1.default.createElement("ul", { className: "list-unstyled" }, buildData.warnings.map((warning, index) => (react_1.default.createElement("li", { key: index, className: "mb-2 p-2 bg-light rounded" },
336
+ react_1.default.createElement("ul", { className: "list-unstyled" }, buildData.warnings.map((warning, index) => (react_1.default.createElement("li", { key: index, className: "mb-2 p-2 rounded" },
458
337
  react_1.default.createElement("div", { className: "text-warning fw-bold" }, warning.text),
459
338
  warning.location && (react_1.default.createElement("div", { className: "small text-muted" },
460
339
  "File: ",
@@ -463,11 +342,13 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
463
342
  warning.location.line,
464
343
  "Column: ",
465
344
  warning.location.column)),
466
- warning.notes && warning.notes.length > 0 && (react_1.default.createElement("div", { className: "small" },
345
+ warning.notes &&
346
+ warning.notes.length > 0 && (react_1.default.createElement("div", { className: "small" },
467
347
  "Notes:",
468
348
  react_1.default.createElement("ul", null, warning.notes.map((note, noteIndex) => (react_1.default.createElement("li", { key: noteIndex }, note.text)))))))))))),
469
349
  (!buildData.errors || buildData.errors.length === 0) &&
470
- (!buildData.warnings || buildData.warnings.length === 0) && (react_1.default.createElement("div", { className: "alert alert-success" }, "No build errors or warnings"))));
350
+ (!buildData.warnings ||
351
+ buildData.warnings.length === 0) && (react_1.default.createElement("div", { className: "alert alert-success" }, "No build errors or warnings"))));
471
352
  }
472
353
  catch (e) {
473
354
  return (react_1.default.createElement("div", { className: "alert alert-danger" },
@@ -477,152 +358,16 @@ const TestPageView = ({ projectName, testName, decodedTestPath, runtime, testsEx
477
358
  })())),
478
359
  (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.endsWith(".json")) &&
479
360
  !selectedFile.path.endsWith("tests.json") &&
480
- !selectedFile.path.endsWith("build.json") && (react_1.default.createElement("pre", { className: "bg-light p-2 small" },
361
+ !selectedFile.path.endsWith("build.json") && (react_1.default.createElement("pre", { className: " p-2 small" },
481
362
  react_1.default.createElement("code", null, selectedFile.content))),
482
363
  (selectedFile === null || selectedFile === void 0 ? void 0 : selectedFile.path.includes("source_files")) && (react_1.default.createElement("div", null,
483
364
  react_1.default.createElement("div", { className: "mb-2 small text-muted" },
484
365
  react_1.default.createElement("i", { className: "bi bi-file-earmark-text me-1" }),
485
- selectedFile.path.split('/').pop()),
486
- react_1.default.createElement(react_bootstrap_2.Button, { variant: "outline-primary", size: "sm", className: "mb-2", onClick: () => {
366
+ selectedFile.path.split("/").pop()),
367
+ react_1.default.createElement(react_bootstrap_1.Button, { variant: "outline-primary", size: "sm", className: "mb-2", onClick: () => {
487
368
  // TODO: Add save functionality
488
369
  alert("Save functionality will be implemented here");
489
370
  } }, "Save Changes")))))),
490
- react_1.default.createElement(react_bootstrap_1.ToastContainer, { position: "top-end", className: "p-3" },
491
- react_1.default.createElement(react_bootstrap_1.Toast, { show: showToast, onClose: () => setShowToast(false), delay: 3000, autohide: true, bg: toastVariant },
492
- react_1.default.createElement(react_bootstrap_1.Toast.Header, null,
493
- react_1.default.createElement("strong", { className: "me-auto" }, "Command Status")),
494
- react_1.default.createElement(react_bootstrap_1.Toast.Body, { className: "text-white" }, toastMessage)))));
371
+ react_1.default.createElement(ToastNotification_1.ToastNotification, { showToast: showToast, setShowToast: setShowToast, toastVariant: toastVariant, toastMessage: toastMessage })));
495
372
  };
496
373
  exports.TestPageView = TestPageView;
497
- // Simple file tree item component
498
- const FileTreeItem = ({ name, isFile, level, isSelected, exists = true, onClick }) => {
499
- const displayName = name
500
- .replace(".json", "")
501
- .replace(".txt", "")
502
- .replace(".log", "")
503
- .replace(/_/g, " ")
504
- .replace(/^std/, "Standard ")
505
- .replace(/^exit/, "Exit Code")
506
- .split('/').pop();
507
- return (react_1.default.createElement("div", { className: `d-flex align-items-center py-1 ${isSelected ? 'text-primary fw-bold' : exists ? 'text-dark' : 'text-muted'}`, style: {
508
- paddingLeft: `${level * 16}px`,
509
- cursor: exists ? 'pointer' : 'not-allowed',
510
- fontSize: '0.875rem',
511
- opacity: exists ? 1 : 0.6
512
- }, onClick: exists ? onClick : undefined, title: exists ? undefined : "File not found or empty" },
513
- react_1.default.createElement("i", { className: `bi ${isFile ? (exists ? 'bi-file-earmark-text' : 'bi-file-earmark') : 'bi-folder'} me-1` }),
514
- react_1.default.createElement("span", null, displayName),
515
- !exists && (react_1.default.createElement("i", { className: "bi bi-question-circle ms-1", title: "File not found or empty" }))));
516
- };
517
- const ArtifactTree = ({ treeData, projectName, testName, runtime, onSelect, level = 0, basePath = '' }) => {
518
- const [expanded, setExpanded] = (0, react_1.useState)({});
519
- const toggleExpand = (path) => {
520
- setExpanded(prev => (Object.assign(Object.assign({}, prev), { [path]: !prev[path] })));
521
- };
522
- return (react_1.default.createElement("ul", { className: "list-unstyled", style: { paddingLeft: `${level * 16}px` } }, Object.entries(treeData).map(([name, node]) => {
523
- const fullPath = basePath ? `${basePath}/${name}` : name;
524
- const isExpanded = expanded[fullPath];
525
- if (node.__isFile) {
526
- return (react_1.default.createElement("li", { key: fullPath, className: "py-1" },
527
- react_1.default.createElement("a", { href: `reports/${projectName}/${testName
528
- .split('.')
529
- .slice(0, -1)
530
- .join('.')}/${runtime}/${node.path}`, target: "_blank", rel: "noopener noreferrer", className: "text-decoration-none", onClick: (e) => {
531
- e.preventDefault();
532
- onSelect(node.path);
533
- } },
534
- react_1.default.createElement("i", { className: "bi bi-file-earmark-text me-2" }),
535
- name)));
536
- }
537
- else {
538
- return (react_1.default.createElement("li", { key: fullPath, className: "py-1" },
539
- react_1.default.createElement("div", { className: "d-flex align-items-center" },
540
- react_1.default.createElement("button", { className: "btn btn-link text-start p-0 text-decoration-none me-1", onClick: () => toggleExpand(fullPath) },
541
- react_1.default.createElement("i", { className: `bi ${isExpanded ? 'bi-folder2-open' : 'bi-folder'} me-2` }),
542
- name)),
543
- isExpanded && (react_1.default.createElement(ArtifactTree, { treeData: node, projectName: projectName, testName: testName, runtime: runtime, onSelect: onSelect, level: level + 1, basePath: fullPath }))));
544
- }
545
- })));
546
- };
547
- const buildArtifactTree = (testData) => {
548
- var _a;
549
- const artifactPaths = new Set();
550
- (_a = testData.givens) === null || _a === void 0 ? void 0 : _a.forEach((given) => {
551
- var _a, _b, _c;
552
- (_a = given.artifacts) === null || _a === void 0 ? void 0 : _a.forEach((artifact) => artifactPaths.add(artifact));
553
- (_b = given.whens) === null || _b === void 0 ? void 0 : _b.forEach((when) => { var _a; return (_a = when.artifacts) === null || _a === void 0 ? void 0 : _a.forEach((artifact) => artifactPaths.add(artifact)); });
554
- (_c = given.thens) === null || _c === void 0 ? void 0 : _c.forEach((then) => { var _a; return (_a = then.artifacts) === null || _a === void 0 ? void 0 : _a.forEach((artifact) => artifactPaths.add(artifact)); });
555
- });
556
- const sortedArtifacts = Array.from(artifactPaths).sort();
557
- return sortedArtifacts.reduce((tree, artifactPath) => {
558
- const parts = artifactPath.split('/');
559
- let currentLevel = tree;
560
- parts.forEach((part, i) => {
561
- if (!currentLevel[part]) {
562
- currentLevel[part] = i === parts.length - 1
563
- ? { __isFile: true, path: artifactPath }
564
- : {};
565
- }
566
- currentLevel = currentLevel[part];
567
- });
568
- return tree;
569
- }, {});
570
- };
571
- const LogNavItem = ({ logName, logContent, activeTab, setActiveTab, setSelectedFile, errorCounts, decodedTestPath, testsExist, }) => {
572
- const displayName = logName
573
- .replace(".json", "")
574
- .replace(".txt", "")
575
- .replace(".log", "")
576
- .replace(/_/g, " ")
577
- .replace(/^std/, "Standard ")
578
- .replace(/^exit/, "Exit Code");
579
- const logValue = typeof logContent === "string" ? logContent.trim() : "";
580
- let statusIndicator = null;
581
- if (logName === logFiles_1.STANDARD_LOGS.TYPE_ERRORS &&
582
- (errorCounts.typeErrors > 0 || (logValue && logValue !== "0"))) {
583
- statusIndicator = (react_1.default.createElement("span", { className: "ms-1" },
584
- "\u274C ",
585
- errorCounts.typeErrors || (logValue ? 1 : 0)));
586
- }
587
- else if (logName === logFiles_1.STANDARD_LOGS.LINT_ERRORS &&
588
- (errorCounts.staticErrors > 0 || (logValue && logValue !== "0"))) {
589
- statusIndicator = (react_1.default.createElement("span", { className: "ms-1" },
590
- "\u274C ",
591
- errorCounts.staticErrors || (logValue ? 1 : 0)));
592
- }
593
- else if (logName === logFiles_1.RUNTIME_SPECIFIC_LOGS.node.STDERR &&
594
- (errorCounts.runTimeErrors > 0 || (logValue && logValue !== "0"))) {
595
- statusIndicator = (react_1.default.createElement("span", { className: "ms-1" },
596
- "\u274C ",
597
- errorCounts.runTimeErrors || (logValue ? 1 : 0)));
598
- }
599
- else if (logName === logFiles_1.STANDARD_LOGS.EXIT && logValue !== "0") {
600
- statusIndicator = react_1.default.createElement("span", { className: "ms-1" },
601
- "\u26A0\uFE0F ",
602
- logValue);
603
- }
604
- else if (logName === logFiles_1.STANDARD_LOGS.TESTS && logValue) {
605
- statusIndicator = (react_1.default.createElement("div", { className: "ms-1" },
606
- react_1.default.createElement(TestStatusBadge_1.TestStatusBadge, { testName: decodedTestPath, testsExist: testsExist, runTimeErrors: errorCounts.runTimeErrors, typeErrors: errorCounts.typeErrors, staticErrors: errorCounts.staticErrors, variant: "compact", className: "mt-1" })));
607
- }
608
- return (react_1.default.createElement(react_bootstrap_2.Nav.Item, { key: logName },
609
- react_1.default.createElement(react_bootstrap_2.Nav.Link, { eventKey: logName, active: activeTab === logName, onClick: () => {
610
- setActiveTab(logName);
611
- setSelectedFile({
612
- path: logName,
613
- content: typeof logContent === "string"
614
- ? logContent
615
- : JSON.stringify(logContent, null, 2),
616
- language: logName.endsWith(".json")
617
- ? "json"
618
- : logName.endsWith(".txt")
619
- ? "plaintext"
620
- : logName.endsWith(".log")
621
- ? "log"
622
- : "plaintext",
623
- });
624
- }, className: "d-flex flex-column align-items-start" },
625
- react_1.default.createElement("div", { className: "d-flex justify-content-between w-100" },
626
- react_1.default.createElement("span", { className: "text-capitalize" }, displayName),
627
- statusIndicator))));
628
- };