underpost 2.7.1 → 2.7.3

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 (214) hide show
  1. package/.dockerignore +13 -13
  2. package/.env.development +7 -7
  3. package/.env.production +7 -7
  4. package/.env.test +7 -7
  5. package/.github/workflows/publish.yml +26 -0
  6. package/.github/workflows/test.yml +80 -0
  7. package/.nycrc +9 -9
  8. package/.prettierignore +12 -12
  9. package/.prettierrc +9 -9
  10. package/.vscode/extensions.json +72 -72
  11. package/.vscode/settings.json +100 -99
  12. package/Dockerfile +89 -89
  13. package/LICENSE +21 -21
  14. package/README.md +96 -96
  15. package/bin/db.js +172 -119
  16. package/bin/deploy.js +607 -661
  17. package/bin/file.js +93 -92
  18. package/bin/index.js +76 -53
  19. package/bin/ssl.js +55 -64
  20. package/bin/util.js +182 -182
  21. package/bin/vs.js +35 -35
  22. package/conf.js +251 -249
  23. package/docker-compose.yml +67 -67
  24. package/jsconfig.json +7 -7
  25. package/jsdoc.json +32 -32
  26. package/nodemon.json +6 -6
  27. package/package.json +137 -132
  28. package/prometheus.yml +36 -36
  29. package/setup.sh +24 -24
  30. package/src/api/core/core.controller.js +69 -69
  31. package/src/api/core/core.model.js +11 -11
  32. package/src/api/core/core.router.js +23 -23
  33. package/src/api/core/core.service.js +29 -29
  34. package/src/api/crypto/crypto.controller.js +51 -51
  35. package/src/api/crypto/crypto.model.js +23 -23
  36. package/src/api/crypto/crypto.router.js +20 -20
  37. package/src/api/crypto/crypto.service.js +64 -64
  38. package/src/api/default/default.controller.js +69 -69
  39. package/src/api/default/default.model.js +20 -20
  40. package/src/api/default/default.router.js +23 -23
  41. package/src/api/default/default.service.js +31 -31
  42. package/src/api/file/file.controller.js +53 -51
  43. package/src/api/file/file.model.js +19 -19
  44. package/src/api/file/file.router.js +21 -20
  45. package/src/api/file/file.service.js +76 -70
  46. package/src/api/instance/instance.controller.js +69 -69
  47. package/src/api/instance/instance.model.js +36 -36
  48. package/src/api/instance/instance.router.js +33 -33
  49. package/src/api/instance/instance.service.js +48 -48
  50. package/src/api/test/test.controller.js +59 -59
  51. package/src/api/test/test.model.js +14 -14
  52. package/src/api/test/test.router.js +21 -21
  53. package/src/api/test/test.service.js +35 -35
  54. package/src/api/user/user.build.js +16 -0
  55. package/src/api/user/user.controller.js +70 -70
  56. package/src/api/user/user.model.js +65 -65
  57. package/src/api/user/user.router.js +345 -345
  58. package/src/api/user/user.service.js +479 -479
  59. package/src/api.js +23 -23
  60. package/src/client/Default.index.js +40 -40
  61. package/src/client/components/core/Account.js +290 -290
  62. package/src/client/components/core/AgGrid.js +160 -160
  63. package/src/client/components/core/Auth.js +19 -19
  64. package/src/client/components/core/Badge.js +32 -32
  65. package/src/client/components/core/{BlockChain.js → Blockchain.js} +41 -41
  66. package/src/client/components/core/Blog.js +9 -9
  67. package/src/client/components/core/BtnIcon.js +101 -94
  68. package/src/client/components/core/CalendarCore.js +458 -319
  69. package/src/client/components/core/Chat.js +64 -64
  70. package/src/client/components/core/ColorPalette.js +5267 -5267
  71. package/src/client/components/core/CommonJs.js +735 -732
  72. package/src/client/components/core/Content.js +193 -49
  73. package/src/client/components/core/Css.js +1064 -1027
  74. package/src/client/components/core/CssCore.js +817 -796
  75. package/src/client/components/core/D3Chart.js +44 -44
  76. package/src/client/components/core/Docs.js +229 -229
  77. package/src/client/components/core/DropDown.js +164 -164
  78. package/src/client/components/core/EventsUI.js +46 -54
  79. package/src/client/components/core/FileExplorer.js +699 -624
  80. package/src/client/components/core/FullScreen.js +45 -45
  81. package/src/client/components/core/Input.js +346 -259
  82. package/src/client/components/core/JoyStick.js +77 -77
  83. package/src/client/components/core/Keyboard.js +73 -73
  84. package/src/client/components/core/LoadingAnimation.js +179 -157
  85. package/src/client/components/core/LogIn.js +187 -181
  86. package/src/client/components/core/LogOut.js +58 -52
  87. package/src/client/components/core/Logger.js +26 -26
  88. package/src/client/components/core/Modal.js +1612 -1596
  89. package/src/client/components/core/NotificationManager.js +84 -84
  90. package/src/client/components/core/Panel.js +613 -413
  91. package/src/client/components/core/PanelForm.js +468 -0
  92. package/src/client/components/core/Polyhedron.js +162 -162
  93. package/src/client/components/core/Recover.js +204 -204
  94. package/src/client/components/core/Responsive.js +53 -53
  95. package/src/client/components/core/RichText.js +51 -27
  96. package/src/client/components/core/Router.js +76 -77
  97. package/src/client/components/core/Scroll.js +34 -0
  98. package/src/client/components/core/SignUp.js +125 -125
  99. package/src/client/components/core/SocketIo.js +72 -72
  100. package/src/client/components/core/Stream.js +113 -113
  101. package/src/client/components/core/ToggleSwitch.js +87 -87
  102. package/src/client/components/core/ToolTip.js +26 -26
  103. package/src/client/components/core/Translate.js +437 -408
  104. package/src/client/components/core/Validator.js +100 -100
  105. package/src/client/components/core/VanillaJs.js +460 -457
  106. package/src/client/components/core/Wallet.js +106 -106
  107. package/src/client/components/core/Webhook.js +25 -25
  108. package/src/client/components/core/Worker.js +272 -272
  109. package/src/client/components/default/CommonDefault.js +29 -29
  110. package/src/client/components/default/CssDefault.js +13 -13
  111. package/src/client/components/default/ElementsDefault.js +38 -38
  112. package/src/client/components/default/LogInDefault.js +41 -41
  113. package/src/client/components/default/LogOutDefault.js +28 -28
  114. package/src/client/components/default/MenuDefault.js +389 -389
  115. package/src/client/components/default/RoutesDefault.js +48 -48
  116. package/src/client/components/default/SettingsDefault.js +16 -16
  117. package/src/client/components/default/SignUpDefault.js +9 -9
  118. package/src/client/components/default/SocketIoDefault.js +54 -54
  119. package/src/client/components/default/TranslateDefault.js +7 -7
  120. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  121. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  122. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  123. package/src/client/public/default/browserconfig.xml +11 -11
  124. package/src/client/public/default/manifest.webmanifest +68 -68
  125. package/src/client/public/default/plantuml/client-conf.svg +1 -0
  126. package/src/client/public/default/plantuml/client-schema.svg +1 -0
  127. package/src/client/public/default/plantuml/cron-conf.svg +1 -0
  128. package/src/client/public/default/plantuml/cron-schema.svg +1 -0
  129. package/src/client/public/default/plantuml/server-conf.svg +1 -0
  130. package/src/client/public/default/plantuml/server-schema.svg +1 -0
  131. package/src/client/public/default/plantuml/ssr-conf.svg +1 -0
  132. package/src/client/public/default/plantuml/ssr-schema.svg +1 -0
  133. package/src/client/public/default/sitemap +147 -147
  134. package/src/client/public/default/yandex-browser-manifest.json +8 -8
  135. package/src/client/public/doc/sitemap +147 -147
  136. package/src/client/public/test/sitemap +147 -147
  137. package/src/client/services/core/core.service.js +170 -152
  138. package/src/client/services/crypto/crypto.service.js +70 -70
  139. package/src/client/services/default/default.management.js +345 -345
  140. package/src/client/services/default/default.service.js +89 -89
  141. package/src/client/services/file/file.service.js +70 -70
  142. package/src/client/services/instance/instance.management.js +74 -74
  143. package/src/client/services/instance/instance.service.js +89 -89
  144. package/src/client/services/test/test.service.js +70 -70
  145. package/src/client/services/user/user.management.js +50 -50
  146. package/src/client/services/user/user.service.js +89 -89
  147. package/src/client/ssr/Render.js +16 -16
  148. package/src/client/ssr/body-components/CacheControl.js +114 -113
  149. package/src/client/ssr/body-components/DefaultSplashScreen.js +79 -79
  150. package/src/client/ssr/email-components/DefaultRecoverEmail.js +21 -21
  151. package/src/client/ssr/email-components/DefaultVerifyEmail.js +17 -17
  152. package/src/client/ssr/head-components/Css.js +241 -241
  153. package/src/client/ssr/head-components/DefaultScripts.js +3 -3
  154. package/src/client/ssr/head-components/Microdata.js +11 -11
  155. package/src/client/ssr/head-components/Production.js +1 -1
  156. package/src/client/ssr/head-components/PwaDefault.js +59 -59
  157. package/src/client/ssr/head-components/Seo.js +14 -14
  158. package/src/client/sw/default.sw.js +201 -201
  159. package/src/client/sw/template.sw.js +84 -84
  160. package/src/client.build.js +22 -22
  161. package/src/client.dev.js +21 -21
  162. package/src/cron.js +25 -25
  163. package/src/db/DataBaseProvider.js +34 -34
  164. package/src/db/mariadb/MariaDB.js +33 -33
  165. package/src/db/mongo/MongooseDB.js +137 -46
  166. package/src/dns.js +22 -22
  167. package/src/index.js +42 -29
  168. package/src/mailer/EmailRender.js +69 -69
  169. package/src/mailer/MailerProvider.js +96 -96
  170. package/src/proxy.js +22 -22
  171. package/src/runtime/lampp/Lampp.js +115 -44
  172. package/src/runtime/nginx/Nginx.js +3 -3
  173. package/src/runtime/xampp/Xampp.js +49 -49
  174. package/src/server/auth.js +235 -204
  175. package/src/server/backup.js +101 -94
  176. package/src/server/client-build-live.js +72 -72
  177. package/src/server/client-build.js +699 -699
  178. package/src/server/client-dev-server.js +60 -58
  179. package/src/server/client-formatted.js +48 -48
  180. package/src/server/client-icons.js +149 -150
  181. package/src/server/conf.js +860 -611
  182. package/src/server/dns.js +98 -98
  183. package/src/server/downloader.js +42 -42
  184. package/src/server/logger.js +190 -180
  185. package/src/server/network.js +122 -122
  186. package/src/server/peer.js +33 -33
  187. package/src/server/process.js +66 -66
  188. package/src/server/prompt-optimizer.js +28 -28
  189. package/src/server/proxy.js +118 -118
  190. package/src/server/runtime.js +444 -393
  191. package/src/server/ssl.js +120 -107
  192. package/src/server.js +25 -25
  193. package/src/ws/IoInterface.js +45 -45
  194. package/src/ws/IoServer.js +39 -39
  195. package/src/ws/core/channels/core.ws.chat.js +23 -23
  196. package/src/ws/core/channels/core.ws.mailer.js +35 -35
  197. package/src/ws/core/channels/core.ws.stream.js +31 -31
  198. package/src/ws/core/core.ws.connection.js +28 -28
  199. package/src/ws/core/core.ws.emit.js +14 -14
  200. package/src/ws/core/core.ws.server.js +24 -24
  201. package/src/ws/core/management/core.ws.chat.js +8 -8
  202. package/src/ws/core/management/core.ws.mailer.js +16 -16
  203. package/src/ws/core/management/core.ws.stream.js +8 -8
  204. package/src/ws/default/channels/default.ws.main.js +16 -16
  205. package/src/ws/default/default.ws.connection.js +22 -22
  206. package/src/ws/default/default.ws.emit.js +14 -14
  207. package/src/ws/default/default.ws.server.js +20 -20
  208. package/src/ws/default/management/default.ws.main.js +8 -8
  209. package/startup.js +11 -11
  210. package/supervisord-openssh-server.conf +4 -4
  211. package/test/api.test.js +60 -60
  212. package/bin/dns.js +0 -1
  213. package/bin/install.js +0 -357
  214. package/bin/shortcut.js +0 -44
package/bin/deploy.js CHANGED
@@ -1,661 +1,607 @@
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, uniqueArray } from '../src/client/components/core/CommonJs.js';
27
- import toJsonSchema from 'to-json-schema';
28
- import simpleGit from 'simple-git';
29
-
30
- const logger = loggerFactory(import.meta);
31
-
32
- logger.info('argv', process.argv);
33
-
34
- const [exe, dir, operator] = process.argv;
35
-
36
- const deployTest = async (dataDeploy) => {
37
- const failed = [];
38
- for (const deploy of dataDeploy) {
39
- const deployServerConfPath = fs.existsSync(`./engine-private/replica/${deploy.deployId}/conf.server.json`)
40
- ? `./engine-private/replica/${deploy.deployId}/conf.server.json`
41
- : `./engine-private/conf/${deploy.deployId}/conf.server.json`;
42
- const serverConf = loadReplicas(JSON.parse(fs.readFileSync(deployServerConfPath, 'utf8')));
43
- let fail = false;
44
- for (const host of Object.keys(serverConf))
45
- for (const path of Object.keys(serverConf[host])) {
46
- const urlTest = `https://${host}${path}`;
47
- try {
48
- const result = await axios.get(urlTest);
49
- const test = result.data.split('<title>');
50
- if (test[1])
51
- logger.info('Success deploy', {
52
- ...deploy,
53
- result: test[1].split('</title>')[0],
54
- urlTest,
55
- });
56
- else {
57
- logger.error('Error deploy', {
58
- ...deploy,
59
- result: result.data,
60
- urlTest,
61
- });
62
- fail = true;
63
- }
64
- } catch (error) {
65
- logger.error('Error deploy', {
66
- ...deploy,
67
- message: error.message,
68
- urlTest,
69
- });
70
- fail = true;
71
- }
72
- }
73
- if (fail) failed.push(deploy);
74
- }
75
- return { failed };
76
- };
77
-
78
- const Cmd = {
79
- clientBuild: (deploy) =>
80
- `node bin/deploy build-full-client${process.argv[4] === 'zip' ? '-zip' : ''} ${deploy.deployId}${
81
- process.argv.includes('docs') ? ' docs' : ''
82
- }`,
83
- delete: (deploy) => `pm2 delete ${deploy.deployId}`,
84
- run: (deploy) => `node bin/deploy run ${deploy.deployId}`,
85
- exec: async (cmd, deployId) => {
86
- if (process.argv[4] === 'copy') {
87
- await ncp.copy(cmd);
88
- await read({ prompt: 'Command copy to clipboard, press enter to continue.\n' });
89
- if (!fs.existsSync(`./tmp/await-deploy`)) return true;
90
- return false;
91
- } else {
92
- shellExec(cmd);
93
- return await new Promise(async (resolve) => {
94
- const maxTime = 1000 * 60 * 5;
95
- const minTime = 10000 * 2;
96
- const intervalTime = 1000;
97
- let currentTime = 0;
98
- const attempt = () => {
99
- if (currentTime >= minTime && !fs.existsSync(`./tmp/await-deploy`)) {
100
- clearInterval(processMonitor);
101
- return resolve(true);
102
- }
103
- cliSpinner(
104
- intervalTime,
105
- `[deploy.js] `,
106
- ` Load instance | elapsed time ${currentTime / 1000}s / ${maxTime / 1000}s`,
107
- 'yellow',
108
- 'material',
109
- );
110
- currentTime += intervalTime;
111
- if (currentTime === maxTime) return resolve(false);
112
- };
113
- const processMonitor = setInterval(attempt, intervalTime);
114
- });
115
- }
116
- },
117
- };
118
-
119
- const deployRun = async (dataDeploy, reset) => {
120
- if (!fs.existsSync(`./tmp`)) fs.mkdirSync(`./tmp`, { recursive: true });
121
- if (reset) fs.writeFileSync(`./tmp/runtime-router.json`, '{}', 'utf8');
122
- for (const deploy of dataDeploy) {
123
- const deployRunAttempt = async () => {
124
- await Cmd.exec(Cmd.delete(deploy));
125
- const execResult = await Cmd.exec(Cmd.run(deploy));
126
- if (!execResult) {
127
- logger.error('Deploy time out deploy restart', { dataDeploy, reset });
128
- await deployRunAttempt();
129
- }
130
- };
131
- await deployRunAttempt();
132
- }
133
- const { failed } = await deployTest(dataDeploy);
134
- for (const deploy of failed) logger.error(deploy.deployId, Cmd.run(deploy));
135
- if (failed.length > 0) {
136
- process.argv[4] = 'copy';
137
- await deployRun(failed);
138
- }
139
- };
140
-
141
- const updateSrc = () => {
142
- const silent = true;
143
- shellExec(`git pull origin master`, { silent });
144
- shellCd(`engine-private`);
145
- shellExec(`git pull origin master`, { silent });
146
- shellCd(`..`);
147
- // shellExec(`npm install && npm install --only=dev`);
148
- };
149
-
150
- try {
151
- switch (operator) {
152
- case 'save':
153
- {
154
- const deployId = process.argv[3];
155
- const folder = `./engine-private/conf/${deployId}`;
156
- if (fs.existsSync(folder)) fs.removeSync(folder);
157
- await Config.build({ folder });
158
- fs.writeFileSync(`${folder}/.env.production`, fs.readFileSync('./.env.production', 'utf8'), 'utf8');
159
- fs.writeFileSync(`${folder}/.env.development`, fs.readFileSync('./.env.development', 'utf8'), 'utf8');
160
- fs.writeFileSync(`${folder}/.env.test`, fs.readFileSync('./.env.test', 'utf8'), 'utf8');
161
- fs.writeFileSync(`${folder}/package.json`, fs.readFileSync('./package.json', 'utf8'), 'utf8');
162
- }
163
- break;
164
- case 'add-nodejs-app-client-conf':
165
- {
166
- const toOptions = {
167
- deployId: process.argv[3],
168
- clientId: process.argv[4],
169
- host: process.argv[5],
170
- path: process.argv[6],
171
- };
172
- const fromOptions = { deployId: process.argv[7], clientId: process.argv[8] };
173
- addClientConf({ toOptions, fromOptions });
174
- }
175
- break;
176
- case 'build-nodejs-conf-app':
177
- {
178
- const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
179
- const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
180
- cloneConf({ toOptions, fromOptions });
181
- }
182
- break;
183
- case 'clone-nodejs-src-client-components':
184
- {
185
- const fromOptions = { componentsFolder: process.argv[3] };
186
- const toOptions = { componentsFolder: process.argv[4] };
187
- cloneSrcComponents({ toOptions, fromOptions });
188
- }
189
- break;
190
- case 'build-nodejs-src-app':
191
- {
192
- const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
193
- const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
194
- buildClientSrc({ toOptions, fromOptions });
195
- }
196
- break;
197
- case 'build-nodejs-conf-api':
198
- {
199
- const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
200
- const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
201
- addApiConf({ toOptions, fromOptions });
202
- }
203
- break;
204
- case 'build-nodejs-src-api':
205
- {
206
- const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
207
- const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
208
- buildApiSrc({ toOptions, fromOptions });
209
- }
210
- break;
211
- case 'build-nodejs-conf-ws':
212
- {
213
- const toOptions = {
214
- wsId: process.argv[3],
215
- deployId: process.argv[4],
216
- host: process.argv[5],
217
- paths: process.argv[6],
218
- };
219
- const fromOptions = {
220
- wsId: process.argv[7],
221
- deployId: process.argv[8],
222
- host: process.argv[9],
223
- paths: process.argv[10],
224
- };
225
- addWsConf({ toOptions, fromOptions });
226
- }
227
- break;
228
- case 'build-nodejs-src-ws':
229
- {
230
- const toOptions = {
231
- wsId: process.argv[3],
232
- deployId: process.argv[4],
233
- host: process.argv[5],
234
- paths: process.argv[6],
235
- };
236
- const fromOptions = {
237
- wsId: process.argv[7],
238
- deployId: process.argv[8],
239
- host: process.argv[9],
240
- paths: process.argv[10],
241
- };
242
- buildWsSrc({ toOptions, fromOptions });
243
- }
244
- break;
245
- case 'conf': {
246
- loadConf(process.argv[3]);
247
- if (process.argv[4]) fs.writeFileSync(`.env`, fs.readFileSync(`.env.${process.argv[4]}`, 'utf8'), 'utf8');
248
- break;
249
- }
250
- case 'run':
251
- {
252
- loadConf(process.argv[3]);
253
- shellExec(`npm start ${process.argv[3]}`);
254
- }
255
- break;
256
- case 'new-nodejs-app':
257
- {
258
- const deployId = process.argv[3];
259
- const clientId = process.argv[4];
260
-
261
- shellExec(`node bin/deploy build-nodejs-conf-app ${deployId} ${clientId}`);
262
-
263
- shellExec(`node bin/deploy build-nodejs-src-app ${deployId} ${clientId}`);
264
-
265
- shellExec(`node bin/deploy build-full-client ${deployId}`);
266
-
267
- shellExec(`npm run dev ${deployId}`);
268
- }
269
- break;
270
- case 'test-new-api':
271
- {
272
- const port = process.argv[3];
273
- const apiId = process.argv[4];
274
- let url = `http://localhost:${port}/api/${apiId}`;
275
- {
276
- logger.info(`POST REQUEST`, url);
277
- const result = await axios.post(url, {});
278
- url += '/' + result.data.data._id;
279
- logger.info(`POST RESULT ${url}`, result.data);
280
- }
281
- {
282
- logger.info(`GET REQUEST`, url);
283
- const result = await axios.get(url);
284
- logger.info(`GET RESULT ${url}`, result.data);
285
- }
286
- {
287
- logger.info(`DELETE REQUEST`, url);
288
- const result = await axios.delete(url);
289
- logger.info(`DELETE RESULT ${url}`, result.data);
290
- }
291
- }
292
- break;
293
- case 'new-nodejs-api':
294
- {
295
- const apiId = process.argv[3];
296
- const deployId = process.argv[4];
297
- const clientId = process.argv[5];
298
-
299
- shellExec(`node bin/deploy build-nodejs-conf-api ${apiId} ${deployId} ${clientId}`);
300
-
301
- shellExec(`node bin/deploy build-nodejs-src-api ${apiId} ${deployId} ${clientId}`);
302
-
303
- // shellExec(`npm run dev ${deployId}`);
304
- }
305
- break;
306
- case 'new-nodejs-ws':
307
- {
308
- const wsId = process.argv[3];
309
- const deployId = process.argv[4];
310
- const host = process.argv[5];
311
- const paths = process.argv[6];
312
-
313
- shellExec(`node bin/deploy build-nodejs-conf-ws ${wsId} ${deployId} ${host} ${paths}`);
314
-
315
- shellExec(`node bin/deploy build-nodejs-src-ws ${wsId} ${deployId} ${host} ${paths}`);
316
-
317
- shellExec(`npm run dev ${deployId}`);
318
- }
319
- break;
320
- case 'build-full-client-zip':
321
- case 'build-full-client':
322
- {
323
- const { deployId, folder } = loadConf(process.argv[3]);
324
-
325
- await logger.setUpInfo();
326
-
327
- let argHost = process.argv[4] ? process.argv[4].split(',') : undefined;
328
- let argPath = process.argv[5] ? process.argv[5].split(',') : undefined;
329
- const serverConf = deployId
330
- ? JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'))
331
- : Config.default.server;
332
- if (!deployId) {
333
- argHost = 'default.net';
334
- argPath = '/';
335
- }
336
- for (const host of Object.keys(serverConf)) {
337
- for (const path of Object.keys(serverConf[host])) {
338
- if (argHost && argPath && (!argHost.includes(host) || !argPath.includes(path))) {
339
- delete serverConf[host][path];
340
- } else {
341
- serverConf[host][path].liteBuild = process.argv.includes('l') ? true : false;
342
- serverConf[host][path].minifyBuild = process.env.NODE_ENV === 'production' ? true : false;
343
- }
344
- }
345
- }
346
- fs.writeFileSync(`./conf/conf.server.json`, JSON.stringify(serverConf, null, 4), 'utf-8');
347
- await buildClient();
348
- }
349
- break;
350
-
351
- case 'update-package':
352
- const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
353
- const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
354
- for (const relativePath of files) {
355
- const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
356
- if (filePah.split('/').pop() === 'package.json') {
357
- originPackage.scripts.start = JSON.parse(fs.readFileSync(filePah), 'utf8').scripts.start;
358
- fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
359
- }
360
- }
361
- break;
362
-
363
- case 'run-macro':
364
- {
365
- if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
366
- updateSrc();
367
- const dataDeploy = getDataDeploy({ buildSingleReplica: true });
368
- shellExec(`node bin/deploy sync-env-port ${process.argv[3]}`);
369
- await deployRun(dataDeploy, true);
370
- }
371
- break;
372
-
373
- case 'run-macro-build':
374
- {
375
- if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
376
- updateSrc();
377
- const dataDeploy = getDataDeploy({ buildSingleReplica: true });
378
- shellExec(`node bin/deploy sync-env-port ${process.argv[3]}`);
379
- for (const deploy of dataDeploy) {
380
- shellExec(`node bin/deploy conf ${deploy.deployId} production`);
381
- shellExec(Cmd.clientBuild(deploy), { silent: true });
382
- }
383
- await deployRun(dataDeploy, true);
384
- }
385
- break;
386
- case 'prometheus':
387
- case 'prom':
388
- {
389
- const rangePort = [1, 20];
390
- const promConfigPath = `./engine-private/prometheus/prometheus-service-config.yml`;
391
- const rawConfig = fs
392
- .readFileSync(promConfigPath, 'utf8')
393
- .replaceAll(
394
- `['']`,
395
- JSON.stringify(range(...rangePort).map((i) => `host.docker.internal:30${setPad(i, '0', 2)}`)).replaceAll(
396
- `"`,
397
- `'`,
398
- ),
399
- );
400
- console.log(rawConfig);
401
-
402
- fs.writeFileSync(promConfigPath, rawConfig, 'utf8');
403
-
404
- await Cmd.exec(`docker-compose -f engine-private/prometheus/prometheus-service.yml up -d`);
405
- }
406
- break;
407
-
408
- case 'sync-env-port':
409
- const dataDeploy = getDataDeploy();
410
- const dataEnv = [
411
- { env: 'production', port: 3000 },
412
- { env: 'development', port: 4000 },
413
- { env: 'test', port: 5000 },
414
- ];
415
- let port = 0;
416
- const singleReplicaHosts = [];
417
- for (const deployIdObj of dataDeploy) {
418
- const { deployId, replicaHost } = deployIdObj;
419
- if (replicaHost && !singleReplicaHosts.includes(replicaHost)) singleReplicaHosts.push(replicaHost);
420
- const proxyInstance = deployId.match('proxy') || deployId.match('cron');
421
- const baseConfPath = fs.existsSync(`./engine-private/replica/${deployId}`)
422
- ? `./engine-private/replica`
423
- : `./engine-private/conf`;
424
- for (const envInstanceObj of dataEnv) {
425
- const envPath = `${baseConfPath}/${deployId}/.env.${envInstanceObj.env}`;
426
- const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
427
- envObj.PORT = proxyInstance
428
- ? envInstanceObj.port
429
- : envInstanceObj.port + port - singleReplicaHosts.length - (replicaHost ? 1 : 0);
430
-
431
- fs.writeFileSync(
432
- envPath,
433
- Object.keys(envObj)
434
- .map((key) => `${key}=${envObj[key]}`)
435
- .join(`\n`),
436
- 'utf8',
437
- );
438
- }
439
- const serverConf = loadReplicas(
440
- JSON.parse(fs.readFileSync(`${baseConfPath}/${deployId}/conf.server.json`, 'utf8')),
441
- );
442
- if (!proxyInstance) for (const host of Object.keys(serverConf)) port += Object.keys(serverConf[host]).length;
443
- }
444
- break;
445
- case 'uml':
446
- {
447
- shellExec(`node bin/deploy fix-uml ${process.argv.slice(3).join(' ')}`);
448
- shellExec(`node bin/deploy build-uml ${process.argv.slice(3).join(' ')}`);
449
- }
450
- break;
451
-
452
- case 'fix-uml': {
453
- // required: java jdk-11.0.1
454
-
455
- // comment:
456
- // '--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax="ALL-UNNAMED"'
457
- // in plantuml.js src
458
-
459
- // const deployId = process.argv[3];
460
- // const clientId = process.argv[4];
461
- // const folder = `./src/client/public/${clientId ? clientId : 'default'}/docs/plantuml`;
462
- // const privateConfFolder = `./engine-private/conf/${deployId}`;
463
- // const confData = !deployId
464
- // ? Config.default
465
- // : {
466
- // client: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.client.json`, 'utf8')),
467
- // ssr: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.ssr.json`, 'utf8')),
468
- // server: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.server.json`, 'utf8')),
469
- // cron: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.cron.json`, 'utf8')),
470
- // };
471
-
472
- fs.writeFileSync(
473
- `./node_modules/plantuml/lib/plantuml.js`,
474
- fs
475
- .readFileSync(`./node_modules/plantuml/lib/plantuml.js`, 'utf8')
476
- .replace(`'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax="ALL-UNNAMED"'`, `//`),
477
- );
478
- }
479
- case 'build-uml':
480
- {
481
- const host = process.argv[3];
482
- const path = process.argv[4];
483
- const folder = `./public/${host}${path}/docs/plantuml`;
484
- const confData = Config.default;
485
-
486
- if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
487
-
488
- for (const typeConf of Object.keys(confData)) {
489
- {
490
- const svg = await plantuml(`
491
- @startjson
492
- ${JSON.stringify(confData[typeConf])}
493
- @endjson
494
- `);
495
- fs.writeFileSync(`${folder}/${typeConf}-conf.svg`, svg);
496
- }
497
- {
498
- const svg = await plantuml(`
499
- @startjson
500
- ${JSON.stringify(toJsonSchema(confData[typeConf]))}
501
- @endjson
502
- `);
503
- fs.writeFileSync(`${folder}/${typeConf}-schema.svg`, svg);
504
- }
505
- }
506
- }
507
- break;
508
-
509
- case 'build-single-replica': {
510
- const deployId = process.argv[3];
511
- const host = process.argv[4];
512
- const path = process.argv[5];
513
- const serverConf = loadReplicas(
514
- JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
515
- );
516
-
517
- if (serverConf[host][path].replicas) {
518
- {
519
- let replicaIndex = -1;
520
- for (const replica of serverConf[host][path].replicas) {
521
- replicaIndex++;
522
- const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
523
- // fs.mkdirSync(`./engine-private/replica/${deployId}${replicaIndex}`, { recursive: true });
524
- await fs.copy(`./engine-private/conf/${deployId}`, `./engine-private/replica/${replicaDeployId}`);
525
- fs.writeFileSync(
526
- `./engine-private/replica/${replicaDeployId}/package.json`,
527
- fs
528
- .readFileSync(`./engine-private/replica/${replicaDeployId}/package.json`, 'utf8')
529
- .replaceAll(`--name ${deployId}`, `--name ${replicaDeployId}`),
530
- 'utf8',
531
- );
532
- }
533
- }
534
- {
535
- let replicaIndex = -1;
536
- for (const replica of serverConf[host][path].replicas) {
537
- replicaIndex++;
538
- const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
539
- let replicaServerConf = JSON.parse(
540
- fs.readFileSync(`./engine-private/replica/${replicaDeployId}/conf.server.json`, 'utf8'),
541
- );
542
-
543
- const singleReplicaConf = replicaServerConf[host][path];
544
- singleReplicaConf.replicas = undefined;
545
- singleReplicaConf.singleReplica = undefined;
546
-
547
- replicaServerConf = {};
548
- replicaServerConf[host] = {};
549
- replicaServerConf[host][replica] = singleReplicaConf;
550
-
551
- fs.writeFileSync(
552
- `./engine-private/replica/${replicaDeployId}/conf.server.json`,
553
- JSON.stringify(replicaServerConf, null, 4),
554
- 'utf8',
555
- );
556
- }
557
- }
558
- }
559
- break;
560
- }
561
- case 'build-macro-replica':
562
- getDataDeploy({ buildSingleReplica: true });
563
- shellExec(`node bin/deploy sync-env-port ${process.argv[3]}`);
564
- break;
565
- case 'update-version':
566
- {
567
- const newVersion = process.argv[3];
568
- const originPackageJson = JSON.parse(fs.readFileSync(`package.json`, 'utf8'));
569
- const { version } = originPackageJson;
570
- originPackageJson.version = newVersion;
571
- fs.writeFileSync(`package.json`, JSON.stringify(originPackageJson, null, 4), 'utf8');
572
-
573
- const originPackageLockJson = JSON.parse(fs.readFileSync(`package-lock.json`, 'utf8'));
574
- originPackageLockJson.version = newVersion;
575
- originPackageLockJson.packages[''].version = newVersion;
576
- fs.writeFileSync(`package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
577
-
578
- if (fs.existsSync(`./engine-private/conf`)) {
579
- const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
580
- for (const relativePath of files) {
581
- const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
582
- if (filePah.split('/').pop() === 'package.json') {
583
- const originPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
584
- originPackage.version = newVersion;
585
- fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
586
- }
587
- }
588
- }
589
-
590
- fs.writeFileSync(
591
- `./docker-compose.yml`,
592
- fs
593
- .readFileSync(`./docker-compose.yml`, 'utf8')
594
- .replaceAll(`engine.version: '${version}'`, `engine.version: '${newVersion}'`),
595
- 'utf8',
596
- );
597
-
598
- if (fs.existsSync(`./.github/workflows/docker-image.yml`))
599
- fs.writeFileSync(
600
- `./.github/workflows/docker-image.yml`,
601
- fs
602
- .readFileSync(`./.github/workflows/docker-image.yml`, 'utf8')
603
- .replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
604
- 'utf8',
605
- );
606
-
607
- fs.writeFileSync(
608
- `./src/client/components/core/Docs.js`,
609
- fs
610
- .readFileSync(`./src/client/components/core/Docs.js`, 'utf8')
611
- .replaceAll(`/engine/${version}`, `/engine/${newVersion}`),
612
- 'utf8',
613
- );
614
-
615
- fs.writeFileSync(
616
- `./src/client/ssr/body-components/CacheControl.js`,
617
- fs
618
- .readFileSync(`./src/client/ssr/body-components/CacheControl.js`, 'utf8')
619
- .replaceAll(`v${version}`, `v${newVersion}`),
620
- 'utf8',
621
- );
622
-
623
- fs.writeFileSync(
624
- `./bin/index.js`,
625
- fs.readFileSync(`./bin/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
626
- 'utf8',
627
- );
628
- }
629
- break;
630
-
631
- case 'update-authors': {
632
- // shellExec(`git log --reverse --format='%aN (<%aE>)' | sort -u`, { stdout: true });
633
- const logs = await simpleGit().log();
634
-
635
- fs.writeFileSync(
636
- './AUTHORS.md',
637
- `# Authors
638
-
639
- #### Ordered by first contribution.
640
-
641
- ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}](mailto:${log.author_email}))`)).join(`
642
- `)}
643
-
644
- #### Generated by [underpost.net](https://underpost.net)`,
645
- 'utf8',
646
- );
647
-
648
- // hash: '1c7418ad2f49c7798a6d28d370b34c69d31dce46',
649
- // date: '2024-09-16T17:10:13-03:00',
650
- // message: 'update',
651
- // refs: '',
652
- // body: '',
653
- // author_name: 'fcoverdugo',
654
- // author_email: 'fcoverdugoa@underpost.net'
655
- }
656
- default:
657
- break;
658
- }
659
- } catch (error) {
660
- logger.error(error, error.stack);
661
- }
1
+ import fs from 'fs-extra';
2
+ import axios from 'axios';
3
+
4
+ import dotenv from 'dotenv';
5
+ import plantuml from 'plantuml';
6
+
7
+ import { shellCd, shellExec } from '../src/server/process.js';
8
+ import { loggerFactory } from '../src/server/logger.js';
9
+ import {
10
+ Config,
11
+ addApiConf,
12
+ addClientConf,
13
+ buildApiSrc,
14
+ buildClientSrc,
15
+ cloneConf,
16
+ loadConf,
17
+ loadReplicas,
18
+ addWsConf,
19
+ buildWsSrc,
20
+ cloneSrcComponents,
21
+ getDeployGroupId,
22
+ deployRun,
23
+ updateSrc,
24
+ getDataDeploy,
25
+ buildReplicaId,
26
+ Cmd,
27
+ restoreMacroDb,
28
+ } from '../src/server/conf.js';
29
+ import { buildClient } from '../src/server/client-build.js';
30
+ import { range, setPad, timer, uniqueArray } from '../src/client/components/core/CommonJs.js';
31
+ import toJsonSchema from 'to-json-schema';
32
+ import simpleGit from 'simple-git';
33
+ import { MongooseDB } from '../src/db/mongo/MongooseDB.js';
34
+ import { Lampp } from '../src/runtime/lampp/Lampp.js';
35
+
36
+ const logger = loggerFactory(import.meta);
37
+
38
+ logger.info('argv', process.argv);
39
+
40
+ const [exe, dir, operator] = process.argv;
41
+
42
+ try {
43
+ switch (operator) {
44
+ case 'save':
45
+ {
46
+ const deployId = process.argv[3];
47
+ const folder = `./engine-private/conf/${deployId}`;
48
+ if (fs.existsSync(folder)) fs.removeSync(folder);
49
+ await Config.build({ folder });
50
+ fs.writeFileSync(`${folder}/.env.production`, fs.readFileSync('./.env.production', 'utf8'), 'utf8');
51
+ fs.writeFileSync(`${folder}/.env.development`, fs.readFileSync('./.env.development', 'utf8'), 'utf8');
52
+ fs.writeFileSync(`${folder}/.env.test`, fs.readFileSync('./.env.test', 'utf8'), 'utf8');
53
+ fs.writeFileSync(`${folder}/package.json`, fs.readFileSync('./package.json', 'utf8'), 'utf8');
54
+ }
55
+ break;
56
+ case 'add-nodejs-app-client-conf':
57
+ {
58
+ const toOptions = {
59
+ deployId: process.argv[3],
60
+ clientId: process.argv[4],
61
+ host: process.argv[5],
62
+ path: process.argv[6],
63
+ };
64
+ const fromOptions = { deployId: process.argv[7], clientId: process.argv[8] };
65
+ addClientConf({ toOptions, fromOptions });
66
+ }
67
+ break;
68
+ case 'build-nodejs-conf-app':
69
+ {
70
+ const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
71
+ const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
72
+ cloneConf({ toOptions, fromOptions });
73
+ }
74
+ break;
75
+ case 'clone-nodejs-src-client-components':
76
+ {
77
+ const fromOptions = { componentsFolder: process.argv[3] };
78
+ const toOptions = { componentsFolder: process.argv[4] };
79
+ cloneSrcComponents({ toOptions, fromOptions });
80
+ }
81
+ break;
82
+ case 'build-nodejs-src-app':
83
+ {
84
+ const toOptions = { deployId: process.argv[3], clientId: process.argv[4] };
85
+ const fromOptions = { deployId: process.argv[5], clientId: process.argv[6] };
86
+ buildClientSrc({ toOptions, fromOptions });
87
+ }
88
+ break;
89
+ case 'build-nodejs-conf-api':
90
+ {
91
+ const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
92
+ const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
93
+ addApiConf({ toOptions, fromOptions });
94
+ }
95
+ break;
96
+ case 'build-nodejs-src-api':
97
+ {
98
+ const toOptions = { apiId: process.argv[3], deployId: process.argv[4], clientId: process.argv[5] };
99
+ const fromOptions = { apiId: process.argv[6], deployId: process.argv[7], clientId: process.argv[8] };
100
+ buildApiSrc({ toOptions, fromOptions });
101
+ }
102
+ break;
103
+ case 'build-nodejs-conf-ws':
104
+ {
105
+ const toOptions = {
106
+ wsId: process.argv[3],
107
+ deployId: process.argv[4],
108
+ host: process.argv[5],
109
+ paths: process.argv[6],
110
+ };
111
+ const fromOptions = {
112
+ wsId: process.argv[7],
113
+ deployId: process.argv[8],
114
+ host: process.argv[9],
115
+ paths: process.argv[10],
116
+ };
117
+ addWsConf({ toOptions, fromOptions });
118
+ }
119
+ break;
120
+ case 'build-nodejs-src-ws':
121
+ {
122
+ const toOptions = {
123
+ wsId: process.argv[3],
124
+ deployId: process.argv[4],
125
+ host: process.argv[5],
126
+ paths: process.argv[6],
127
+ };
128
+ const fromOptions = {
129
+ wsId: process.argv[7],
130
+ deployId: process.argv[8],
131
+ host: process.argv[9],
132
+ paths: process.argv[10],
133
+ };
134
+ buildWsSrc({ toOptions, fromOptions });
135
+ }
136
+ break;
137
+ case 'conf': {
138
+ loadConf(process.argv[3]);
139
+ if (process.argv[4]) fs.writeFileSync(`.env`, fs.readFileSync(`.env.${process.argv[4]}`, 'utf8'), 'utf8');
140
+ break;
141
+ }
142
+ case 'run':
143
+ {
144
+ if (process.argv.includes('replicas')) {
145
+ const deployGroupId = getDeployGroupId();
146
+ const dataDeploy = getDataDeploy({
147
+ deployId: process.argv[3],
148
+ buildSingleReplica: true,
149
+ deployGroupId,
150
+ });
151
+ if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
152
+ updateSrc();
153
+ await deployRun(dataDeploy);
154
+ } else {
155
+ loadConf(process.argv[3]);
156
+ shellExec(`npm start ${process.argv[3]}`);
157
+ }
158
+ }
159
+ break;
160
+ case 'new-nodejs-app':
161
+ {
162
+ const deployId = process.argv[3];
163
+ const clientId = process.argv[4];
164
+
165
+ shellExec(`node bin/deploy build-nodejs-conf-app ${deployId} ${clientId}`);
166
+
167
+ shellExec(`node bin/deploy build-nodejs-src-app ${deployId} ${clientId}`);
168
+
169
+ shellExec(`node bin/deploy build-full-client ${deployId}`);
170
+
171
+ shellExec(`npm run dev ${deployId}`);
172
+ }
173
+ break;
174
+ case 'test-new-api':
175
+ {
176
+ const port = process.argv[3];
177
+ const apiId = process.argv[4];
178
+ let url = `http://localhost:${port}/api/${apiId}`;
179
+ {
180
+ logger.info(`POST REQUEST`, url);
181
+ const result = await axios.post(url, {});
182
+ url += '/' + result.data.data._id;
183
+ logger.info(`POST RESULT ${url}`, result.data);
184
+ }
185
+ {
186
+ logger.info(`GET REQUEST`, url);
187
+ const result = await axios.get(url);
188
+ logger.info(`GET RESULT ${url}`, result.data);
189
+ }
190
+ {
191
+ logger.info(`DELETE REQUEST`, url);
192
+ const result = await axios.delete(url);
193
+ logger.info(`DELETE RESULT ${url}`, result.data);
194
+ }
195
+ }
196
+ break;
197
+ case 'new-nodejs-api':
198
+ {
199
+ const apiId = process.argv[3];
200
+ const deployId = process.argv[4];
201
+ const clientId = process.argv[5];
202
+
203
+ shellExec(`node bin/deploy build-nodejs-conf-api ${apiId} ${deployId} ${clientId}`);
204
+
205
+ shellExec(`node bin/deploy build-nodejs-src-api ${apiId} ${deployId} ${clientId}`);
206
+
207
+ // shellExec(`npm run dev ${deployId}`);
208
+ }
209
+ break;
210
+ case 'new-nodejs-ws':
211
+ {
212
+ const wsId = process.argv[3];
213
+ const deployId = process.argv[4];
214
+ const host = process.argv[5];
215
+ const paths = process.argv[6];
216
+
217
+ shellExec(`node bin/deploy build-nodejs-conf-ws ${wsId} ${deployId} ${host} ${paths}`);
218
+
219
+ shellExec(`node bin/deploy build-nodejs-src-ws ${wsId} ${deployId} ${host} ${paths}`);
220
+
221
+ shellExec(`npm run dev ${deployId}`);
222
+ }
223
+ break;
224
+ case 'build-full-client':
225
+ {
226
+ const { deployId, folder } = loadConf(process.argv[3]);
227
+
228
+ let argHost = process.argv[4] ? process.argv[4].split(',') : undefined;
229
+ let argPath = process.argv[5] ? process.argv[5].split(',') : undefined;
230
+ let deployIdSingleReplicas = [];
231
+ const serverConf = deployId
232
+ ? JSON.parse(fs.readFileSync(`./conf/conf.server.json`, 'utf8'))
233
+ : Config.default.server;
234
+ if (!deployId) {
235
+ argHost = 'default.net';
236
+ argPath = '/';
237
+ }
238
+ for (const host of Object.keys(serverConf)) {
239
+ for (const path of Object.keys(serverConf[host])) {
240
+ if (argHost && argPath && (!argHost.includes(host) || !argPath.includes(path))) {
241
+ delete serverConf[host][path];
242
+ } else {
243
+ serverConf[host][path].liteBuild = process.argv.includes('l') ? true : false;
244
+ serverConf[host][path].minifyBuild = process.env.NODE_ENV === 'production' ? true : false;
245
+ if (process.env.NODE_ENV === 'development' && process.argv.includes('static')) {
246
+ serverConf[host][path].apiBaseProxyPath = '/';
247
+ serverConf[host][path].apiBaseHost = `localhost:${parseInt(process.env.PORT) + 1}`;
248
+ }
249
+ if (serverConf[host][path].singleReplica && serverConf[host][path].replicas) {
250
+ deployIdSingleReplicas = deployIdSingleReplicas.concat(
251
+ serverConf[host][path].replicas.map((replica) => buildReplicaId({ deployId, replica })),
252
+ );
253
+
254
+ shellExec(Cmd.replica(deployId, host, path));
255
+ }
256
+ if (serverConf[host][path].db) {
257
+ switch (serverConf[host][path].db.provider) {
258
+ case 'mariadb':
259
+ {
260
+ shellExec(`node bin/db ${host}${path} create ${deployId}`);
261
+ }
262
+
263
+ break;
264
+
265
+ default:
266
+ break;
267
+ }
268
+ }
269
+ }
270
+ }
271
+ }
272
+ fs.writeFileSync(`./conf/conf.server.json`, JSON.stringify(serverConf, null, 4), 'utf-8');
273
+ await buildClient();
274
+
275
+ for (const replicaDeployId of deployIdSingleReplicas) {
276
+ shellExec(Cmd.conf(replicaDeployId));
277
+ shellExec(Cmd.build(replicaDeployId));
278
+ }
279
+ }
280
+ break;
281
+
282
+ case 'update-package':
283
+ const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
284
+ const originPackage = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
285
+ for (const relativePath of files) {
286
+ const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
287
+ if (filePah.split('/').pop() === 'package.json') {
288
+ originPackage.scripts.start = JSON.parse(fs.readFileSync(filePah), 'utf8').scripts.start;
289
+ fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
290
+ }
291
+ }
292
+ break;
293
+
294
+ case 'run-macro':
295
+ {
296
+ if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
297
+ updateSrc();
298
+ const dataDeploy = getDataDeploy({ deployGroupId: process.argv[3], buildSingleReplica: true });
299
+ await deployRun(dataDeploy, true);
300
+ }
301
+ break;
302
+
303
+ case 'run-macro-build':
304
+ {
305
+ if (fs.existsSync(`./tmp/await-deploy`)) fs.remove(`./tmp/await-deploy`);
306
+ updateSrc();
307
+ const dataDeploy = getDataDeploy({ deployGroupId: process.argv[3], buildSingleReplica: true });
308
+ for (const deploy of dataDeploy) {
309
+ shellExec(Cmd.conf(deploy.deployId));
310
+ shellExec(Cmd.build(deploy.deployId));
311
+ }
312
+ await deployRun(dataDeploy, true);
313
+ }
314
+ break;
315
+ case 'prometheus':
316
+ case 'prom':
317
+ {
318
+ const rangePort = [1, 20];
319
+ const promConfigPath = `./engine-private/prometheus/prometheus-service-config.yml`;
320
+ const rawConfig = fs
321
+ .readFileSync(promConfigPath, 'utf8')
322
+ .replaceAll(
323
+ `['']`,
324
+ JSON.stringify(range(...rangePort).map((i) => `host.docker.internal:30${setPad(i, '0', 2)}`)).replaceAll(
325
+ `"`,
326
+ `'`,
327
+ ),
328
+ );
329
+ console.log(rawConfig);
330
+
331
+ fs.writeFileSync(promConfigPath, rawConfig, 'utf8');
332
+
333
+ shellExec(`docker-compose -f engine-private/prometheus/prometheus-service.yml up -d`);
334
+ }
335
+ break;
336
+
337
+ case 'sync-env-port':
338
+ const dataDeploy = getDataDeploy({ deployGroupId: process.argv[3], disableSyncEnvPort: true });
339
+ const dataEnv = [
340
+ { env: 'production', port: 3000 },
341
+ { env: 'development', port: 4000 },
342
+ { env: 'test', port: 5000 },
343
+ ];
344
+ let port = 0;
345
+ const singleReplicaHosts = [];
346
+ for (const deployIdObj of dataDeploy) {
347
+ const { deployId, replicaHost } = deployIdObj;
348
+ if (replicaHost && !singleReplicaHosts.includes(replicaHost)) singleReplicaHosts.push(replicaHost);
349
+ const proxyInstance = deployId.match('proxy') || deployId.match('cron');
350
+ const baseConfPath = fs.existsSync(`./engine-private/replica/${deployId}`)
351
+ ? `./engine-private/replica`
352
+ : `./engine-private/conf`;
353
+ for (const envInstanceObj of dataEnv) {
354
+ const envPath = `${baseConfPath}/${deployId}/.env.${envInstanceObj.env}`;
355
+ const envObj = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
356
+ envObj.PORT = proxyInstance
357
+ ? envInstanceObj.port
358
+ : envInstanceObj.port + port - singleReplicaHosts.length - (replicaHost ? 1 : 0);
359
+
360
+ fs.writeFileSync(
361
+ envPath,
362
+ Object.keys(envObj)
363
+ .map((key) => `${key}=${envObj[key]}`)
364
+ .join(`\n`),
365
+ 'utf8',
366
+ );
367
+ }
368
+ const serverConf = loadReplicas(
369
+ JSON.parse(fs.readFileSync(`${baseConfPath}/${deployId}/conf.server.json`, 'utf8')),
370
+ );
371
+ if (!proxyInstance) for (const host of Object.keys(serverConf)) port += Object.keys(serverConf[host]).length;
372
+ }
373
+ break;
374
+ case 'uml':
375
+ {
376
+ shellExec(`node bin/deploy fix-uml ${process.argv.slice(3).join(' ')}`);
377
+ shellExec(`node bin/deploy build-uml ${process.argv.slice(3).join(' ')}`);
378
+ }
379
+ break;
380
+
381
+ case 'fix-uml': {
382
+ // required: java jdk-11.0.1
383
+
384
+ // comment:
385
+ // '--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax="ALL-UNNAMED"'
386
+ // in plantuml.js src
387
+
388
+ // const deployId = process.argv[3];
389
+ // const clientId = process.argv[4];
390
+ // const folder = `./src/client/public/${clientId ? clientId : 'default'}/docs/plantuml`;
391
+ // const privateConfFolder = `./engine-private/conf/${deployId}`;
392
+ // const confData = !deployId
393
+ // ? Config.default
394
+ // : {
395
+ // client: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.client.json`, 'utf8')),
396
+ // ssr: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.ssr.json`, 'utf8')),
397
+ // server: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.server.json`, 'utf8')),
398
+ // cron: JSON.parse(fs.readFileSync(`${privateConfFolder}/conf.cron.json`, 'utf8')),
399
+ // };
400
+
401
+ fs.writeFileSync(
402
+ `./node_modules/plantuml/lib/plantuml.js`,
403
+ fs
404
+ .readFileSync(`./node_modules/plantuml/lib/plantuml.js`, 'utf8')
405
+ .replace(`'--add-opens=java.xml/com.sun.org.apache.xalan.internal.xsltc.trax="ALL-UNNAMED"'`, `//`),
406
+ );
407
+ }
408
+ case 'build-uml':
409
+ {
410
+ const host = process.argv[3];
411
+ const path = process.argv[4];
412
+ const folder = `./public/${host}${path}/docs/plantuml`;
413
+ const confData = Config.default;
414
+
415
+ if (!fs.existsSync(folder)) fs.mkdirSync(folder, { recursive: true });
416
+
417
+ for (const typeConf of Object.keys(confData)) {
418
+ {
419
+ const svg = await plantuml(`
420
+ @startjson
421
+ ${JSON.stringify(confData[typeConf])}
422
+ @endjson
423
+ `);
424
+ fs.writeFileSync(`${folder}/${typeConf}-conf.svg`, svg);
425
+ }
426
+ {
427
+ const svg = await plantuml(`
428
+ @startjson
429
+ ${JSON.stringify(toJsonSchema(confData[typeConf]))}
430
+ @endjson
431
+ `);
432
+ fs.writeFileSync(`${folder}/${typeConf}-schema.svg`, svg);
433
+ }
434
+ }
435
+ }
436
+ break;
437
+
438
+ case 'build-single-replica': {
439
+ const deployId = process.argv[3];
440
+ const host = process.argv[4];
441
+ const path = process.argv[5];
442
+ const serverConf = loadReplicas(
443
+ JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')),
444
+ );
445
+
446
+ if (serverConf[host][path].replicas) {
447
+ {
448
+ let replicaIndex = -1;
449
+ for (const replica of serverConf[host][path].replicas) {
450
+ replicaIndex++;
451
+ const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
452
+ // fs.mkdirSync(`./engine-private/replica/${deployId}${replicaIndex}`, { recursive: true });
453
+ await fs.copy(`./engine-private/conf/${deployId}`, `./engine-private/replica/${replicaDeployId}`);
454
+ fs.writeFileSync(
455
+ `./engine-private/replica/${replicaDeployId}/package.json`,
456
+ fs
457
+ .readFileSync(`./engine-private/replica/${replicaDeployId}/package.json`, 'utf8')
458
+ .replaceAll(`--name ${deployId}`, `--name ${replicaDeployId}`),
459
+ 'utf8',
460
+ );
461
+ }
462
+ }
463
+ {
464
+ let replicaIndex = -1;
465
+ for (const replica of serverConf[host][path].replicas) {
466
+ replicaIndex++;
467
+ const replicaDeployId = `${deployId}-${serverConf[host][path].replicas[replicaIndex].slice(1)}`;
468
+ let replicaServerConf = JSON.parse(
469
+ fs.readFileSync(`./engine-private/replica/${replicaDeployId}/conf.server.json`, 'utf8'),
470
+ );
471
+
472
+ const singleReplicaConf = replicaServerConf[host][path];
473
+ singleReplicaConf.replicas = undefined;
474
+ singleReplicaConf.singleReplica = undefined;
475
+
476
+ replicaServerConf = {};
477
+ replicaServerConf[host] = {};
478
+ replicaServerConf[host][replica] = singleReplicaConf;
479
+
480
+ fs.writeFileSync(
481
+ `./engine-private/replica/${replicaDeployId}/conf.server.json`,
482
+ JSON.stringify(replicaServerConf, null, 4),
483
+ 'utf8',
484
+ );
485
+ }
486
+ }
487
+ }
488
+ break;
489
+ }
490
+ case 'build-macro-replica':
491
+ getDataDeploy({ deployGroupId: process.argv[3], buildSingleReplica: true });
492
+ break;
493
+ case 'update-version':
494
+ {
495
+ const newVersion = process.argv[3];
496
+ const originPackageJson = JSON.parse(fs.readFileSync(`package.json`, 'utf8'));
497
+ const { version } = originPackageJson;
498
+ originPackageJson.version = newVersion;
499
+ fs.writeFileSync(`package.json`, JSON.stringify(originPackageJson, null, 4), 'utf8');
500
+
501
+ const originPackageLockJson = JSON.parse(fs.readFileSync(`package-lock.json`, 'utf8'));
502
+ originPackageLockJson.version = newVersion;
503
+ originPackageLockJson.packages[''].version = newVersion;
504
+ fs.writeFileSync(`package-lock.json`, JSON.stringify(originPackageLockJson, null, 4), 'utf8');
505
+
506
+ if (fs.existsSync(`./engine-private/conf`)) {
507
+ const files = await fs.readdir(`./engine-private/conf`, { recursive: true });
508
+ for (const relativePath of files) {
509
+ const filePah = `./engine-private/conf/${relativePath.replaceAll(`\\`, '/')}`;
510
+ if (filePah.split('/').pop() === 'package.json') {
511
+ const originPackage = JSON.parse(fs.readFileSync(filePah, 'utf8'));
512
+ originPackage.version = newVersion;
513
+ fs.writeFileSync(filePah, JSON.stringify(originPackage, null, 4), 'utf8');
514
+ }
515
+ }
516
+ }
517
+
518
+ fs.writeFileSync(
519
+ `./docker-compose.yml`,
520
+ fs
521
+ .readFileSync(`./docker-compose.yml`, 'utf8')
522
+ .replaceAll(`engine.version: '${version}'`, `engine.version: '${newVersion}'`),
523
+ 'utf8',
524
+ );
525
+
526
+ if (fs.existsSync(`./.github/workflows/docker-image.yml`))
527
+ fs.writeFileSync(
528
+ `./.github/workflows/docker-image.yml`,
529
+ fs
530
+ .readFileSync(`./.github/workflows/docker-image.yml`, 'utf8')
531
+ .replaceAll(`underpost-engine:v${version}`, `underpost-engine:v${newVersion}`),
532
+ 'utf8',
533
+ );
534
+
535
+ fs.writeFileSync(
536
+ `./src/client/components/core/Docs.js`,
537
+ fs
538
+ .readFileSync(`./src/client/components/core/Docs.js`, 'utf8')
539
+ .replaceAll(`/engine/${version}`, `/engine/${newVersion}`),
540
+ 'utf8',
541
+ );
542
+
543
+ fs.writeFileSync(
544
+ `./src/client/ssr/body-components/CacheControl.js`,
545
+ fs
546
+ .readFileSync(`./src/client/ssr/body-components/CacheControl.js`, 'utf8')
547
+ .replaceAll(`v${version}`, `v${newVersion}`),
548
+ 'utf8',
549
+ );
550
+
551
+ fs.writeFileSync(
552
+ `./bin/index.js`,
553
+ fs.readFileSync(`./bin/index.js`, 'utf8').replaceAll(`${version}`, `${newVersion}`),
554
+ 'utf8',
555
+ );
556
+ }
557
+ break;
558
+
559
+ case 'update-authors': {
560
+ // shellExec(`git log --reverse --format='%aN (<%aE>)' | sort -u`, { stdout: true });
561
+ const logs = await simpleGit().log();
562
+
563
+ fs.writeFileSync(
564
+ './AUTHORS.md',
565
+ `# Authors
566
+
567
+ #### Ordered by first contribution.
568
+
569
+ ${uniqueArray(logs.all.map((log) => `- ${log.author_name} ([${log.author_email}](mailto:${log.author_email}))`)).join(`
570
+ `)}
571
+
572
+ #### Generated by [underpost.net](https://underpost.net)`,
573
+ 'utf8',
574
+ );
575
+
576
+ // hash: '1c7418ad2f49c7798a6d28d370b34c69d31dce46',
577
+ // date: '2024-09-16T17:10:13-03:00',
578
+ // message: 'update',
579
+ // refs: '',
580
+ // body: '',
581
+ // author_name: 'fcoverdugo',
582
+ // author_email: 'fcoverdugoa@underpost.net'
583
+ }
584
+
585
+ case 'restore-macro-db':
586
+ {
587
+ const deployGroupId = process.argv[3];
588
+ await restoreMacroDb(deployGroupId);
589
+ }
590
+
591
+ break;
592
+
593
+ case 'mongo': {
594
+ await MongooseDB.server();
595
+ break;
596
+ }
597
+
598
+ case 'lampp': {
599
+ await Lampp.install();
600
+ }
601
+
602
+ default:
603
+ break;
604
+ }
605
+ } catch (error) {
606
+ logger.error(error, error.stack);
607
+ }