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