cyberia 2.8.885

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 (525) hide show
  1. package/.dockerignore +15 -0
  2. package/.env.development +45 -0
  3. package/.env.production +50 -0
  4. package/.env.test +45 -0
  5. package/.github/workflows/engine-cyberia.cd.yml +31 -0
  6. package/.github/workflows/engine-cyberia.ci.yml +60 -0
  7. package/.github/workflows/ghpkg.ci.yml +87 -0
  8. package/.github/workflows/npmpkg.ci.yml +72 -0
  9. package/.github/workflows/publish.ci.yml +84 -0
  10. package/.github/workflows/publish.cyberia.ci.yml +84 -0
  11. package/.github/workflows/pwa-microservices-template-page.cd.yml +72 -0
  12. package/.github/workflows/pwa-microservices-template-test.ci.yml +33 -0
  13. package/.github/workflows/release.cd.yml +37 -0
  14. package/.nycrc +9 -0
  15. package/.prettierignore +13 -0
  16. package/.prettierrc +9 -0
  17. package/.vscode/extensions.json +51 -0
  18. package/.vscode/settings.json +87 -0
  19. package/AUTHORS.md +21 -0
  20. package/CHANGELOG.md +205 -0
  21. package/Dockerfile +28 -0
  22. package/LICENSE +21 -0
  23. package/README.md +85 -0
  24. package/bin/build.js +209 -0
  25. package/bin/cron.js +47 -0
  26. package/bin/cyberia.js +145 -0
  27. package/bin/db.js +199 -0
  28. package/bin/deploy.js +1293 -0
  29. package/bin/file.js +197 -0
  30. package/bin/hwt.js +49 -0
  31. package/bin/index.js +145 -0
  32. package/bin/ssl.js +63 -0
  33. package/bin/util.js +80 -0
  34. package/bin/vs.js +74 -0
  35. package/cli.md +714 -0
  36. package/conf.js +204 -0
  37. package/deployment.yaml +138 -0
  38. package/jsconfig.json +7 -0
  39. package/jsdoc.json +32 -0
  40. package/manifests/deployment/adminer/deployment.yaml +32 -0
  41. package/manifests/deployment/adminer/kustomization.yaml +7 -0
  42. package/manifests/deployment/adminer/service.yaml +13 -0
  43. package/manifests/deployment/dd-default-development/deployment.yaml +167 -0
  44. package/manifests/deployment/dd-default-development/proxy.yaml +46 -0
  45. package/manifests/deployment/dd-test-development/deployment.yaml +174 -0
  46. package/manifests/deployment/dd-test-development/proxy.yaml +51 -0
  47. package/manifests/deployment/fastapi/backend-deployment.yml +120 -0
  48. package/manifests/deployment/fastapi/backend-service.yml +19 -0
  49. package/manifests/deployment/fastapi/frontend-deployment.yml +54 -0
  50. package/manifests/deployment/fastapi/frontend-service.yml +15 -0
  51. package/manifests/deployment/fastapi/initial_data.sh +56 -0
  52. package/manifests/deployment/kafka/deployment.yaml +69 -0
  53. package/manifests/deployment/mongo-express/deployment.yaml +60 -0
  54. package/manifests/deployment/phpmyadmin/deployment.yaml +54 -0
  55. package/manifests/deployment/spark/spark-pi-py.yaml +21 -0
  56. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
  57. package/manifests/envoy-service-nodeport.yaml +23 -0
  58. package/manifests/grafana/deployment.yaml +57 -0
  59. package/manifests/grafana/kustomization.yaml +7 -0
  60. package/manifests/grafana/pvc.yaml +12 -0
  61. package/manifests/grafana/service.yaml +14 -0
  62. package/manifests/kind-config-dev.yaml +12 -0
  63. package/manifests/kind-config.yaml +12 -0
  64. package/manifests/kubeadm-calico-config.yaml +119 -0
  65. package/manifests/kubelet-config.yaml +65 -0
  66. package/manifests/letsencrypt-prod.yaml +15 -0
  67. package/manifests/lxd/lxd-admin-profile.yaml +17 -0
  68. package/manifests/lxd/lxd-preseed.yaml +30 -0
  69. package/manifests/lxd/underpost-setup.sh +163 -0
  70. package/manifests/mariadb/config.yaml +10 -0
  71. package/manifests/mariadb/kustomization.yaml +9 -0
  72. package/manifests/mariadb/pv.yaml +12 -0
  73. package/manifests/mariadb/pvc.yaml +10 -0
  74. package/manifests/mariadb/secret.yaml +8 -0
  75. package/manifests/mariadb/service.yaml +10 -0
  76. package/manifests/mariadb/statefulset.yaml +56 -0
  77. package/manifests/mariadb/storage-class.yaml +10 -0
  78. package/manifests/mongodb/backup-access.yaml +16 -0
  79. package/manifests/mongodb/backup-cronjob.yaml +42 -0
  80. package/manifests/mongodb/backup-pv-pvc.yaml +22 -0
  81. package/manifests/mongodb/configmap.yaml +26 -0
  82. package/manifests/mongodb/headless-service.yaml +10 -0
  83. package/manifests/mongodb/kustomization.yaml +11 -0
  84. package/manifests/mongodb/pv-pvc.yaml +23 -0
  85. package/manifests/mongodb/statefulset.yaml +126 -0
  86. package/manifests/mongodb/storage-class.yaml +9 -0
  87. package/manifests/mongodb-4.4/kustomization.yaml +7 -0
  88. package/manifests/mongodb-4.4/pv-pvc.yaml +23 -0
  89. package/manifests/mongodb-4.4/service-deployment.yaml +63 -0
  90. package/manifests/mysql/kustomization.yaml +7 -0
  91. package/manifests/mysql/pv-pvc.yaml +27 -0
  92. package/manifests/mysql/statefulset.yaml +55 -0
  93. package/manifests/postgresql/configmap.yaml +9 -0
  94. package/manifests/postgresql/kustomization.yaml +10 -0
  95. package/manifests/postgresql/pv.yaml +15 -0
  96. package/manifests/postgresql/pvc.yaml +13 -0
  97. package/manifests/postgresql/service.yaml +10 -0
  98. package/manifests/postgresql/statefulset.yaml +37 -0
  99. package/manifests/prometheus/deployment.yaml +82 -0
  100. package/manifests/valkey/kustomization.yaml +7 -0
  101. package/manifests/valkey/service.yaml +11 -0
  102. package/manifests/valkey/statefulset.yaml +38 -0
  103. package/nodemon.json +6 -0
  104. package/package.json +118 -0
  105. package/proxy.yaml +35 -0
  106. package/scripts/device-scan.sh +43 -0
  107. package/scripts/gpu-diag.sh +19 -0
  108. package/scripts/maas-setup.sh +120 -0
  109. package/scripts/nat-iptables.sh +26 -0
  110. package/scripts/nvim.sh +91 -0
  111. package/scripts/snap-clean.sh +26 -0
  112. package/scripts/ssh-cluster-info.sh +14 -0
  113. package/scripts/ssl.sh +164 -0
  114. package/src/api/blockchain/blockchain.controller.js +51 -0
  115. package/src/api/blockchain/blockchain.model.js +90 -0
  116. package/src/api/blockchain/blockchain.router.js +21 -0
  117. package/src/api/blockchain/blockchain.service.js +24 -0
  118. package/src/api/core/core.controller.js +69 -0
  119. package/src/api/core/core.model.js +11 -0
  120. package/src/api/core/core.router.js +24 -0
  121. package/src/api/core/core.service.js +35 -0
  122. package/src/api/crypto/crypto.controller.js +51 -0
  123. package/src/api/crypto/crypto.model.js +23 -0
  124. package/src/api/crypto/crypto.router.js +20 -0
  125. package/src/api/crypto/crypto.service.js +64 -0
  126. package/src/api/default/default.controller.js +74 -0
  127. package/src/api/default/default.model.js +20 -0
  128. package/src/api/default/default.router.js +27 -0
  129. package/src/api/default/default.service.js +40 -0
  130. package/src/api/document/document.controller.js +66 -0
  131. package/src/api/document/document.model.js +51 -0
  132. package/src/api/document/document.router.js +24 -0
  133. package/src/api/document/document.service.js +133 -0
  134. package/src/api/file/file.controller.js +67 -0
  135. package/src/api/file/file.model.js +19 -0
  136. package/src/api/file/file.router.js +22 -0
  137. package/src/api/file/file.service.js +100 -0
  138. package/src/api/instance/instance.controller.js +69 -0
  139. package/src/api/instance/instance.model.js +40 -0
  140. package/src/api/instance/instance.router.js +34 -0
  141. package/src/api/instance/instance.service.js +70 -0
  142. package/src/api/ipfs/ipfs.controller.js +51 -0
  143. package/src/api/ipfs/ipfs.model.js +17 -0
  144. package/src/api/ipfs/ipfs.router.js +20 -0
  145. package/src/api/ipfs/ipfs.service.js +25 -0
  146. package/src/api/object-layer/README.md +85 -0
  147. package/src/api/object-layer/object-layer.controller.js +69 -0
  148. package/src/api/object-layer/object-layer.model.js +181 -0
  149. package/src/api/object-layer/object-layer.router.js +29 -0
  150. package/src/api/object-layer/object-layer.service.js +49 -0
  151. package/src/api/test/test.controller.js +59 -0
  152. package/src/api/test/test.model.js +14 -0
  153. package/src/api/test/test.router.js +21 -0
  154. package/src/api/test/test.service.js +35 -0
  155. package/src/api/user/postman_collection.json +216 -0
  156. package/src/api/user/user.build.js +16 -0
  157. package/src/api/user/user.controller.js +35 -0
  158. package/src/api/user/user.model.js +100 -0
  159. package/src/api/user/user.router.js +400 -0
  160. package/src/api/user/user.service.js +500 -0
  161. package/src/api.js +23 -0
  162. package/src/cli/baremetal.js +1310 -0
  163. package/src/cli/cloud-init.js +548 -0
  164. package/src/cli/cluster.js +834 -0
  165. package/src/cli/cron.js +95 -0
  166. package/src/cli/db.js +414 -0
  167. package/src/cli/deploy.js +661 -0
  168. package/src/cli/env.js +101 -0
  169. package/src/cli/fs.js +256 -0
  170. package/src/cli/image.js +156 -0
  171. package/src/cli/index.js +436 -0
  172. package/src/cli/lxd.js +402 -0
  173. package/src/cli/monitor.js +260 -0
  174. package/src/cli/repository.js +274 -0
  175. package/src/cli/run.js +728 -0
  176. package/src/cli/script.js +85 -0
  177. package/src/cli/secrets.js +71 -0
  178. package/src/cli/ssh.js +46 -0
  179. package/src/cli/test.js +159 -0
  180. package/src/client/Cyberia.index.js +50 -0
  181. package/src/client/CyberiaAdmin.index.js +34 -0
  182. package/src/client/CyberiaPortal.index.js +36 -0
  183. package/src/client/Default.index.js +84 -0
  184. package/src/client/components/core/404.js +20 -0
  185. package/src/client/components/core/500.js +20 -0
  186. package/src/client/components/core/Account.js +326 -0
  187. package/src/client/components/core/AgGrid.js +191 -0
  188. package/src/client/components/core/Alert.js +77 -0
  189. package/src/client/components/core/Auth.js +342 -0
  190. package/src/client/components/core/Badge.js +32 -0
  191. package/src/client/components/core/Blockchain.js +41 -0
  192. package/src/client/components/core/Blog.js +9 -0
  193. package/src/client/components/core/BtnIcon.js +111 -0
  194. package/src/client/components/core/CalendarCore.js +464 -0
  195. package/src/client/components/core/Chat.js +64 -0
  196. package/src/client/components/core/ColorPalette.js +5267 -0
  197. package/src/client/components/core/CommonJs.js +1010 -0
  198. package/src/client/components/core/Content.js +196 -0
  199. package/src/client/components/core/Css.js +1099 -0
  200. package/src/client/components/core/CssCore.js +882 -0
  201. package/src/client/components/core/D3Chart.js +44 -0
  202. package/src/client/components/core/Docs.js +376 -0
  203. package/src/client/components/core/DropDown.js +223 -0
  204. package/src/client/components/core/EventsUI.js +133 -0
  205. package/src/client/components/core/FileExplorer.js +707 -0
  206. package/src/client/components/core/FullScreen.js +36 -0
  207. package/src/client/components/core/Input.js +383 -0
  208. package/src/client/components/core/JoyStick.js +80 -0
  209. package/src/client/components/core/Keyboard.js +73 -0
  210. package/src/client/components/core/LoadingAnimation.js +159 -0
  211. package/src/client/components/core/LogIn.js +190 -0
  212. package/src/client/components/core/LogOut.js +63 -0
  213. package/src/client/components/core/Logger.js +29 -0
  214. package/src/client/components/core/Modal.js +2494 -0
  215. package/src/client/components/core/NotificationManager.js +84 -0
  216. package/src/client/components/core/ObjectLayerEngine.js +1229 -0
  217. package/src/client/components/core/ObjectLayerEngineModal.js +443 -0
  218. package/src/client/components/core/Pagination.js +207 -0
  219. package/src/client/components/core/Panel.js +772 -0
  220. package/src/client/components/core/PanelForm.js +627 -0
  221. package/src/client/components/core/Polyhedron.js +162 -0
  222. package/src/client/components/core/Recover.js +207 -0
  223. package/src/client/components/core/Responsive.js +82 -0
  224. package/src/client/components/core/RichText.js +43 -0
  225. package/src/client/components/core/Router.js +317 -0
  226. package/src/client/components/core/Scroll.js +76 -0
  227. package/src/client/components/core/SignUp.js +125 -0
  228. package/src/client/components/core/SocketIo.js +74 -0
  229. package/src/client/components/core/Stream.js +113 -0
  230. package/src/client/components/core/ToggleSwitch.js +101 -0
  231. package/src/client/components/core/ToolTip.js +90 -0
  232. package/src/client/components/core/Translate.js +522 -0
  233. package/src/client/components/core/Validator.js +115 -0
  234. package/src/client/components/core/VanillaJs.js +423 -0
  235. package/src/client/components/core/Wallet.js +106 -0
  236. package/src/client/components/core/WebComponent.js +44 -0
  237. package/src/client/components/core/Webhook.js +25 -0
  238. package/src/client/components/core/Worker.js +371 -0
  239. package/src/client/components/core/windowGetDimensions.js +269 -0
  240. package/src/client/components/cyberia/BagCyberia.js +1253 -0
  241. package/src/client/components/cyberia/BiomeCyberia.js +130 -0
  242. package/src/client/components/cyberia/CharacterCyberia.js +321 -0
  243. package/src/client/components/cyberia/CommonCyberia.js +1834 -0
  244. package/src/client/components/cyberia/CssCyberia.js +816 -0
  245. package/src/client/components/cyberia/ElementPreviewCyberia.js +183 -0
  246. package/src/client/components/cyberia/ElementsCyberia.js +146 -0
  247. package/src/client/components/cyberia/InteractionPanelCyberia.js +1043 -0
  248. package/src/client/components/cyberia/JoyStickCyberia.js +53 -0
  249. package/src/client/components/cyberia/LogInCyberia.js +68 -0
  250. package/src/client/components/cyberia/LogOutCyberia.js +24 -0
  251. package/src/client/components/cyberia/MainUserCyberia.js +424 -0
  252. package/src/client/components/cyberia/MapCyberia.js +160 -0
  253. package/src/client/components/cyberia/MatrixCyberia.js +147 -0
  254. package/src/client/components/cyberia/MenuCyberia.js +575 -0
  255. package/src/client/components/cyberia/PixiCyberia.js +1639 -0
  256. package/src/client/components/cyberia/PointAndClickMovementCyberia.js +146 -0
  257. package/src/client/components/cyberia/QuestCyberia.js +1420 -0
  258. package/src/client/components/cyberia/RoutesCyberia.js +47 -0
  259. package/src/client/components/cyberia/SettingsCyberia.js +16 -0
  260. package/src/client/components/cyberia/SignUpCyberia.js +14 -0
  261. package/src/client/components/cyberia/SkillCyberia.js +124 -0
  262. package/src/client/components/cyberia/SocketIoCyberia.js +211 -0
  263. package/src/client/components/cyberia/TileCyberia.js +685 -0
  264. package/src/client/components/cyberia/TranslateCyberia.js +96 -0
  265. package/src/client/components/cyberia/UniverseCyberia.js +14 -0
  266. package/src/client/components/cyberia/WebhookCyberia.js +13 -0
  267. package/src/client/components/cyberia/WikiCyberia.js +144 -0
  268. package/src/client/components/cyberia/WorldCyberia.js +680 -0
  269. package/src/client/components/cyberia-admin/BiomeCyberiaAdmin.js +978 -0
  270. package/src/client/components/cyberia-admin/CommonCyberiaAdmin.js +29 -0
  271. package/src/client/components/cyberia-admin/CssCyberiaAdmin.js +15 -0
  272. package/src/client/components/cyberia-admin/ElementsCyberiaAdmin.js +38 -0
  273. package/src/client/components/cyberia-admin/InstanceEngineCyberiaAdmin.js +180 -0
  274. package/src/client/components/cyberia-admin/LogInCyberiaAdmin.js +34 -0
  275. package/src/client/components/cyberia-admin/LogOutCyberiaAdmin.js +24 -0
  276. package/src/client/components/cyberia-admin/MenuCyberiaAdmin.js +660 -0
  277. package/src/client/components/cyberia-admin/RoutesCyberiaAdmin.js +57 -0
  278. package/src/client/components/cyberia-admin/ServerCyberiaAdmin.js +129 -0
  279. package/src/client/components/cyberia-admin/SettingsCyberiaAdmin.js +16 -0
  280. package/src/client/components/cyberia-admin/SignUpCyberiaAdmin.js +11 -0
  281. package/src/client/components/cyberia-admin/SocketIoCyberiaAdmin.js +53 -0
  282. package/src/client/components/cyberia-admin/TranslateCyberiaAdmin.js +7 -0
  283. package/src/client/components/cyberia-biome/CityCyberiaBiome.js +209 -0
  284. package/src/client/components/cyberia-biome/CityInteriorCyberiaBiome.js +253 -0
  285. package/src/client/components/cyberia-biome/ColorChaosCyberiaBiome.js +26 -0
  286. package/src/client/components/cyberia-biome/ForestCyberiaBiome.js +191 -0
  287. package/src/client/components/cyberia-biome/GridBaseCyberiaBiome.js +364 -0
  288. package/src/client/components/cyberia-biome/SeedCityCyberiaBiome.js +347 -0
  289. package/src/client/components/cyberia-biome/ShopCyberiaBiome.js +12 -0
  290. package/src/client/components/cyberia-biome/SpaceCyberiaBiome.js +58 -0
  291. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +29 -0
  292. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +132 -0
  293. package/src/client/components/cyberia-portal/ElementsCyberiaPortal.js +38 -0
  294. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +18 -0
  295. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +12 -0
  296. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +487 -0
  297. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +45 -0
  298. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +136 -0
  299. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +16 -0
  300. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +11 -0
  301. package/src/client/components/cyberia-portal/SocketIoCyberiaPortal.js +52 -0
  302. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +12 -0
  303. package/src/client/components/default/CommonDefault.js +29 -0
  304. package/src/client/components/default/CssDefault.js +27 -0
  305. package/src/client/components/default/ElementsDefault.js +38 -0
  306. package/src/client/components/default/LogInDefault.js +14 -0
  307. package/src/client/components/default/LogOutDefault.js +10 -0
  308. package/src/client/components/default/MenuDefault.js +743 -0
  309. package/src/client/components/default/RoutesDefault.js +48 -0
  310. package/src/client/components/default/SettingsDefault.js +16 -0
  311. package/src/client/components/default/SignUpDefault.js +9 -0
  312. package/src/client/components/default/SocketIoDefault.js +54 -0
  313. package/src/client/components/default/TranslateDefault.js +7 -0
  314. package/src/client/public/default/android-chrome-144x144.png +0 -0
  315. package/src/client/public/default/android-chrome-192x192.png +0 -0
  316. package/src/client/public/default/android-chrome-256x256.png +0 -0
  317. package/src/client/public/default/android-chrome-36x36.png +0 -0
  318. package/src/client/public/default/android-chrome-384x384.png +0 -0
  319. package/src/client/public/default/android-chrome-48x48.png +0 -0
  320. package/src/client/public/default/android-chrome-512x512.png +0 -0
  321. package/src/client/public/default/android-chrome-72x72.png +0 -0
  322. package/src/client/public/default/android-chrome-96x96.png +0 -0
  323. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  324. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  325. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  326. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  327. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  328. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  329. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  330. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  331. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  332. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  333. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  334. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  335. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  336. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  337. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  338. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  339. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  340. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  341. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  342. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  343. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  344. package/src/client/public/default/apple-touch-icon.png +0 -0
  345. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  346. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  347. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  348. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  349. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  350. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  351. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  352. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  353. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  354. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  355. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  356. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  357. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  358. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  359. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  360. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  361. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  362. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  363. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  364. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  365. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  366. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  367. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  368. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  369. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  370. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  371. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  372. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  373. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  374. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  375. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  376. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  377. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  378. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  379. package/src/client/public/default/assets/background/dark.jpg +0 -0
  380. package/src/client/public/default/assets/background/dark.svg +557 -0
  381. package/src/client/public/default/assets/background/white.jpg +0 -0
  382. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  383. package/src/client/public/default/assets/background/white0.jpg +0 -0
  384. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  385. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  386. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  387. package/src/client/public/default/assets/mailer/api-user-default-avatar.png +0 -0
  388. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  389. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  390. package/src/client/public/default/browserconfig.xml +12 -0
  391. package/src/client/public/default/favicon-16x16.png +0 -0
  392. package/src/client/public/default/favicon-32x32.png +0 -0
  393. package/src/client/public/default/favicon-48x48.png +0 -0
  394. package/src/client/public/default/favicon.ico +0 -0
  395. package/src/client/public/default/manifest.webmanifest +69 -0
  396. package/src/client/public/default/mstile-144x144.png +0 -0
  397. package/src/client/public/default/mstile-150x150.png +0 -0
  398. package/src/client/public/default/mstile-310x150.png +0 -0
  399. package/src/client/public/default/mstile-310x310.png +0 -0
  400. package/src/client/public/default/mstile-70x70.png +0 -0
  401. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  402. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  403. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  404. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  405. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  406. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  407. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  408. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  409. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  410. package/src/client/public/default/site.webmanifest +69 -0
  411. package/src/client/public/default/sitemap +148 -0
  412. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  413. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  414. package/src/client/public/doc/favicon.ico +0 -0
  415. package/src/client/public/doc/sitemap +148 -0
  416. package/src/client/public/test/favicon.ico +0 -0
  417. package/src/client/public/test/sitemap +148 -0
  418. package/src/client/services/blockchain/blockchain.service.js +73 -0
  419. package/src/client/services/core/core.service.js +165 -0
  420. package/src/client/services/crypto/crypto.service.js +73 -0
  421. package/src/client/services/default/default.management.js +450 -0
  422. package/src/client/services/default/default.service.js +98 -0
  423. package/src/client/services/document/document.service.js +97 -0
  424. package/src/client/services/file/file.service.js +72 -0
  425. package/src/client/services/instance/instance.management.js +78 -0
  426. package/src/client/services/instance/instance.service.js +97 -0
  427. package/src/client/services/ipfs/ipfs.service.js +73 -0
  428. package/src/client/services/object-layer/object-layer.service.js +93 -0
  429. package/src/client/services/test/test.service.js +73 -0
  430. package/src/client/services/user/user.management.js +56 -0
  431. package/src/client/services/user/user.service.js +108 -0
  432. package/src/client/ssr/Render.js +237 -0
  433. package/src/client/ssr/body/404.js +73 -0
  434. package/src/client/ssr/body/500.js +72 -0
  435. package/src/client/ssr/body/CacheControl.js +114 -0
  436. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +90 -0
  437. package/src/client/ssr/body/CyberiaSplashScreenLore.js +424 -0
  438. package/src/client/ssr/body/DefaultSplashScreen.js +90 -0
  439. package/src/client/ssr/email/DefaultRecoverEmail.js +21 -0
  440. package/src/client/ssr/email/DefaultVerifyEmail.js +17 -0
  441. package/src/client/ssr/head/Css.js +241 -0
  442. package/src/client/ssr/head/CyberiaAdminScripts.js +6 -0
  443. package/src/client/ssr/head/CyberiaPortalScripts.js +6 -0
  444. package/src/client/ssr/head/CyberiaScripts.js +6 -0
  445. package/src/client/ssr/head/DefaultScripts.js +6 -0
  446. package/src/client/ssr/head/Microdata.js +11 -0
  447. package/src/client/ssr/head/Production.js +1 -0
  448. package/src/client/ssr/head/Pwa.js +146 -0
  449. package/src/client/ssr/head/Seo.js +15 -0
  450. package/src/client/ssr/mailer/DefaultRecoverEmail.js +21 -0
  451. package/src/client/ssr/mailer/DefaultVerifyEmail.js +17 -0
  452. package/src/client/ssr/offline/Maintenance.js +63 -0
  453. package/src/client/ssr/offline/NoNetworkConnection.js +67 -0
  454. package/src/client/ssr/pages/404.js +12 -0
  455. package/src/client/ssr/pages/500.js +12 -0
  456. package/src/client/ssr/pages/Test.js +198 -0
  457. package/src/client/ssr/pages/maintenance.js +14 -0
  458. package/src/client/ssr/pages/offline.js +21 -0
  459. package/src/client/sw/default.sw.js +108 -0
  460. package/src/client/sw/template.sw.js +84 -0
  461. package/src/client.build.js +22 -0
  462. package/src/client.dev.js +24 -0
  463. package/src/db/DataBaseProvider.js +98 -0
  464. package/src/db/mariadb/MariaDB.js +66 -0
  465. package/src/db/mongo/MongooseDB.js +70 -0
  466. package/src/index.js +198 -0
  467. package/src/mailer/EmailRender.js +116 -0
  468. package/src/mailer/MailerProvider.js +213 -0
  469. package/src/monitor.js +24 -0
  470. package/src/proxy.js +22 -0
  471. package/src/runtime/express/Express.js +256 -0
  472. package/src/runtime/lampp/Dockerfile +50 -0
  473. package/src/runtime/lampp/Lampp.js +343 -0
  474. package/src/server/auth.js +689 -0
  475. package/src/server/backup.js +96 -0
  476. package/src/server/client-build-docs.js +205 -0
  477. package/src/server/client-build-live.js +109 -0
  478. package/src/server/client-build.js +690 -0
  479. package/src/server/client-dev-server.js +87 -0
  480. package/src/server/client-formatted.js +87 -0
  481. package/src/server/client-icons.js +108 -0
  482. package/src/server/conf.js +1071 -0
  483. package/src/server/crypto.js +210 -0
  484. package/src/server/dns.js +276 -0
  485. package/src/server/downloader.js +74 -0
  486. package/src/server/json-schema.js +77 -0
  487. package/src/server/logger.js +197 -0
  488. package/src/server/network.js +72 -0
  489. package/src/server/object-layer.js +294 -0
  490. package/src/server/peer.js +69 -0
  491. package/src/server/process.js +171 -0
  492. package/src/server/proxy.js +110 -0
  493. package/src/server/runtime.js +170 -0
  494. package/src/server/ssr.js +127 -0
  495. package/src/server/start.js +161 -0
  496. package/src/server/tls.js +251 -0
  497. package/src/server/valkey.js +293 -0
  498. package/src/server.js +25 -0
  499. package/src/ws/IoInterface.js +139 -0
  500. package/src/ws/IoServer.js +88 -0
  501. package/src/ws/core/channels/core.ws.chat.js +23 -0
  502. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  503. package/src/ws/core/channels/core.ws.stream.js +31 -0
  504. package/src/ws/core/core.ws.connection.js +62 -0
  505. package/src/ws/core/core.ws.emit.js +53 -0
  506. package/src/ws/core/core.ws.server.js +76 -0
  507. package/src/ws/core/management/core.ws.chat.js +8 -0
  508. package/src/ws/core/management/core.ws.mailer.js +16 -0
  509. package/src/ws/core/management/core.ws.stream.js +8 -0
  510. package/src/ws/cyberia/channels/cyberia.ws.bot.js +56 -0
  511. package/src/ws/cyberia/channels/cyberia.ws.skill.js +51 -0
  512. package/src/ws/cyberia/channels/cyberia.ws.user.js +437 -0
  513. package/src/ws/cyberia/cyberia.ws.connection.js +36 -0
  514. package/src/ws/cyberia/cyberia.ws.emit.js +14 -0
  515. package/src/ws/cyberia/cyberia.ws.server.js +67 -0
  516. package/src/ws/cyberia/management/cyberia.ws.bot.js +669 -0
  517. package/src/ws/cyberia/management/cyberia.ws.skill.js +441 -0
  518. package/src/ws/cyberia/management/cyberia.ws.user.js +188 -0
  519. package/src/ws/default/channels/default.ws.main.js +16 -0
  520. package/src/ws/default/default.ws.connection.js +22 -0
  521. package/src/ws/default/default.ws.emit.js +14 -0
  522. package/src/ws/default/default.ws.server.js +20 -0
  523. package/src/ws/default/management/default.ws.main.js +8 -0
  524. package/test/api.test.js +53 -0
  525. package/test/crypto.test.js +117 -0
@@ -0,0 +1,1071 @@
1
+ import fs from 'fs-extra';
2
+ import dotenv from 'dotenv';
3
+ import {
4
+ capFirst,
5
+ getCapVariableName,
6
+ newInstance,
7
+ orderArrayFromAttrInt,
8
+ range,
9
+ timer,
10
+ } from '../client/components/core/CommonJs.js';
11
+ import * as dir from 'path';
12
+ import colors from 'colors';
13
+ import { loggerFactory } from './logger.js';
14
+ import { shellExec } from './process.js';
15
+ import { DefaultConf } from '../../conf.js';
16
+ import splitFile from 'split-file';
17
+ import UnderpostRootEnv from '../cli/env.js';
18
+
19
+ colors.enable();
20
+
21
+ dotenv.config();
22
+
23
+ const logger = loggerFactory(import.meta);
24
+
25
+ const Config = {
26
+ default: DefaultConf,
27
+ build: async function (deployContext = 'dd-default', deployList, subConf) {
28
+ if (process.argv[2] && typeof process.argv[2] === 'string' && process.argv[2].startsWith('dd-'))
29
+ deployContext = process.argv[2];
30
+ if (!subConf && process.argv[3] && typeof process.argv[3] === 'string') subConf = process.argv[3];
31
+ if (!fs.existsSync(`./tmp`)) fs.mkdirSync(`./tmp`, { recursive: true });
32
+ UnderpostRootEnv.API.set('await-deploy', new Date().toISOString());
33
+ if (fs.existsSync(`./engine-private/replica/${deployContext}`)) return loadConf(deployContext, subConf);
34
+ else if (deployContext.startsWith('dd-')) return loadConf(deployContext, subConf);
35
+ if (deployContext === 'proxy') Config.buildProxy(deployList, subConf);
36
+ },
37
+ deployIdFactory: function (deployId = 'dd-default', options = { cluster: false }) {
38
+ if (!deployId.startsWith('dd-')) deployId = `dd-${deployId}`;
39
+
40
+ logger.info('Build deployId', deployId);
41
+
42
+ const folder = `./engine-private/conf/${deployId}`;
43
+ const repoName = `engine-${deployId.split('dd-')[1]}`;
44
+
45
+ if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
46
+ fs.writeFileSync(
47
+ `${folder}/.env.production`,
48
+ fs.readFileSync('./.env.production', 'utf8').replaceAll('dd-default', deployId),
49
+ 'utf8',
50
+ );
51
+ fs.writeFileSync(
52
+ `${folder}/.env.development`,
53
+ fs.readFileSync('./.env.development', 'utf8').replaceAll('dd-default', deployId),
54
+ 'utf8',
55
+ );
56
+ fs.writeFileSync(
57
+ `${folder}/.env.test`,
58
+ fs.readFileSync('./.env.test', 'utf8').replaceAll('dd-default', deployId),
59
+ 'utf8',
60
+ );
61
+ fs.writeFileSync(
62
+ `${folder}/package.json`,
63
+ fs.readFileSync('./package.json', 'utf8').replaceAll('dd-default', deployId),
64
+ 'utf8',
65
+ );
66
+
67
+ this.buildTmpConf(folder);
68
+
69
+ if (options.cluster === true) {
70
+ fs.writeFileSync(
71
+ `./.github/workflows/${repoName}.cd.yml`,
72
+ fs.readFileSync(`./.github/workflows/engine-test.cd.yml`, 'utf8').replaceAll('test', deployId.split('dd-')[1]),
73
+ 'utf8',
74
+ );
75
+ fs.writeFileSync(
76
+ `./.github/workflows/${repoName}.ci.yml`,
77
+ fs.readFileSync(`./.github/workflows/engine-test.ci.yml`, 'utf8').replaceAll('test', deployId.split('dd-')[1]),
78
+ 'utf8',
79
+ );
80
+ shellExec(`node bin/deploy update-default-conf ${deployId}`);
81
+
82
+ if (!fs.existsSync(`./engine-private/deploy/dd.router`))
83
+ fs.writeFileSync(`./engine-private/deploy/dd.router`, '', 'utf8');
84
+
85
+ fs.writeFileSync(
86
+ `./engine-private/deploy/dd.router`,
87
+ fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').trim() + `,${deployId}`,
88
+ 'utf8',
89
+ );
90
+ const updateRepo = (stage = 1) => {
91
+ shellExec(`git add . && git commit -m "Add base deployId ${deployId} cluster files stage:${stage}"`);
92
+ shellExec(
93
+ `cd engine-private && git add . && git commit -m "Add base deployId ${deployId} cluster files stage:${stage}"`,
94
+ );
95
+ };
96
+ updateRepo(1);
97
+ shellExec(`node bin run --build --dev sync`);
98
+ updateRepo(2);
99
+ shellExec(`node bin run --build sync`);
100
+ updateRepo(3);
101
+ }
102
+
103
+ return { deployIdFolder: folder, deployId };
104
+ },
105
+ buildTmpConf: function (folder = './conf') {
106
+ for (const confType of Object.keys(this.default))
107
+ fs.writeFileSync(`${folder}/conf.${confType}.json`, JSON.stringify(this.default[confType], null, 4), 'utf8');
108
+ },
109
+ buildProxy: function (deployList = 'dd-default', subConf = '') {
110
+ if (!deployList) deployList = process.argv[3];
111
+ if (!subConf) subConf = process.argv[4];
112
+ this.default.server = {};
113
+ for (const deployId of deployList.split(',')) {
114
+ let confPath = `./engine-private/conf/${deployId}/conf.server.json`;
115
+ const privateConfDevPath = fs.existsSync(`./engine-private/replica/${deployId}/conf.server.json`)
116
+ ? `./engine-private/replica/${deployId}/conf.server.json`
117
+ : `./engine-private/conf/${deployId}/conf.server.dev.${subConf}.json`;
118
+ const confDevPath = fs.existsSync(privateConfDevPath)
119
+ ? privateConfDevPath
120
+ : `./engine-private/conf/${deployId}/conf.server.dev.json`;
121
+
122
+ if (process.env.NODE_ENV === 'development' && fs.existsSync(confDevPath)) confPath = confDevPath;
123
+ const serverConf = JSON.parse(fs.readFileSync(confPath, 'utf8'));
124
+
125
+ for (const host of Object.keys(loadReplicas(serverConf))) {
126
+ if (serverConf[host]['/'])
127
+ this.default.server[host] = {
128
+ ...this.default.server[host],
129
+ ...serverConf[host],
130
+ };
131
+ else
132
+ this.default.server[host] = {
133
+ ...serverConf[host],
134
+ ...this.default.server[host],
135
+ };
136
+ }
137
+ }
138
+ this.buildTmpConf();
139
+ },
140
+ };
141
+
142
+ const loadConf = (deployId = 'dd-default', subConf) => {
143
+ if (deployId === 'current') {
144
+ console.log(process.env.DEPLOY_ID);
145
+ return;
146
+ }
147
+ if (deployId === 'clean') {
148
+ const path = '.';
149
+ fs.removeSync(`${path}/.env`);
150
+ shellExec(`git checkout ${path}/.env.production`);
151
+ shellExec(`git checkout ${path}/.env.development`);
152
+ shellExec(`git checkout ${path}/.env.test`);
153
+ if (fs.existsSync(`${path}/jsdoc.json`)) shellExec(`git checkout ${path}/jsdoc.json`);
154
+ shellExec(`git checkout ${path}/package.json`);
155
+ shellExec(`git checkout ${path}/package-lock.json`);
156
+ return;
157
+ }
158
+ const folder = fs.existsSync(`./engine-private/replica/${deployId}`)
159
+ ? `./engine-private/replica/${deployId}`
160
+ : `./engine-private/conf/${deployId}`;
161
+ if (!fs.existsSync(folder)) Config.deployIdFactory(deployId);
162
+ if (!fs.existsSync(`./conf`)) fs.mkdirSync(`./conf`);
163
+ if (!fs.existsSync(`./tmp`)) fs.mkdirSync(`./tmp`);
164
+
165
+ for (const typeConf of Object.keys(Config.default)) {
166
+ let srcConf = fs.readFileSync(`${folder}/conf.${typeConf}.json`, 'utf8');
167
+ if (process.env.NODE_ENV === 'development' && typeConf === 'server') {
168
+ const devConfPath = `${folder}/conf.${typeConf}.dev${subConf ? `.${subConf}` : ''}.json`;
169
+ if (fs.existsSync(devConfPath)) srcConf = fs.readFileSync(devConfPath, 'utf8');
170
+ }
171
+ if (typeConf === 'server') srcConf = JSON.stringify(loadReplicas(JSON.parse(srcConf)), null, 4);
172
+ fs.writeFileSync(`./conf/conf.${typeConf}.json`, srcConf, 'utf8');
173
+ }
174
+ fs.writeFileSync(`./.env.production`, fs.readFileSync(`${folder}/.env.production`, 'utf8'), 'utf8');
175
+ fs.writeFileSync(`./.env.development`, fs.readFileSync(`${folder}/.env.development`, 'utf8'), 'utf8');
176
+ fs.writeFileSync(`./.env.test`, fs.readFileSync(`${folder}/.env.test`, 'utf8'), 'utf8');
177
+ const NODE_ENV = process.env.NODE_ENV;
178
+ if (NODE_ENV) {
179
+ const subPathEnv = fs.existsSync(`${folder}/.env.${NODE_ENV}.${subConf}`)
180
+ ? `${folder}/.env.${NODE_ENV}.${subConf}`
181
+ : `${folder}/.env.${NODE_ENV}`;
182
+ fs.writeFileSync(`./.env`, fs.readFileSync(subPathEnv, 'utf8'), 'utf8');
183
+ const env = dotenv.parse(fs.readFileSync(subPathEnv, 'utf8'));
184
+ process.env = {
185
+ ...process.env,
186
+ ...env,
187
+ };
188
+ }
189
+ const originPackageJson = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
190
+ const packageJson = JSON.parse(fs.readFileSync(`${folder}/package.json`, 'utf8'));
191
+ originPackageJson.scripts.start = packageJson.scripts.start;
192
+ packageJson.scripts = originPackageJson.scripts;
193
+ fs.writeFileSync(`./package.json`, JSON.stringify(packageJson, null, 4), 'utf8');
194
+ return { folder, deployId };
195
+ };
196
+
197
+ const loadReplicas = (confServer) => {
198
+ for (const host of Object.keys(confServer)) {
199
+ for (const path of Object.keys(confServer[host])) {
200
+ const { replicas, singleReplica } = confServer[host][path];
201
+ if (replicas && !singleReplica)
202
+ for (const replicaPath of replicas) {
203
+ {
204
+ confServer[host][replicaPath] = newInstance(confServer[host][path]);
205
+ delete confServer[host][replicaPath].replicas;
206
+ }
207
+ }
208
+ }
209
+ }
210
+ return confServer;
211
+ };
212
+
213
+ const cloneConf = async (
214
+ { toOptions, fromOptions },
215
+ fromDefaultOptions = { deployId: 'dd-default', clientId: 'default' },
216
+ ) => {
217
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
218
+ if (!fromOptions.clientId) fromOptions.clientId = fromDefaultOptions.clientId;
219
+
220
+ const confFromFolder = `./engine-private/conf/${fromOptions.deployId}`;
221
+ const confToFolder = `./engine-private/conf/${toOptions.deployId}`;
222
+
223
+ const toClientVariableName = getCapVariableName(toOptions.clientId);
224
+ const fromClientVariableName = getCapVariableName(fromOptions.clientId);
225
+
226
+ const formattedSrc = (dataConf) =>
227
+ JSON.stringify(dataConf, null, 4)
228
+ .replaceAll(fromClientVariableName, toClientVariableName)
229
+ .replaceAll(fromOptions.clientId, toOptions.clientId);
230
+
231
+ const isMergeConf = fs.existsSync(confToFolder);
232
+ if (!isMergeConf) fs.mkdirSync(confToFolder, { recursive: true });
233
+
234
+ fs.writeFileSync(
235
+ `${confToFolder}/.env.production`,
236
+ fs.readFileSync(`${confFromFolder}/.env.production`, 'utf8'),
237
+ 'utf8',
238
+ );
239
+ fs.writeFileSync(
240
+ `${confToFolder}/.env.development`,
241
+ fs.readFileSync(`${confFromFolder}/.env.development`, 'utf8'),
242
+ 'utf8',
243
+ );
244
+ fs.writeFileSync(`${confToFolder}/.env.test`, fs.readFileSync(`${confFromFolder}/.env.test`, 'utf8'), 'utf8');
245
+
246
+ for (const confTypeId of ['server', 'client', 'cron', 'ssr']) {
247
+ const confFromData = JSON.parse(fs.readFileSync(`${confFromFolder}/conf.${confTypeId}.json`, 'utf8'));
248
+ fs.writeFileSync(`${confToFolder}/conf.${confTypeId}.json`, formattedSrc(confFromData), 'utf8');
249
+ }
250
+
251
+ const packageData = JSON.parse(fs.readFileSync(`${confFromFolder}/package.json`, 'utf8'));
252
+ packageData.scripts.start = packageData.scripts.start.replaceAll(fromOptions.deployId, toOptions.deployId);
253
+ fs.writeFileSync(`${confToFolder}/package.json`, JSON.stringify(packageData, null, 4), 'utf8');
254
+ };
255
+
256
+ const addClientConf = async (
257
+ { toOptions, fromOptions },
258
+ fromDefaultOptions = { deployId: 'dd-default', clientId: 'default' },
259
+ ) => {
260
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
261
+ if (!fromOptions.clientId) fromOptions.clientId = fromDefaultOptions.clientId;
262
+
263
+ const confFromFolder = `./engine-private/conf/${fromOptions.deployId}`;
264
+ const confToFolder = `./engine-private/conf/${toOptions.deployId}`;
265
+
266
+ const toClientConf = JSON.parse(fs.readFileSync(`${confToFolder}/conf.client.json`, 'utf8'));
267
+ const fromClientConf = JSON.parse(fs.readFileSync(`${confFromFolder}/conf.client.json`, 'utf8'));
268
+
269
+ const toClientVariableName = getCapVariableName(toOptions.clientId);
270
+ const fromClientVariableName = getCapVariableName(fromOptions.clientId);
271
+
272
+ const { host, path } = toOptions;
273
+
274
+ toClientConf[fromOptions.clientId] = fromClientConf[fromOptions.clientId];
275
+
276
+ fs.writeFileSync(`${confToFolder}/conf.client.json`, JSON.stringify(toClientConf, null, 4), 'utf8');
277
+
278
+ const toServerConf = JSON.parse(fs.readFileSync(`${confToFolder}/conf.server.json`, 'utf8'));
279
+ const fromServerConf = JSON.parse(fs.readFileSync(`${confToFolder}/conf.server.json`, 'utf8'));
280
+
281
+ toServerConf[host][path].client = fromOptions.clientId;
282
+ toServerConf[host][path].runtime = 'nodejs';
283
+ toServerConf[host][path].apis = fromClientConf[fromOptions.clientId].services;
284
+
285
+ fs.writeFileSync(`${confToFolder}/conf.server.json`, JSON.stringify(toServerConf, null, 4), 'utf8');
286
+
287
+ const fromSsrConf = JSON.parse(fs.readFileSync(`${confFromFolder}/conf.ssr.json`, 'utf8'));
288
+ const toSsrConf = JSON.parse(fs.readFileSync(`${confToFolder}/conf.ssr.json`, 'utf8'));
289
+
290
+ toSsrConf[fromClientVariableName] = fromSsrConf[fromClientVariableName];
291
+
292
+ fs.writeFileSync(`${confToFolder}/conf.ssr.json`, JSON.stringify(toSsrConf, null, 4), 'utf8');
293
+ };
294
+
295
+ const buildClientSrc = async (
296
+ { toOptions, fromOptions },
297
+ fromDefaultOptions = { deployId: 'dd-default', clientId: 'default' },
298
+ ) => {
299
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
300
+ if (!fromOptions.clientId) fromOptions.clientId = fromDefaultOptions.clientId;
301
+
302
+ const confFromFolder = `./src/client/components/${fromOptions.clientId}`;
303
+ const confToFolder = `./src/client/components/${toOptions.clientId}`;
304
+
305
+ const toClientVariableName = getCapVariableName(toOptions.clientId);
306
+ const fromClientVariableName = getCapVariableName(fromOptions.clientId);
307
+
308
+ const formattedSrc = (src) =>
309
+ src.replaceAll(fromClientVariableName, toClientVariableName).replaceAll(fromOptions.clientId, toOptions.clientId);
310
+
311
+ const isMergeConf = fs.existsSync(confToFolder);
312
+ if (!isMergeConf) fs.mkdirSync(confToFolder, { recursive: true });
313
+
314
+ const files = await fs.readdir(confFromFolder, { recursive: true });
315
+ for (const relativePath of files) {
316
+ const fromFilePath = dir.resolve(`${confFromFolder}/${relativePath}`);
317
+ const toFilePath = dir.resolve(`${confToFolder}/${relativePath}`);
318
+
319
+ fs.writeFileSync(formattedSrc(toFilePath), formattedSrc(fs.readFileSync(fromFilePath, 'utf8')), 'utf8');
320
+ }
321
+
322
+ fs.writeFileSync(
323
+ `./src/client/ssr/head/${toClientVariableName}Scripts.js`,
324
+ formattedSrc(fs.readFileSync(`./src/client/ssr/head/${fromClientVariableName}Scripts.js`, 'utf8')),
325
+ 'utf8',
326
+ );
327
+
328
+ fs.writeFileSync(
329
+ `./src/client/${toClientVariableName}.index.js`,
330
+ formattedSrc(fs.readFileSync(`./src/client/${fromClientVariableName}.index.js`, 'utf8')),
331
+ 'utf8',
332
+ );
333
+
334
+ fs.copySync(`./src/client/public/${fromOptions.clientId}`, `./src/client/public/${toOptions.clientId}`);
335
+ };
336
+
337
+ const buildApiSrc = async (
338
+ { toOptions, fromOptions },
339
+ fromDefaultOptions = { apiId: 'default', deployId: 'dd-default', clientId: 'default' },
340
+ ) => {
341
+ if (!fromOptions.apiId) fromOptions.apiId = fromDefaultOptions.apiId;
342
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
343
+ if (!fromOptions.clientId) fromOptions.clientId = fromDefaultOptions.clientId;
344
+
345
+ const toClientVariableName = getCapVariableName(toOptions.apiId);
346
+ const fromClientVariableName = getCapVariableName(fromOptions.apiId);
347
+
348
+ const formattedSrc = (src) =>
349
+ src.replaceAll(fromClientVariableName, toClientVariableName).replaceAll(fromOptions.apiId, toOptions.apiId);
350
+
351
+ const apiToFolder = `./src/api/${toOptions.apiId}`;
352
+ const apiFromFolder = `./src/api/${fromOptions.apiId}`;
353
+
354
+ const isMergeConf = fs.existsSync(apiToFolder);
355
+ if (!isMergeConf) fs.mkdirSync(apiToFolder, { recursive: true });
356
+
357
+ for (const srcApiType of ['model', 'controller', 'service', 'router']) {
358
+ fs.writeFileSync(
359
+ `${apiToFolder}/${toOptions.apiId}.${srcApiType}.js`,
360
+ formattedSrc(fs.readFileSync(`${apiFromFolder}/${fromOptions.apiId}.${srcApiType}.js`, 'utf8')),
361
+ 'utf8',
362
+ );
363
+ }
364
+
365
+ fs.mkdirSync(`./src/client/services/${toOptions.apiId}`, { recursive: true });
366
+ if (fs.existsSync(`./src/client/services/${fromOptions.apiId}/${fromOptions.apiId}.service.js`))
367
+ fs.writeFileSync(
368
+ `./src/client/services/${toOptions.apiId}/${toOptions.apiId}.service.js`,
369
+ formattedSrc(
370
+ fs.readFileSync(`./src/client/services/${fromOptions.apiId}/${fromOptions.apiId}.service.js`, 'utf8'),
371
+ ),
372
+ 'utf8',
373
+ );
374
+ return;
375
+ if (fs.existsSync(`./src/client/services/${fromOptions.apiId}/${fromOptions.apiId}.management.js`))
376
+ fs.writeFileSync(
377
+ `./src/client/services/${toOptions.apiId}/${toOptions.apiId}.management.js`,
378
+ formattedSrc(
379
+ fs.readFileSync(`./src/client/services/${fromOptions.apiId}/${fromOptions.apiId}.management.js`, 'utf8'),
380
+ ),
381
+ 'utf8',
382
+ );
383
+ };
384
+
385
+ const addApiConf = async (
386
+ { toOptions, fromOptions },
387
+ fromDefaultOptions = { apiId: 'default', deployId: 'dd-default', clientId: 'default' },
388
+ ) => {
389
+ if (!fromOptions.apiId) fromOptions.apiId = fromDefaultOptions.apiId;
390
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
391
+ if (!fromOptions.clientId) fromOptions.clientId = fromDefaultOptions.clientId;
392
+
393
+ const toClientVariableName = getCapVariableName(toOptions.apiId);
394
+ const fromClientVariableName = getCapVariableName(fromOptions.apiId);
395
+
396
+ const confFromFolder = `./engine-private/conf/${fromOptions.deployId}`;
397
+ const confToFolder = `./engine-private/conf/${toOptions.deployId}`;
398
+
399
+ const confServer = JSON.parse(fs.readFileSync(`${confToFolder}/conf.server.json`, 'utf8'));
400
+ for (const host of Object.keys(confServer))
401
+ for (const path of Object.keys(confServer[host]))
402
+ if (confServer[host][path].apis) confServer[host][path].apis.push(toOptions.apiId);
403
+ fs.writeFileSync(`${confToFolder}/conf.server.json`, JSON.stringify(confServer, null, 4), 'utf8');
404
+
405
+ const confClient = JSON.parse(fs.readFileSync(`${confToFolder}/conf.client.json`, 'utf8'));
406
+ confClient[toOptions.clientId].services.push(toOptions.apiId);
407
+ fs.writeFileSync(`${confToFolder}/conf.client.json`, JSON.stringify(confClient, null, 4), 'utf8');
408
+ };
409
+
410
+ const addWsConf = async (
411
+ { toOptions, fromOptions },
412
+ fromDefaultOptions = { wsId: 'default', deployId: 'dd-default', host: 'default.net', paths: '/' },
413
+ ) => {
414
+ if (!fromOptions.wsId) fromOptions.wsId = fromDefaultOptions.wsId;
415
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
416
+ if (!fromOptions.host) fromOptions.host = fromDefaultOptions.host;
417
+ if (!fromOptions.paths) fromOptions.paths = fromDefaultOptions.paths;
418
+
419
+ const toClientVariableName = getCapVariableName(toOptions.apiId);
420
+ const fromClientVariableName = getCapVariableName(fromOptions.apiId);
421
+
422
+ const confFromFolder = `./engine-private/conf/${fromOptions.deployId}`;
423
+ const confToFolder = `./engine-private/conf/${toOptions.deployId}`;
424
+
425
+ const paths = toOptions.paths.split(',');
426
+
427
+ const confServer = JSON.parse(fs.readFileSync(`${confToFolder}/conf.server.json`, 'utf8'));
428
+ for (const host of Object.keys(confServer))
429
+ for (const path of Object.keys(confServer[host]))
430
+ if (host === toOptions.host && paths.includes(path) && confServer[host][path])
431
+ confServer[host][path].ws = toOptions.wsId;
432
+ fs.writeFileSync(`${confToFolder}/conf.server.json`, JSON.stringify(confServer, null, 4), 'utf8');
433
+ };
434
+
435
+ const buildWsSrc = async (
436
+ { toOptions, fromOptions },
437
+ fromDefaultOptions = { wsId: 'default', deployId: 'dd-default', host: 'default.net', paths: '/' },
438
+ ) => {
439
+ if (!fromOptions.wsId) fromOptions.wsId = fromDefaultOptions.wsId;
440
+ if (!fromOptions.deployId) fromOptions.deployId = fromDefaultOptions.deployId;
441
+ if (!fromOptions.host) fromOptions.host = fromDefaultOptions.host;
442
+ if (!fromOptions.paths) fromOptions.paths = fromDefaultOptions.paths;
443
+
444
+ const toClientVariableName = getCapVariableName(toOptions.wsId);
445
+ const fromClientVariableName = getCapVariableName(fromOptions.wsId);
446
+
447
+ const confFromFolder = `./src/ws/${fromOptions.wsId}`;
448
+ const confToFolder = `./src/ws/${toOptions.wsId}`;
449
+
450
+ const paths = toOptions.paths.split(',');
451
+
452
+ const formattedSrc = (src) =>
453
+ src.replaceAll(fromClientVariableName, toClientVariableName).replaceAll(fromOptions.wsId, toOptions.wsId);
454
+
455
+ const files = await fs.readdir(confFromFolder, { recursive: true });
456
+ for (const relativePath of files) {
457
+ const fromFilePath = dir.resolve(`${confFromFolder}/${relativePath}`);
458
+ const toFilePath = dir.resolve(`${confToFolder}/${relativePath}`);
459
+
460
+ if (fs.lstatSync(fromFilePath).isDirectory() && !fs.existsSync(formattedSrc(toFilePath)))
461
+ fs.mkdirSync(formattedSrc(toFilePath), { recursive: true });
462
+
463
+ if (fs.lstatSync(fromFilePath).isFile() && !fs.existsSync(formattedSrc(toFilePath))) {
464
+ fs.writeFileSync(formattedSrc(toFilePath), formattedSrc(fs.readFileSync(fromFilePath, 'utf8')), 'utf8');
465
+ }
466
+ }
467
+ };
468
+
469
+ const cloneSrcComponents = async ({ toOptions, fromOptions }) => {
470
+ const toClientVariableName = getCapVariableName(toOptions.componentsFolder);
471
+ const fromClientVariableName = getCapVariableName(fromOptions.componentsFolder);
472
+
473
+ const formattedSrc = (src) =>
474
+ src
475
+ .replaceAll(fromClientVariableName, toClientVariableName)
476
+ .replaceAll(fromOptions.componentsFolder, toOptions.componentsFolder);
477
+
478
+ const confFromFolder = `./src/client/components/${fromOptions.componentsFolder}`;
479
+ const confToFolder = `./src/client/components/${toOptions.componentsFolder}`;
480
+
481
+ fs.mkdirSync(confToFolder, { recursive: true });
482
+
483
+ const files = await fs.readdir(confFromFolder);
484
+ for (const relativePath of files) {
485
+ const fromFilePath = dir.resolve(`${confFromFolder}/${relativePath}`);
486
+ const toFilePath = dir.resolve(`${confToFolder}/${relativePath}`);
487
+
488
+ fs.writeFileSync(formattedSrc(toFilePath), formattedSrc(fs.readFileSync(fromFilePath, 'utf8')), 'utf8');
489
+ }
490
+ };
491
+
492
+ const buildProxyRouter = () => {
493
+ const confServer = JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'));
494
+ let currentPort = parseInt(process.env.PORT) + 1;
495
+ const proxyRouter = {};
496
+ const singleReplicaHosts = [];
497
+ for (const host of Object.keys(confServer)) {
498
+ for (const path of Object.keys(confServer[host])) {
499
+ if (confServer[host][path].singleReplica && !singleReplicaHosts.includes(host)) {
500
+ singleReplicaHosts.push(host);
501
+ currentPort++;
502
+ continue;
503
+ }
504
+ confServer[host][path].port = newInstance(currentPort);
505
+ for (const port of confServer[host][path].proxy) {
506
+ if (!(port in proxyRouter)) proxyRouter[port] = {};
507
+ proxyRouter[port][`${host}${path}`] = {
508
+ // target: `http://${host}:${confServer[host][path].port}${path}`,
509
+ target: `http://localhost:${confServer[host][path].port - singleReplicaHosts.length}`,
510
+ // target: `http://127.0.0.1:${confServer[host][path].port}`,
511
+ proxy: confServer[host][path].proxy,
512
+ redirect: confServer[host][path].redirect,
513
+ host,
514
+ path,
515
+ };
516
+ }
517
+ currentPort++;
518
+ if (confServer[host][path].peer) {
519
+ const peerPath = path === '/' ? `/peer` : `${path}/peer`;
520
+ confServer[host][peerPath] = newInstance(confServer[host][path]);
521
+ confServer[host][peerPath].port = newInstance(currentPort);
522
+ for (const port of confServer[host][path].proxy) {
523
+ if (!(port in proxyRouter)) proxyRouter[port] = {};
524
+ proxyRouter[port][`${host}${peerPath}`] = {
525
+ // target: `http://${host}:${confServer[host][peerPath].port}${peerPath}`,
526
+ target: `http://localhost:${confServer[host][peerPath].port - singleReplicaHosts.length}`,
527
+ // target: `http://127.0.0.1:${confServer[host][peerPath].port}`,
528
+ proxy: confServer[host][peerPath].proxy,
529
+ host,
530
+ path: peerPath,
531
+ };
532
+ }
533
+ currentPort++;
534
+ }
535
+ }
536
+ }
537
+
538
+ return proxyRouter;
539
+ };
540
+
541
+ const pathPortAssignmentFactory = (router, confServer) => {
542
+ const pathPortAssignmentData = {};
543
+ for (const host of Object.keys(confServer)) {
544
+ const pathPortAssignment = [];
545
+ for (const path of Object.keys(confServer[host])) {
546
+ const { peer } = confServer[host][path];
547
+ if (!router[`${host}${path === '/' ? '' : path}`]) continue;
548
+ const port = parseInt(router[`${host}${path === '/' ? '' : path}`].split(':')[2]);
549
+ // logger.info('', { host, port, path });
550
+ pathPortAssignment.push({
551
+ port,
552
+ path,
553
+ });
554
+
555
+ if (peer) {
556
+ // logger.info('', { host, port: port + 1, path: '/peer' });
557
+ pathPortAssignment.push({
558
+ port: port + 1,
559
+ path: '/peer',
560
+ });
561
+ }
562
+ }
563
+ pathPortAssignmentData[host] = pathPortAssignment;
564
+ }
565
+ return pathPortAssignmentData;
566
+ };
567
+
568
+ const deployRangePortFactory = (router) => {
569
+ const ports = Object.values(router).map((p) => parseInt(p.split(':')[2]));
570
+ const fromPort = Math.min(...ports);
571
+ const toPort = Math.max(...ports);
572
+ return { ports, fromPort, toPort };
573
+ };
574
+
575
+ const buildKindPorts = (from, to) =>
576
+ range(parseInt(from), parseInt(to))
577
+ .map(
578
+ (port) => ` - name: 'tcp-${port}'
579
+ protocol: TCP
580
+ port: ${port}
581
+ targetPort: ${port}
582
+ - name: 'udp-${port}'
583
+ protocol: UDP
584
+ port: ${port}
585
+ targetPort: ${port}
586
+ `,
587
+ )
588
+ .join('\n');
589
+
590
+ const buildPortProxyRouter = (port, proxyRouter) => {
591
+ const hosts = proxyRouter[port];
592
+ const router = {};
593
+ // build router
594
+ Object.keys(hosts).map((hostKey) => {
595
+ let { host, path, target, proxy, peer } = hosts[hostKey];
596
+ if (process.env.NODE_ENV === 'development' && process.argv.includes('localhost')) host = `localhost`;
597
+
598
+ if (!proxy.includes(port)) {
599
+ logger.warn('Proxy port not set on conf', { port, host, path, proxy, target });
600
+ if (process.env.NODE_ENV === 'production') {
601
+ logger.warn('Omitting host', { host, path, target });
602
+ return;
603
+ }
604
+ }
605
+
606
+ const absoluteHost = [80, 443].includes(port)
607
+ ? `${host}${path === '/' ? '' : path}`
608
+ : `${host}:${port}${path === '/' ? '' : path}`;
609
+
610
+ if (absoluteHost in router)
611
+ logger.warn('Overwrite: Absolute host already exists on router', { absoluteHost, target });
612
+
613
+ router[absoluteHost] = target;
614
+ }); // order router
615
+
616
+ if (Object.keys(router).length === 0) return router;
617
+
618
+ const reOrderRouter = {};
619
+ for (const absoluteHostKey of orderArrayFromAttrInt(Object.keys(router), 'length'))
620
+ reOrderRouter[absoluteHostKey] = router[absoluteHostKey];
621
+
622
+ return reOrderRouter;
623
+ };
624
+
625
+ const buildReplicaId = ({ deployId, replica }) => `${deployId}-${replica.slice(1)}`;
626
+
627
+ const getDataDeploy = (
628
+ options = {
629
+ buildSingleReplica: false,
630
+ deployGroupId: '',
631
+ deployId: '',
632
+ disableSyncEnvPort: false,
633
+ },
634
+ ) => {
635
+ let dataDeploy =
636
+ options.deployGroupId === 'dd'
637
+ ? fs.readFileSync(`./engine-private/deploy/${options.deployGroupId}.router`, 'utf8')
638
+ : fs.readFileSync(`./engine-private/deploy/${options.deployGroupId}`, 'utf8');
639
+
640
+ dataDeploy = dataDeploy
641
+ .split(',')
642
+ .map((deployId) => deployId.trim())
643
+ .filter((deployId) => deployId);
644
+
645
+ if (options.deployId) dataDeploy = dataDeploy.filter((d) => d === options.deployId);
646
+
647
+ dataDeploy = dataDeploy.map((deployId) => {
648
+ return {
649
+ deployId,
650
+ };
651
+ });
652
+
653
+ if (options && options.buildSingleReplica && fs.existsSync(`./engine-private/replica`))
654
+ fs.removeSync(`./engine-private/replica`);
655
+
656
+ let buildDataDeploy = [];
657
+ for (const deployObj of dataDeploy) {
658
+ const serverConf = loadReplicas(
659
+ JSON.parse(fs.readFileSync(`./engine-private/conf/${deployObj.deployId}/conf.server.json`, 'utf8')),
660
+ );
661
+ let replicaDataDeploy = [];
662
+ for (const host of Object.keys(serverConf))
663
+ for (const path of Object.keys(serverConf[host])) {
664
+ if (serverConf[host][path].replicas && serverConf[host][path].singleReplica) {
665
+ if (options && options.buildSingleReplica) shellExec(Cmd.replica(deployObj.deployId, host, path));
666
+ replicaDataDeploy = replicaDataDeploy.concat(
667
+ serverConf[host][path].replicas.map((r) => {
668
+ return {
669
+ deployId: buildReplicaId({ deployId: deployObj.deployId, replica: r }),
670
+ replicaHost: host,
671
+ };
672
+ }),
673
+ );
674
+ }
675
+ }
676
+ buildDataDeploy.push(deployObj);
677
+ if (replicaDataDeploy.length > 0) buildDataDeploy = buildDataDeploy.concat(replicaDataDeploy);
678
+ }
679
+
680
+ const enableSyncEnvPort = !options.disableSyncEnvPort && options.buildSingleReplica;
681
+ if (enableSyncEnvPort) shellExec(Cmd.syncPorts(options.deployGroupId));
682
+
683
+ logger.info('buildDataDeploy', { buildDataDeploy, enableSyncEnvPort });
684
+
685
+ return buildDataDeploy;
686
+ };
687
+
688
+ const validateTemplatePath = (absolutePath = '') => {
689
+ const host = 'default.net';
690
+ const path = '/';
691
+ const client = 'default';
692
+ const ssr = 'Default';
693
+ const confServer = DefaultConf.server[host][path];
694
+ const confClient = DefaultConf.client[client];
695
+ const confSsr = DefaultConf.ssr[ssr];
696
+ const clients = DefaultConf.client.default.services;
697
+
698
+ if (absolutePath.match('src/api') && !confServer.apis.find((p) => absolutePath.match(`src/api/${p}/`))) {
699
+ return false;
700
+ }
701
+ if (absolutePath.match('conf.dd-') && absolutePath.match('.js')) return false;
702
+ if (
703
+ absolutePath.match('src/client/services/') &&
704
+ !clients.find((p) => absolutePath.match(`src/client/services/${p}/`))
705
+ ) {
706
+ return false;
707
+ }
708
+ if (absolutePath.match('src/client/public/') && !clients.find((p) => absolutePath.match(`src/client/public/${p}/`))) {
709
+ return false;
710
+ }
711
+ if (
712
+ absolutePath.match('src/client/components/') &&
713
+ !clients.find((p) => absolutePath.match(`src/client/components/${p}/`))
714
+ ) {
715
+ return false;
716
+ }
717
+ if (absolutePath.match('src/client/sw/') && !clients.find((p) => absolutePath.match(`src/client/sw/${p}.sw.js`))) {
718
+ return false;
719
+ }
720
+ if (
721
+ absolutePath.match('src/client/ssr/body') &&
722
+ !confSsr.body.find((p) => absolutePath.match(`src/client/ssr/body/${p}.js`))
723
+ ) {
724
+ return false;
725
+ }
726
+ if (
727
+ absolutePath.match('src/client/ssr/head') &&
728
+ !confSsr.head.find((p) => absolutePath.match(`src/client/ssr/head/${p}.js`))
729
+ ) {
730
+ return false;
731
+ }
732
+ if (
733
+ absolutePath.match('src/client/ssr/mailer') &&
734
+ !Object.keys(confSsr.mailer).find((p) => absolutePath.match(`src/client/ssr/mailer/${confSsr.mailer[p]}.js`))
735
+ ) {
736
+ return false;
737
+ }
738
+ if (
739
+ absolutePath.match('src/client/ssr/offline') &&
740
+ !confSsr.offline.find((p) => absolutePath.match(`src/client/ssr/offline/${p.client}.js`))
741
+ ) {
742
+ return false;
743
+ }
744
+ if (
745
+ absolutePath.match('src/client/ssr/pages') &&
746
+ !confSsr.pages.find((p) => absolutePath.match(`src/client/ssr/pages/${p.client}.js`))
747
+ ) {
748
+ return false;
749
+ }
750
+ if (absolutePath.match('hardhat/')) return false;
751
+ if (
752
+ absolutePath.match('/client') &&
753
+ absolutePath.match('.index.js') &&
754
+ !absolutePath.match('/offline') &&
755
+ !clients.find((p) => absolutePath.match(`src/client/${capFirst(p)}.index.js`))
756
+ ) {
757
+ return false;
758
+ }
759
+ if (absolutePath.match('src/ws/') && !clients.find((p) => absolutePath.match(`src/ws/${p}/`))) {
760
+ return false;
761
+ }
762
+ return true;
763
+ };
764
+
765
+ const awaitDeployMonitor = async (init = false, deltaMs = 1000) => {
766
+ if (init) UnderpostRootEnv.API.set('await-deploy', new Date().toISOString());
767
+ await timer(deltaMs);
768
+ if (UnderpostRootEnv.API.get('await-deploy')) return await awaitDeployMonitor();
769
+ };
770
+
771
+ const getCronBackUpFolder = (host = '', path = '') => {
772
+ return `${host}${path.replace(/\\/g, '/').replace(`/`, '-')}`;
773
+ };
774
+
775
+ const mergeFile = async (parts = [], outputFilePath) => {
776
+ await new Promise((resolve) => {
777
+ splitFile
778
+ .mergeFiles(parts, outputFilePath)
779
+ .then(() => {
780
+ resolve();
781
+ })
782
+ .catch((err) => {
783
+ console.log('Error: ', err);
784
+ resolve();
785
+ });
786
+ });
787
+ };
788
+
789
+ const rebuildConfFactory = ({ deployId, valkey, mongo }) => {
790
+ const confServer = loadReplicas(
791
+ JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
792
+ );
793
+ const hosts = {};
794
+ for (const host of Object.keys(confServer)) {
795
+ hosts[host] = {};
796
+ for (const path of Object.keys(confServer[host])) {
797
+ if (!confServer[host][path].db) continue;
798
+ const { singleReplica, replicas, db } = confServer[host][path];
799
+ const { provider } = db;
800
+ if (singleReplica) {
801
+ for (const replica of replicas) {
802
+ const deployIdReplica = buildReplicaId({ replica, deployId });
803
+ const confServerReplica = JSON.parse(
804
+ fs.readFileSync(`./engine-private/replica/${deployIdReplica}/conf.server.json`, 'utf8'),
805
+ );
806
+ for (const _host of Object.keys(confServerReplica)) {
807
+ for (const _path of Object.keys(confServerReplica[_host])) {
808
+ hosts[host][_path] = { replica: { host, path } };
809
+ confServerReplica[_host][_path].valkey = valkey;
810
+ switch (provider) {
811
+ case 'mongoose':
812
+ confServerReplica[_host][_path].db.host = mongo.host;
813
+ break;
814
+ }
815
+ }
816
+ }
817
+ fs.writeFileSync(
818
+ `./engine-private/replica/${deployIdReplica}/conf.server.json`,
819
+ JSON.stringify(confServerReplica, null, 4),
820
+ 'utf8',
821
+ );
822
+ }
823
+ } else hosts[host][path] = {};
824
+ confServer[host][path].valkey = valkey;
825
+ switch (provider) {
826
+ case 'mongoose':
827
+ confServer[host][path].db.host = mongo.host;
828
+ break;
829
+ }
830
+ }
831
+ }
832
+ fs.writeFileSync(`./engine-private/conf/${deployId}/conf.server.json`, JSON.stringify(confServer, null, 4), 'utf8');
833
+ return { hosts };
834
+ };
835
+
836
+ const getPathsSSR = (conf) => {
837
+ const paths = ['src/client/ssr/Render.js'];
838
+ for (const o of conf.head) paths.push(`src/client/ssr/head/${o}.js`);
839
+ for (const o of conf.body) paths.push(`src/client/ssr/body/${o}.js`);
840
+ for (const o of Object.keys(conf.mailer)) paths.push(`src/client/ssr/mailer/${conf.mailer[o]}.js`);
841
+ for (const o of conf.offline) paths.push(`src/client/ssr/mailer/${o.client}.js`);
842
+ for (const o of conf.pages) paths.push(`src/client/ssr/pages/${o.client}.js`);
843
+ return paths;
844
+ };
845
+
846
+ const Cmd = {
847
+ delete: (deployId) => `pm2 delete ${deployId}`,
848
+ run: () => `npm start`,
849
+ build: (deployId) => `node bin/deploy build-full-client ${deployId}${process.argv.includes('l') ? ' l' : ''}`,
850
+ conf: (deployId, env) => `node bin/deploy conf ${deployId} ${env ? env : 'production'}`,
851
+ replica: (deployId, host, path) => `node bin/deploy build-single-replica ${deployId} ${host} ${path}`,
852
+ syncPorts: (deployGroupId) => `node bin/deploy sync-env-port ${deployGroupId}`,
853
+ cron: (deployList, jobList, name, expression, options) =>
854
+ `pm2 start ./bin/index.js --no-autorestart --instances 1 --cron "${expression}" --name ${name} -- cron ${
855
+ options?.itc ? `--itc ` : ''
856
+ }${options?.git ? `--git ` : ''}${deployList} ${jobList}`,
857
+ };
858
+
859
+ const splitFileFactory = async (name, _path) => {
860
+ const stats = fs.statSync(_path);
861
+ const maxSizeInBytes = 1024 * 1024 * 50; // 50 mb
862
+ const fileSizeInBytes = stats.size;
863
+ if (fileSizeInBytes > maxSizeInBytes) {
864
+ logger.info('splitFileFactory input', { name, from: _path });
865
+ return await new Promise((resolve) => {
866
+ splitFile
867
+ .splitFileBySize(_path, maxSizeInBytes) // 50 mb
868
+ .then((names) => {
869
+ logger.info('splitFileFactory output', { parts: names });
870
+ fs.writeFileSync(
871
+ `${_path.split('/').slice(0, -1).join('/')}/${name}-parths.json`,
872
+ JSON.stringify(names, null, 4),
873
+ 'utf8',
874
+ );
875
+ fs.removeSync(_path);
876
+ return resolve(true);
877
+ })
878
+ .catch((err) => {
879
+ console.log('Error: ', err);
880
+ return resolve(false);
881
+ });
882
+ });
883
+ }
884
+ return false;
885
+ };
886
+
887
+ const getNpmRootPath = () =>
888
+ shellExec(`npm root -g`, {
889
+ stdout: true,
890
+ disableLog: true,
891
+ silent: true,
892
+ }).trim();
893
+
894
+ const getUnderpostRootPath = () => `${getNpmRootPath()}/underpost`;
895
+
896
+ const writeEnv = (envPath, envObj) =>
897
+ fs.writeFileSync(
898
+ envPath,
899
+ Object.keys(envObj)
900
+ .map((key) => `${key}=${envObj[key]}`)
901
+ .join(`\n`),
902
+ 'utf8',
903
+ );
904
+
905
+ const buildCliDoc = (program, oldVersion, newVersion) => {
906
+ let md = shellExec(`node bin help`, { silent: true, stdout: true }).split('Options:');
907
+ const baseOptions =
908
+ `## ${md[0].split(`\n`)[2]}
909
+
910
+ ### Usage: ` +
911
+ '`' +
912
+ md[0].split(`\n`)[0].split('Usage: ')[1] +
913
+ '`' +
914
+ `
915
+ ` +
916
+ '```\n Options:' +
917
+ md[1] +
918
+ ' \n```';
919
+ md =
920
+ baseOptions +
921
+ `
922
+
923
+ ## Commands:
924
+ `;
925
+ program.commands.map((o) => {
926
+ md +=
927
+ `
928
+
929
+ ` +
930
+ '### `' +
931
+ o._name +
932
+ '` :' +
933
+ `
934
+ ` +
935
+ '```\n ' +
936
+ shellExec(`node bin help ${o._name}`, { silent: true, stdout: true }) +
937
+ ' \n```' +
938
+ `
939
+ `;
940
+ });
941
+ md = md.replaceAll(oldVersion, newVersion);
942
+ fs.writeFileSync(`./src/client/public/nexodev/docs/references/Command Line Interface.md`, md, 'utf8');
943
+ fs.writeFileSync(`./cli.md`, md, 'utf8');
944
+ const readmeSplit = `pwa-microservices-template</a>`;
945
+ const readme = fs.readFileSync(`./README.md`, 'utf8').split(readmeSplit);
946
+ fs.writeFileSync(
947
+ './README.md',
948
+ (
949
+ readme[0] +
950
+ readmeSplit +
951
+ `
952
+
953
+ ` +
954
+ baseOptions +
955
+ `
956
+
957
+ <a target="_top" href="https://github.com/${process.env.GITHUB_USERNAME}/pwa-microservices-template/blob/master/cli.md">See complete CLI Docs here.</a>
958
+
959
+ `
960
+ ).replaceAll(oldVersion, newVersion),
961
+ 'utf8',
962
+ );
963
+ };
964
+
965
+ const getInstanceContext = async (options = { singleReplica, replicas, redirect: '' }) => {
966
+ const { singleReplica, replicas, redirect } = options;
967
+
968
+ if (singleReplica && replicas && replicas.length > 0)
969
+ return {
970
+ singleReplicaHost: true,
971
+ };
972
+
973
+ const redirectTarget = redirect
974
+ ? redirect[redirect.length - 1] === '/'
975
+ ? redirect.slice(0, -1)
976
+ : redirect
977
+ : undefined;
978
+
979
+ return { redirectTarget };
980
+ };
981
+
982
+ const buildApiConf = async (options = { deployId: '', subConf: '', host: '', path: '', origin: '' }) => {
983
+ let { deployId, subConf, host, path, origin } = options;
984
+ if (!deployId) deployId = process.argv[2].trim();
985
+ if (!subConf) subConf = process.argv[3].trim();
986
+ if (process.argv[4]) host = process.argv[4].trim();
987
+ if (process.argv[5]) path = process.argv[5].trim();
988
+ if (process.argv[6])
989
+ origin = `${process.env.NODE_ENV === 'production' ? 'https' : 'http'}://${process.argv[6].trim()}`;
990
+
991
+ if (!origin) return;
992
+ const confServer = JSON.parse(
993
+ fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.dev.${subConf}.json`, 'utf8'),
994
+ );
995
+ const envObj = dotenv.parse(
996
+ fs.readFileSync(`./engine-private/conf/${deployId}/.env.${process.env.NODE_ENV}`, 'utf8'),
997
+ );
998
+ if (host && path) {
999
+ confServer[host][path].origins = [origin];
1000
+ logger.info('Build api conf', { host, path, origin });
1001
+ } else return;
1002
+ writeEnv(`./engine-private/conf/${deployId}/.env.${process.env.NODE_ENV}.${subConf}-dev-api`, envObj);
1003
+ fs.writeFileSync(
1004
+ `./engine-private/conf/${deployId}/conf.server.dev.${subConf}-dev-api.json`,
1005
+ JSON.stringify(confServer, null, 4),
1006
+ 'utf8',
1007
+ );
1008
+ };
1009
+
1010
+ const buildClientStaticConf = async (options = { deployId: '', subConf: '', apiBaseHost: '', host: '', path: '' }) => {
1011
+ let { deployId, subConf, host, path } = options;
1012
+ if (!deployId) deployId = process.argv[2].trim();
1013
+ if (!subConf) subConf = process.argv[3].trim();
1014
+ if (!host) host = process.argv[4].trim();
1015
+ if (!path) path = process.argv[5].trim();
1016
+ const confServer = JSON.parse(
1017
+ fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.dev.${subConf}-dev-api.json`, 'utf8'),
1018
+ );
1019
+ const envObj = dotenv.parse(
1020
+ fs.readFileSync(`./engine-private/conf/${deployId}/.env.${process.env.NODE_ENV}.${subConf}-dev-api`, 'utf8'),
1021
+ );
1022
+ envObj.PORT = parseInt(envObj.PORT);
1023
+ const apiBaseHost = options?.apiBaseHost ? options.apiBaseHost : `localhost:${envObj.PORT + 1}`;
1024
+ confServer[host][path].apiBaseHost = apiBaseHost;
1025
+ confServer[host][path].apiBaseProxyPath = path;
1026
+ logger.info('Build client static conf', { host, path, apiBaseHost });
1027
+ envObj.PORT = parseInt(confServer[host][path].origins[0].split(':')[2]) - 1;
1028
+ writeEnv(`./engine-private/conf/${deployId}/.env.${process.env.NODE_ENV}.${subConf}-dev-client`, envObj);
1029
+ fs.writeFileSync(
1030
+ `./engine-private/conf/${deployId}/conf.server.dev.${subConf}-dev-client.json`,
1031
+ JSON.stringify(confServer, null, 4),
1032
+ 'utf8',
1033
+ );
1034
+ };
1035
+
1036
+ export {
1037
+ Cmd,
1038
+ Config,
1039
+ loadConf,
1040
+ loadReplicas,
1041
+ cloneConf,
1042
+ getCapVariableName,
1043
+ buildClientSrc,
1044
+ buildApiSrc,
1045
+ addApiConf,
1046
+ addClientConf,
1047
+ addWsConf,
1048
+ buildWsSrc,
1049
+ cloneSrcComponents,
1050
+ buildProxyRouter,
1051
+ getDataDeploy,
1052
+ validateTemplatePath,
1053
+ buildReplicaId,
1054
+ getCronBackUpFolder,
1055
+ mergeFile,
1056
+ getPathsSSR,
1057
+ buildKindPorts,
1058
+ buildPortProxyRouter,
1059
+ splitFileFactory,
1060
+ getNpmRootPath,
1061
+ getUnderpostRootPath,
1062
+ writeEnv,
1063
+ pathPortAssignmentFactory,
1064
+ deployRangePortFactory,
1065
+ awaitDeployMonitor,
1066
+ rebuildConfFactory,
1067
+ buildCliDoc,
1068
+ getInstanceContext,
1069
+ buildApiConf,
1070
+ buildClientStaticConf,
1071
+ };