testeranto 0.219.13 → 0.219.15

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 (237) hide show
  1. package/package.json +1 -1
  2. package/src/testeranto.ts +1 -1
  3. package/dist/common/allTestsUtils.js +0 -17
  4. package/dist/common/package.json +0 -3
  5. package/dist/common/scripts/build-example.js +0 -105
  6. package/dist/common/src/Init.js +0 -38
  7. package/dist/common/src/Types.js +0 -63
  8. package/dist/common/src/esbuildConfigs/consoleDetectorPlugin.js +0 -38
  9. package/dist/common/src/esbuildConfigs/eslint-formatter-testeranto.js +0 -21
  10. package/dist/common/src/esbuildConfigs/featuresPlugin.js +0 -39
  11. package/dist/common/src/esbuildConfigs/index.js +0 -22
  12. package/dist/common/src/esbuildConfigs/inputFilesPlugin.js +0 -30
  13. package/dist/common/src/esbuildConfigs/nativeImportDetectorPlugin.js +0 -24
  14. package/dist/common/src/esbuildConfigs/rebuildPlugin.js +0 -19
  15. package/dist/common/src/init-docs.js +0 -9
  16. package/dist/common/src/lib/tiposkripto/BaseGiven.js +0 -96
  17. package/dist/common/src/lib/tiposkripto/BaseSuite.js +0 -134
  18. package/dist/common/src/lib/tiposkripto/BaseThen.js +0 -65
  19. package/dist/common/src/lib/tiposkripto/BaseTiposkripto.js +0 -193
  20. package/dist/common/src/lib/tiposkripto/BaseWhen.js +0 -46
  21. package/dist/common/src/lib/tiposkripto/CoreTypes.js +0 -2
  22. package/dist/common/src/lib/tiposkripto/Node.js +0 -40
  23. package/dist/common/src/lib/tiposkripto/Tiposkripto.js +0 -49
  24. package/dist/common/src/lib/tiposkripto/Types.js +0 -2
  25. package/dist/common/src/lib/tiposkripto/Web.js +0 -70
  26. package/dist/common/src/lib/tiposkripto/abstractBase.test/MockGiven.js +0 -22
  27. package/dist/common/src/lib/tiposkripto/abstractBase.test/MockThen.js +0 -16
  28. package/dist/common/src/lib/tiposkripto/abstractBase.test/MockWhen.js +0 -18
  29. package/dist/common/src/lib/tiposkripto/abstractBase.test/adapter.js +0 -24
  30. package/dist/common/src/lib/tiposkripto/abstractBase.test/implementation.js +0 -38
  31. package/dist/common/src/lib/tiposkripto/abstractBase.test/index.js +0 -17
  32. package/dist/common/src/lib/tiposkripto/abstractBase.test/specification.js +0 -19
  33. package/dist/common/src/lib/tiposkripto/abstractBase.test/types.js +0 -2
  34. package/dist/common/src/lib/tiposkripto/index.js +0 -29
  35. package/dist/common/src/runtimes.js +0 -4
  36. package/dist/common/src/server/aider/configParser.js +0 -124
  37. package/dist/common/src/server/aider/docker.js +0 -30
  38. package/dist/common/src/server/getRunnables.js +0 -36
  39. package/dist/common/src/server/htmlTemplate.js +0 -44
  40. package/dist/common/src/server/nodeVersion.js +0 -5
  41. package/dist/common/src/server/runtimes/common.js +0 -136
  42. package/dist/common/src/server/runtimes/golang/docker.js +0 -62
  43. package/dist/common/src/server/runtimes/java/docker.js +0 -46
  44. package/dist/common/src/server/runtimes/node/docker.js +0 -42
  45. package/dist/common/src/server/runtimes/node/esbuild.js +0 -40
  46. package/dist/common/src/server/runtimes/node/node.js +0 -75
  47. package/dist/common/src/server/runtimes/python/docker.js +0 -31
  48. package/dist/common/src/server/runtimes/ruby/docker.js +0 -34
  49. package/dist/common/src/server/runtimes/rust/docker.js +0 -35
  50. package/dist/common/src/server/runtimes/web/docker.js +0 -42
  51. package/dist/common/src/server/runtimes/web/esbuild.js +0 -29
  52. package/dist/common/src/server/runtimes/web/hoist.js +0 -16
  53. package/dist/common/src/server/runtimes/web/web.js +0 -157
  54. package/dist/common/src/server/serverClasees/Server.js +0 -47
  55. package/dist/common/src/server/serverClasees/Server_Base.js +0 -18
  56. package/dist/common/src/server/serverClasees/Server_Docker.js +0 -904
  57. package/dist/common/src/server/serverClasees/Server_FS.js +0 -119
  58. package/dist/common/src/server/serverClasees/Server_HTTP.js +0 -189
  59. package/dist/common/src/server/serverClasees/Server_WS.js +0 -262
  60. package/dist/common/src/server/serverManagers/DockerManager.js +0 -28
  61. package/dist/common/src/server/serverManagers/HttpManager.js +0 -114
  62. package/dist/common/src/server/serverManagers/WsManager.js +0 -230
  63. package/dist/common/src/server/serverManagers/fs.js +0 -32
  64. package/dist/common/src/server/serverManagers/tcp.js +0 -51
  65. package/dist/common/src/server/types.js +0 -2
  66. package/dist/common/src/testeranto.js +0 -75
  67. package/dist/common/src/vscode/TerminalManager.js +0 -129
  68. package/dist/common/src/vscode/TestTreeItem.js +0 -77
  69. package/dist/common/src/vscode/extension.js +0 -185
  70. package/dist/common/src/vscode/providers/FeaturesTreeDataProvider.js +0 -445
  71. package/dist/common/src/vscode/providers/FileTreeDataProvider.js +0 -190
  72. package/dist/common/src/vscode/providers/ProcessesTreeDataProvider.js +0 -270
  73. package/dist/common/src/vscode/providers/ResultsTreeDataProvider.js +0 -87
  74. package/dist/common/src/vscode/providers/TestTreeDataProvider.js +0 -309
  75. package/dist/common/src/vscode/types.js +0 -9
  76. package/dist/common/testeranto/runtimes/node/node.js +0 -7
  77. package/dist/common/testeranto/runtimes/web/web.js +0 -6
  78. package/dist/common/testeranto/testeranto.js +0 -70
  79. package/dist/common/tsconfig.common.tsbuildinfo +0 -1
  80. package/dist/module/allTestsUtils.js +0 -13
  81. package/dist/module/package.json +0 -3
  82. package/dist/module/scripts/build-example.js +0 -100
  83. package/dist/module/src/Init.js +0 -33
  84. package/dist/module/src/Types.js +0 -62
  85. package/dist/module/src/esbuildConfigs/consoleDetectorPlugin.js +0 -32
  86. package/dist/module/src/esbuildConfigs/eslint-formatter-testeranto.js +0 -18
  87. package/dist/module/src/esbuildConfigs/featuresPlugin.js +0 -34
  88. package/dist/module/src/esbuildConfigs/index.js +0 -20
  89. package/dist/module/src/esbuildConfigs/inputFilesPlugin.js +0 -25
  90. package/dist/module/src/esbuildConfigs/nativeImportDetectorPlugin.js +0 -21
  91. package/dist/module/src/esbuildConfigs/rebuildPlugin.js +0 -14
  92. package/dist/module/src/init-docs.js +0 -4
  93. package/dist/module/src/lib/tiposkripto/BaseGiven.js +0 -92
  94. package/dist/module/src/lib/tiposkripto/BaseSuite.js +0 -130
  95. package/dist/module/src/lib/tiposkripto/BaseThen.js +0 -61
  96. package/dist/module/src/lib/tiposkripto/BaseTiposkripto.js +0 -190
  97. package/dist/module/src/lib/tiposkripto/BaseWhen.js +0 -42
  98. package/dist/module/src/lib/tiposkripto/CoreTypes.js +0 -1
  99. package/dist/module/src/lib/tiposkripto/Node.js +0 -33
  100. package/dist/module/src/lib/tiposkripto/Tiposkripto.js +0 -14
  101. package/dist/module/src/lib/tiposkripto/Types.js +0 -1
  102. package/dist/module/src/lib/tiposkripto/Web.js +0 -63
  103. package/dist/module/src/lib/tiposkripto/abstractBase.test/MockGiven.js +0 -18
  104. package/dist/module/src/lib/tiposkripto/abstractBase.test/MockThen.js +0 -12
  105. package/dist/module/src/lib/tiposkripto/abstractBase.test/MockWhen.js +0 -14
  106. package/dist/module/src/lib/tiposkripto/abstractBase.test/adapter.js +0 -21
  107. package/dist/module/src/lib/tiposkripto/abstractBase.test/implementation.js +0 -35
  108. package/dist/module/src/lib/tiposkripto/abstractBase.test/index.js +0 -12
  109. package/dist/module/src/lib/tiposkripto/abstractBase.test/specification.js +0 -15
  110. package/dist/module/src/lib/tiposkripto/abstractBase.test/types.js +0 -1
  111. package/dist/module/src/lib/tiposkripto/index.js +0 -24
  112. package/dist/module/src/runtimes.js +0 -1
  113. package/dist/module/src/server/aider/configParser.js +0 -116
  114. package/dist/module/src/server/aider/docker.js +0 -28
  115. package/dist/module/src/server/getRunnables.js +0 -29
  116. package/dist/module/src/server/htmlTemplate.js +0 -40
  117. package/dist/module/src/server/nodeVersion.js +0 -2
  118. package/dist/module/src/server/runtimes/common.js +0 -127
  119. package/dist/module/src/server/runtimes/golang/docker.js +0 -55
  120. package/dist/module/src/server/runtimes/java/docker.js +0 -40
  121. package/dist/module/src/server/runtimes/node/docker.js +0 -36
  122. package/dist/module/src/server/runtimes/node/esbuild.js +0 -35
  123. package/dist/module/src/server/runtimes/node/node.js +0 -37
  124. package/dist/module/src/server/runtimes/python/docker.js +0 -25
  125. package/dist/module/src/server/runtimes/ruby/docker.js +0 -28
  126. package/dist/module/src/server/runtimes/rust/docker.js +0 -29
  127. package/dist/module/src/server/runtimes/web/docker.js +0 -36
  128. package/dist/module/src/server/runtimes/web/esbuild.js +0 -24
  129. package/dist/module/src/server/runtimes/web/hoist.js +0 -11
  130. package/dist/module/src/server/runtimes/web/web.js +0 -119
  131. package/dist/module/src/server/serverClasees/Server.js +0 -40
  132. package/dist/module/src/server/serverClasees/Server_Base.js +0 -14
  133. package/dist/module/src/server/serverClasees/Server_Docker.js +0 -897
  134. package/dist/module/src/server/serverClasees/Server_FS.js +0 -119
  135. package/dist/module/src/server/serverClasees/Server_HTTP.js +0 -182
  136. package/dist/module/src/server/serverClasees/Server_WS.js +0 -258
  137. package/dist/module/src/server/serverManagers/DockerManager.js +0 -28
  138. package/dist/module/src/server/serverManagers/HttpManager.js +0 -110
  139. package/dist/module/src/server/serverManagers/WsManager.js +0 -226
  140. package/dist/module/src/server/serverManagers/fs.js +0 -32
  141. package/dist/module/src/server/serverManagers/tcp.js +0 -47
  142. package/dist/module/src/server/types.js +0 -1
  143. package/dist/module/src/testeranto.js +0 -40
  144. package/dist/module/src/vscode/TerminalManager.js +0 -92
  145. package/dist/module/src/vscode/TestTreeItem.js +0 -40
  146. package/dist/module/src/vscode/extension.js +0 -148
  147. package/dist/module/src/vscode/providers/FeaturesTreeDataProvider.js +0 -408
  148. package/dist/module/src/vscode/providers/FileTreeDataProvider.js +0 -153
  149. package/dist/module/src/vscode/providers/ProcessesTreeDataProvider.js +0 -233
  150. package/dist/module/src/vscode/providers/ResultsTreeDataProvider.js +0 -50
  151. package/dist/module/src/vscode/providers/TestTreeDataProvider.js +0 -272
  152. package/dist/module/src/vscode/types.js +0 -6
  153. package/dist/module/testeranto/runtimes/node/node.js +0 -5
  154. package/dist/module/testeranto/runtimes/web/web.js +0 -4
  155. package/dist/module/testeranto/testeranto.js +0 -68
  156. package/dist/module/tsconfig.module.tsbuildinfo +0 -1
  157. package/dist/prebuild/chunk-QLT7PNPK.mjs +0 -162
  158. package/dist/prebuild/esbuildConfigs/eslint-formatter-testeranto.mjs +0 -20
  159. package/dist/prebuild/init-docs.mjs +0 -56
  160. package/dist/prebuild/server/runtimes/node/node.mjs +0 -80
  161. package/dist/prebuild/server/runtimes/web/hoist.mjs +0 -12
  162. package/dist/prebuild/server/runtimes/web/web.mjs +0 -162
  163. package/dist/prebuild/testeranto-6SAYRVSE.mjs +0 -72
  164. package/dist/prebuild/testeranto.mjs +0 -1692
  165. package/dist/types/src/Init.d.ts +0 -2
  166. package/dist/types/src/Types.d.ts +0 -87
  167. package/dist/types/src/esbuildConfigs/consoleDetectorPlugin.d.ts +0 -2
  168. package/dist/types/src/esbuildConfigs/eslint-formatter-testeranto.d.ts +0 -2
  169. package/dist/types/src/esbuildConfigs/featuresPlugin.d.ts +0 -5
  170. package/dist/types/src/esbuildConfigs/index.d.ts +0 -3
  171. package/dist/types/src/esbuildConfigs/inputFilesPlugin.d.ts +0 -7
  172. package/dist/types/src/esbuildConfigs/nativeImportDetectorPlugin.d.ts +0 -2
  173. package/dist/types/src/esbuildConfigs/rebuildPlugin.d.ts +0 -6
  174. package/dist/types/src/init-docs.d.ts +0 -1
  175. package/dist/types/src/lib/tiposkripto/BaseGiven.d.ts +0 -42
  176. package/dist/types/src/lib/tiposkripto/BaseSuite.d.ts +0 -46
  177. package/dist/types/src/lib/tiposkripto/BaseThen.d.ts +0 -28
  178. package/dist/types/src/lib/tiposkripto/BaseTiposkripto.d.ts +0 -35
  179. package/dist/types/src/lib/tiposkripto/BaseWhen.d.ts +0 -27
  180. package/dist/types/src/lib/tiposkripto/CoreTypes.d.ts +0 -51
  181. package/dist/types/src/lib/tiposkripto/Node.d.ts +0 -9
  182. package/dist/types/src/lib/tiposkripto/Tiposkripto.d.ts +0 -5
  183. package/dist/types/src/lib/tiposkripto/Types.d.ts +0 -9
  184. package/dist/types/src/lib/tiposkripto/Web.d.ts +0 -9
  185. package/dist/types/src/lib/tiposkripto/abstractBase.test/MockGiven.d.ts +0 -9
  186. package/dist/types/src/lib/tiposkripto/abstractBase.test/MockThen.d.ts +0 -6
  187. package/dist/types/src/lib/tiposkripto/abstractBase.test/MockWhen.d.ts +0 -6
  188. package/dist/types/src/lib/tiposkripto/abstractBase.test/adapter.d.ts +0 -3
  189. package/dist/types/src/lib/tiposkripto/abstractBase.test/implementation.d.ts +0 -3
  190. package/dist/types/src/lib/tiposkripto/abstractBase.test/index.d.ts +0 -28
  191. package/dist/types/src/lib/tiposkripto/abstractBase.test/specification.d.ts +0 -3
  192. package/dist/types/src/lib/tiposkripto/abstractBase.test/types.d.ts +0 -39
  193. package/dist/types/src/lib/tiposkripto/index.d.ts +0 -56
  194. package/dist/types/src/runtimes.d.ts +0 -2
  195. package/dist/types/src/server/aider/configParser.d.ts +0 -11
  196. package/dist/types/src/server/aider/docker.d.ts +0 -2
  197. package/dist/types/src/server/getRunnables.d.ts +0 -3
  198. package/dist/types/src/server/htmlTemplate.d.ts +0 -2
  199. package/dist/types/src/server/nodeVersion.d.ts +0 -2
  200. package/dist/types/src/server/runtimes/common.d.ts +0 -12
  201. package/dist/types/src/server/runtimes/golang/docker.d.ts +0 -5
  202. package/dist/types/src/server/runtimes/java/docker.d.ts +0 -14
  203. package/dist/types/src/server/runtimes/node/docker.d.ts +0 -14
  204. package/dist/types/src/server/runtimes/node/esbuild.d.ts +0 -4
  205. package/dist/types/src/server/runtimes/node/node.d.ts +0 -1
  206. package/dist/types/src/server/runtimes/python/docker.d.ts +0 -14
  207. package/dist/types/src/server/runtimes/ruby/docker.d.ts +0 -14
  208. package/dist/types/src/server/runtimes/rust/docker.d.ts +0 -14
  209. package/dist/types/src/server/runtimes/web/docker.d.ts +0 -15
  210. package/dist/types/src/server/runtimes/web/esbuild.d.ts +0 -4
  211. package/dist/types/src/server/runtimes/web/hoist.d.ts +0 -1
  212. package/dist/types/src/server/runtimes/web/web.d.ts +0 -1
  213. package/dist/types/src/server/serverClasees/Server.d.ts +0 -8
  214. package/dist/types/src/server/serverClasees/Server_Base.d.ts +0 -9
  215. package/dist/types/src/server/serverClasees/Server_Docker.d.ts +0 -81
  216. package/dist/types/src/server/serverClasees/Server_FS.d.ts +0 -0
  217. package/dist/types/src/server/serverClasees/Server_HTTP.d.ts +0 -20
  218. package/dist/types/src/server/serverClasees/Server_WS.d.ts +0 -23
  219. package/dist/types/src/server/serverManagers/DockerManager.d.ts +0 -0
  220. package/dist/types/src/server/serverManagers/HttpManager.d.ts +0 -9
  221. package/dist/types/src/server/serverManagers/WsManager.d.ts +0 -10
  222. package/dist/types/src/server/serverManagers/fs.d.ts +0 -0
  223. package/dist/types/src/server/serverManagers/tcp.d.ts +0 -27
  224. package/dist/types/src/server/types.d.ts +0 -68
  225. package/dist/types/src/testeranto.d.ts +0 -1
  226. package/dist/types/src/vscode/TerminalManager.d.ts +0 -18
  227. package/dist/types/src/vscode/TestTreeItem.d.ts +0 -13
  228. package/dist/types/src/vscode/extension.d.ts +0 -3
  229. package/dist/types/src/vscode/providers/FeaturesTreeDataProvider.d.ts +0 -17
  230. package/dist/types/src/vscode/providers/FileTreeDataProvider.d.ts +0 -13
  231. package/dist/types/src/vscode/providers/ProcessesTreeDataProvider.d.ts +0 -23
  232. package/dist/types/src/vscode/providers/ResultsTreeDataProvider.d.ts +0 -10
  233. package/dist/types/src/vscode/providers/TestTreeDataProvider.d.ts +0 -16
  234. package/dist/types/src/vscode/types.d.ts +0 -14
  235. package/dist/types/testeranto/testeranto.d.ts +0 -3
  236. package/dist/types/tsconfig.types.tsbuildinfo +0 -1
  237. package/dist/vscode/extension.mjs +0 -5116
@@ -1,897 +0,0 @@
1
- import ansiColors from "ansi-colors";
2
- import { exec, execSync, spawn } from "child_process";
3
- import fs from "fs";
4
- import yaml from "js-yaml";
5
- import path from "path";
6
- import { promisify } from "util";
7
- import { RUN_TIMES } from "../../runtimes";
8
- import { golangBddCommand, golangBuildCommand, golangDockerComposeFile } from "../runtimes/golang/docker";
9
- import { javaBddCommand, javaBuildCommand, javaDockerComposeFile } from "../runtimes/java/docker";
10
- import { nodeBddCommand, nodeBuildCommand, nodeDockerComposeFile } from "../runtimes/node/docker";
11
- import { pythonBddCommand, pythonBuildCommand, pythonDockerComposeFile } from "../runtimes/python/docker";
12
- import { rubyBddCommand, rubyBuildCommand, rubyDockerComposeFile } from "../runtimes/ruby/docker";
13
- import { rustBddCommand, rustBuildCommand, rustDockerComposeFile } from "../runtimes/rust/docker";
14
- import { webBddCommand, webBuildCommand, webDockerComposeFile } from "../runtimes/web/docker";
15
- import { Server_WS } from "./Server_WS";
16
- export class Server_Docker extends Server_WS {
17
- constructor(configs, mode) {
18
- super(configs, mode);
19
- this.logProcesses = new Map();
20
- }
21
- BaseCompose(services) {
22
- return {
23
- services,
24
- volumes: {
25
- node_modules: {
26
- driver: "local",
27
- },
28
- },
29
- networks: {
30
- allTests_network: {
31
- driver: "bridge",
32
- },
33
- },
34
- };
35
- }
36
- staticTestDockerComposeFile(runtime, container_name, command) {
37
- // Find the dockerfile path from configs
38
- let dockerfilePath = '';
39
- for (const [key, value] of Object.entries(this.configs.runtimes)) {
40
- if (value.runtime === runtime) {
41
- dockerfilePath = value.dockerfile;
42
- break;
43
- }
44
- }
45
- // If no dockerfile found, use a default based on runtime
46
- if (!dockerfilePath) {
47
- throw (`[Docker] [staticTestDockerComposeFile] no dockerfile found for ${dockerfilePath}, ${Object.entries(this.configs)}`);
48
- }
49
- return {
50
- build: {
51
- context: process.cwd(),
52
- dockerfile: dockerfilePath,
53
- },
54
- container_name,
55
- environment: {
56
- // NODE_ENV: "production",
57
- // ...config.env,
58
- },
59
- working_dir: "/workspace",
60
- command: command,
61
- networks: ["allTests_network"],
62
- };
63
- }
64
- ;
65
- bddTestDockerComposeFile(runtime, container_name, command) {
66
- // Find the dockerfile path from configs
67
- let dockerfilePath = '';
68
- for (const [key, value] of Object.entries(this.configs.runtimes)) {
69
- if (value.runtime === runtime) {
70
- dockerfilePath = value.dockerfile;
71
- break;
72
- }
73
- }
74
- // If no dockerfile found, use a default based on runtime
75
- if (!dockerfilePath) {
76
- throw (`[Docker] [bddTestDockerComposeFile] no dockerfile found for ${dockerfilePath}, ${Object.entries(this.configs)}`);
77
- }
78
- const service = {
79
- build: {
80
- context: process.cwd(),
81
- dockerfile: dockerfilePath,
82
- },
83
- container_name,
84
- environment: {
85
- // NODE_ENV: "production",
86
- // ...config.env,
87
- },
88
- working_dir: "/workspace",
89
- volumes: [
90
- `${process.cwd()}/src:/workspace/src`,
91
- `${process.cwd()}/example:/workspace/example`,
92
- `${process.cwd()}/dist:/workspace/dist`,
93
- `${process.cwd()}/testeranto:/workspace/testeranto`,
94
- ],
95
- command: command,
96
- networks: ["allTests_network"],
97
- };
98
- return service;
99
- }
100
- ;
101
- aiderDockerComposeFile(container_name) {
102
- return {
103
- build: {
104
- context: process.cwd(),
105
- dockerfile: 'aider.Dockerfile',
106
- },
107
- container_name,
108
- environment: {
109
- // NODE_ENV: "production",
110
- // ...config.env,
111
- },
112
- working_dir: "/workspace",
113
- command: "aider",
114
- networks: ["allTests_network"],
115
- };
116
- }
117
- ;
118
- generateServices(
119
- // config: IBuiltConfig,
120
- ) {
121
- const services = {};
122
- console.log("mark1");
123
- // // Add browser service
124
- // services['browser'] = {
125
- // build:
126
- // {
127
- // context: `/Users/adam/Code/testeranto`,
128
- // dockerfile: `src/server/runtimes/web/web.Dockerfile`
129
- // },
130
- // // image: 'browserless/chrome:latest',
131
- // shm_size: '2gb',
132
- // // environment: [ "DEFAULT_ARGS=--disable-dev-shm-usage"],
133
- // container_name: 'browser-allTests',
134
- // // environment: {
135
- // // CONNECTION_TIMEOUT: '60000',
136
- // // MAX_CONCURRENT_SESSIONS: '10',
137
- // // ENABLE_CORS: 'true',
138
- // // TOKEN: '',
139
- // // DEFAULT_ARGS: '--disable-dev-shm-usage'
140
- // // },
141
- // ports: [
142
- // '3000:3000',
143
- // '9222:9222'
144
- // ],
145
- // networks: ["default"],
146
- // };
147
- const runTimeToCompose = {
148
- 'node': [nodeDockerComposeFile, nodeBuildCommand, nodeBddCommand],
149
- 'web': [webDockerComposeFile, webBuildCommand, webBddCommand],
150
- 'python': [pythonDockerComposeFile, pythonBuildCommand, pythonBddCommand],
151
- 'golang': [golangDockerComposeFile, golangBuildCommand, golangBddCommand],
152
- 'ruby': [rubyDockerComposeFile, rubyBuildCommand, rubyBddCommand],
153
- 'rust': [rustDockerComposeFile, rustBuildCommand, rustBddCommand],
154
- "java": [javaDockerComposeFile, javaBuildCommand, javaBddCommand]
155
- };
156
- // Iterate through each entry in the config Map
157
- for (const [runtimeTestsName, runtimeTests] of Object.entries(this.configs.runtimes)) {
158
- const runtime = runtimeTests.runtime;
159
- const dockerfile = runtimeTests.dockerfile;
160
- const buildOptions = runtimeTests.buildOptions;
161
- const testsObj = runtimeTests.tests;
162
- // loop over all suites which are of the right runtime
163
- for (const [t, c] of Object.entries(this.configs.runtimes)) {
164
- if (c.runtime === runtime) {
165
- if (RUN_TIMES.includes(runtime)) {
166
- const buildCommand = runTimeToCompose[runtime][1](buildOptions, c.buildOptions, runtimeTestsName);
167
- // Add builder service for this runtime
168
- const builderServiceName = `${runtime}-builder`;
169
- // Ensure dockerfile path is valid and exists
170
- let dockerfilePath = dockerfile;
171
- const fullDockerfilePath = path.join(process.cwd(), dockerfilePath);
172
- if (!fs.existsSync(fullDockerfilePath)) {
173
- throw (`[Server_Docker] Dockerfile not found at ${fullDockerfilePath}`);
174
- }
175
- services[builderServiceName] = {
176
- build: {
177
- context: process.cwd(),
178
- dockerfile: dockerfilePath,
179
- },
180
- container_name: builderServiceName,
181
- environment: {},
182
- working_dir: "/workspace",
183
- volumes: [
184
- `${process.cwd()}/src:/workspace/src`,
185
- `${process.cwd()}/example:/workspace/example`,
186
- `${process.cwd()}/dist:/workspace/dist`,
187
- `${process.cwd()}/testeranto:/workspace/testeranto`,
188
- ],
189
- command: buildCommand,
190
- networks: ["allTests_network"],
191
- };
192
- for (const tName of testsObj) {
193
- // Clean the test name for use in container names
194
- // Handle numeric test names (like '0') by converting to string
195
- // const testNameStr = String(testName);
196
- const cleanTestName = tName.toLowerCase()
197
- .replaceAll("/", "_")
198
- .replaceAll(".", "-")
199
- .replace(/[^a-z0-9_-]/g, '');
200
- // Generate UID using the runtimeTestsName (e.g., 'nodeTests') and clean test name
201
- const uid = `${runtimeTestsName.toLowerCase()}-${cleanTestName}`;
202
- // Add BDD service for this test
203
- const bddCommandFunc = runTimeToCompose[runtime][2];
204
- // TODO find filepath
205
- // const filePath = "testeranto/bundles/allTests/ruby/example/Calculator.test.rb"
206
- const filePath = `testeranto/bundles/allTests/${runtime}/${tName}`;
207
- const command = bddCommandFunc(filePath);
208
- console.log("wtf command", command);
209
- services[`${uid}-bdd`] = this.bddTestDockerComposeFile(runtime, `${uid}-bdd`, command);
210
- services[`${uid}-aider`] = this.aiderDockerComposeFile(`${uid}-aider`);
211
- }
212
- }
213
- else {
214
- throw `unknown runtime ${runtime}`;
215
- }
216
- }
217
- }
218
- }
219
- // Ensure all services use the same network configuration
220
- for (const serviceName in services) {
221
- if (!services[serviceName].networks) {
222
- services[serviceName].networks = ["allTests_network"];
223
- }
224
- }
225
- return services;
226
- }
227
- autogenerateStamp(x) {
228
- return `# This file is autogenerated. Do not edit it directly
229
- ${x}
230
- `;
231
- }
232
- getUpCommand() {
233
- return `docker compose up -d`;
234
- }
235
- getDownCommand() {
236
- return `docker compose down -v --remove-orphans`;
237
- }
238
- getPsCommand() {
239
- return `docker compose ps`;
240
- }
241
- getLogsCommand(serviceName, tail = 100) {
242
- const base = `docker compose logs --no-color --tail=${tail}`;
243
- return serviceName ? `${base} ${serviceName}` : base;
244
- }
245
- getConfigServicesCommand() {
246
- return `docker compose config --services`;
247
- }
248
- getBuildCommand() {
249
- return `docker compose build`;
250
- }
251
- getStartCommand() {
252
- return `docker compose start`;
253
- }
254
- // private async waitForContainerExists(serviceName: string, maxAttempts: number = 30, delayMs: number = 1000): Promise<boolean> {
255
- // for (let attempt = 1; attempt <= maxAttempts; attempt++) {
256
- // try {
257
- // const cmd = `docker compose -f "testeranto/docker-compose.yml" ps -q ${serviceName}`;
258
- // const { execSync } = require('child_process');
259
- // const containerId = execSync(cmd, {
260
- // // cwd:this.dockerManager.cwd
261
- // }).toString().trim();
262
- // if (containerId && containerId.length > 0) {
263
- // console.log(`[Server_Docker] Container for ${serviceName} exists with ID: ${containerId.substring(0, 12)}`);
264
- // return true;
265
- // }
266
- // } catch (error) {
267
- // // Container doesn't exist yet or command failed
268
- // }
269
- // if (attempt < maxAttempts) {
270
- // await new Promise(resolve => setTimeout(resolve, delayMs));
271
- // }
272
- // }
273
- // console.warn(`[Server_Docker] Container for ${serviceName} did not appear after ${maxAttempts} attempts`);
274
- // return false;
275
- // }
276
- async startServiceLogging(serviceName, runtime) {
277
- var _a, _b;
278
- // Create report directory
279
- const reportDir = path.join(process.cwd(), "testeranto", "reports", "allTests", "example", runtime);
280
- try {
281
- fs.mkdirSync(reportDir, { recursive: true });
282
- }
283
- catch (error) {
284
- console.error(`[Server_Docker] Failed to create report directory ${reportDir}: ${error.message}`);
285
- return;
286
- }
287
- const logFilePath = path.join(reportDir, `${serviceName}.log`);
288
- const exitCodeFilePath = path.join(reportDir, `${serviceName}.exitcode`);
289
- // Start a process to capture logs - use a more robust approach
290
- // We'll use a shell script that handles waiting for the container
291
- const logScript = `
292
- # Wait for container to exist
293
- for i in {1..30}; do
294
- if docker compose -f "testeranto/docker-compose.yml" ps -q ${serviceName} > /dev/null 2>&1; then
295
- break
296
- fi
297
- sleep 1
298
- done
299
- # Capture logs from the beginning
300
- docker compose -f "testeranto/docker-compose.yml" logs --no-color -f ${serviceName}
301
- `;
302
- console.log(`[Server_Docker] Starting log capture for ${serviceName} to ${logFilePath}`);
303
- const logStream = fs.createWriteStream(logFilePath, { flags: 'a' });
304
- const timestamp = new Date().toISOString();
305
- logStream.write(`=== Log started at ${timestamp} for service ${serviceName} ===\n\n`);
306
- const child = spawn('bash', ['-c', logScript], {
307
- stdio: ['ignore', 'pipe', 'pipe'],
308
- // cwd: this.dockerManager.cwd
309
- });
310
- // Get container ID for tracking
311
- let containerId = null;
312
- try {
313
- // Try to get container ID, but don't fail if we can't
314
- const containerIdCmd = `docker compose -f "testeranto/docker-compose.yml" ps -q ${serviceName}`;
315
- containerId = execSync(containerIdCmd, {
316
- // cwd: this.dockerManager.cwd
317
- }).toString().trim();
318
- }
319
- catch (error) {
320
- console.warn(`[Server_Docker] Could not get container ID for ${serviceName}, will track by service name`);
321
- }
322
- (_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on('data', (data) => {
323
- logStream.write(data);
324
- });
325
- (_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on('data', (data) => {
326
- logStream.write(data);
327
- });
328
- child.on('error', (error) => {
329
- console.error(`[Server_Docker] Log process error for ${serviceName}:`, error);
330
- logStream.write(`\n=== Log process error: ${error.message} ===\n`);
331
- logStream.end();
332
- // Write error exit code
333
- fs.writeFileSync(exitCodeFilePath, '-1');
334
- });
335
- child.on('close', (code) => {
336
- const endTimestamp = new Date().toISOString();
337
- logStream.write(`\n=== Log ended at ${endTimestamp}, process exited with code ${code} ===\n`);
338
- logStream.end();
339
- console.log(`[Server_Docker] Log process for ${serviceName} exited with code ${code}`);
340
- // Write exit code to file
341
- fs.writeFileSync(exitCodeFilePath, (code === null || code === void 0 ? void 0 : code.toString()) || '0');
342
- // Also capture the actual container exit code
343
- this.captureContainerExitCode(serviceName, reportDir);
344
- if (containerId) {
345
- this.logProcesses.delete(containerId);
346
- }
347
- else {
348
- // Remove by service name if we couldn't get container ID
349
- for (const [id, proc] of this.logProcesses.entries()) {
350
- if (proc.serviceName === serviceName) {
351
- this.logProcesses.delete(id);
352
- break;
353
- }
354
- }
355
- }
356
- });
357
- // Track the process
358
- const trackingKey = containerId || serviceName;
359
- this.logProcesses.set(trackingKey, { process: child, serviceName });
360
- }
361
- async captureContainerExitCode(serviceName, reportDir) {
362
- try {
363
- // Get container ID including stopped containers
364
- const containerIdCmd = `docker compose -f "testeranto/docker-compose.yml" ps -a -q ${serviceName}`;
365
- const containerId = execSync(containerIdCmd, {
366
- // cwd: this.dockerManager.cwd
367
- }).toString().trim();
368
- if (containerId) {
369
- // Check if container exists and get its exit code
370
- const inspectCmd = `docker inspect --format='{{.State.ExitCode}}' ${containerId}`;
371
- const exitCode = execSync(inspectCmd, {
372
- // cwd: this.dockerManager.cwd
373
- }).toString().trim();
374
- // Write container exit code to a separate file
375
- const containerExitCodeFilePath = path.join(reportDir, `${serviceName}.container.exitcode`);
376
- fs.writeFileSync(containerExitCodeFilePath, exitCode);
377
- console.log(`[Server_Docker] Container ${serviceName} (${containerId.substring(0, 12)}) exited with code ${exitCode}`);
378
- // Also capture the container's status
379
- const statusCmd = `docker inspect --format='{{.State.Status}}' ${containerId}`;
380
- const status = execSync(statusCmd, {
381
- // cwd: this.dockerManager.cwd
382
- }).toString().trim();
383
- const statusFilePath = path.join(reportDir, `${serviceName}.container.status`);
384
- fs.writeFileSync(statusFilePath, status);
385
- }
386
- else {
387
- console.debug(`[Server_Docker] No container found for service ${serviceName}`);
388
- }
389
- }
390
- catch (error) {
391
- // Container might not exist anymore, which is fine
392
- console.debug(`[Server_Docker] Could not capture container exit code for ${serviceName}: ${error.message}`);
393
- }
394
- }
395
- async start() {
396
- console.log(`[Server_Docker] start()`);
397
- super.start();
398
- await this.setupDockerCompose();
399
- // Ensure base reports directory exists
400
- const baseReportsDir = path.join(process.cwd(), "testeranto", "reports");
401
- try {
402
- fs.mkdirSync(baseReportsDir, { recursive: true });
403
- console.log(`[Server_Docker] Created base reports directory: ${baseReportsDir}`);
404
- }
405
- catch (error) {
406
- console.error(`[Server_Docker] Failed to create base reports directory ${baseReportsDir}: ${error.message}`);
407
- }
408
- console.log(`[Server_Docker] Dropping everything...`);
409
- try {
410
- const downCmd = `docker compose -f "testeranto/docker-compose.yml" down -v --remove-orphans`;
411
- console.log(`[Server_Docker] Running: ${downCmd}`);
412
- await this.spawnPromise(downCmd);
413
- console.log(`[Server_Docker] Docker compose down completed`);
414
- }
415
- catch (error) {
416
- console.log(`[Server_Docker] Docker compose down noted: ${error.message}`);
417
- }
418
- // Start builder services
419
- for (const runtime of RUN_TIMES) {
420
- const serviceName = `${runtime}-builder`;
421
- console.log(`[Server_Docker] Starting builder service: ${serviceName}`);
422
- try {
423
- await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${serviceName}`);
424
- this.startServiceLogging(serviceName, runtime)
425
- .catch(error => console.error(`[Server_Docker] Failed to start logging for ${serviceName}:`, error));
426
- this.captureExistingLogs(serviceName, runtime);
427
- }
428
- catch (error) {
429
- console.error(`[Server_Docker] Failed to start ${serviceName}: ${error.message}`);
430
- }
431
- }
432
- // Start browser service
433
- console.log(`[Server_Docker] Starting browser service...`);
434
- try {
435
- await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d browser`);
436
- }
437
- catch (error) {
438
- console.error(`[Server_Docker] Failed to start browser service: ${error.message}`);
439
- }
440
- // Wait for browser service to be healthy before starting web BDD services
441
- console.log(`[Server_Docker] Waiting for browser container to be healthy...`);
442
- await this.waitForContainerHealthy('browser-allTests', 60000); // 60 seconds max
443
- // Start aider services
444
- for (const [configKey, configValue] of Object.entries(this.configs.runtimes)) {
445
- const runtime = configValue.runtime;
446
- // const testsObj = configValue[3];
447
- const tests = configValue.tests;
448
- console.log(`[Server_Docker] Found tests for ${runtime}:`, (JSON.stringify(tests)));
449
- for (const testName of tests) {
450
- // Generate the UID exactly as DockerManager does
451
- const uid = `${configKey}-${testName.toLowerCase().replaceAll("/", "_").replaceAll(".", "-")}`;
452
- const aiderServiceName = `${uid}-aider`;
453
- console.log(`[Server_Docker] Starting aider service: ${aiderServiceName} for test ${testName}`);
454
- try {
455
- await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${aiderServiceName}`);
456
- // Start logging for aider services
457
- this.startServiceLogging(aiderServiceName, runtime)
458
- .catch(error => console.error(`[Server_Docker] Failed to start logging for ${aiderServiceName}:`, error));
459
- this.captureExistingLogs(aiderServiceName, runtime)
460
- .catch(error => console.error(`[Server_Docker] Failed to capture existing logs for ${aiderServiceName}:`, error));
461
- }
462
- catch (error) {
463
- console.error(`[Server_Docker] Failed to start ${aiderServiceName}: ${error.message}`);
464
- }
465
- }
466
- }
467
- // Start BDD test services
468
- // TODO these logs from these services should be saved into reports
469
- for (const [configKey, configValue] of Object.entries(this.configs.runtimes)) {
470
- const runtime = configValue.runtime;
471
- // const testsObj = configValue[3];
472
- const tests = configValue.tests;
473
- console.log(`[Server_Docker] Found tests for ${runtime}:`, (JSON.stringify(tests)));
474
- // const runtime = configValue[0];
475
- // const testsObj = configValue[3];
476
- // const tests = testsObj?.tests || {};
477
- for (const testName of tests) {
478
- const uid = `${configKey}-${testName.toLowerCase().replaceAll("/", "_").replaceAll(".", "-")}`;
479
- const bddServiceName = `${uid}-bdd`;
480
- console.log(`[Server_Docker] Starting BDD service: ${bddServiceName}, ${configKey}, ${configValue}`);
481
- try {
482
- // Start the service
483
- await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${bddServiceName}`);
484
- // Immediately start logging in the background
485
- // Don't wait for it to complete
486
- this.startServiceLogging(bddServiceName, runtime)
487
- .catch(error => console.error(`[Server_Docker] Failed to start logging for ${bddServiceName}:`, error));
488
- // Also capture any existing logs from the container (in case it already produced output)
489
- this.captureExistingLogs(bddServiceName, runtime)
490
- .catch(error => console.error(`[Server_Docker] Failed to capture existing logs for ${bddServiceName}:`, error));
491
- }
492
- catch (error) {
493
- console.error(`[Server_Docker] Failed to start ${bddServiceName}: ${error.message}`);
494
- // Even if starting failed, try to capture any logs that might exist
495
- this.captureExistingLogs(bddServiceName, runtime)
496
- .catch(err => console.error(`[Server_Docker] Also failed to capture logs:`, err));
497
- }
498
- }
499
- }
500
- // Start static test services
501
- // TODO these logs from these services should be saved into reports
502
- for (const [configKey, configValue] of Object.entries(this.configs)) {
503
- const runtime = configValue[0];
504
- const testsObj = configValue[3];
505
- const tests = (testsObj === null || testsObj === void 0 ? void 0 : testsObj.tests) || {};
506
- for (const testName in tests) {
507
- const uid = `${configKey}-${testName.toLowerCase().replaceAll("/", "_").replaceAll(".", "-")}`;
508
- const checks = (testsObj === null || testsObj === void 0 ? void 0 : testsObj.checks) || [];
509
- for (let i = 0; i < checks.length; i++) {
510
- const staticServiceName = `${uid}-static-${i}`;
511
- console.log(`[Server_Docker] Starting static test service: ${staticServiceName}`);
512
- try {
513
- await this.spawnPromise(`docker compose -f "testeranto/docker-compose.yml" up -d ${staticServiceName}`);
514
- // Start logging for this service
515
- this.startServiceLogging(staticServiceName, runtime)
516
- .catch(error => console.error(`[Server_Docker] Failed to start logging for ${staticServiceName}:`, error));
517
- // Also capture any existing logs
518
- this.captureExistingLogs(staticServiceName, runtime)
519
- .catch(error => console.error(`[Server_Docker] Failed to capture existing logs for ${staticServiceName}:`, error));
520
- }
521
- catch (error) {
522
- console.error(`[Server_Docker] Failed to start ${staticServiceName}: ${error.message}`);
523
- // Try to capture logs even if starting failed
524
- this.captureExistingLogs(staticServiceName, runtime)
525
- .catch(err => console.error(`[Server_Docker] Also failed to capture logs:`, err));
526
- }
527
- }
528
- }
529
- }
530
- }
531
- async captureExistingLogs(serviceName, runtime) {
532
- // Create report directory
533
- const reportDir = path.join(process.cwd(), "testeranto", "reports", "allTests", "example", runtime);
534
- try {
535
- fs.mkdirSync(reportDir, { recursive: true });
536
- }
537
- catch (error) {
538
- console.error(`[Server_Docker] Failed to create report directory ${reportDir}: ${error.message}`);
539
- return;
540
- }
541
- const logFilePath = path.join(reportDir, `${serviceName}.log`);
542
- try {
543
- // First, check if the container exists (including stopped ones)
544
- const checkCmd = `docker compose -f "testeranto/docker-compose.yml" ps -a -q ${serviceName}`;
545
- const containerId = execSync(checkCmd, {
546
- // cwd: this.dockerManager.cwd,
547
- encoding: 'utf-8'
548
- }).toString().trim();
549
- if (!containerId) {
550
- console.debug(`[Server_Docker] No container found for service ${serviceName}`);
551
- return;
552
- }
553
- // Get existing logs from the container
554
- const cmd = `docker compose -f "testeranto/docker-compose.yml" logs --no-color ${serviceName} 2>/dev/null || true`;
555
- const existingLogs = execSync(cmd, {
556
- // cwd: this.dockerManager.cwd,
557
- encoding: 'utf-8',
558
- maxBuffer: 10 * 1024 * 1024 // 10MB
559
- });
560
- if (existingLogs && existingLogs.trim().length > 0) {
561
- // Append to the log file
562
- fs.appendFileSync(logFilePath, existingLogs);
563
- console.log(`[Server_Docker] Captured ${existingLogs.length} bytes of existing logs for ${serviceName}`);
564
- }
565
- // Also try to capture the container exit code if it has exited
566
- this.captureContainerExitCode(serviceName, reportDir);
567
- }
568
- catch (error) {
569
- // It's okay if this fails - the container might not exist yet
570
- console.debug(`[Server_Docker] No existing logs for ${serviceName}: ${error.message}`);
571
- }
572
- }
573
- async waitForContainerHealthy(containerName, timeoutMs) {
574
- const startTime = Date.now();
575
- const checkInterval = 2000; // Check every 2 seconds
576
- // while (Date.now() - startTime < timeoutMs) {
577
- // try {
578
- // // Use docker inspect to check container health status
579
- // const cmd = `docker inspect --format="{{.State.Health.Status}}" ${containerName}`;
580
- // const { exec } = require('child_process');
581
- // const { promisify } = require('util');
582
- // const execAsync = promisify(exec);
583
- // const { stdout, stderr } = await execAsync(cmd);
584
- // const healthStatus = stdout.trim();
585
- // if (healthStatus === 'healthy') {
586
- // console.log(`[Server_Docker] Container ${containerName} is healthy`);
587
- // return;
588
- // } else if (healthStatus === 'unhealthy') {
589
- // throw new Error(`Container ${containerName} is unhealthy`);
590
- // } else {
591
- // console.log(`[Server_Docker] Container ${containerName} health status: ${healthStatus}`);
592
- // }
593
- // } catch (error: any) {
594
- // // Container might not exist yet or command failed
595
- // console.log(`[Server_Docker] Waiting for container ${containerName} to be healthy...`);
596
- // }
597
- // // Wait before checking again
598
- // await new Promise(resolve => setTimeout(resolve, checkInterval));
599
- // }
600
- // throw new Error(`Timeout waiting for container ${containerName} to become healthy`);
601
- }
602
- async stop() {
603
- console.log(`[Server_Docker] stop()`);
604
- // Stop all log processes first
605
- for (const [containerId, logProcess] of this.logProcesses.entries()) {
606
- try {
607
- logProcess.process.kill('SIGTERM');
608
- console.log(`[Server_Docker] Stopped log process for container ${containerId} (${logProcess.serviceName})`);
609
- }
610
- catch (error) {
611
- console.error(`[Server_Docker] Error stopping log process for ${containerId}:`, error);
612
- }
613
- }
614
- this.logProcesses.clear();
615
- const result = await this.DC_down();
616
- if (result.exitCode !== 0) {
617
- console.error(`Docker Compose down failed: ${result.err}`);
618
- }
619
- super.stop();
620
- }
621
- async setupDockerCompose() {
622
- // First, ensure all necessary directories exist
623
- const composeDir = path.join(process.cwd(), "testeranto", "bundles");
624
- try {
625
- // Setup directories
626
- fs.mkdirSync(composeDir, { recursive: true });
627
- // Generate Dockerfiles for each runtime
628
- // Note: runtimes needs to be defined - we'll get it from config
629
- // const runtimes: IRunTime[] = ["node", "web", "golang", "python", "ruby"];
630
- // deprecated
631
- // this.generateRuntimeDockerfiles(config, runtimes, composeDir, log, error);
632
- const services = this.generateServices(
633
- // config,
634
- );
635
- this.writeComposeFile(services);
636
- }
637
- catch (err) {
638
- console.error(`Error in setupDockerCompose:`, err);
639
- throw err;
640
- }
641
- }
642
- writeComposeFile(services) {
643
- const dockerComposeFileContents = this.BaseCompose(services);
644
- fs.writeFileSync('testeranto/docker-compose.yml', yaml.dump(dockerComposeFileContents, {
645
- lineWidth: -1,
646
- noRefs: true,
647
- }));
648
- }
649
- async exec(cmd, options) {
650
- const execAsync = promisify(exec);
651
- return execAsync(cmd, { cwd: options.cwd });
652
- }
653
- spawnPromise(command) {
654
- return new Promise((resolve, reject) => {
655
- console.log(`[spawnPromise] Executing: ${command}`);
656
- // Use shell: true to let the shell handle command parsing (including quotes)
657
- const child = spawn(command, {
658
- stdio: 'inherit',
659
- shell: true,
660
- // cwd: this.dockerManager.cwd
661
- });
662
- child.on('error', (error) => {
663
- console.error(`[spawnPromise] Failed to start process: ${error.message}`);
664
- reject(error);
665
- });
666
- child.on('close', (code) => {
667
- if (code === 0) {
668
- console.log(`[spawnPromise] Process completed successfully`);
669
- resolve(code);
670
- }
671
- else {
672
- console.error(`[spawnPromise] Process exited with code ${code}`);
673
- reject(new Error(`Process exited with code ${code}`));
674
- }
675
- });
676
- });
677
- }
678
- async DC_upAll() {
679
- try {
680
- const cmd = this.getUpCommand();
681
- await this.spawnPromise(cmd);
682
- return {
683
- exitCode: 0,
684
- out: '',
685
- err: '',
686
- data: null,
687
- };
688
- }
689
- catch (error) {
690
- console.error(`[Docker] docker compose up ❌ ${ansiColors.bgBlue(error.message.replaceAll('\\n', '\n'))}`);
691
- return {
692
- exitCode: 1,
693
- out: '',
694
- err: `Error starting services: ${error.message}`,
695
- data: null,
696
- };
697
- }
698
- }
699
- async DC_down() {
700
- try {
701
- const cmd = this.getDownCommand();
702
- await this.spawnPromise(cmd);
703
- return {
704
- exitCode: 0,
705
- out: "",
706
- err: "",
707
- data: null,
708
- };
709
- }
710
- catch (error) {
711
- console.log(`[DC_down] Error during down: ${error.message}`);
712
- return {
713
- exitCode: 1,
714
- out: "",
715
- err: `Error stopping services: ${error.message}`,
716
- data: null,
717
- };
718
- }
719
- }
720
- async DC_ps() {
721
- try {
722
- const cmd = this.getPsCommand();
723
- const { stdout, stderr } = await this.exec(cmd, {
724
- // cwd: this.dockerManager.cwd
725
- });
726
- return {
727
- exitCode: 0,
728
- out: stdout,
729
- err: stderr,
730
- data: null,
731
- };
732
- }
733
- catch (error) {
734
- return {
735
- exitCode: 1,
736
- out: "",
737
- err: `Error getting service status: ${error.message}`,
738
- data: null,
739
- };
740
- }
741
- }
742
- async DC_logs(serviceName, options) {
743
- var _a;
744
- const tail = (_a = options === null || options === void 0 ? void 0 : options.tail) !== null && _a !== void 0 ? _a : 100;
745
- try {
746
- const cmd = this.getLogsCommand(serviceName, tail);
747
- const { stdout, stderr } = await this.exec(cmd, {
748
- // cwd: this.dockerManager.cwd
749
- });
750
- return {
751
- exitCode: 0,
752
- out: stdout,
753
- err: stderr,
754
- data: null,
755
- };
756
- }
757
- catch (error) {
758
- return {
759
- exitCode: 1,
760
- out: "",
761
- err: `Error getting logs for ${serviceName}: ${error.message}`,
762
- data: null,
763
- };
764
- }
765
- }
766
- async DC_configServices() {
767
- try {
768
- const cmd = this.getConfigServicesCommand();
769
- const { stdout, stderr } = await this.exec(cmd, {
770
- // cwd: this.dockerManager.cwd
771
- });
772
- return {
773
- exitCode: 0,
774
- out: stdout,
775
- err: stderr,
776
- data: null,
777
- };
778
- }
779
- catch (error) {
780
- return {
781
- exitCode: 1,
782
- out: "",
783
- err: `Error getting services from config: ${error.message}`,
784
- data: null,
785
- };
786
- }
787
- }
788
- async DC_start() {
789
- try {
790
- const startCommand = this.getStartCommand();
791
- await this.spawnPromise(startCommand);
792
- return {
793
- exitCode: 0,
794
- data: null,
795
- };
796
- }
797
- catch (error) {
798
- console.error(`[Docker] docker compose start ❌ ${ansiColors.bgBlue(error.message.replaceAll('\\n', '\n'))}`);
799
- return {
800
- exitCode: 1,
801
- data: null,
802
- };
803
- }
804
- }
805
- async DC_build() {
806
- try {
807
- const buildCommand = this.getBuildCommand();
808
- await this.spawnPromise(buildCommand);
809
- console.log(`[DC_build] Build completed successfully`);
810
- return {
811
- exitCode: 0,
812
- out: '',
813
- err: '',
814
- data: null,
815
- };
816
- }
817
- catch (error) {
818
- console.error(`[Docker] docker-compose build ❌ ${ansiColors.bgBlue(error.message.replaceAll('\\n', '\n'))}`);
819
- return {
820
- exitCode: 1,
821
- out: '',
822
- err: `Error building services: ${error.message}`,
823
- data: null,
824
- };
825
- }
826
- }
827
- getProcessSummary() {
828
- console.log(`[Server_Docker] getProcessSummary called`);
829
- try {
830
- // Get running containers
831
- const output = execSync('docker ps --format "{{.Names}}|{{.Image}}|{{.Status}}|{{.Ports}}|{{.State}}|{{.Command}}"').toString();
832
- const processes = output.trim().split('\n').filter(line => line.trim()).map(line => {
833
- const parts = line.split('|');
834
- const [name, image, status, ports, state, command] = parts;
835
- // Try to get exit code for stopped containers
836
- let exitCode = null;
837
- try {
838
- // Check if container exists (including stopped ones)
839
- const inspectCmd = `docker inspect --format='{{.State.ExitCode}}' ${name} 2>/dev/null || echo ""`;
840
- const exitCodeStr = execSync(inspectCmd).toString().trim();
841
- if (exitCodeStr !== '') {
842
- exitCode = parseInt(exitCodeStr, 10);
843
- // Only include exit code if container is not running
844
- if (state === 'running') {
845
- exitCode = null;
846
- }
847
- }
848
- }
849
- catch (error) {
850
- // Container might not exist, which is fine
851
- }
852
- return {
853
- processId: name,
854
- command: command || image,
855
- image: image,
856
- timestamp: new Date().toISOString(),
857
- status: status,
858
- state: state,
859
- ports: ports,
860
- exitCode: exitCode,
861
- // Add additional fields that might be useful for the frontend
862
- runtime: this.getRuntimeFromName(name),
863
- health: 'unknown' // We could add health check status here
864
- };
865
- });
866
- return {
867
- processes: processes,
868
- total: processes.length,
869
- timestamp: new Date().toISOString()
870
- };
871
- }
872
- catch (error) {
873
- console.error(`[Server_Docker] Error getting docker processes: ${error.message}`);
874
- return {
875
- processes: [],
876
- total: 0,
877
- timestamp: new Date().toISOString(),
878
- error: error.message
879
- };
880
- }
881
- }
882
- getRuntimeFromName(name) {
883
- if (name.includes('node'))
884
- return 'node';
885
- if (name.includes('web'))
886
- return 'web';
887
- if (name.includes('golang'))
888
- return 'golang';
889
- if (name.includes('python'))
890
- return 'python';
891
- if (name.includes('ruby'))
892
- return 'ruby';
893
- if (name.includes('browser'))
894
- return 'browser';
895
- return 'unknown';
896
- }
897
- }