@adaptivestone/framework 5.0.0-beta.11 → 5.0.0-beta.13

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