@adaptivestone/framework 5.0.0-beta.10 → 5.0.0-beta.12

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