@adaptivestone/framework 5.0.0-beta.4 → 5.0.0-beta.41

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 (301) hide show
  1. package/CHANGELOG.md +1117 -528
  2. package/LICENCE +1 -1
  3. package/dist/Cli.d.ts +7 -0
  4. package/dist/Cli.js +19 -0
  5. package/dist/Cli.js.map +1 -0
  6. package/dist/cluster.d.ts +1 -0
  7. package/dist/cluster.js +18 -0
  8. package/dist/cluster.js.map +1 -0
  9. package/dist/commands/CreateUser.d.ts +32 -0
  10. package/dist/commands/CreateUser.js +83 -0
  11. package/dist/commands/CreateUser.js.map +1 -0
  12. package/dist/commands/Documentation.d.ts +5 -0
  13. package/dist/commands/Documentation.js +15 -0
  14. package/dist/commands/Documentation.js.map +1 -0
  15. package/dist/commands/DropIndex.d.ts +16 -0
  16. package/dist/commands/DropIndex.js +30 -0
  17. package/dist/commands/DropIndex.js.map +1 -0
  18. package/dist/commands/GenerateRandomBytes.d.ts +7 -0
  19. package/dist/commands/GenerateRandomBytes.js +18 -0
  20. package/dist/commands/GenerateRandomBytes.js.map +1 -0
  21. package/dist/commands/GenerateTypes.d.ts +11 -0
  22. package/dist/commands/GenerateTypes.js +52 -0
  23. package/dist/commands/GenerateTypes.js.map +1 -0
  24. package/dist/commands/GetOpenApiJson.d.ts +17 -0
  25. package/dist/commands/GetOpenApiJson.js +272 -0
  26. package/dist/commands/GetOpenApiJson.js.map +1 -0
  27. package/dist/commands/SyncIndexes.d.ts +6 -0
  28. package/dist/commands/SyncIndexes.js +31 -0
  29. package/dist/commands/SyncIndexes.js.map +1 -0
  30. package/dist/commands/migration/Create.d.ts +18 -0
  31. package/dist/commands/migration/Create.js +57 -0
  32. package/dist/commands/migration/Create.js.map +1 -0
  33. package/dist/commands/migration/Migrate.d.ts +6 -0
  34. package/dist/commands/migration/Migrate.js +43 -0
  35. package/dist/commands/migration/Migrate.js.map +1 -0
  36. package/dist/config/auth.d.ts +6 -0
  37. package/dist/config/auth.js +7 -0
  38. package/dist/config/auth.js.map +1 -0
  39. package/dist/config/http.d.ts +8 -0
  40. package/dist/config/http.js +10 -0
  41. package/dist/config/http.js.map +1 -0
  42. package/dist/config/i18n.d.ts +13 -0
  43. package/dist/config/i18n.js +13 -0
  44. package/dist/config/i18n.js.map +1 -0
  45. package/dist/config/ipDetector.d.ts +5 -0
  46. package/dist/config/ipDetector.js +15 -0
  47. package/dist/config/ipDetector.js.map +1 -0
  48. package/dist/config/log.d.ts +11 -0
  49. package/dist/config/log.js +20 -0
  50. package/dist/config/log.js.map +1 -0
  51. package/dist/config/mongo.d.ts +4 -0
  52. package/dist/config/mongo.js +4 -0
  53. package/dist/config/mongo.js.map +1 -0
  54. package/dist/config/rateLimiter.d.ts +13 -0
  55. package/dist/config/rateLimiter.js +17 -0
  56. package/dist/config/rateLimiter.js.map +1 -0
  57. package/dist/config/redis.d.ts +5 -0
  58. package/dist/config/redis.js +5 -0
  59. package/dist/config/redis.js.map +1 -0
  60. package/dist/config/validate.d.ts +4 -0
  61. package/dist/config/validate.js +4 -0
  62. package/dist/config/validate.js.map +1 -0
  63. package/dist/controllers/Auth.d.ts +131 -0
  64. package/dist/controllers/Auth.js +186 -0
  65. package/dist/controllers/Auth.js.map +1 -0
  66. package/dist/controllers/Home.d.ts +15 -0
  67. package/dist/controllers/Home.js +22 -0
  68. package/dist/controllers/Home.js.map +1 -0
  69. package/dist/controllers/index.d.ts +16 -0
  70. package/dist/controllers/index.js +59 -0
  71. package/dist/controllers/index.js.map +1 -0
  72. package/dist/folderConfig.d.ts +34 -0
  73. package/dist/folderConfig.js +14 -0
  74. package/dist/folderConfig.js.map +1 -0
  75. package/dist/helpers/appInstance.d.ts +3 -0
  76. package/dist/helpers/appInstance.js +8 -0
  77. package/dist/helpers/appInstance.js.map +1 -0
  78. package/dist/helpers/crypto.d.ts +3 -0
  79. package/dist/helpers/crypto.js +17 -0
  80. package/dist/helpers/crypto.js.map +1 -0
  81. package/dist/helpers/files.d.ts +16 -0
  82. package/dist/helpers/files.js +76 -0
  83. package/dist/helpers/files.js.map +1 -0
  84. package/dist/helpers/logger.d.ts +4 -0
  85. package/dist/helpers/logger.js +20 -0
  86. package/dist/helpers/logger.js.map +1 -0
  87. package/dist/helpers/redis/clearNamespace.d.ts +2 -0
  88. package/dist/helpers/redis/clearNamespace.js +14 -0
  89. package/dist/helpers/redis/clearNamespace.js.map +1 -0
  90. package/dist/helpers/redis/redisConnection.d.ts +6 -0
  91. package/dist/helpers/redis/redisConnection.js +48 -0
  92. package/dist/helpers/redis/redisConnection.js.map +1 -0
  93. package/dist/helpers/yup.d.ts +13 -0
  94. package/dist/helpers/yup.js +21 -0
  95. package/dist/helpers/yup.js.map +1 -0
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.js +7 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/models/Lock.d.ts +90 -0
  100. package/dist/models/Lock.js +97 -0
  101. package/dist/models/Lock.js.map +1 -0
  102. package/dist/models/Migration.d.ts +13 -0
  103. package/dist/models/Migration.js +14 -0
  104. package/dist/models/Migration.js.map +1 -0
  105. package/dist/models/Sequence.d.ts +28 -0
  106. package/dist/models/Sequence.js +19 -0
  107. package/dist/models/Sequence.js.map +1 -0
  108. package/dist/models/User.d.ts +656 -0
  109. package/dist/models/User.js +291 -0
  110. package/dist/models/User.js.map +1 -0
  111. package/dist/models/UserOld.d.ts +179 -0
  112. package/dist/models/UserOld.js +230 -0
  113. package/dist/models/UserOld.js.map +1 -0
  114. package/dist/modules/AbstractCommand.d.ts +51 -0
  115. package/dist/modules/AbstractCommand.js +60 -0
  116. package/dist/modules/AbstractCommand.js.map +1 -0
  117. package/dist/modules/AbstractConnector.d.ts +5 -0
  118. package/dist/modules/AbstractConnector.js +8 -0
  119. package/dist/modules/AbstractConnector.js.map +1 -0
  120. package/dist/modules/AbstractController.d.ts +95 -0
  121. package/dist/modules/AbstractController.js +323 -0
  122. package/dist/modules/AbstractController.js.map +1 -0
  123. package/dist/modules/AbstractModel.d.ts +29 -0
  124. package/dist/modules/AbstractModel.js +42 -0
  125. package/dist/modules/AbstractModel.js.map +1 -0
  126. package/dist/modules/Base.d.ts +29 -0
  127. package/dist/modules/Base.js +58 -0
  128. package/dist/modules/Base.js.map +1 -0
  129. package/dist/modules/BaseCli.d.ts +25 -0
  130. package/dist/modules/BaseCli.js +147 -0
  131. package/dist/modules/BaseCli.js.map +1 -0
  132. package/dist/modules/BaseModel.d.ts +55 -0
  133. package/dist/modules/BaseModel.js +37 -0
  134. package/dist/modules/BaseModel.js.map +1 -0
  135. package/dist/server.d.ts +123 -0
  136. package/dist/server.js +468 -0
  137. package/dist/server.js.map +1 -0
  138. package/dist/services/cache/Cache.d.ts +31 -0
  139. package/dist/services/cache/Cache.js +102 -0
  140. package/dist/services/cache/Cache.js.map +1 -0
  141. package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
  142. package/dist/services/documentation/DocumentationGenerator.js +130 -0
  143. package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
  144. package/dist/services/http/HttpServer.d.ts +35 -0
  145. package/dist/services/http/HttpServer.js +70 -0
  146. package/dist/services/http/HttpServer.js.map +1 -0
  147. package/dist/services/http/middleware/AbstractMiddleware.d.ts +26 -0
  148. package/dist/services/http/middleware/AbstractMiddleware.js +41 -0
  149. package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
  150. package/dist/services/http/middleware/Auth.d.ts +9 -0
  151. package/dist/services/http/middleware/Auth.js +18 -0
  152. package/dist/services/http/middleware/Auth.js.map +1 -0
  153. package/dist/services/http/middleware/Cors.d.ts +12 -0
  154. package/dist/services/http/middleware/Cors.js +36 -0
  155. package/dist/services/http/middleware/Cors.js.map +1 -0
  156. package/dist/services/http/middleware/GetUserByToken.d.ts +27 -0
  157. package/dist/services/http/middleware/GetUserByToken.js +47 -0
  158. package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
  159. package/dist/services/http/middleware/I18n.d.ts +23 -0
  160. package/dist/services/http/middleware/I18n.js +61 -0
  161. package/dist/services/http/middleware/I18n.js.map +1 -0
  162. package/dist/services/http/middleware/IpDetector.d.ts +14 -0
  163. package/dist/services/http/middleware/IpDetector.js +55 -0
  164. package/dist/services/http/middleware/IpDetector.js.map +1 -0
  165. package/dist/services/http/middleware/Pagination.d.ts +27 -0
  166. package/dist/services/http/middleware/Pagination.js +46 -0
  167. package/dist/services/http/middleware/Pagination.js.map +1 -0
  168. package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
  169. package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
  170. package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
  171. package/dist/services/http/middleware/RateLimiter.d.ts +26 -0
  172. package/dist/services/http/middleware/RateLimiter.js +102 -0
  173. package/dist/services/http/middleware/RateLimiter.js.map +1 -0
  174. package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
  175. package/dist/services/http/middleware/RequestLogger.js +18 -0
  176. package/dist/services/http/middleware/RequestLogger.js.map +1 -0
  177. package/dist/services/http/middleware/RequestParser.d.ts +8 -0
  178. package/dist/services/http/middleware/RequestParser.js +35 -0
  179. package/dist/services/http/middleware/RequestParser.js.map +1 -0
  180. package/dist/services/http/middleware/Role.d.ts +12 -0
  181. package/dist/services/http/middleware/Role.js +24 -0
  182. package/dist/services/http/middleware/Role.js.map +1 -0
  183. package/dist/services/i18n/I18n.d.ts +15 -0
  184. package/dist/services/i18n/I18n.js +58 -0
  185. package/dist/services/i18n/I18n.js.map +1 -0
  186. package/dist/services/logging/SentryTransport.d.ts +13 -0
  187. package/dist/services/logging/SentryTransport.js +121 -0
  188. package/dist/services/logging/SentryTransport.js.map +1 -0
  189. package/dist/services/validate/ValidateService.d.ts +31 -0
  190. package/dist/services/validate/ValidateService.js +95 -0
  191. package/dist/services/validate/ValidateService.js.map +1 -0
  192. package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
  193. package/dist/services/validate/drivers/AbstractValidator.js +29 -0
  194. package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
  195. package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
  196. package/dist/services/validate/drivers/CustomValidator.js +48 -0
  197. package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
  198. package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
  199. package/dist/services/validate/drivers/YupValidator.js +86 -0
  200. package/dist/services/validate/drivers/YupValidator.js.map +1 -0
  201. package/dist/tests/frameworkVitestSetup.d.ts +1 -0
  202. package/dist/tests/frameworkVitestSetup.js +9 -0
  203. package/dist/tests/frameworkVitestSetup.js.map +1 -0
  204. package/dist/tests/globalSetupVitest.d.ts +3 -0
  205. package/dist/tests/globalSetupVitest.js +29 -0
  206. package/dist/tests/globalSetupVitest.js.map +1 -0
  207. package/dist/tests/setupVitest.d.ts +1 -0
  208. package/dist/tests/setupVitest.js +91 -0
  209. package/dist/tests/setupVitest.js.map +1 -0
  210. package/dist/tests/testHelpers.d.ts +340 -0
  211. package/dist/tests/testHelpers.js +48 -0
  212. package/dist/tests/testHelpers.js.map +1 -0
  213. package/package.json +53 -40
  214. package/Cli.js +0 -22
  215. package/cluster.js +0 -27
  216. package/commands/CreateUser.js +0 -75
  217. package/commands/Documentation.js +0 -17
  218. package/commands/DropIndex.js +0 -29
  219. package/commands/GenerateRandomBytes.js +0 -21
  220. package/commands/GetOpenApiJson.js +0 -325
  221. package/commands/SyncIndexes.js +0 -39
  222. package/commands/migration/Create.js +0 -61
  223. package/commands/migration/Migrate.js +0 -55
  224. package/config/auth.js +0 -9
  225. package/config/http.js +0 -9
  226. package/config/i18n.js +0 -12
  227. package/config/ipDetector.js +0 -14
  228. package/config/log.js +0 -22
  229. package/config/mail.js +0 -29
  230. package/config/mongo.js +0 -3
  231. package/config/rateLimiter.js +0 -16
  232. package/config/redis.js +0 -4
  233. package/config/validate.js +0 -3
  234. package/controllers/Auth.js +0 -210
  235. package/controllers/Home.js +0 -28
  236. package/controllers/index.js +0 -60
  237. package/folderConfig.js +0 -14
  238. package/helpers/files.js +0 -79
  239. package/helpers/logger.js +0 -17
  240. package/helpers/redis/clearNamespace.js +0 -14
  241. package/helpers/yup.js +0 -24
  242. package/index.js +0 -8
  243. package/jsconfig.json +0 -9
  244. package/locales/en/translation.json +0 -27
  245. package/locales/ru/translation.json +0 -27
  246. package/migrations/.gitkeep +0 -0
  247. package/models/Migration.js +0 -15
  248. package/models/Sequence.js +0 -22
  249. package/models/User.js +0 -263
  250. package/modules/AbstractCommand.js +0 -43
  251. package/modules/AbstractConnector.js +0 -9
  252. package/modules/AbstractController.js +0 -413
  253. package/modules/AbstractModel.d.ts +0 -48
  254. package/modules/AbstractModel.js +0 -92
  255. package/modules/Base.d.ts +0 -37
  256. package/modules/Base.js +0 -63
  257. package/modules/BaseCli.js +0 -97
  258. package/server.d.ts +0 -98
  259. package/server.js +0 -438
  260. package/services/cache/Cache.d.ts +0 -35
  261. package/services/cache/Cache.js +0 -124
  262. package/services/documentation/DocumentationGenerator.js +0 -169
  263. package/services/http/HttpServer.js +0 -96
  264. package/services/http/middleware/AbstractMiddleware.js +0 -51
  265. package/services/http/middleware/Auth.js +0 -20
  266. package/services/http/middleware/Cors.js +0 -46
  267. package/services/http/middleware/GetUserByToken.js +0 -47
  268. package/services/http/middleware/I18n.js +0 -117
  269. package/services/http/middleware/IpDetector.js +0 -59
  270. package/services/http/middleware/Pagination.js +0 -57
  271. package/services/http/middleware/PrepareAppInfo.js +0 -18
  272. package/services/http/middleware/RateLimiter.js +0 -134
  273. package/services/http/middleware/RequestLogger.js +0 -22
  274. package/services/http/middleware/RequestParser.js +0 -40
  275. package/services/http/middleware/Role.js +0 -29
  276. package/services/messaging/email/index.js +0 -217
  277. package/services/messaging/email/resources/.gitkeep +0 -1
  278. package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
  279. package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
  280. package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
  281. package/services/messaging/email/templates/recovery/html.pug +0 -8
  282. package/services/messaging/email/templates/recovery/subject.pug +0 -2
  283. package/services/messaging/email/templates/recovery/text.pug +0 -3
  284. package/services/messaging/email/templates/verification/html.pug +0 -10
  285. package/services/messaging/email/templates/verification/subject.pug +0 -1
  286. package/services/messaging/email/templates/verification/text.pug +0 -1
  287. package/services/messaging/index.js +0 -3
  288. package/services/validate/ValidateService.js +0 -157
  289. package/services/validate/drivers/AbstractValidator.js +0 -37
  290. package/services/validate/drivers/CustomValidator.js +0 -51
  291. package/services/validate/drivers/YupValidator.js +0 -103
  292. package/tests/globalSetupVitest.js +0 -35
  293. package/tests/setup.js +0 -118
  294. package/tests/setupVitest.js +0 -109
  295. package/types/Expand.d.ts +0 -11
  296. package/types/TFoldersConfig.d.ts +0 -17
  297. package/views/404.pug +0 -3
  298. package/views/home.pug +0 -3
  299. package/views/layouts/base.pug +0 -39
  300. package/vitest.config.js +0 -16
  301. /package/{commands → dist/migrations}/.gitkeep +0 -0
@@ -1,97 +0,0 @@
1
- /* eslint-disable no-console */
2
- import path from 'node:path';
3
- import * as url from 'node:url';
4
- import Base from './Base.js';
5
-
6
- class Cli extends Base {
7
- constructor(server) {
8
- super(server.app);
9
- this.server = server;
10
- this.commands = {};
11
- }
12
-
13
- async loadCommands() {
14
- if (Object.keys(this.commands).length) {
15
- return true;
16
- }
17
- const dirname = url.fileURLToPath(new URL('.', import.meta.url));
18
- const commandsToLoad = await this.getFilesPathWithInheritance(
19
- path.join(dirname, '../commands'),
20
- this.server.app.foldersConfig.commands,
21
- );
22
- for (const com of commandsToLoad) {
23
- if (com.file.endsWith('.js')) {
24
- const c = com.file.replace('.js', '');
25
-
26
- this.commands[c.toLowerCase()] = com.path;
27
- }
28
- }
29
- return true;
30
- }
31
-
32
- async printCommandTable() {
33
- const commands = Object.keys(this.commands).sort();
34
- const maxLength = commands.reduce((max, c) => Math.max(max, c.length), 0);
35
- console.log('Available commands:');
36
- let commandsClasses = [];
37
- for (const c of commands) {
38
- // eslint-disable-next-line no-await-in-loop
39
- commandsClasses.push(import(this.commands[c]));
40
- // console.log(
41
- // ` \x1b[36m${c.padEnd(maxLength)}\x1b[0m - ${f.default.description}`,
42
- // );
43
- }
44
- commandsClasses = await Promise.all(commandsClasses);
45
- for (const [key, c] of Object.entries(commands)) {
46
- // eslint-disable-next-line no-await-in-loop
47
- console.log(
48
- ` \x1b[36m${c.padEnd(maxLength)}\x1b[0m - ${commandsClasses[key].default.description}`,
49
- );
50
- }
51
- }
52
-
53
- async run(command, args) {
54
- await this.loadCommands();
55
-
56
- if (!command) {
57
- console.log('Please provide command name');
58
- await this.printCommandTable();
59
- return false;
60
- }
61
-
62
- if (!this.commands[command]) {
63
- console.log(`Command ${command} not found `);
64
- await this.printCommandTable();
65
- return false;
66
- }
67
- const { default: Command } = await import(this.commands[command]);
68
-
69
- if (Command.isShouldInitModels) {
70
- this.logger.debug(
71
- `Command ${command} isShouldInitModels called. If you want to skip loading and init models, please set isShouldInitModels to false in tyou command`,
72
- );
73
- process.env.MONGO_APP_NAME = Command.getMongoConnectionName(
74
- command,
75
- args,
76
- );
77
- await this.server.initAllModels();
78
- } else {
79
- this.logger.debug(`Command ${command} NOT need to isShouldInitModels`);
80
- }
81
-
82
- const c = new Command(this.app, this.commands, args);
83
- let result = false;
84
-
85
- result = await c.run().catch((e) => {
86
- this.logger.error(e.stack);
87
- });
88
-
89
- return result;
90
- }
91
-
92
- static get loggerGroup() {
93
- return 'CLI_';
94
- }
95
- }
96
-
97
- export default Cli;
package/server.d.ts DELETED
@@ -1,98 +0,0 @@
1
- import TFolderConfig from './types/TFoldersConfig';
2
- import { ExpandDeep } from './types/Expand';
3
-
4
- import EventEmitter from 'events';
5
-
6
- import { Model as MongooseModel, Schema } from 'mongoose';
7
-
8
- import BaseCli from './modules/BaseCli';
9
- import Cache from './services/cache/Cache';
10
- import winston from 'winston';
11
-
12
- import HttpServer from './services/http/HttpServer.js';
13
-
14
- type ServerConfig = {
15
- folders: ExpandDeep<TFolderConfig>;
16
- };
17
-
18
- declare class Server {
19
- config: ServerConfig;
20
- app: {
21
- getConfig: Server['getConfig'];
22
- getModel: Server['getModel'];
23
- runCliCommand: Server['runCliCommand'];
24
- updateConfig: Server['updateConfig'];
25
- foldersConfig: Server['config']['folders'];
26
- events: EventEmitter;
27
- get cache(): Server['cacheService'];
28
- get logger(): winston.Logger;
29
- httpServer: HttpServer | null;
30
- controllerManager: null;
31
- };
32
- cacheService: Cache;
33
-
34
- cache: {
35
- configs: Map<string, {}>;
36
- models: Map<string, MongooseModel<any>>;
37
- };
38
- cli: null | BaseCli;
39
-
40
- /**
41
- * Construct new server
42
- */
43
- constructor(config: ExpandDeep<ServerConfig>);
44
-
45
- /**
46
- * Start server (http + init all http ralated functions)
47
- */
48
- startServer(callbackBefore404?: Promise<null>): Promise<null>;
49
-
50
- /**
51
- * Do an initialization (config reading, etc)
52
- * @returns {Promise}
53
- */
54
- init(
55
- options: { isSkipModelInit: boolean } = { isSkipModelInit: false },
56
- ): Promise<boolean>;
57
-
58
- /**
59
- * Load model and init them
60
- * @returns {Promise}
61
- */
62
- initAllModels(): Promise<void>;
63
-
64
- /**
65
- * Return config from {configName} (file name) on config folder.
66
- * Support cache and updating confing into cache
67
- * Also will update config based on NODE_ENV. If config.js and config.production.js
68
- * and NODE_ENV is production then we will load base config (config.js) and the load
69
- * environment config (config.production.js) and overwrite base config options
70
- * @see updateConfig
71
- * @TODO generate that based on real data
72
- */
73
- getConfig(configName: string): { [key: string]: any };
74
-
75
- /**
76
- * Return or create new logger instance. This is a main logger instance
77
- */
78
- getLogger(): winston.Logger;
79
-
80
- /**
81
- * Primary designed for tests when we need to update some configs before start testing
82
- * Should be called before any initialization was done
83
- */
84
- updateConfig(configName: string, config: {}): { [key: string]: any };
85
-
86
- /**
87
- * Return model from {modelName} (file name) on model folder.
88
- * Support cache
89
- */
90
- getModel(modelName: string): MongooseModel<any>;
91
-
92
- /**
93
- * Run cli command into framework (http, ws, etc)
94
- */
95
- runCliCommand(commandName: string, args: {}): Promise<BaseCli['run']>;
96
- }
97
-
98
- export default Server;
package/server.js DELETED
@@ -1,438 +0,0 @@
1
- /* eslint-disable no-console */
2
- import EventEmitter from 'node:events';
3
- import { hrtime, loadEnvFile } from 'node:process';
4
- import * as url from 'node:url';
5
- import path from 'node:path';
6
-
7
- import merge from 'deepmerge';
8
- import winston from 'winston';
9
- import { getFilesPathWithInheritance } from './helpers/files.js';
10
- import { consoleLogger } from './helpers/logger.js';
11
- import Cache from './services/cache/Cache.js';
12
-
13
- try {
14
- loadEnvFile();
15
- } catch (e) {
16
- console.warn('No env file found. This is ok. But please check youself.');
17
- }
18
-
19
- /**
20
- * Main framework class.
21
- */
22
- class Server {
23
- #realLogger = null;
24
-
25
- #isInited = false;
26
-
27
- #isModelsInited = false;
28
-
29
- #isModelsLoaded = false;
30
-
31
- cli = null;
32
-
33
- /**
34
- * Construct new server
35
- * @param {Object} config main config object
36
- * @param {Object} config.folders folders config
37
- * @param {String} config.folders.config path to folder with config files
38
- * @param {String} config.folders.models path to folder with moidels files
39
- * @param {String} config.folders.controllers path to folder with controllers files
40
- * @param {String} config.folders.views path to folder with view files
41
- * @param {String} config.folders.locales path to folder with locales files
42
- * @param {String} config.folders.emails path to folder with emails files
43
- */
44
- constructor(config) {
45
- this.config = config;
46
- const that = this;
47
- this.app = {
48
- getConfig: this.getConfig.bind(this),
49
- getModel: this.getModel.bind(this),
50
- runCliCommand: this.runCliCommand.bind(this),
51
- updateConfig: this.updateConfig.bind(this),
52
- foldersConfig: this.config.folders,
53
- events: new EventEmitter(),
54
- get cache() {
55
- return that.getCache();
56
- },
57
- get logger() {
58
- return that.getLogger();
59
- },
60
- httpServer: null,
61
- controllerManager: null,
62
- };
63
-
64
- this.cache = {
65
- configs: new Map(),
66
- models: new Map(),
67
- modelConstructors: new Map(),
68
- };
69
-
70
- this.app.events.on('shutdown', () => {
71
- const forceShutdownTimer = setTimeout(() => {
72
- console.error('Shutdown timed out, forcing exit');
73
- process.exit(1);
74
- }, 5_000);
75
- // Unref the timer so it doesn't keep the process alive
76
- forceShutdownTimer.unref();
77
- });
78
- }
79
-
80
- /**
81
- * Start server (http + init all http ralated functions)
82
- * @param {Function} callbackBefore404 code that should be executed before adding page 404
83
- * @returns {Promise}
84
- */
85
- async startServer(callbackBefore404 = async () => Promise.resolve()) {
86
- const [{ default: HttpServer }, { default: ControllerManager }] =
87
- await Promise.all([
88
- import('./services/http/HttpServer.js'), // Speed optimisation
89
- import('./controllers/index.js'), // Speed optimisation
90
- this.init(),
91
- ]);
92
-
93
- this.addErrorHandling();
94
-
95
- // TODO config
96
- this.app.httpServer = new HttpServer(this.app);
97
-
98
- this.app.controllerManager = new ControllerManager(this.app);
99
-
100
- await this.app.controllerManager.initControllers();
101
- await callbackBefore404();
102
- this.app.httpServer.add404Page();
103
- }
104
-
105
- /**
106
- * Do an initialization (config reading, etc)
107
- * @returns {Promise}
108
- */
109
- async init({ isSkipModelInit = false, isSkipModelLoading = false } = {}) {
110
- if (this.#isInited) {
111
- return true;
112
- }
113
-
114
- console.time('Server init. Done');
115
- console.time('Loading config and model files. Time');
116
- const prom = [this.#initConfigFiles()];
117
- if (!isSkipModelLoading) {
118
- prom.push(this.#loadModelFiles());
119
- }
120
- await Promise.all(prom);
121
- console.timeEnd('Loading config and model files. Time');
122
-
123
- if (!isSkipModelInit) {
124
- await this.initAllModels();
125
- }
126
-
127
- this.#isInited = true;
128
-
129
- console.timeEnd('Server init. Done');
130
-
131
- return true;
132
- }
133
-
134
- /**
135
- * Load model and init them
136
- * @returns {Promise}
137
- */
138
- async initAllModels() {
139
- if (this.#isModelsInited) {
140
- // already inited
141
- return;
142
- }
143
- const now = performance.now();
144
-
145
- if (!this.#isModelsLoaded) {
146
- await this.#loadModelFiles();
147
- }
148
-
149
- if (this.app.getConfig('mongo').connectionString) {
150
- for (const [modelName, ModelConstructor] of this.cache
151
- .modelConstructors) {
152
- try {
153
- const model = new ModelConstructor(this.app);
154
- this.cache.models.set(modelName, model.mongooseModel);
155
- } catch (e) {
156
- this.app.logger.error(
157
- `Problem with model ${modelName}, ${e.message}`,
158
- );
159
- this.app.logger.error(e);
160
- }
161
- }
162
- } else {
163
- this.app.logger.info(
164
- 'Skipping inited models as we have no mongo connection string',
165
- );
166
- }
167
-
168
- this.app.logger.debug(
169
- `Inited models in ${(performance.now() - now).toFixed(2)}ms`,
170
- );
171
- this.#isModelsInited = true;
172
- }
173
-
174
- async #initConfigFiles() {
175
- const dirname = url.fileURLToPath(new URL('.', import.meta.url));
176
- const files = await getFilesPathWithInheritance({
177
- internalFolder: path.join(dirname, '/config'),
178
- externalFolder: this.app.foldersConfig.config,
179
- loggerFileType: 'CONFIG',
180
- logger: (m) => consoleLogger('info', m),
181
- filter: {
182
- startWithCapital: false,
183
- },
184
- });
185
-
186
- const configFiles = {};
187
-
188
- for (const file of files) {
189
- const config = file.file.split('.');
190
- if (!configFiles[config[0]]) {
191
- configFiles[config[0]] = {};
192
- }
193
- if (config.length === 2) {
194
- configFiles[config[0]].default = file.path;
195
- } else {
196
- configFiles[config[0]][config[1]] = file.path;
197
- }
198
- }
199
-
200
- const loadConfig = async (configName, values) => {
201
- const promises = [import(values.default)];
202
- if (process.env.NODE_ENV && values[process.env.NODE_ENV]) {
203
- promises.push(import(values[process.env.NODE_ENV]));
204
- }
205
- const result = await Promise.all(promises);
206
- return {
207
- name: configName,
208
- finalValue: merge(result[0].default, result[1]?.default || {}, {
209
- arrayMerge: (destinationArray, sourceArray) => sourceArray,
210
- }),
211
- };
212
- };
213
-
214
- const loadingPromises = [];
215
-
216
- for (const [configFile, value] of Object.entries(configFiles)) {
217
- loadingPromises.push(loadConfig(configFile, value));
218
- }
219
-
220
- const configs = await Promise.all(loadingPromises);
221
-
222
- for (const config of configs) {
223
- this.cache.configs.set(config.name, config.finalValue);
224
- }
225
- return true;
226
- }
227
-
228
- async #loadModelFiles() {
229
- if (this.#isModelsLoaded) {
230
- // already inited
231
- return true;
232
- }
233
- const dirname = url.fileURLToPath(new URL('.', import.meta.url));
234
- const files = await getFilesPathWithInheritance({
235
- internalFolder: path.join(dirname, '/models'),
236
- externalFolder: this.app.foldersConfig.models,
237
- loggerFileType: 'MODEL',
238
- logger: (m) => consoleLogger('info', m),
239
- });
240
-
241
- const promises = [];
242
- for (const file of files) {
243
- const t = hrtime.bigint();
244
- promises.push(
245
- import(file.path).then((f) => ({
246
- name: file.file.split('.')[0],
247
- file: f,
248
- took: hrtime.bigint() - t,
249
- })),
250
- );
251
- }
252
-
253
- const loadedModels = await Promise.all(promises);
254
-
255
- for (const model of loadedModels) {
256
- this.cache.modelConstructors.set(model.name, model.file.default);
257
- }
258
- this.#isModelsLoaded = true;
259
- return true;
260
- }
261
-
262
- /**
263
- * Add error logging on promise reject
264
- */
265
- addErrorHandling() {
266
- process.on('uncaughtException', (e) =>
267
- this.app.logger.error('uncaughtException', e),
268
- );
269
- process.on('unhandledRejection', (e) => {
270
- this.app.logger.error('unhandledRejection', e);
271
- });
272
- }
273
-
274
- /**
275
- * Return config from {configName} (file name) on config folder.
276
- * Support cache and updating confing into cache
277
- * Also will update config based on NODE_ENV. If config.js and config.production.js
278
- * and NODE_ENV is production then we will load base config (config.js) and the load
279
- * environment config (config.production.js) and overwrite base config options
280
- * @see updateConfig
281
- * @param {String} configName name on config file to load
282
- * @returns {Object} config object. Structure depends of config file
283
- */
284
- getConfig(configName) {
285
- if (!this.cache.configs.has(configName)) {
286
- if (!this.#isInited) {
287
- throw new Error('You should call Server.init() before using getConfig');
288
- }
289
- this.app.logger.warn(
290
- `You asked for config ${configName} that not exists. Please check you codebase `,
291
- );
292
- return {};
293
- }
294
- return this.cache.configs.get(configName);
295
- }
296
-
297
- /**
298
- * Return or create new logger instance. This is a main logger instance
299
- */
300
- getLogger() {
301
- if (!this.#realLogger) {
302
- this.#realLogger = this.#createLogger();
303
- }
304
- return this.#realLogger;
305
- }
306
-
307
- #createLogger() {
308
- const alignColorsAndTime = winston.format.combine(
309
- winston.format.colorize({
310
- all: true,
311
- }),
312
- winston.format.timestamp(),
313
- winston.format.printf(
314
- (info) =>
315
- `(${process.pid}) \x1B[32m[${info.label ?? 'SERVER'}]\x1B[39m ${
316
- info.timestamp
317
- } ${info.level} : ${info.message} ${info?.stack ?? ''} ${
318
- info.durationMs ? `Duration: ${info.durationMs}ms` : ''
319
- }`,
320
- ),
321
- );
322
- const logConfig = this.app.getConfig('log').transports;
323
- function IsConstructor(f) {
324
- try {
325
- Reflect.construct(String, [], f);
326
- } catch (e) {
327
- return false;
328
- }
329
- return true;
330
- }
331
-
332
- const logger = winston.createLogger({
333
- format: winston.format.errors({ stack: true }),
334
- level: 'silly',
335
- });
336
-
337
- for (const log of logConfig) {
338
- if (log.enable) {
339
- if (log.transport === 'console') {
340
- logger.add(
341
- new winston.transports.Console({
342
- level: log.transportOptions.level,
343
- format: winston.format.combine(
344
- winston.format.colorize(),
345
- alignColorsAndTime,
346
- ),
347
- }),
348
- );
349
- } else {
350
- import(log.transport).then((Tr) => {
351
- let Transport = Tr.default;
352
- if (!IsConstructor(Transport) && Transport.default) {
353
- Transport = Transport.default;
354
- } else {
355
- console.error(
356
- `${log.transport} not a constructor. Please check it`,
357
- );
358
- return;
359
- }
360
- logger.profile(`Adding new logger ${log.transport}`);
361
- logger.add(new Transport(log.transportOptions));
362
- logger.profile(`Adding new logger ${log.transport}`);
363
- });
364
- }
365
- }
366
- }
367
-
368
- return logger;
369
- }
370
-
371
- /**
372
- * Primary designed for tests when we need to update some configs before start testing
373
- * Should be called before any initialization was done
374
- * @TODO send event to all inited components to update config
375
- * @param {String} configName
376
- * @param {Object} config
377
- */
378
- updateConfig(configName, config) {
379
- // const confName = configName.charAt(0).toUpperCase() + configName.slice(1);
380
- const conf = this.getConfig(configName);
381
- const newConf = Object.assign(conf, config); // TODO deep clone
382
- this.cache.configs.set(configName, newConf);
383
- return newConf;
384
- }
385
-
386
- /**
387
- * Return model from {modelName} (file name) on model folder.
388
- * Support cache
389
- * @param {String} modelName name on config file to load
390
- * @returns {import('mongoose').Model | false| {}}
391
- */
392
- getModel(modelName) {
393
- if (modelName.endsWith('s')) {
394
- this.app.logger.warn(
395
- `Probably your model name '${modelName}' in plural from. Try to avoid plural form`,
396
- );
397
- }
398
- if (!this.#isInited) {
399
- this.app.logger.error(
400
- new Error('You should call Server.init() before using getModel'),
401
- );
402
- return false;
403
- }
404
- if (!this.cache.models.has(modelName)) {
405
- this.app.logger.warn(
406
- `You asked for model ${modelName} that not exists. Please check you codebase `,
407
- );
408
- return {};
409
- }
410
- return this.cache.models.get(modelName);
411
- }
412
-
413
- /**
414
- * Run cli command into framework (http, ws, etc)
415
- * @param {String} commandName name of command to load
416
- * @param {Object} args list of arguments to pass into command
417
- */
418
- async runCliCommand(commandName, args) {
419
- if (!this.cli) {
420
- const { default: BaseCli } = await import('./modules/BaseCli.js'); // Speed optimisation
421
- this.cli = new BaseCli(this);
422
- }
423
- return this.cli.run(commandName, args);
424
- }
425
-
426
- /**
427
- * Get internal cache service
428
- * @returns
429
- */
430
- getCache() {
431
- if (!this.cacheService) {
432
- this.cacheService = new Cache(this.app);
433
- }
434
- return this.cacheService;
435
- }
436
- }
437
-
438
- export default Server;
@@ -1,35 +0,0 @@
1
- import Base from '../../modules/Base';
2
- import Server from '../../server.js';
3
-
4
- declare class Cache extends Base {
5
- app: Server['app'];
6
-
7
- constructor(app: Server['app']);
8
-
9
- /**
10
- * As framework support namespaces all key for cache go through this function
11
- * Function return new key with added namespace
12
- * @param key key to add namespace
13
- */
14
- getKeyWithNameSpace(key: string): string;
15
-
16
- /**
17
- * Get value from cache. Set and get if not eists
18
- * @param key key to check
19
- * @param onNotFound callback that will be executed if value not found on cahce
20
- * @param storeTime how long we should store value on cache
21
- */
22
- getSetValue(
23
- key: string,
24
- onNotFound: () => Promise<any>,
25
- storeTime: number,
26
- ): Promise<any>;
27
-
28
- /**
29
- * Remove key from cache
30
- * @param key key to remove
31
- */
32
- removeKey(key: string): Promise<number>;
33
- }
34
-
35
- export default Cache;