cyberia 3.0.3 → 3.2.5

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 (296) hide show
  1. package/{.env.production → .env.example} +20 -4
  2. package/.github/workflows/engine-cyberia.cd.yml +43 -10
  3. package/.github/workflows/engine-cyberia.ci.yml +48 -26
  4. package/.github/workflows/ghpkg.ci.yml +5 -5
  5. package/.github/workflows/gitlab.ci.yml +1 -1
  6. package/.github/workflows/hardhat.ci.yml +82 -0
  7. package/.github/workflows/npmpkg.ci.yml +60 -14
  8. package/.github/workflows/publish.ci.yml +26 -7
  9. package/.github/workflows/publish.cyberia.ci.yml +5 -5
  10. package/.github/workflows/pwa-microservices-template-page.cd.yml +6 -7
  11. package/.github/workflows/pwa-microservices-template-test.ci.yml +4 -4
  12. package/.github/workflows/release.cd.yml +14 -8
  13. package/.vscode/extensions.json +9 -8
  14. package/.vscode/settings.json +3 -2
  15. package/CHANGELOG.md +643 -1
  16. package/CLI-HELP.md +132 -57
  17. package/Dockerfile +4 -2
  18. package/README.md +347 -22
  19. package/WHITE-PAPER.md +1540 -0
  20. package/bin/build.js +21 -12
  21. package/bin/cyberia.js +2640 -106
  22. package/bin/deploy.js +258 -372
  23. package/bin/file.js +5 -1
  24. package/bin/index.js +2640 -106
  25. package/bin/vs.js +3 -3
  26. package/conf.js +169 -105
  27. package/deployment.yaml +236 -20
  28. package/hardhat/.env.example +31 -0
  29. package/hardhat/README.md +531 -0
  30. package/hardhat/WHITE-PAPER.md +1540 -0
  31. package/hardhat/contracts/ObjectLayerToken.sol +391 -0
  32. package/hardhat/deployments/.gitkeep +0 -0
  33. package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
  34. package/hardhat/hardhat.config.js +136 -0
  35. package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
  36. package/hardhat/networks/besu-object-layer.network.json +138 -0
  37. package/hardhat/package-lock.json +4323 -0
  38. package/hardhat/package.json +36 -0
  39. package/hardhat/scripts/deployObjectLayerToken.js +98 -0
  40. package/hardhat/test/ObjectLayerToken.js +592 -0
  41. package/hardhat/types/ethers-contracts/ObjectLayerToken.ts +690 -0
  42. package/hardhat/types/ethers-contracts/common.ts +92 -0
  43. package/hardhat/types/ethers-contracts/factories/ObjectLayerToken__factory.ts +1055 -0
  44. package/hardhat/types/ethers-contracts/factories/index.ts +4 -0
  45. package/hardhat/types/ethers-contracts/hardhat.d.ts +47 -0
  46. package/hardhat/types/ethers-contracts/index.ts +6 -0
  47. package/jsdoc.dd-cyberia.json +68 -0
  48. package/jsdoc.json +65 -49
  49. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +5 -4
  50. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +5 -4
  51. package/manifests/deployment/dd-cyberia-development/deployment.yaml +562 -0
  52. package/manifests/deployment/dd-cyberia-development/proxy.yaml +297 -0
  53. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +132 -0
  54. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  55. package/manifests/deployment/dd-test-development/deployment.yaml +88 -74
  56. package/manifests/deployment/dd-test-development/proxy.yaml +13 -4
  57. package/manifests/deployment/playwright/deployment.yaml +1 -1
  58. package/manifests/pv-pvc-dd.yaml +1 -1
  59. package/nodemon.json +1 -1
  60. package/package.json +60 -48
  61. package/proxy.yaml +118 -10
  62. package/pv-pvc.yaml +132 -0
  63. package/scripts/k3s-node-setup.sh +1 -1
  64. package/scripts/ports-ls.sh +2 -0
  65. package/scripts/rhel-grpc-setup.sh +56 -0
  66. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +47 -1
  67. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +17 -2
  68. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  69. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +80 -7
  70. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +93 -0
  71. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +36 -0
  72. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +29 -0
  73. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +51 -0
  74. package/src/api/cyberia-entity/cyberia-entity.controller.js +74 -0
  75. package/src/api/cyberia-entity/cyberia-entity.model.js +24 -0
  76. package/src/api/cyberia-entity/cyberia-entity.router.js +27 -0
  77. package/src/api/cyberia-entity/cyberia-entity.service.js +42 -0
  78. package/src/api/cyberia-instance/cyberia-fallback-world.js +368 -0
  79. package/src/api/cyberia-instance/cyberia-instance.controller.js +92 -0
  80. package/src/api/cyberia-instance/cyberia-instance.model.js +84 -0
  81. package/src/api/cyberia-instance/cyberia-instance.router.js +63 -0
  82. package/src/api/cyberia-instance/cyberia-instance.service.js +191 -0
  83. package/src/api/cyberia-instance/cyberia-portal-connector.js +486 -0
  84. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +74 -0
  85. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +413 -0
  86. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +228 -0
  87. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +27 -0
  88. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +42 -0
  89. package/src/api/cyberia-map/cyberia-map.controller.js +79 -0
  90. package/src/api/cyberia-map/cyberia-map.model.js +30 -0
  91. package/src/api/cyberia-map/cyberia-map.router.js +40 -0
  92. package/src/api/cyberia-map/cyberia-map.service.js +74 -0
  93. package/src/api/document/document.service.js +1 -1
  94. package/src/api/file/file.controller.js +3 -1
  95. package/src/api/file/file.ref.json +18 -0
  96. package/src/api/file/file.service.js +28 -5
  97. package/src/api/ipfs/ipfs.controller.js +4 -25
  98. package/src/api/ipfs/ipfs.model.js +43 -34
  99. package/src/api/ipfs/ipfs.router.js +8 -13
  100. package/src/api/ipfs/ipfs.service.js +56 -104
  101. package/src/api/object-layer/README.md +347 -22
  102. package/src/api/object-layer/object-layer.controller.js +6 -2
  103. package/src/api/object-layer/object-layer.model.js +12 -8
  104. package/src/api/object-layer/object-layer.router.js +698 -42
  105. package/src/api/object-layer/object-layer.service.js +119 -37
  106. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +1 -2
  107. package/src/api/user/user.router.js +10 -5
  108. package/src/api/user/user.service.js +15 -14
  109. package/src/cli/baremetal.js +6 -10
  110. package/src/cli/cloud-init.js +0 -3
  111. package/src/cli/cluster.js +7 -7
  112. package/src/cli/db.js +723 -857
  113. package/src/cli/deploy.js +215 -105
  114. package/src/cli/env.js +34 -5
  115. package/src/cli/fs.js +5 -4
  116. package/src/cli/image.js +0 -3
  117. package/src/cli/index.js +83 -15
  118. package/src/cli/kubectl.js +211 -0
  119. package/src/cli/monitor.js +5 -6
  120. package/src/cli/release.js +284 -0
  121. package/src/cli/repository.js +708 -62
  122. package/src/cli/run.js +371 -151
  123. package/src/cli/secrets.js +73 -2
  124. package/src/cli/ssh.js +1 -1
  125. package/src/cli/test.js +3 -3
  126. package/src/client/Cryptokoyn.index.js +3 -4
  127. package/src/client/CyberiaPortal.index.js +3 -4
  128. package/src/client/Default.index.js +3 -4
  129. package/src/client/Itemledger.index.js +4 -963
  130. package/src/client/Underpost.index.js +3 -4
  131. package/src/client/components/core/AgGrid.js +20 -5
  132. package/src/client/components/core/Alert.js +2 -2
  133. package/src/client/components/core/AppStore.js +69 -0
  134. package/src/client/components/core/CalendarCore.js +2 -2
  135. package/src/client/components/core/Content.js +22 -3
  136. package/src/client/components/core/Docs.js +30 -6
  137. package/src/client/components/core/DropDown.js +137 -17
  138. package/src/client/components/core/FileExplorer.js +71 -4
  139. package/src/client/components/core/Input.js +1 -1
  140. package/src/client/components/core/Keyboard.js +2 -2
  141. package/src/client/components/core/LogIn.js +2 -2
  142. package/src/client/components/core/LogOut.js +2 -2
  143. package/src/client/components/core/Modal.js +20 -7
  144. package/src/client/components/core/Panel.js +0 -1
  145. package/src/client/components/core/PanelForm.js +19 -19
  146. package/src/client/components/core/RichText.js +1 -2
  147. package/src/client/components/core/SocketIo.js +82 -29
  148. package/src/client/components/core/SocketIoHandler.js +75 -0
  149. package/src/client/components/core/Stream.js +143 -95
  150. package/src/client/components/core/Webhook.js +40 -7
  151. package/src/client/components/cryptokoyn/AppStoreCryptokoyn.js +5 -0
  152. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +3 -3
  153. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +2 -2
  154. package/src/client/components/cryptokoyn/MenuCryptokoyn.js +3 -3
  155. package/src/client/components/cryptokoyn/SocketIoCryptokoyn.js +3 -51
  156. package/src/client/components/cyberia/InstanceEngineCyberia.js +700 -0
  157. package/src/client/components/cyberia/MapEngineCyberia.js +1359 -2
  158. package/src/client/components/cyberia/ObjectLayerEngineModal.js +17 -6
  159. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +92 -54
  160. package/src/client/components/cyberia-portal/AppStoreCyberiaPortal.js +5 -0
  161. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +217 -30
  162. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +44 -2
  163. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +3 -4
  164. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +2 -2
  165. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +104 -9
  166. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +5 -0
  167. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +3 -49
  168. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  169. package/src/client/components/default/AppStoreDefault.js +5 -0
  170. package/src/client/components/default/LogInDefault.js +3 -3
  171. package/src/client/components/default/LogOutDefault.js +2 -2
  172. package/src/client/components/default/MenuDefault.js +5 -5
  173. package/src/client/components/default/SocketIoDefault.js +3 -51
  174. package/src/client/components/itemledger/AppStoreItemledger.js +5 -0
  175. package/src/client/components/itemledger/LogInItemledger.js +3 -3
  176. package/src/client/components/itemledger/LogOutItemledger.js +2 -2
  177. package/src/client/components/itemledger/MenuItemledger.js +3 -3
  178. package/src/client/components/itemledger/SocketIoItemledger.js +3 -51
  179. package/src/client/components/underpost/AppStoreUnderpost.js +5 -0
  180. package/src/client/components/underpost/CssUnderpost.js +59 -0
  181. package/src/client/components/underpost/LogInUnderpost.js +6 -3
  182. package/src/client/components/underpost/LogOutUnderpost.js +4 -2
  183. package/src/client/components/underpost/MenuUnderpost.js +104 -18
  184. package/src/client/components/underpost/RoutesUnderpost.js +2 -0
  185. package/src/client/components/underpost/SocketIoUnderpost.js +3 -51
  186. package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
  187. package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
  188. package/src/client/public/cryptokoyn/microdata.json +85 -0
  189. package/src/client/public/cryptokoyn/site.webmanifest +57 -0
  190. package/src/client/public/cryptokoyn/sitemap +3 -3
  191. package/src/client/public/default/sitemap +3 -3
  192. package/src/client/public/itemledger/browserconfig.xml +2 -2
  193. package/src/client/public/itemledger/manifest.webmanifest +4 -4
  194. package/src/client/public/itemledger/microdata.json +71 -0
  195. package/src/client/public/itemledger/sitemap +3 -3
  196. package/src/client/public/itemledger/yandex-browser-manifest.json +2 -2
  197. package/src/client/public/test/sitemap +3 -3
  198. package/src/client/services/core/core.service.js +20 -8
  199. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +105 -0
  200. package/src/client/services/cyberia-entity/cyberia-entity.management.js +57 -0
  201. package/src/client/services/cyberia-entity/cyberia-entity.service.js +105 -0
  202. package/src/client/services/cyberia-instance/cyberia-instance.management.js +194 -0
  203. package/src/client/services/cyberia-instance/cyberia-instance.service.js +122 -0
  204. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +105 -0
  205. package/src/client/services/cyberia-map/cyberia-map.management.js +193 -0
  206. package/src/client/services/cyberia-map/cyberia-map.service.js +126 -0
  207. package/src/client/services/instance/instance.management.js +2 -2
  208. package/src/client/services/ipfs/ipfs.service.js +3 -23
  209. package/src/client/services/object-layer/object-layer.management.js +3 -3
  210. package/src/client/services/object-layer/object-layer.service.js +21 -0
  211. package/src/client/services/user/user.management.js +2 -2
  212. package/src/client/ssr/body/404.js +15 -11
  213. package/src/client/ssr/body/500.js +15 -11
  214. package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
  215. package/src/client/ssr/head/PwaItemledger.js +60 -0
  216. package/src/client/ssr/offline/NoNetworkConnection.js +11 -10
  217. package/src/client/ssr/pages/CyberiaServerMetrics.js +1 -1
  218. package/src/client/ssr/pages/Test.js +11 -10
  219. package/src/client.build.js +0 -3
  220. package/src/client.dev.js +0 -3
  221. package/src/db/DataBaseProvider.js +17 -2
  222. package/src/db/mariadb/MariaDB.js +14 -9
  223. package/src/db/mongo/MongooseDB.js +17 -1
  224. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +305 -0
  225. package/src/grpc/cyberia/README.md +326 -0
  226. package/src/grpc/cyberia/grpc-server.js +530 -0
  227. package/src/index.js +24 -1
  228. package/src/proxy.js +0 -3
  229. package/src/runtime/express/Dockerfile +4 -0
  230. package/src/runtime/express/Express.js +33 -10
  231. package/src/runtime/lampp/Dockerfile +13 -2
  232. package/src/runtime/lampp/Lampp.js +33 -17
  233. package/src/runtime/wp/Dockerfile +68 -0
  234. package/src/runtime/wp/Wp.js +639 -0
  235. package/src/server/auth.js +36 -15
  236. package/src/server/backup.js +39 -12
  237. package/src/server/besu-genesis-generator.js +1630 -0
  238. package/src/server/client-build-docs.js +133 -17
  239. package/src/server/client-build-live.js +9 -18
  240. package/src/server/client-build.js +229 -101
  241. package/src/server/client-dev-server.js +14 -13
  242. package/src/server/client-formatted.js +109 -57
  243. package/src/server/conf.js +391 -164
  244. package/src/server/cron.js +27 -24
  245. package/src/server/dns.js +29 -12
  246. package/src/server/downloader.js +0 -2
  247. package/src/server/ipfs-client.js +24 -1
  248. package/src/server/logger.js +27 -9
  249. package/src/server/object-layer.js +217 -103
  250. package/src/server/peer.js +8 -2
  251. package/src/server/process.js +1 -50
  252. package/src/server/proxy.js +4 -8
  253. package/src/server/runtime.js +30 -9
  254. package/src/server/semantic-layer-generator-floor.js +359 -0
  255. package/src/server/semantic-layer-generator-skin.js +1294 -0
  256. package/src/server/semantic-layer-generator.js +116 -555
  257. package/src/server/ssr.js +0 -3
  258. package/src/server/start.js +19 -12
  259. package/src/server/tls.js +0 -2
  260. package/src/server.js +0 -4
  261. package/src/ws/IoInterface.js +1 -10
  262. package/src/ws/IoServer.js +14 -33
  263. package/src/ws/core/channels/core.ws.chat.js +65 -20
  264. package/src/ws/core/channels/core.ws.mailer.js +113 -32
  265. package/src/ws/core/channels/core.ws.stream.js +90 -31
  266. package/src/ws/core/core.ws.connection.js +12 -33
  267. package/src/ws/core/core.ws.emit.js +10 -26
  268. package/src/ws/core/core.ws.server.js +25 -58
  269. package/src/ws/default/channels/default.ws.main.js +53 -12
  270. package/src/ws/default/default.ws.connection.js +26 -13
  271. package/src/ws/default/default.ws.server.js +30 -12
  272. package/.env.development +0 -43
  273. package/.env.test +0 -43
  274. package/hardhat/contracts/CryptoKoyn.sol +0 -59
  275. package/hardhat/contracts/ItemLedger.sol +0 -73
  276. package/hardhat/contracts/Lock.sol +0 -34
  277. package/hardhat/hardhat.config.cjs +0 -45
  278. package/hardhat/ignition/modules/Lock.js +0 -18
  279. package/hardhat/networks/cryptokoyn-itemledger.network.json +0 -29
  280. package/hardhat/scripts/deployCryptokoyn.cjs +0 -25
  281. package/hardhat/scripts/deployItemledger.cjs +0 -25
  282. package/hardhat/test/Lock.js +0 -126
  283. package/hardhat/white-paper.md +0 -581
  284. package/src/client/components/cryptokoyn/CommonCryptokoyn.js +0 -29
  285. package/src/client/components/cryptokoyn/ElementsCryptokoyn.js +0 -38
  286. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +0 -38
  287. package/src/client/components/default/ElementsDefault.js +0 -38
  288. package/src/client/components/itemledger/CommonItemledger.js +0 -29
  289. package/src/client/components/itemledger/ElementsItemledger.js +0 -38
  290. package/src/client/components/underpost/CommonUnderpost.js +0 -29
  291. package/src/client/components/underpost/ElementsUnderpost.js +0 -38
  292. package/src/ws/core/management/core.ws.chat.js +0 -8
  293. package/src/ws/core/management/core.ws.mailer.js +0 -16
  294. package/src/ws/core/management/core.ws.stream.js +0 -8
  295. package/src/ws/default/management/default.ws.main.js +0 -8
  296. package/white-paper.md +0 -581
package/bin/deploy.js CHANGED
@@ -3,27 +3,21 @@ import axios from 'axios';
3
3
 
4
4
  import dotenv from 'dotenv';
5
5
 
6
- import { pbcopy, shellCd, shellExec } from '../src/server/process.js';
6
+ import { pbcopy, shellExec } from '../src/server/process.js';
7
7
  import { loggerFactory } from '../src/server/logger.js';
8
8
  import {
9
- Config,
10
9
  addApiConf,
11
10
  addClientConf,
12
11
  buildApiSrc,
13
12
  buildClientSrc,
14
13
  cloneConf,
15
- loadConf,
16
- loadReplicas,
17
14
  addWsConf,
18
15
  buildWsSrc,
19
16
  cloneSrcComponents,
20
- getDataDeploy,
21
- buildReplicaId,
22
- Cmd,
23
17
  writeEnv,
24
18
  buildCliDoc,
19
+ loadConf,
25
20
  } from '../src/server/conf.js';
26
- import { buildClient } from '../src/server/client-build.js';
27
21
  import colors from 'colors';
28
22
  import { program } from '../src/cli/index.js';
29
23
  import { timer } from '../src/client/components/core/CommonJs.js';
@@ -120,19 +114,6 @@ try {
120
114
  buildWsSrc({ toOptions, fromOptions });
121
115
  }
122
116
  break;
123
- case 'conf': {
124
- let subConf = process.argv[5] ?? '';
125
-
126
- if (!['current', 'clean', 'root'].includes(process.argv[3])) {
127
- const path = fs.existsSync(`./engine-private/replica/${process.argv[3]}`)
128
- ? `./engine-private/replica/${process.argv[3]}/.env.${process.argv[4]}`
129
- : `./engine-private/conf/${process.argv[3]}/.env.${process.argv[4]}`;
130
- dotenv.config({ path, override: true });
131
- }
132
-
133
- loadConf(process.argv[3], subConf);
134
- break;
135
- }
136
117
 
137
118
  case 'new-nodejs-app':
138
119
  {
@@ -143,7 +124,7 @@ try {
143
124
 
144
125
  shellExec(`node bin/deploy build-nodejs-src-app ${deployId} ${clientId}`);
145
126
 
146
- shellExec(`node bin/deploy build-full-client ${deployId}`);
127
+ await Underpost.repo.client(deployId);
147
128
 
148
129
  shellExec(`npm run dev ${deployId}`);
149
130
  }
@@ -180,8 +161,6 @@ try {
180
161
  shellExec(`node bin/deploy build-nodejs-conf-api ${apiId} ${deployId} ${clientId}`);
181
162
 
182
163
  shellExec(`node bin/deploy build-nodejs-src-api ${apiId} ${deployId} ${clientId}`);
183
-
184
- // shellExec(`npm run dev ${deployId}`);
185
164
  }
186
165
  break;
187
166
  case 'new-nodejs-ws':
@@ -198,42 +177,6 @@ try {
198
177
  shellExec(`npm run dev ${deployId}`);
199
178
  }
200
179
  break;
201
- case 'build-full-client':
202
- {
203
- dotenv.config({ override: true });
204
- if (!process.argv[3]) process.argv[3] = 'dd-default';
205
- const { deployId } = loadConf(process.argv[3], process.argv[4] ?? '');
206
-
207
- let argHost = process.argv[5] ? process.argv[5].split(',') : [];
208
- let argPath = process.argv[6] ? process.argv[6].split(',') : [];
209
- let deployIdSingleReplicas = [];
210
- const serverConf = deployId
211
- ? JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'))
212
- : Config.default.server;
213
- for (const host of Object.keys(serverConf)) {
214
- for (const path of Object.keys(serverConf[host])) {
215
- if (argHost.length && argPath.length && (!argHost.includes(host) || !argPath.includes(path))) {
216
- delete serverConf[host][path];
217
- } else {
218
- serverConf[host][path].liteBuild = false;
219
- serverConf[host][path].minifyBuild = process.env.NODE_ENV === 'production' ? true : false;
220
- if (serverConf[host][path].singleReplica && serverConf[host][path].replicas) {
221
- deployIdSingleReplicas = deployIdSingleReplicas.concat(
222
- serverConf[host][path].replicas.map((replica) => buildReplicaId({ deployId, replica })),
223
- );
224
- }
225
- }
226
- }
227
- }
228
- fs.writeFileSync(`./conf/conf.server.json`, JSON.stringify(serverConf, null, 4), 'utf-8');
229
- await buildClient();
230
-
231
- for (const replicaDeployId of deployIdSingleReplicas) {
232
- shellExec(Cmd.conf(replicaDeployId, process.env.NODE_ENV));
233
- shellExec(Cmd.build(replicaDeployId));
234
- }
235
- }
236
- break;
237
180
 
238
181
  case 'update-dependencies':
239
182
  const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
@@ -244,102 +187,12 @@ try {
244
187
  const deployPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
245
188
  deployPackage.dependencies = originPackage.dependencies;
246
189
  deployPackage.devDependencies = originPackage.devDependencies;
190
+ deployPackage.overrides = originPackage.overrides;
247
191
  fs.writeFileSync(filePah, JSON.stringify(deployPackage, null, 4), 'utf8');
248
192
  }
249
193
  }
250
194
  break;
251
195
 
252
- case 'sync-env-port':
253
- const dataDeploy = getDataDeploy({ disableSyncEnvPort: true });
254
- const dataEnv = [
255
- { env: 'production', port: 3000 },
256
- { env: 'development', port: 4000 },
257
- { env: 'test', port: 5000 },
258
- ];
259
- let portOffset = 0;
260
- for (const deployIdObj of dataDeploy) {
261
- const { deployId } = deployIdObj;
262
- const baseConfPath = fs.existsSync(`./engine-private/replica/${deployId}`)
263
- ? `./engine-private/replica`
264
- : `./engine-private/conf`;
265
- for (const envInstanceObj of dataEnv) {
266
- const envPath = `${baseConfPath}/${deployId}/.env.${envInstanceObj.env}`;
267
- const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
268
- envObj.PORT = `${envInstanceObj.port + portOffset}`;
269
-
270
- writeEnv(envPath, envObj);
271
- }
272
- const serverConf = loadReplicas(
273
- deployId,
274
- JSON.parse(fs.readFileSync(`${baseConfPath}/${deployId}/conf.server.json`, 'utf8')),
275
- );
276
- for (const host of Object.keys(serverConf)) {
277
- for (const path of Object.keys(serverConf[host])) {
278
- if (serverConf[host][path].singleReplica) {
279
- portOffset--;
280
- continue;
281
- }
282
- portOffset++;
283
- if (serverConf[host][path].peer) portOffset++;
284
- }
285
- }
286
- }
287
- break;
288
-
289
- case 'build-single-replica': {
290
- const deployId = process.argv[3];
291
- const host = process.argv[4];
292
- const path = process.argv[5];
293
- const serverConf = loadReplicas(
294
- deployId,
295
- JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
296
- );
297
-
298
- if (serverConf[host][path].replicas) {
299
- {
300
- let replicaIndex = -1;
301
- for (const replica of serverConf[host][path].replicas) {
302
- replicaIndex++;
303
- const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
304
- // fs.mkdirSync(`./engine-private/replica/${deployId}${replicaIndex}`, { recursive: true });
305
- await fs.copy(`./engine-private/conf/${deployId}`, `./engine-private/replica/${replicaDeployId}`);
306
- fs.writeFileSync(
307
- `./engine-private/replica/${replicaDeployId}/package.json`,
308
- fs
309
- .readFileSync(`./engine-private/replica/${replicaDeployId}/package.json`, 'utf8')
310
- .replaceAll(`${deployId}`, `${replicaDeployId}`),
311
- 'utf8',
312
- );
313
- }
314
- }
315
- {
316
- let replicaIndex = -1;
317
- for (const replica of serverConf[host][path].replicas) {
318
- replicaIndex++;
319
- const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
320
- let replicaServerConf = JSON.parse(
321
- fs.readFileSync(`./engine-private/replica/${replicaDeployId}/conf.server.json`, 'utf8'),
322
- );
323
-
324
- const singleReplicaConf = replicaServerConf[host][path];
325
- singleReplicaConf.replicas = undefined;
326
- singleReplicaConf.singleReplica = undefined;
327
-
328
- replicaServerConf = {};
329
- replicaServerConf[host] = {};
330
- replicaServerConf[host][replica] = singleReplicaConf;
331
-
332
- fs.writeFileSync(
333
- `./engine-private/replica/${replicaDeployId}/conf.server.json`,
334
- JSON.stringify(replicaServerConf, null, 4),
335
- 'utf8',
336
- );
337
- }
338
- }
339
- }
340
- break;
341
- }
342
-
343
196
  case 'rename-package': {
344
197
  const name = process.argv[3];
345
198
  const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
@@ -365,129 +218,28 @@ try {
365
218
  break;
366
219
  }
367
220
 
368
- case 'version-build': {
369
- dotenv.config({ path: `./engine-private/conf/dd-cron/.env.production`, override: true });
370
- shellCd(`/home/dd/engine`);
371
- Underpost.repo.clean({ paths: ['/home/dd/engine', '/home/dd/engine/engine-private '] });
372
- shellExec(`node bin pull . ${process.env.GITHUB_USERNAME}/engine`);
373
- shellExec(`node bin run kill 4001`);
374
- shellExec(`node bin run kill 4002`);
375
- shellExec(`node bin run kill 4003`);
376
- shellExec(`npm run update-template`);
377
- shellExec(
378
- `cd ../pwa-microservices-template && npm install && echo "\nENABLE_FILE_LOGS=true" >> .env.development`,
379
- );
380
- shellExec(`cd ../pwa-microservices-template && npm run build && timeout 5s npm run dev`, {
381
- async: true,
382
- });
383
- await timer(5500);
384
- const templateRunnerResult = fs.readFileSync(`../pwa-microservices-template/logs/start.js/all.log`, 'utf8');
385
- logger.info('Test template runner result');
386
- console.log(templateRunnerResult);
387
- if (!templateRunnerResult || templateRunnerResult.toLowerCase().match('error')) {
388
- logger.error('Test template runner result failed');
389
- break;
390
- }
391
- shellCd(`/home/dd/engine`);
392
- Underpost.repo.clean({ paths: ['/home/dd/engine', '/home/dd/engine/engine-private '] });
393
- const originPackageJson = JSON.parse(fs.readFileSync(`package.json`, 'utf8'));
394
- const newVersion = process.argv[3] ?? originPackageJson.version;
395
- const node = process.argv[4] ?? 'kind-control-plane';
396
- const { version } = originPackageJson;
397
- originPackageJson.version = newVersion;
398
- fs.writeFileSync(`package.json`, JSON.stringify(originPackageJson, null, 4), 'utf8');
399
-
400
- const originPackageLockJson = JSON.parse(fs.readFileSync(`package-lock.json`, 'utf8'));
401
- originPackageLockJson.version = newVersion;
402
- originPackageLockJson.packages[''].version = newVersion;
403
- fs.writeFileSync(`package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
404
-
405
- if (fs.existsSync(`./engine-private/conf`)) {
406
- const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
407
- for (const relativePath of files) {
408
- const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
409
- if (filePah.split('/').pop() === 'package.json') {
410
- const originPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
411
- originPackage.version = newVersion;
412
- fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
413
- }
414
- if (filePah.split('/').pop() === 'deployment.yaml') {
415
- fs.writeFileSync(
416
- filePah,
417
- fs
418
- .readFileSync(filePah, 'utf8')
419
- .replaceAll(`v${version}`, `v${newVersion}`)
420
- .replaceAll(`engine.version: ${version}`, `engine.version: ${newVersion}`),
421
- 'utf8',
422
- );
423
- }
424
- }
425
- }
426
-
427
- fs.writeFileSync(
428
- `./manifests/deployment/dd-default-development/deployment.yaml`,
429
- fs
430
- .readFileSync(`./manifests/deployment/dd-default-development/deployment.yaml`, 'utf8')
431
- .replaceAll(`underpost:v${version}`, `underpost:v${newVersion}`),
432
- 'utf8',
433
- );
434
-
435
- if (fs.existsSync(`./.github/workflows/docker-image.ci.yml`))
436
- fs.writeFileSync(
437
- `./.github/workflows/docker-image.ci.yml`,
438
- fs
439
- .readFileSync(`./.github/workflows/docker-image.ci.yml`, 'utf8')
440
- .replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
441
- 'utf8',
442
- );
443
-
444
- fs.writeFileSync(
445
- `./src/index.js`,
446
- fs.readFileSync(`./src/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
447
- 'utf8',
448
- );
449
- shellExec(`node bin/deploy cli-docs ${version} ${newVersion}`);
450
- shellExec(`node bin/deploy update-dependencies`);
451
- shellExec(`node bin/build dd`);
452
- shellExec(
453
- `node bin deploy --kubeadm --build-manifest --sync --info-router --replicas 1 --node ${node} dd production`,
454
- );
455
- shellExec(
456
- `node bin deploy --kubeadm --build-manifest --sync --info-router --replicas 1 --node ${node} dd development `,
457
- );
458
- for (const deployId of fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(`,`)) {
459
- fs.copySync(
460
- `./engine-private/conf/${deployId}/build/development/deployment.yaml`,
461
- `./manifests/deployment/${deployId}-development/deployment.yaml`,
462
- );
463
- fs.copySync(
464
- `./engine-private/conf/${deployId}/build/development/proxy.yaml`,
465
- `./manifests/deployment/${deployId}-development/proxy.yaml`,
466
- );
221
+ case 'build-default-confs': {
222
+ for (const deployId of fs
223
+ .readFileSync(`./engine-private/deploy/dd.router`, 'utf8')
224
+ .split(`,`)
225
+ .concat(['dd-cron'])) {
226
+ if (fs.existsSync(`./engine-private/conf/${deployId}/build/development/deployment.yaml`))
227
+ fs.copySync(
228
+ `./engine-private/conf/${deployId}/build/development/deployment.yaml`,
229
+ `./manifests/deployment/${deployId}-development/deployment.yaml`,
230
+ );
231
+ if (fs.existsSync(`./engine-private/conf/${deployId}/build/development/proxy.yaml`))
232
+ fs.copySync(
233
+ `./engine-private/conf/${deployId}/build/development/proxy.yaml`,
234
+ `./manifests/deployment/${deployId}-development/proxy.yaml`,
235
+ );
236
+ if (fs.existsSync(`./engine-private/conf/${deployId}/build/development/pv-pvc.yaml`))
237
+ fs.copySync(
238
+ `./engine-private/conf/${deployId}/build/development/pv-pvc.yaml`,
239
+ `./manifests/deployment/${deployId}-development/pv-pvc.yaml`,
240
+ );
467
241
  shellExec(`node bin new --dev --default-conf --deploy-id ${deployId}`);
468
242
  }
469
- shellExec(`sudo rm -rf ./engine-private/conf/dd-default`);
470
- shellExec(`node bin new --deploy-id dd-default`);
471
- console.log(fs.existsSync(`./engine-private/conf/dd-default`));
472
- shellExec(`sudo rm -rf ./engine-private/conf/dd-default`);
473
- shellExec(`node bin cron --dev --setup-start`);
474
- shellExec(`node bin/deploy build-envs`);
475
- shellExec(`node bin cmt --changelog-build`);
476
- break;
477
- }
478
-
479
- case 'version-deploy': {
480
- dotenv.config({ path: `./engine-private/conf/dd-cron/.env.production`, override: true });
481
- shellExec(
482
- `underpost secret underpost --create-from-file /home/dd/engine/engine-private/conf/dd-cron/.env.production`,
483
- );
484
- shellExec(`node bin/deploy sync-envs`);
485
- shellExec(`node bin/build dd conf`);
486
- shellExec(`git add . && cd ./engine-private && git add .`);
487
- shellExec(`node bin cmt . ci package-pwa-microservices-template 'New release v:${process.argv[3]}'`);
488
- shellExec(`node bin cmt ./engine-private ci package-pwa-microservices-template`);
489
- shellExec(`node bin push . ${process.env.GITHUB_USERNAME}/engine`);
490
- shellExec(`cd ./engine-private && node ../bin push . ${process.env.GITHUB_USERNAME}/engine-private`);
491
243
  break;
492
244
  }
493
245
 
@@ -507,31 +259,6 @@ ${shellExec(`git log | grep Author: | sort -u`, { stdout: true }).split(`\n`).jo
507
259
  break;
508
260
  }
509
261
 
510
- case 'heb': {
511
- // https://besu.hyperledger.org/
512
- // https://github.com/hyperledger/besu/archive/refs/tags/24.9.1.tar.gz
513
-
514
- shellCd(`..`);
515
-
516
- // Download the Linux binary
517
- shellExec(`wget https://github.com/hyperledger/besu/releases/download/24.9.1/besu-24.9.1.tar.gz`);
518
-
519
- // Unzip the file:
520
- shellExec(`tar -xvzf besu-24.9.1.tar.gz`);
521
-
522
- shellCd(`besu-24.9.1`);
523
-
524
- shellExec(`bin/besu --help`);
525
-
526
- // Set env path
527
- // export PATH=$PATH:/home/dd/besu-24.9.1/bin
528
-
529
- // Open src
530
- // shellExec(`sudo code /home/dd/besu-24.9.1 --user-data-dir="/root/.vscode-root" --no-sandbox`);
531
-
532
- break;
533
- }
534
-
535
262
  case 'maas-db': {
536
263
  // DROP, ALTER, CREATE, WITH ENCRYPTED
537
264
  // sudo -u <user> -h <host> psql <db-name>
@@ -639,7 +366,10 @@ ${shellExec(`git log | grep Author: | sort -u`, { stdout: true }).split(`\n`).jo
639
366
  `${path}/.env`,
640
367
  fs
641
368
  .readFileSync(`${path}/.env`, 'utf8')
642
- .replace(`FIRST_SUPERUSER=admin@example.com`, `FIRST_SUPERUSER=development@underpost.net`)
369
+ .replace(
370
+ `FIRST_SUPERUSER=admin@example.com`,
371
+ `FIRST_SUPERUSER=${process.env.GITHUB_EMAIL || 'development@underpost.net'}`,
372
+ )
643
373
  .replace(`FIRST_SUPERUSER_PASSWORD=changethis`, `FIRST_SUPERUSER_PASSWORD=${password}`)
644
374
  .replace(`SECRET_KEY=changethis`, `SECRET_KEY=${password}`)
645
375
  .replace(`POSTGRES_DB=app`, `POSTGRES_DB=postgresdb`)
@@ -725,7 +455,7 @@ ${shellExec(`git log | grep Author: | sort -u`, { stdout: true }).split(`\n`).jo
725
455
  shellExec(
726
456
  `sudo kubectl create secret generic ${secretSelector}` +
727
457
  ` --from-file=SECRET_KEY=/home/dd/engine/engine-private/postgresql-password` +
728
- ` --from-literal=FIRST_SUPERUSER=development@underpost.net` +
458
+ ` --from-literal=FIRST_SUPERUSER=${process.env.GITHUB_EMAIL || 'development@underpost.net'}` +
729
459
  ` --from-file=FIRST_SUPERUSER_PASSWORD=/home/dd/engine/engine-private/postgresql-password` +
730
460
  ` --dry-run=client -o yaml | kubectl apply -f - -n ${namespace}`,
731
461
  );
@@ -873,71 +603,6 @@ nvidia/gpu-operator \
873
603
  break;
874
604
  }
875
605
 
876
- case 'udpate-version-files': {
877
- const oldNpmVersion = process.argv[3];
878
- const oldNodeVersion = process.argv[4];
879
- const oldNodeMajorVersion = oldNodeVersion.split('.')[0];
880
- const nodeVersion = shellExec(`node --version`, { stdout: true }).trim().replace('v', '');
881
- const newNodeMajorVersion = nodeVersion.split('.')[0];
882
- const npmVersion = shellExec(`npm --version`, { stdout: true }).trim();
883
-
884
- fs.writeFileSync(
885
- `README.md`,
886
- fs
887
- .readFileSync(`README.md`, 'utf8')
888
- .replaceAll(oldNodeVersion, nodeVersion)
889
- .replaceAll(oldNpmVersion, npmVersion),
890
- );
891
- fs.writeFileSync(
892
- `src/client/public/nexodev/docs/references/Getting started.md`,
893
- fs
894
- .readFileSync(`src/client/public/nexodev/docs/references/Getting started.md`, 'utf8')
895
- .replaceAll(oldNodeVersion, nodeVersion)
896
- .replaceAll(oldNpmVersion, npmVersion),
897
- );
898
-
899
- const workflowFiles = [
900
- `./.github/workflows/coverall.ci.yml`,
901
-
902
- `./.github/workflows/engine-core.ci.yml`,
903
-
904
- `./.github/workflows/engine-cyberia.ci.yml`,
905
-
906
- `./.github/workflows/engine-lampp.ci.yml`,
907
-
908
- `./.github/workflows/engine-test.ci.yml`,
909
-
910
- `./.github/workflows/ghpkg.ci.yml`,
911
-
912
- `./.github/workflows/npmpkg.ci.yml`,
913
-
914
- `./.github/workflows/publish.ci.yml`,
915
-
916
- `./.github/workflows/pwa-microservices-template-page.cd.yml`,
917
-
918
- `./.github/workflows/pwa-microservices-template-test.ci.yml`,
919
-
920
- `./.github/workflows/test-api-rest.cd.yml`,
921
-
922
- `./src/runtime/lampp/Dockerfile`,
923
-
924
- `./Dockerfile`,
925
- ];
926
-
927
- workflowFiles.forEach((file) => {
928
- fs.writeFileSync(
929
- file,
930
- fs
931
- .readFileSync(file, 'utf8')
932
- .replaceAll(oldNodeMajorVersion + '.x', newNodeMajorVersion + '.x')
933
- .replaceAll(oldNodeVersion, nodeVersion)
934
- .replaceAll(oldNpmVersion, npmVersion),
935
- );
936
- });
937
- pbcopy(`nvm alias default v${nodeVersion}`);
938
- break;
939
- }
940
-
941
606
  case 'tls': {
942
607
  fs.mkdirSync(`./engine-private/ssl/localhost`, { recursive: true });
943
608
  const targetDir = `./engine-private/ssl/${process.argv[3] ? process.argv[3] : 'localhost'}`;
@@ -988,12 +653,18 @@ nvidia/gpu-operator \
988
653
  }
989
654
 
990
655
  case 'sync-start': {
656
+ const targetDeployId = process.argv[3] || 'dd';
657
+ const deployIds =
658
+ targetDeployId === 'dd'
659
+ ? fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(',')
660
+ : [targetDeployId];
991
661
  const originPackageJson = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
992
- for (const deployId of fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(',')) {
662
+ for (const deployId of deployIds) {
993
663
  const packageJsonPath = `./engine-private/conf/${deployId}/package.json`;
994
664
  const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
995
- packageJson.scripts.start = `${originPackageJson.scripts.start} ${deployId}`;
665
+ packageJson.scripts = { start: `${originPackageJson.scripts.start} ${deployId}` };
996
666
  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 4), 'utf8');
667
+ logger.info(`sync-start`, { deployId, start: packageJson.scripts.start });
997
668
  }
998
669
  break;
999
670
  }
@@ -1013,9 +684,32 @@ nvidia/gpu-operator \
1013
684
  break;
1014
685
  }
1015
686
 
1016
- case 'envs': {
1017
- shellExec(`node bin/deploy sync-envs`);
1018
- shellExec(`node bin/deploy build-envs`);
687
+ case 'sync-conf': {
688
+ const originPackageJson = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
689
+ for (const deployId of ['dd-cron'].concat(
690
+ fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(','),
691
+ )) {
692
+ for (const file of fs.readdirSync(`./engine-private/conf/${deployId}/`)) {
693
+ const deployPackage = JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/package.json`, 'utf8'));
694
+ deployPackage.overrides = originPackageJson.overrides;
695
+ deployPackage.dependencies = originPackageJson.dependencies;
696
+ fs.writeFileSync(
697
+ `./engine-private/conf/${deployId}/package.json`,
698
+ JSON.stringify(deployPackage, null, 4),
699
+ 'utf8',
700
+ );
701
+ if (file.startsWith('conf.server') && file.endsWith('.json')) {
702
+ const filePath = `./engine-private/conf/${deployId}/${file}`;
703
+ const confObj = JSON.parse(fs.readFileSync(filePath, 'utf8'));
704
+ for (const host of Object.keys(confObj)) {
705
+ for (const path of Object.keys(confObj[host])) {
706
+ }
707
+ }
708
+ // fs.writeFileSync(filePath, JSON.stringify(confObj, null, 4), 'utf8');
709
+ logger.info(`sync-conf`, { deployId, file });
710
+ }
711
+ }
712
+ }
1019
713
  break;
1020
714
  }
1021
715
 
@@ -1040,7 +734,7 @@ nvidia/gpu-operator \
1040
734
  if (fs.existsSync(toPath)) fs.removeSync(toPath);
1041
735
  shellExec(`node bin/deploy pw-conf ${scriptPath}`);
1042
736
  shellExec(`kubectl delete deployment playwright-server --ignore-not-found`);
1043
- while (Underpost.deploy.get('playwright-server').length > 0) {
737
+ while (Underpost.kubectl.get('playwright-server').length > 0) {
1044
738
  logger.info(`Waiting for playwright-server deployment to be deleted...`);
1045
739
  await timer(1000);
1046
740
  }
@@ -1048,13 +742,13 @@ nvidia/gpu-operator \
1048
742
  const id = 'playwright-server';
1049
743
  await Underpost.test.statusMonitor(id);
1050
744
  const nameSpace = 'default';
1051
- const [pod] = Underpost.deploy.get(id);
745
+ const [pod] = Underpost.kubectl.get(id);
1052
746
  const podName = pod.NAME;
1053
747
  shellExec(`kubectl logs -f ${podName} -n ${nameSpace}`, {
1054
748
  async: true,
1055
749
  });
1056
750
  (async () => {
1057
- while (!Underpost.deploy.existsContainerFile({ podName, path: fromPath })) {
751
+ while (!Underpost.kubectl.existsFile({ podName, path: fromPath })) {
1058
752
  await timer(1000);
1059
753
  logger.info(`Waiting for file ${fromPath} in pod ${podName}...`);
1060
754
  }
@@ -1073,6 +767,198 @@ nvidia/gpu-operator \
1073
767
  `);
1074
768
  break;
1075
769
  }
770
+
771
+ case 'dependabot': {
772
+ dotenv.config({ path: `./engine-private/conf/dd-cron/.env.production`, override: true });
773
+ shellExec(`git fetch origin --prune`);
774
+
775
+ const { stdout: branchOutput } = shellExec(`git branch -r`, { silent: true });
776
+ const dependabotBranches = branchOutput
777
+ .split('\n')
778
+ .map((b) => b.trim())
779
+ .filter((b) => b.startsWith('remotes/origin/dependabot/') || b.startsWith('origin/dependabot/'))
780
+ .map((b) => b.replace(/^remotes\//, '').replace(/^origin\//, ''));
781
+
782
+ if (dependabotBranches.length === 0) {
783
+ logger.info('No remote dependabot branches found');
784
+ break;
785
+ }
786
+
787
+ logger.info('Found dependabot branches:', dependabotBranches);
788
+
789
+ // Stash local changes to prevent checkout/merge conflicts
790
+ const stashResult = shellExec(`git stash --include-untracked`, { silent: true });
791
+ const hasStash = !stashResult.stdout.includes('No local changes to save');
792
+
793
+ // Checkout master
794
+ const checkoutResult = shellExec(`git checkout master`);
795
+ if (checkoutResult.code !== 0) {
796
+ logger.error('Failed to checkout master');
797
+ if (hasStash) shellExec(`git stash pop`);
798
+ break;
799
+ }
800
+
801
+ // Pull latest master
802
+ shellExec(`git pull origin master`);
803
+
804
+ // Get repo URI from remote
805
+ const remoteUrl = shellExec(`git config --get remote.origin.url`, { stdout: true, silent: true }).trim();
806
+ const gitUri = remoteUrl.replace(/.*github\.com[:/]/, '').replace(/\.git$/, '');
807
+
808
+ const mergedBranches = [];
809
+ const failedBranches = [];
810
+
811
+ for (const branch of dependabotBranches) {
812
+ logger.info(`Merging branch: ${branch}`);
813
+ const mergeResult = shellExec(`git merge origin/${branch}`);
814
+ if (mergeResult.code === 0) {
815
+ const isAlreadyMerged = mergeResult.stdout && mergeResult.stdout.includes('Already up to date');
816
+ mergedBranches.push({ branch, isAlreadyMerged });
817
+ } else {
818
+ logger.error(`Failed to merge branch: ${branch}`);
819
+ shellExec(`git merge --abort`, { silent: true });
820
+ failedBranches.push(branch);
821
+ }
822
+ }
823
+
824
+ // Delete merged local and remote branches
825
+ for (const { branch, isAlreadyMerged } of mergedBranches) {
826
+ shellExec(`git branch -D ${branch}`, { silent: true });
827
+ // logger.info(`Deleting remote branch: ${branch}${isAlreadyMerged ? ' (already merged)' : ''}`);
828
+ // shellExec(`git push https://${process.env.GITHUB_TOKEN}@github.com/${gitUri}.git --delete ${branch}`, {
829
+ // disableLog: true,
830
+ // });
831
+ }
832
+
833
+ // Restore stashed changes
834
+ if (hasStash) shellExec(`git stash pop`);
835
+
836
+ logger.info(
837
+ 'Merged branches:',
838
+ mergedBranches.map((m) => m.branch),
839
+ );
840
+ if (failedBranches.length > 0) logger.warn('Failed branches:', failedBranches);
841
+ logger.info('Dependabot merge completed');
842
+ break;
843
+ }
844
+
845
+ case 'add-api': {
846
+ // node bin/deploy add-api <apiId> <deployId> [clientId] [host]
847
+ // Example: node bin/deploy add-api cyberia-dialogue dd-cyberia cyberia-portal
848
+ // Example: node bin/deploy add-api cyberia-dialogue dd-cyberia cyberia-portal underpost.net
849
+ //
850
+ // Adds an API to server conf files (main + dev variants) and client conf.
851
+ // - conf.server.json: adds apiId to every host/path that has an `apis` array
852
+ // (or only to the specified host if [host] is provided)
853
+ // - conf.server.dev.*.json: same treatment for all dev variants
854
+ // - conf.client.json: adds apiId to the specified clientId's `services` array
855
+ // Idempotent: skips if the API is already present.
856
+
857
+ const apiId = process.argv[3];
858
+ const deployId = process.argv[4];
859
+ const clientId = process.argv[5];
860
+ const targetHost = process.argv[6];
861
+
862
+ if (!apiId || !deployId) {
863
+ logger.error('Usage: node bin/deploy add-api <apiId> <deployId> [clientId] [host]');
864
+ logger.error('Example: node bin/deploy add-api cyberia-dialogue dd-cyberia cyberia-portal');
865
+ logger.error('Example: node bin/deploy add-api cyberia-dialogue dd-cyberia cyberia-portal underpost.net');
866
+ process.exit(1);
867
+ }
868
+
869
+ const confFolder = `./engine-private/conf/${deployId}`;
870
+ if (!fs.existsSync(confFolder)) {
871
+ logger.error(`Config folder not found: ${confFolder}`);
872
+ process.exit(1);
873
+ }
874
+
875
+ // Helper: add apiId to apis[] arrays in a server conf file (idempotent)
876
+ // When targetHost is set, only entries under that host are modified.
877
+ const addApiToServerConf = (filePath) => {
878
+ if (!fs.existsSync(filePath)) return 0;
879
+ const conf = JSON.parse(fs.readFileSync(filePath, 'utf8'));
880
+ let count = 0;
881
+ const hosts = targetHost ? (conf[targetHost] ? [targetHost] : []) : Object.keys(conf);
882
+ for (const host of hosts) {
883
+ for (const path of Object.keys(conf[host])) {
884
+ const entry = conf[host][path];
885
+ if (Array.isArray(entry.apis) && entry.apis.length > 0 && !entry.apis.includes(apiId)) {
886
+ entry.apis.push(apiId);
887
+ count++;
888
+ }
889
+ }
890
+ }
891
+ if (count > 0) {
892
+ fs.writeFileSync(filePath, JSON.stringify(conf, null, 4), 'utf8');
893
+ }
894
+ return count;
895
+ };
896
+
897
+ // 1. Main conf.server.json
898
+ const mainPath = `${confFolder}/conf.server.json`;
899
+ const mainCount = addApiToServerConf(mainPath);
900
+ logger.info(`conf.server.json: added "${apiId}" to ${mainCount} path(s)`);
901
+
902
+ // 2. All dev variants: conf.server.dev.*.json
903
+ const devFiles = fs
904
+ .readdirSync(confFolder)
905
+ .filter((f) => f.startsWith('conf.server.dev.') && f.endsWith('.json'));
906
+ for (const devFile of devFiles) {
907
+ const devPath = `${confFolder}/${devFile}`;
908
+ const devCount = addApiToServerConf(devPath);
909
+ logger.info(`${devFile}: added "${apiId}" to ${devCount} path(s)`);
910
+ }
911
+
912
+ // Helper: add apiId to a client conf file's clientId services (idempotent)
913
+ const addApiToClientConf = (filePath, label) => {
914
+ if (!clientId || !fs.existsSync(filePath)) return;
915
+ const confClient = JSON.parse(fs.readFileSync(filePath, 'utf8'));
916
+ if (confClient[clientId] && Array.isArray(confClient[clientId].services)) {
917
+ if (!confClient[clientId].services.includes(apiId)) {
918
+ confClient[clientId].services.push(apiId);
919
+ fs.writeFileSync(filePath, JSON.stringify(confClient, null, 4), 'utf8');
920
+ logger.info(`${label}: added "${apiId}" to "${clientId}" services`);
921
+ } else {
922
+ logger.info(`${label}: "${apiId}" already in "${clientId}" services`);
923
+ }
924
+ } else {
925
+ logger.warn(`${label}: clientId "${clientId}" not found or has no services array`);
926
+ }
927
+ };
928
+
929
+ // 3. Client conf.client.json
930
+ addApiToClientConf(`${confFolder}/conf.client.json`, 'conf.client.json');
931
+
932
+ // 4. Replicas: engine-private/replica/<deployId>-*
933
+ const replicaBase = './engine-private/replica';
934
+ if (fs.existsSync(replicaBase)) {
935
+ const replicaDirs = fs
936
+ .readdirSync(replicaBase)
937
+ .filter((d) => d.startsWith(`${deployId}-`) && fs.statSync(`${replicaBase}/${d}`).isDirectory());
938
+ for (const replicaDir of replicaDirs) {
939
+ const replicaFolder = `${replicaBase}/${replicaDir}`;
940
+ // Server conf
941
+ const rMainCount = addApiToServerConf(`${replicaFolder}/conf.server.json`);
942
+ logger.info(`replica/${replicaDir}/conf.server.json: added "${apiId}" to ${rMainCount} path(s)`);
943
+ // Dev variants
944
+ const rDevFiles = fs
945
+ .readdirSync(replicaFolder)
946
+ .filter((f) => f.startsWith('conf.server.dev.') && f.endsWith('.json'));
947
+ for (const rDevFile of rDevFiles) {
948
+ const rDevCount = addApiToServerConf(`${replicaFolder}/${rDevFile}`);
949
+ logger.info(`replica/${replicaDir}/${rDevFile}: added "${apiId}" to ${rDevCount} path(s)`);
950
+ }
951
+ // Client conf
952
+ addApiToClientConf(`${replicaFolder}/conf.client.json`, `replica/${replicaDir}/conf.client.json`);
953
+ }
954
+ }
955
+
956
+ // 5. Rebuild default conf
957
+ shellExec(`node bin new --default-conf --deploy-id ${deployId}`);
958
+ logger.info(`Rebuilt default conf for ${deployId}`);
959
+
960
+ break;
961
+ }
1076
962
  }
1077
963
  } catch (error) {
1078
964
  logger.error(error, error.stack);