underpost 2.6.2

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 (269) hide show
  1. package/.dockerignore +14 -0
  2. package/.env.development +8 -0
  3. package/.env.production +8 -0
  4. package/.env.test +8 -0
  5. package/.nycrc +9 -0
  6. package/.prettierignore +13 -0
  7. package/.prettierrc +9 -0
  8. package/.vscode/extensions.json +72 -0
  9. package/.vscode/settings.json +99 -0
  10. package/Dockerfile +88 -0
  11. package/LICENSE +21 -0
  12. package/README.md +51 -0
  13. package/bin/db.js +119 -0
  14. package/bin/deploy.js +600 -0
  15. package/bin/dns.js +1 -0
  16. package/bin/file.js +92 -0
  17. package/bin/help.js +110 -0
  18. package/bin/index.js +29 -0
  19. package/bin/install.js +357 -0
  20. package/bin/shortcut.js +44 -0
  21. package/bin/ssl.js +61 -0
  22. package/bin/util.js +182 -0
  23. package/bin/vs.js +35 -0
  24. package/conf.js +244 -0
  25. package/docker-compose.yml +67 -0
  26. package/jsconfig.json +7 -0
  27. package/jsdoc.json +32 -0
  28. package/nodemon.json +6 -0
  29. package/package.json +128 -0
  30. package/prometheus.yml +36 -0
  31. package/setup.sh +25 -0
  32. package/src/api/core/core.controller.js +69 -0
  33. package/src/api/core/core.model.js +11 -0
  34. package/src/api/core/core.router.js +23 -0
  35. package/src/api/core/core.service.js +29 -0
  36. package/src/api/crypto/crypto.controller.js +51 -0
  37. package/src/api/crypto/crypto.model.js +23 -0
  38. package/src/api/crypto/crypto.router.js +20 -0
  39. package/src/api/crypto/crypto.service.js +64 -0
  40. package/src/api/default/default.controller.js +69 -0
  41. package/src/api/default/default.model.js +20 -0
  42. package/src/api/default/default.router.js +23 -0
  43. package/src/api/default/default.service.js +31 -0
  44. package/src/api/file/file.controller.js +51 -0
  45. package/src/api/file/file.model.js +19 -0
  46. package/src/api/file/file.router.js +20 -0
  47. package/src/api/file/file.service.js +70 -0
  48. package/src/api/instance/instance.controller.js +69 -0
  49. package/src/api/instance/instance.model.js +36 -0
  50. package/src/api/instance/instance.router.js +33 -0
  51. package/src/api/instance/instance.service.js +48 -0
  52. package/src/api/test/test.controller.js +59 -0
  53. package/src/api/test/test.model.js +14 -0
  54. package/src/api/test/test.router.js +21 -0
  55. package/src/api/test/test.service.js +35 -0
  56. package/src/api/user/user.controller.js +70 -0
  57. package/src/api/user/user.model.js +65 -0
  58. package/src/api/user/user.router.js +345 -0
  59. package/src/api/user/user.service.js +479 -0
  60. package/src/api.js +23 -0
  61. package/src/client/Default.index.js +40 -0
  62. package/src/client/components/core/Account.js +290 -0
  63. package/src/client/components/core/AgGrid.js +160 -0
  64. package/src/client/components/core/Auth.js +19 -0
  65. package/src/client/components/core/Badge.js +32 -0
  66. package/src/client/components/core/BlockChain.js +41 -0
  67. package/src/client/components/core/Blog.js +9 -0
  68. package/src/client/components/core/BtnIcon.js +91 -0
  69. package/src/client/components/core/CalendarCore.js +319 -0
  70. package/src/client/components/core/Chat.js +64 -0
  71. package/src/client/components/core/ColorPalette.js +5267 -0
  72. package/src/client/components/core/CommonJs.js +708 -0
  73. package/src/client/components/core/Content.js +49 -0
  74. package/src/client/components/core/Css.js +1027 -0
  75. package/src/client/components/core/CssCore.js +792 -0
  76. package/src/client/components/core/D3Chart.js +44 -0
  77. package/src/client/components/core/Docs.js +130 -0
  78. package/src/client/components/core/DropDown.js +164 -0
  79. package/src/client/components/core/EventsUI.js +54 -0
  80. package/src/client/components/core/FileExplorer.js +624 -0
  81. package/src/client/components/core/FullScreen.js +45 -0
  82. package/src/client/components/core/Input.js +259 -0
  83. package/src/client/components/core/JoyStick.js +77 -0
  84. package/src/client/components/core/Keyboard.js +73 -0
  85. package/src/client/components/core/LoadingAnimation.js +157 -0
  86. package/src/client/components/core/LogIn.js +181 -0
  87. package/src/client/components/core/LogOut.js +52 -0
  88. package/src/client/components/core/Logger.js +26 -0
  89. package/src/client/components/core/Modal.js +1596 -0
  90. package/src/client/components/core/NotificationManager.js +84 -0
  91. package/src/client/components/core/Panel.js +413 -0
  92. package/src/client/components/core/Polyhedron.js +162 -0
  93. package/src/client/components/core/Recover.js +204 -0
  94. package/src/client/components/core/Responsive.js +53 -0
  95. package/src/client/components/core/RichText.js +27 -0
  96. package/src/client/components/core/Router.js +77 -0
  97. package/src/client/components/core/SignUp.js +125 -0
  98. package/src/client/components/core/SocketIo.js +72 -0
  99. package/src/client/components/core/Stream.js +113 -0
  100. package/src/client/components/core/ToggleSwitch.js +87 -0
  101. package/src/client/components/core/ToolTip.js +26 -0
  102. package/src/client/components/core/Translate.js +408 -0
  103. package/src/client/components/core/Validator.js +100 -0
  104. package/src/client/components/core/VanillaJs.js +454 -0
  105. package/src/client/components/core/Wallet.js +106 -0
  106. package/src/client/components/core/Webhook.js +25 -0
  107. package/src/client/components/core/Worker.js +272 -0
  108. package/src/client/components/default/CommonDefault.js +29 -0
  109. package/src/client/components/default/CssDefault.js +13 -0
  110. package/src/client/components/default/ElementsDefault.js +38 -0
  111. package/src/client/components/default/LogInDefault.js +41 -0
  112. package/src/client/components/default/LogOutDefault.js +28 -0
  113. package/src/client/components/default/MenuDefault.js +389 -0
  114. package/src/client/components/default/RoutesDefault.js +48 -0
  115. package/src/client/components/default/SettingsDefault.js +16 -0
  116. package/src/client/components/default/SignUpDefault.js +9 -0
  117. package/src/client/components/default/SocketIoDefault.js +54 -0
  118. package/src/client/components/default/TranslateDefault.js +7 -0
  119. package/src/client/public/default/android-chrome-144x144.png +0 -0
  120. package/src/client/public/default/android-chrome-192x192.png +0 -0
  121. package/src/client/public/default/android-chrome-256x256.png +0 -0
  122. package/src/client/public/default/android-chrome-36x36.png +0 -0
  123. package/src/client/public/default/android-chrome-384x384.png +0 -0
  124. package/src/client/public/default/android-chrome-48x48.png +0 -0
  125. package/src/client/public/default/android-chrome-512x512.png +0 -0
  126. package/src/client/public/default/android-chrome-72x72.png +0 -0
  127. package/src/client/public/default/android-chrome-96x96.png +0 -0
  128. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  129. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  130. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  131. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  132. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  133. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  134. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  135. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  136. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  137. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  138. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  139. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  140. package/src/client/public/default/apple-touch-icon.png +0 -0
  141. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  142. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  143. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  144. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  145. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  146. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  147. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  148. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  149. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  150. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  151. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  152. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  153. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  154. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  155. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  156. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  157. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  158. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  159. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  160. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  161. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  162. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  163. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  164. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  165. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  166. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  167. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  168. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  169. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  170. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  171. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  172. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  173. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  174. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  175. package/src/client/public/default/assets/background/white.jpg +0 -0
  176. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  177. package/src/client/public/default/assets/background/white0.jpg +0 -0
  178. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  179. package/src/client/public/default/browserconfig.xml +12 -0
  180. package/src/client/public/default/favicon-16x16.png +0 -0
  181. package/src/client/public/default/favicon-32x32.png +0 -0
  182. package/src/client/public/default/favicon-48x48.png +0 -0
  183. package/src/client/public/default/favicon.ico +0 -0
  184. package/src/client/public/default/manifest.webmanifest +69 -0
  185. package/src/client/public/default/mstile-144x144.png +0 -0
  186. package/src/client/public/default/mstile-150x150.png +0 -0
  187. package/src/client/public/default/mstile-310x150.png +0 -0
  188. package/src/client/public/default/mstile-310x310.png +0 -0
  189. package/src/client/public/default/mstile-70x70.png +0 -0
  190. package/src/client/public/default/sitemap +148 -0
  191. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  192. package/src/client/public/default/yandex-browser-manifest.json +9 -0
  193. package/src/client/public/doc/favicon.ico +0 -0
  194. package/src/client/public/doc/sitemap +148 -0
  195. package/src/client/public/test/favicon.ico +0 -0
  196. package/src/client/public/test/sitemap +148 -0
  197. package/src/client/services/core/core.service.js +152 -0
  198. package/src/client/services/crypto/crypto.service.js +70 -0
  199. package/src/client/services/default/default.management.js +345 -0
  200. package/src/client/services/default/default.service.js +89 -0
  201. package/src/client/services/file/file.service.js +70 -0
  202. package/src/client/services/instance/instance.management.js +74 -0
  203. package/src/client/services/instance/instance.service.js +89 -0
  204. package/src/client/services/test/test.service.js +70 -0
  205. package/src/client/services/user/user.management.js +50 -0
  206. package/src/client/services/user/user.service.js +89 -0
  207. package/src/client/ssr/Render.js +16 -0
  208. package/src/client/ssr/body-components/CacheControl.js +113 -0
  209. package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -0
  210. package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -0
  211. package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -0
  212. package/src/client/ssr/head-components/Css.js +241 -0
  213. package/src/client/ssr/head-components/DefaultScripts.js +3 -0
  214. package/src/client/ssr/head-components/Microdata.js +11 -0
  215. package/src/client/ssr/head-components/Production.js +1 -0
  216. package/src/client/ssr/head-components/PwaDefault.js +60 -0
  217. package/src/client/ssr/head-components/Seo.js +14 -0
  218. package/src/client/sw/default.sw.js +201 -0
  219. package/src/client/sw/template.sw.js +84 -0
  220. package/src/client.build.js +22 -0
  221. package/src/client.dev.js +21 -0
  222. package/src/cron.js +25 -0
  223. package/src/db/DataBaseProvider.js +34 -0
  224. package/src/db/mariadb/MariaDB.js +33 -0
  225. package/src/db/mongo/MongooseDB.js +46 -0
  226. package/src/dns.js +22 -0
  227. package/src/mailer/EmailRender.js +69 -0
  228. package/src/mailer/MailerProvider.js +96 -0
  229. package/src/proxy.js +22 -0
  230. package/src/runtime/lampp/Lampp.js +44 -0
  231. package/src/runtime/nginx/Nginx.js +3 -0
  232. package/src/runtime/xampp/Xampp.js +49 -0
  233. package/src/server/auth.js +204 -0
  234. package/src/server/backup.js +83 -0
  235. package/src/server/client-build-live.js +72 -0
  236. package/src/server/client-build.js +688 -0
  237. package/src/server/client-dev-server.js +58 -0
  238. package/src/server/client-formatted.js +48 -0
  239. package/src/server/client-icons.js +150 -0
  240. package/src/server/conf.js +611 -0
  241. package/src/server/dns.js +87 -0
  242. package/src/server/downloader.js +42 -0
  243. package/src/server/logger.js +135 -0
  244. package/src/server/network.js +122 -0
  245. package/src/server/peer.js +33 -0
  246. package/src/server/process.js +66 -0
  247. package/src/server/proxy.js +118 -0
  248. package/src/server/runtime.js +393 -0
  249. package/src/server/ssl.js +107 -0
  250. package/src/server.js +25 -0
  251. package/src/ws/IoInterface.js +45 -0
  252. package/src/ws/IoServer.js +39 -0
  253. package/src/ws/core/channels/core.ws.chat.js +23 -0
  254. package/src/ws/core/channels/core.ws.mailer.js +35 -0
  255. package/src/ws/core/channels/core.ws.stream.js +31 -0
  256. package/src/ws/core/core.ws.connection.js +28 -0
  257. package/src/ws/core/core.ws.emit.js +14 -0
  258. package/src/ws/core/core.ws.server.js +24 -0
  259. package/src/ws/core/management/core.ws.chat.js +8 -0
  260. package/src/ws/core/management/core.ws.mailer.js +16 -0
  261. package/src/ws/core/management/core.ws.stream.js +8 -0
  262. package/src/ws/default/channels/default.ws.main.js +16 -0
  263. package/src/ws/default/default.ws.connection.js +22 -0
  264. package/src/ws/default/default.ws.emit.js +14 -0
  265. package/src/ws/default/default.ws.server.js +20 -0
  266. package/src/ws/default/management/default.ws.main.js +8 -0
  267. package/startup.js +11 -0
  268. package/supervisord-openssh-server.conf +5 -0
  269. package/test/api.test.js +60 -0
package/bin/deploy.js ADDED
@@ -0,0 +1,600 @@
1
+ import fs from 'fs-extra';
2
+ import axios from 'axios';
3
+ import ncp from 'copy-paste';
4
+ import read from 'read';
5
+ import dotenv from 'dotenv';
6
+ import plantuml from 'plantuml';
7
+
8
+ import { shellCd, shellExec } from '../src/server/process.js';
9
+ import { loggerFactory } from '../src/server/logger.js';
10
+ import {
11
+ Config,
12
+ addApiConf,
13
+ addClientConf,
14
+ buildApiSrc,
15
+ buildClientSrc,
16
+ cloneConf,
17
+ loadConf,
18
+ loadReplicas,
19
+ addWsConf,
20
+ buildWsSrc,
21
+ cloneSrcComponents,
22
+ cliSpinner,
23
+ getDataDeploy,
24
+ } from '../src/server/conf.js';
25
+ import { buildClient } from '../src/server/client-build.js';
26
+ import { range, setPad, timer } from '../src/client/components/core/CommonJs.js';
27
+ import toJsonSchema from 'to-json-schema';
28
+
29
+ const logger = loggerFactory(import.meta);
30
+
31
+ logger.info('argv', process.argv);
32
+
33
+ const [exe, dir, operator] = process.argv;
34
+
35
+ const deployTest = async (dataDeploy) => {
36
+ const failed = [];
37
+ for (const deploy of dataDeploy) {
38
+ const deployServerConfPath = fs.existsSync(`./engine-private/replica/${deploy.deployId}/conf.server.json`)
39
+ ? `./engine-private/replica/${deploy.deployId}/conf.server.json`
40
+ : `./engine-private/conf/${deploy.deployId}/conf.server.json`;
41
+ const serverConf = loadReplicas(JSON.parse(fs.readFileSync(deployServerConfPath, 'utf8')));
42
+ let fail = false;
43
+ for (const host of Object.keys(serverConf))
44
+ for (const path of Object.keys(serverConf[host])) {
45
+ const urlTest = `https://${host}${path}`;
46
+ try {
47
+ const result = await axios.get(urlTest);
48
+ const test = result.data.split('<title>');
49
+ if (test[1])
50
+ logger.info('Success deploy', {
51
+ ...deploy,
52
+ result: test[1].split('</title>')[0],
53
+ urlTest,
54
+ });
55
+ else {
56
+ logger.error('Error deploy', {
57
+ ...deploy,
58
+ result: result.data,
59
+ urlTest,
60
+ });
61
+ fail = true;
62
+ }
63
+ } catch (error) {
64
+ logger.error('Error deploy', {
65
+ ...deploy,
66
+ message: error.message,
67
+ urlTest,
68
+ });
69
+ fail = true;
70
+ }
71
+ }
72
+ if (fail) failed.push(deploy);
73
+ }
74
+ return { failed };
75
+ };
76
+
77
+ const Cmd = {
78
+ clientBuild: (deploy) =>
79
+ `node bin/deploy build-full-client${process.argv[4] === 'zip' ? '-zip' : ''} ${deploy.deployId}${
80
+ process.argv.includes('docs') ? ' docs' : ''
81
+ }`,
82
+ delete: (deploy) => `pm2 delete ${deploy.deployId}`,
83
+ run: (deploy) => `node bin/deploy run ${deploy.deployId}`,
84
+ exec: async (cmd, deployId) => {
85
+ if (process.argv[4] === 'copy') {
86
+ await ncp.copy(cmd);
87
+ await read({ prompt: 'Command copy to clipboard, press enter to continue.\n' });
88
+ if (!fs.existsSync(`./tmp/await-deploy`)) return true;
89
+ return false;
90
+ } else {
91
+ shellExec(cmd);
92
+ return await new Promise(async (resolve) => {
93
+ const maxTime = 1000 * 60 * 5;
94
+ const minTime = 10000 * 2;
95
+ const intervalTime = 1000;
96
+ let currentTime = 0;
97
+ const attempt = () => {
98
+ if (currentTime >= minTime && !fs.existsSync(`./tmp/await-deploy`)) {
99
+ clearInterval(processMonitor);
100
+ return resolve(true);
101
+ }
102
+ cliSpinner(
103
+ intervalTime,
104
+ `[deploy.js] `,
105
+ ` Load instance | elapsed time ${currentTime / 1000}s / ${maxTime / 1000}s`,
106
+ 'yellow',
107
+ 'material',
108
+ );
109
+ currentTime += intervalTime;
110
+ if (currentTime === maxTime) return resolve(false);
111
+ };
112
+ const processMonitor = setInterval(attempt, intervalTime);
113
+ });
114
+ }
115
+ },
116
+ };
117
+
118
+ const deployRun = async (dataDeploy, reset) => {
119
+ if (!fs.existsSync(`./tmp`)) fs.mkdirSync(`./tmp`, { recursive: true });
120
+ if (reset) fs.writeFileSync(`./tmp/runtime-router.json`, '{}', 'utf8');
121
+ for (const deploy of dataDeploy) {
122
+ const deployRunAttempt = async () => {
123
+ await Cmd.exec(Cmd.delete(deploy));
124
+ const execResult = await Cmd.exec(Cmd.run(deploy));
125
+ if (!execResult) {
126
+ logger.error('Deploy time out deploy restart', { dataDeploy, reset });
127
+ await deployRunAttempt();
128
+ }
129
+ };
130
+ await deployRunAttempt();
131
+ }
132
+ const { failed } = await deployTest(dataDeploy);
133
+ for (const deploy of failed) logger.error(deploy.deployId, Cmd.run(deploy));
134
+ if (failed.length > 0) {
135
+ process.argv[4] = 'copy';
136
+ await deployRun(failed);
137
+ }
138
+ };
139
+
140
+ const updateSrc = () => {
141
+ const silent = true;
142
+ shellExec(`git pull origin master`, { silent });
143
+ shellCd(`engine-private`);
144
+ shellExec(`git pull origin master`, { silent });
145
+ shellCd(`..`);
146
+ // shellExec(`npm install && npm install --only=dev`);
147
+ };
148
+
149
+ try {
150
+ switch (operator) {
151
+ case 'save':
152
+ {
153
+ const deployId = process.argv[3];
154
+ const folder = `./engine-private/conf/${deployId}`;
155
+ if (fs.existsSync(folder)) fs.removeSync(folder);
156
+ await Config.build({ folder });
157
+ fs.writeFileSync(`${folder}/.env.production`, fs.readFileSync('./.env.production', 'utf8'), 'utf8');
158
+ fs.writeFileSync(`${folder}/.env.development`, fs.readFileSync('./.env.development', 'utf8'), 'utf8');
159
+ fs.writeFileSync(`${folder}/.env.test`, fs.readFileSync('./.env.test', 'utf8'), 'utf8');
160
+ fs.writeFileSync(`${folder}/package.json`, fs.readFileSync('./package.json', 'utf8'), 'utf8');
161
+ }
162
+ break;
163
+ case 'add-nodejs-app-client-conf':
164
+ {
165
+ const toOptions = {
166
+ deployId: process.argv[3],
167
+ clientId: process.argv[4],
168
+ host: process.argv[5],
169
+ path: process.argv[6],
170
+ };
171
+ const fromOptions = { deployId: process.argv[7], clientId: process.argv[8] };
172
+ addClientConf({ toOptions, fromOptions });
173
+ }
174
+ break;
175
+ case 'build-nodejs-conf-app':
176
+ {
177
+ const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
178
+ const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
179
+ cloneConf({ toOptions, fromOptions });
180
+ }
181
+ break;
182
+ case 'clone-nodejs-src-client-components':
183
+ {
184
+ const fromOptions = { componentsFolder: process.argv[3] };
185
+ const toOptions = { componentsFolder: process.argv[4] };
186
+ cloneSrcComponents({ toOptions, fromOptions });
187
+ }
188
+ break;
189
+ case 'build-nodejs-src-app':
190
+ {
191
+ const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
192
+ const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
193
+ buildClientSrc({ toOptions, fromOptions });
194
+ }
195
+ break;
196
+ case 'build-nodejs-conf-api':
197
+ {
198
+ const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
199
+ const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
200
+ addApiConf({ toOptions, fromOptions });
201
+ }
202
+ break;
203
+ case 'build-nodejs-src-api':
204
+ {
205
+ const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
206
+ const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
207
+ buildApiSrc({ toOptions, fromOptions });
208
+ }
209
+ break;
210
+ case 'build-nodejs-conf-ws':
211
+ {
212
+ const toOptions = {
213
+ wsId: process.argv[3],
214
+ deployId: process.argv[4],
215
+ host: process.argv[5],
216
+ paths: process.argv[6],
217
+ };
218
+ const fromOptions = {
219
+ wsId: process.argv[7],
220
+ deployId: process.argv[8],
221
+ host: process.argv[9],
222
+ paths: process.argv[10],
223
+ };
224
+ addWsConf({ toOptions, fromOptions });
225
+ }
226
+ break;
227
+ case 'build-nodejs-src-ws':
228
+ {
229
+ const toOptions = {
230
+ wsId: process.argv[3],
231
+ deployId: process.argv[4],
232
+ host: process.argv[5],
233
+ paths: process.argv[6],
234
+ };
235
+ const fromOptions = {
236
+ wsId: process.argv[7],
237
+ deployId: process.argv[8],
238
+ host: process.argv[9],
239
+ paths: process.argv[10],
240
+ };
241
+ buildWsSrc({ toOptions, fromOptions });
242
+ }
243
+ break;
244
+ case 'conf': {
245
+ loadConf(process.argv[3]);
246
+ if (process.argv[4]) fs.writeFileSync(`.env`, fs.readFileSync(`.env.${process.argv[4]}`, 'utf8'), 'utf8');
247
+ break;
248
+ }
249
+ case 'run':
250
+ {
251
+ loadConf(process.argv[3]);
252
+ shellExec(`npm start ${process.argv[3]}`);
253
+ }
254
+ break;
255
+ case 'new-nodejs-app':
256
+ {
257
+ const deployId = process.argv[3];
258
+ const clientId = process.argv[4];
259
+
260
+ shellExec(`node bin/deploy build-nodejs-conf-app ${deployId} ${clientId}`);
261
+
262
+ shellExec(`node bin/deploy build-nodejs-src-app ${deployId} ${clientId}`);
263
+
264
+ shellExec(`node bin/deploy build-full-client ${deployId}`);
265
+
266
+ shellExec(`npm run dev ${deployId}`);
267
+ }
268
+ break;
269
+ case 'test-new-api':
270
+ {
271
+ const port = process.argv[3];
272
+ const apiId = process.argv[4];
273
+ let url = `http://localhost:${port}/api/${apiId}`;
274
+ {
275
+ logger.info(`POST REQUEST`, url);
276
+ const result = await axios.post(url, {});
277
+ url += '/' + result.data.data._id;
278
+ logger.info(`POST RESULT ${url}`, result.data);
279
+ }
280
+ {
281
+ logger.info(`GET REQUEST`, url);
282
+ const result = await axios.get(url);
283
+ logger.info(`GET RESULT ${url}`, result.data);
284
+ }
285
+ {
286
+ logger.info(`DELETE REQUEST`, url);
287
+ const result = await axios.delete(url);
288
+ logger.info(`DELETE RESULT ${url}`, result.data);
289
+ }
290
+ }
291
+ break;
292
+ case 'new-nodejs-api':
293
+ {
294
+ const apiId = process.argv[3];
295
+ const deployId = process.argv[4];
296
+ const clientId = process.argv[5];
297
+
298
+ shellExec(`node bin/deploy build-nodejs-conf-api ${apiId} ${deployId} ${clientId}`);
299
+
300
+ shellExec(`node bin/deploy build-nodejs-src-api ${apiId} ${deployId} ${clientId}`);
301
+
302
+ // shellExec(`npm run dev ${deployId}`);
303
+ }
304
+ break;
305
+ case 'new-nodejs-ws':
306
+ {
307
+ const wsId = process.argv[3];
308
+ const deployId = process.argv[4];
309
+ const host = process.argv[5];
310
+ const paths = process.argv[6];
311
+
312
+ shellExec(`node bin/deploy build-nodejs-conf-ws ${wsId} ${deployId} ${host} ${paths}`);
313
+
314
+ shellExec(`node bin/deploy build-nodejs-src-ws ${wsId} ${deployId} ${host} ${paths}`);
315
+
316
+ shellExec(`npm run dev ${deployId}`);
317
+ }
318
+ break;
319
+ case 'build-full-client-zip':
320
+ case 'build-full-client':
321
+ {
322
+ const { deployId, folder } = loadConf(process.argv[3]);
323
+
324
+ await logger.setUpInfo();
325
+
326
+ let argHost = process.argv[4] ? process.argv[4].split(',') : undefined;
327
+ let argPath = process.argv[5] ? process.argv[5].split(',') : undefined;
328
+ const serverConf = deployId
329
+ ? JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'))
330
+ : Config.default.server;
331
+ if (!deployId) {
332
+ argHost = 'default.net';
333
+ argPath = '/';
334
+ }
335
+ for (const host of Object.keys(serverConf)) {
336
+ for (const path of Object.keys(serverConf[host])) {
337
+ if (argHost && argPath && (!argHost.includes(host) || !argPath.includes(path))) {
338
+ delete serverConf[host][path];
339
+ } else {
340
+ serverConf[host][path].lightBuild = process.argv.includes('l') ? true : false;
341
+ serverConf[host][path].minifyBuild = process.env.NODE_ENV === 'production' ? true : false;
342
+ }
343
+ }
344
+ }
345
+ fs.writeFileSync(`./conf/conf.server.json`, JSON.stringify(serverConf, null, 4), 'utf-8');
346
+ await buildClient();
347
+ }
348
+ break;
349
+
350
+ case 'update-package':
351
+ const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
352
+ const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
353
+ for (const relativePath of files) {
354
+ const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
355
+ if (filePah.split('/').pop() === 'package.json') {
356
+ originPackage.scripts.start = JSON.parse(fs.readFileSync(filePah), 'utf8').scripts.start;
357
+ fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
358
+ }
359
+ }
360
+ break;
361
+
362
+ case 'run-macro':
363
+ {
364
+ if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
365
+ updateSrc();
366
+ const dataDeploy = getDataDeploy({ buildSingleReplica: true });
367
+ shellExec(`node bin/deploy sync-env-port ${process.argv[3]}`);
368
+ await deployRun(dataDeploy, true);
369
+ }
370
+ break;
371
+
372
+ case 'run-macro-build':
373
+ {
374
+ if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
375
+ updateSrc();
376
+ const dataDeploy = getDataDeploy({ buildSingleReplica: true });
377
+ shellExec(`node bin/deploy sync-env-port ${process.argv[3]}`);
378
+ for (const deploy of dataDeploy) {
379
+ shellExec(`node bin/deploy conf ${deploy.deployId} production`);
380
+ shellExec(Cmd.clientBuild(deploy), { silent: true });
381
+ }
382
+ await deployRun(dataDeploy, true);
383
+ }
384
+ break;
385
+ case 'prometheus':
386
+ case 'prom':
387
+ {
388
+ const rangePort = [1, 20];
389
+ const promConfigPath = `./engine-private/prometheus/prometheus-service-config.yml`;
390
+ const rawConfig = fs
391
+ .readFileSync(promConfigPath, 'utf8')
392
+ .replaceAll(
393
+ `['']`,
394
+ JSON.stringify(range(...rangePort).map((i) => `host.docker.internal:30${setPad(i, '0', 2)}`)).replaceAll(
395
+ `"`,
396
+ `'`,
397
+ ),
398
+ );
399
+ console.log(rawConfig);
400
+
401
+ fs.writeFileSync(promConfigPath, rawConfig, 'utf8');
402
+
403
+ await Cmd.exec(`docker-compose -f engine-private/prometheus/prometheus-service.yml up -d`);
404
+ }
405
+ break;
406
+
407
+ case 'sync-env-port':
408
+ const dataDeploy = getDataDeploy();
409
+ const dataEnv = [
410
+ { env: 'production', port: 3000 },
411
+ { env: 'development', port: 4000 },
412
+ { env: 'test', port: 5000 },
413
+ ];
414
+ let port = 0;
415
+ const singleReplicaHosts = [];
416
+ for (const deployIdObj of dataDeploy) {
417
+ const { deployId, replicaHost } = deployIdObj;
418
+ if (replicaHost && !singleReplicaHosts.includes(replicaHost)) singleReplicaHosts.push(replicaHost);
419
+ const proxyInstance = deployId.match('proxy') || deployId.match('cron');
420
+ const baseConfPath = fs.existsSync(`./engine-private/replica/${deployId}`)
421
+ ? `./engine-private/replica`
422
+ : `./engine-private/conf`;
423
+ for (const envInstanceObj of dataEnv) {
424
+ const envPath = `${baseConfPath}/${deployId}/.env.${envInstanceObj.env}`;
425
+ const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
426
+ envObj.PORT = proxyInstance
427
+ ? envInstanceObj.port
428
+ : envInstanceObj.port + port - singleReplicaHosts.length - (replicaHost ? 1 : 0);
429
+
430
+ fs.writeFileSync(
431
+ envPath,
432
+ Object.keys(envObj)
433
+ .map((key) => `${key}=${envObj[key]}`)
434
+ .join(`\n`),
435
+ 'utf8',
436
+ );
437
+ }
438
+ const serverConf = loadReplicas(
439
+ JSON.parse(fs.readFileSync(`${baseConfPath}/${deployId}/conf.server.json`, 'utf8')),
440
+ );
441
+ if (!proxyInstance) for (const host of Object.keys(serverConf)) port += Object.keys(serverConf[host]).length;
442
+ }
443
+ break;
444
+
445
+ case 'build-uml':
446
+ {
447
+ // comment:
448
+ // '--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax="ALL-UNNAMED"'
449
+ // in plantuml.js src
450
+
451
+ const deployId = process.argv[3];
452
+ const clientId = process.argv[4];
453
+ const folder = `./src/client/public/${clientId ? clientId : 'default'}/plantuml`;
454
+ const confData = !deployId
455
+ ? Config.default
456
+ : {
457
+ client: '',
458
+ ssr: '',
459
+ server: '',
460
+ cron: '',
461
+ };
462
+
463
+ if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
464
+
465
+ for (const typeConf of Object.keys(confData)) {
466
+ {
467
+ const svg = await plantuml(`
468
+ @startjson
469
+ ${JSON.stringify(confData[typeConf])}
470
+ @endjson
471
+ `);
472
+ fs.writeFileSync(`${folder}/${typeConf}-conf-default.svg`, svg);
473
+ }
474
+ {
475
+ const svg = await plantuml(`
476
+ @startjson
477
+ ${JSON.stringify(toJsonSchema(confData[typeConf]))}
478
+ @endjson
479
+ `);
480
+ fs.writeFileSync(`${folder}/${typeConf}-schema-default.svg`, svg);
481
+ }
482
+ }
483
+ }
484
+ break;
485
+
486
+ case 'build-single-replica': {
487
+ const deployId = process.argv[3];
488
+ const host = process.argv[4];
489
+ const path = process.argv[5];
490
+ const serverConf = loadReplicas(
491
+ JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
492
+ );
493
+
494
+ if (serverConf[host][path].replicas) {
495
+ {
496
+ let replicaIndex = -1;
497
+ for (const replica of serverConf[host][path].replicas) {
498
+ replicaIndex++;
499
+ const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
500
+ // fs.mkdirSync(`./engine-private/replica/${deployId}${replicaIndex}`, { recursive: true });
501
+ await fs.copy(`./engine-private/conf/${deployId}`, `./engine-private/replica/${replicaDeployId}`);
502
+ fs.writeFileSync(
503
+ `./engine-private/replica/${replicaDeployId}/package.json`,
504
+ fs
505
+ .readFileSync(`./engine-private/replica/${replicaDeployId}/package.json`, 'utf8')
506
+ .replaceAll(`--name ${deployId}`, `--name ${replicaDeployId}`),
507
+ 'utf8',
508
+ );
509
+ }
510
+ }
511
+ {
512
+ let replicaIndex = -1;
513
+ for (const replica of serverConf[host][path].replicas) {
514
+ replicaIndex++;
515
+ const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
516
+ let replicaServerConf = JSON.parse(
517
+ fs.readFileSync(`./engine-private/replica/${replicaDeployId}/conf.server.json`, 'utf8'),
518
+ );
519
+
520
+ const singleReplicaConf = replicaServerConf[host][path];
521
+ singleReplicaConf.replicas = undefined;
522
+ singleReplicaConf.singleReplica = undefined;
523
+
524
+ replicaServerConf = {};
525
+ replicaServerConf[host] = {};
526
+ replicaServerConf[host][replica] = singleReplicaConf;
527
+
528
+ fs.writeFileSync(
529
+ `./engine-private/replica/${replicaDeployId}/conf.server.json`,
530
+ JSON.stringify(replicaServerConf, null, 4),
531
+ 'utf8',
532
+ );
533
+ }
534
+ }
535
+ }
536
+ break;
537
+ }
538
+ case 'build-macro-replica':
539
+ getDataDeploy({ buildSingleReplica: true });
540
+ shellExec(`node bin/deploy sync-env-port ${process.argv[3]}`);
541
+ break;
542
+ case 'update-version':
543
+ {
544
+ const newVersion = process.argv[3];
545
+ const originPackageJson = JSON.parse(fs.readFileSync(`package.json`, 'utf8'));
546
+ const { version } = originPackageJson;
547
+ originPackageJson.version = newVersion;
548
+ fs.writeFileSync(`package.json`, JSON.stringify(originPackageJson, null, 4), 'utf8');
549
+
550
+ {
551
+ const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
552
+ for (const relativePath of files) {
553
+ const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
554
+ if (filePah.split('/').pop() === 'package.json') {
555
+ const originPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
556
+ originPackage.version = newVersion;
557
+ fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
558
+ }
559
+ }
560
+ }
561
+
562
+ fs.writeFileSync(
563
+ `./docker-compose.yml`,
564
+ fs
565
+ .readFileSync(`./docker-compose.yml`, 'utf8')
566
+ .replaceAll(`engine.version: '${version}'`, `engine.version: '${newVersion}'`),
567
+ 'utf8',
568
+ );
569
+
570
+ fs.writeFileSync(
571
+ `./.github/workflows/docker-image.yml`,
572
+ fs
573
+ .readFileSync(`./.github/workflows/docker-image.yml`, 'utf8')
574
+ .replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
575
+ 'utf8',
576
+ );
577
+
578
+ fs.writeFileSync(
579
+ `./src/client/components/core/Docs.js`,
580
+ fs
581
+ .readFileSync(`./src/client/components/core/Docs.js`, 'utf8')
582
+ .replaceAll(`/engine/${version}`, `/engine/${newVersion}`),
583
+ 'utf8',
584
+ );
585
+
586
+ fs.writeFileSync(
587
+ `./src/client/ssr/body-components/CacheControl.js`,
588
+ fs
589
+ .readFileSync(`./src/client/ssr/body-components/CacheControl.js`, 'utf8')
590
+ .replaceAll(`v${version}`, `v${newVersion}`),
591
+ 'utf8',
592
+ );
593
+ }
594
+ break;
595
+ default:
596
+ break;
597
+ }
598
+ } catch (error) {
599
+ logger.error(error, error.stack);
600
+ }
package/bin/dns.js ADDED
@@ -0,0 +1 @@
1
+ // update single/group/all dns record: A | ANAME
package/bin/file.js ADDED
@@ -0,0 +1,92 @@
1
+ import fs from 'fs-extra';
2
+
3
+ import { loggerFactory } from '../src/server/logger.js';
4
+ import { cap, getDirname } from '../src/client/components/core/CommonJs.js';
5
+ import { shellExec } from '../src/server/process.js';
6
+ import walk from 'ignore-walk';
7
+ import { getCapVariableName, validateTemplatePath } from '../src/server/conf.js';
8
+
9
+ const logger = loggerFactory(import.meta);
10
+
11
+ logger.info('argv', process.argv);
12
+
13
+ // usage:
14
+ // node bin/file create './wena que-onda.py'
15
+ // node bin/file create js-module './wena que-onda.js'
16
+ // node bin/file copy-src 'c:/dd/excel-api' 'c:/dd/engine/engine-private/deploy/excel-api'
17
+
18
+ let [exe, dir, type] = process.argv;
19
+ let rawPath = process.argv[3].replaceAll(`'`, '');
20
+ let toPath = process.argv[4].replaceAll(`'`, '');
21
+
22
+ let path = `${rawPath}`.split('/');
23
+ path.pop();
24
+ path = path.join('/');
25
+
26
+ const file = `${rawPath}`.split('/').pop();
27
+ const ext = file.split('.')[1];
28
+ let name = getCapVariableName(file.split('.')[0]);
29
+
30
+ logger.info('File metadata', { path, file, ext, name });
31
+
32
+ try {
33
+ // throw '';
34
+ // let cmd;
35
+ let content = '';
36
+ switch (type) {
37
+ case 'create-js-module':
38
+ // node bin/file './src/client/components/core/progress bar.js'
39
+ content = `const ${name} = {}; export { ${name} }`;
40
+ setTimeout(() => shellExec(`prettier --write ${buildPath}`));
41
+ break;
42
+
43
+ case 'update-template':
44
+ case 'copy-src':
45
+ console.log({ rawPath, toPath });
46
+
47
+ // this function returns a promise, but you can also pass a cb
48
+ // if you like that approach better.
49
+ let result = await new Promise((resolve) =>
50
+ walk(
51
+ {
52
+ path: rawPath, // root dir to start in. defaults to process.cwd()
53
+ ignoreFiles: [`.gitignore`], // list of filenames. defaults to ['.ignore']
54
+ includeEmpty: false, // true to include empty dirs, default false
55
+ follow: false, // true to follow symlink dirs, default false
56
+ },
57
+ (...args) => resolve(args[1]),
58
+ ),
59
+ );
60
+
61
+ result = result.filter((path) => !path.startsWith('.git'));
62
+
63
+ console.log('copy paths', result);
64
+
65
+ if (type !== 'update-template') fs.removeSync(toPath);
66
+
67
+ for (const copyPath of result) {
68
+ const folder = getDirname(`${toPath}/${copyPath}`);
69
+ const absolutePath = `${rawPath}/${copyPath}`;
70
+
71
+ if (type === 'update-template' && !validateTemplatePath(absolutePath)) continue;
72
+
73
+ if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
74
+
75
+ logger.info('build', `${toPath}/${copyPath}`);
76
+
77
+ fs.copyFileSync(absolutePath, `${toPath}/${copyPath}`);
78
+ }
79
+
80
+ break;
81
+ case 'create':
82
+ const buildPath = `${path}/${name}${ext ? `.${ext}` : ''}`;
83
+ logger.info('Build path', buildPath);
84
+ fs.mkdirSync(path, { recursive: true });
85
+ fs.writeFileSync(buildPath, content, 'utf8');
86
+ default:
87
+ logger.error('not found operator');
88
+ break;
89
+ }
90
+ } catch (error) {
91
+ logger.error(error, error.stack);
92
+ }