@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
@@ -0,0 +1,121 @@
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 Transport from 'winston-transport';
10
+ // See: https://github.com/winstonjs/triple-beam
11
+ const LEVEL_SYMBOL = Symbol.for('level');
12
+ const MESSAGE_SYMBOL = Symbol.for('message');
13
+ const SPLAT_SYMBOL = Symbol.for('splat');
14
+ class ExtendedError extends Error {
15
+ constructor(info) {
16
+ super(info.message || 'Unknown error');
17
+ this.name = info.name || 'Error';
18
+ if (info.stack && typeof info.stack === 'string') {
19
+ this.stack = info.stack;
20
+ }
21
+ }
22
+ }
23
+ function isObject(anything) {
24
+ return typeof anything === 'object' && anything != null;
25
+ }
26
+ /**
27
+ * Winston transport wrapper for Sentry that conditionally loads @sentry/node
28
+ * Assumes Sentry is already initialized in the consuming application
29
+ * Only loads the Winston transport if @sentry/node is installed
30
+ */
31
+ class SentryTransport extends Transport {
32
+ #sentry = null;
33
+ #initializationAttempted = false;
34
+ constructor(opts = {}) {
35
+ super(opts);
36
+ // Try to load Sentry Winston transport asynchronously
37
+ this.loadSentryTransport(opts);
38
+ }
39
+ async loadSentryTransport(opts) {
40
+ if (this.#initializationAttempted) {
41
+ return;
42
+ }
43
+ this.#initializationAttempted = true;
44
+ try {
45
+ // Dynamically import @sentry/node - will fail if not installed
46
+ // Using dynamic import to avoid TypeScript errors when package is not installed
47
+ const SentryNode = await import(__rewriteRelativeImportExtension('@sentry/node'));
48
+ const sentry = SentryNode.default || SentryNode;
49
+ this.#sentry = sentry;
50
+ console.log('[Framework] Sentry Winston transport loaded successfully');
51
+ }
52
+ catch (error) {
53
+ // Sentry is not installed - this is fine for a framework
54
+ console.log('[Framework] Sentry Winston transport not available (package not installed)');
55
+ }
56
+ }
57
+ log(info, callback) {
58
+ setImmediate(() => {
59
+ this.emit('logged', info);
60
+ });
61
+ if (!this.#sentry || !isObject(info)) {
62
+ return callback();
63
+ }
64
+ const levelFromSymbol = info[LEVEL_SYMBOL];
65
+ // See: https://github.com/winstonjs/winston?tab=readme-ov-file#streams-objectmode-and-info-objects
66
+ const { message, tags, user, ...attributes } = info;
67
+ // Remove all symbols from the remaining attributes
68
+ attributes[LEVEL_SYMBOL] = undefined;
69
+ attributes[MESSAGE_SYMBOL] = undefined;
70
+ attributes[SPLAT_SYMBOL] = undefined;
71
+ const logSeverityLevel = WINSTON_LEVEL_TO_LOG_SEVERITY_LEVEL_MAP[levelFromSymbol] ??
72
+ 'info';
73
+ // Setup Sentry scope with tags, user, and extras
74
+ const scope = this.#sentry.getCurrentScope();
75
+ scope.clear();
76
+ if (tags !== undefined && isObject(tags)) {
77
+ scope.setTags(tags);
78
+ }
79
+ if (user !== undefined && isObject(user)) {
80
+ scope.setUser(user);
81
+ }
82
+ // Filter out undefined values and set extras
83
+ const extras = Object.fromEntries(Object.entries(attributes).filter(([_, value]) => value !== undefined));
84
+ scope.setExtras(extras);
85
+ const error = Object.values(info).find((value) => value instanceof Error) ??
86
+ new ExtendedError(info);
87
+ this.#sentry.captureException(error, {
88
+ tags: tags,
89
+ level: logSeverityLevel,
90
+ });
91
+ return callback();
92
+ }
93
+ }
94
+ const WINSTON_LEVEL_TO_LOG_SEVERITY_LEVEL_MAP = {
95
+ // npm
96
+ silly: 'trace',
97
+ // npm and syslog
98
+ debug: 'debug',
99
+ // npm
100
+ verbose: 'debug',
101
+ // npm
102
+ http: 'debug',
103
+ // npm and syslog
104
+ info: 'info',
105
+ // syslog
106
+ notice: 'info',
107
+ // npm
108
+ warn: 'warn',
109
+ // syslog
110
+ warning: 'warn',
111
+ // npm and syslog
112
+ error: 'error',
113
+ // syslog
114
+ emerg: 'fatal',
115
+ // syslog
116
+ alert: 'fatal',
117
+ // syslog
118
+ crit: 'fatal',
119
+ };
120
+ export default SentryTransport;
121
+ //# sourceMappingURL=SentryTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SentryTransport.js","sourceRoot":"","sources":["../../../src/services/logging/SentryTransport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export default ValidateService;
2
+ declare class ValidateService extends Base {
3
+ static drivers: {
4
+ YupValidator: typeof YupValidator;
5
+ CustomValidator: typeof CustomValidator;
6
+ };
7
+ static isValidatorExists(validator: any): boolean;
8
+ static getDriverByValidatorBody(app: any, body?: {}): {};
9
+ constructor(app: any, validator: any);
10
+ validator: {} | null;
11
+ /**
12
+ * Filter middlewares by route path and select all parameters
13
+ */
14
+ filterRelatedParametersByRoute(middlewares: any, method: any, path: any): any;
15
+ /**
16
+ * Group all middleware(routes + controller) parameters
17
+ */
18
+ getMiddlewareParams(controllerMiddlewares: any, AllrouteMiddlewares: any, options: any): {
19
+ request: any[];
20
+ query: any[];
21
+ };
22
+ validateSchema(req: any, validator: any, data: any): Promise<any>;
23
+ validateArrayOfSchemas(req: any, validators: any, data: any): Promise<any[]>;
24
+ /**
25
+ * Validate req data. For example req.body, req.query
26
+ */
27
+ validateReqData(req: any, options: any): Promise<any>;
28
+ }
29
+ import Base from '../../modules/Base.ts';
30
+ import YupValidator from './drivers/YupValidator.js';
31
+ import CustomValidator from './drivers/CustomValidator.js';
@@ -0,0 +1,95 @@
1
+ import { isSchema } from 'yup';
2
+ import Base from "../../modules/Base.js";
3
+ import CustomValidator from './drivers/CustomValidator.js';
4
+ import YupValidator from './drivers/YupValidator.js';
5
+ class ValidateService extends Base {
6
+ constructor(app, validator) {
7
+ super(app);
8
+ this.validator = validator
9
+ ? ValidateService.getDriverByValidatorBody(app, validator)
10
+ : null;
11
+ }
12
+ static drivers = {
13
+ YupValidator,
14
+ CustomValidator,
15
+ };
16
+ static isValidatorExists(validator) {
17
+ if (!(validator instanceof Object)) {
18
+ return false;
19
+ }
20
+ return Object.values(ValidateService.drivers).some((driver) => validator instanceof driver);
21
+ }
22
+ static getDriverByValidatorBody(app, body = {}) {
23
+ if (ValidateService.isValidatorExists(body)) {
24
+ return body;
25
+ }
26
+ if (isSchema(body)) {
27
+ const yupValidator = new YupValidator(app, body);
28
+ return yupValidator;
29
+ }
30
+ const customValidator = new CustomValidator(app, body);
31
+ return customValidator;
32
+ }
33
+ /**
34
+ * Filter middlewares by route path and select all parameters
35
+ */
36
+ filterRelatedParametersByRoute(middlewares, method, path) {
37
+ const middlewaresParams = middlewares
38
+ .filter((middleware) => middleware.method.toLowerCase() === method.toLowerCase() &&
39
+ middleware.fullPath.toLowerCase() === path.toLowerCase())
40
+ ?.map((middleware) => {
41
+ const instance = new middleware.MiddlewareFunction(this.app, middleware.params);
42
+ return instance.relatedReqParameters;
43
+ });
44
+ return middlewaresParams;
45
+ }
46
+ /**
47
+ * Group all middleware(routes + controller) parameters
48
+ */
49
+ getMiddlewareParams(controllerMiddlewares, AllrouteMiddlewares, options) {
50
+ const { method, path } = options;
51
+ const routeMiddlewaresParams = this.filterRelatedParametersByRoute(AllrouteMiddlewares, method, path);
52
+ const controllerMiddlewaresParams = this.filterRelatedParametersByRoute(controllerMiddlewares, method, path);
53
+ return {
54
+ request: [
55
+ ...controllerMiddlewaresParams.map((x) => x.request),
56
+ ...routeMiddlewaresParams.map((x) => x.request),
57
+ ],
58
+ query: [
59
+ ...controllerMiddlewaresParams.map((x) => x.query),
60
+ ...routeMiddlewaresParams.map((x) => x.query),
61
+ ],
62
+ };
63
+ }
64
+ async validateSchema(req, validator, data) {
65
+ if (!validator) {
66
+ return {};
67
+ }
68
+ await validator.validateFields(data, req);
69
+ return validator.castFields(data, req);
70
+ }
71
+ async validateArrayOfSchemas(req, validators, data) {
72
+ const result = [];
73
+ for (const validator of validators) {
74
+ const formatedValidator = ValidateService.getDriverByValidatorBody(this.app, validator);
75
+ result.push(this.validateSchema(req, formatedValidator, data));
76
+ }
77
+ return Promise.all(result);
78
+ }
79
+ /**
80
+ * Validate req data. For example req.body, req.query
81
+ */
82
+ async validateReqData(req, options) {
83
+ const { selectedReqData, additionalMiddlewareFieldsData } = options;
84
+ const { middlewaresInfo, routeMiddlewaresReg, options: routeOptions, } = additionalMiddlewareFieldsData;
85
+ let validatedFields = await this.validateSchema(req, this.validator, selectedReqData);
86
+ const additionalMiddlewareSchemas = this.getMiddlewareParams(middlewaresInfo, routeMiddlewaresReg, routeOptions)[routeOptions.prefix];
87
+ if (additionalMiddlewareSchemas.length) {
88
+ const middlewareValidatedFields = await this.validateArrayOfSchemas(req, additionalMiddlewareSchemas, selectedReqData);
89
+ validatedFields = Object.assign({}, validatedFields, ...middlewareValidatedFields);
90
+ }
91
+ return validatedFields;
92
+ }
93
+ }
94
+ export default ValidateService;
95
+ //# sourceMappingURL=ValidateService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ValidateService.js","sourceRoot":"","sources":["../../../src/services/validate/ValidateService.js"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export default AbstractValidator;
2
+ declare class AbstractValidator extends Base {
3
+ static convertFieldsToJson(_fields: any): {};
4
+ constructor(app: any, body: any);
5
+ body: any;
6
+ get fieldsInJsonFormat(): {};
7
+ validateFields(_data: any, { query, body, appInfo }: {
8
+ query: any;
9
+ body: any;
10
+ appInfo: any;
11
+ }): Promise<boolean>;
12
+ castFields(): Promise<boolean>;
13
+ }
14
+ import Base from '../../../modules/Base.ts';
@@ -0,0 +1,29 @@
1
+ import Base from "../../../modules/Base.js";
2
+ class AbstractValidator extends Base {
3
+ constructor(app, body) {
4
+ super(app);
5
+ this.body = body;
6
+ }
7
+ static convertFieldsToJson(_fields) {
8
+ // IMPLENT;
9
+ return {};
10
+ }
11
+ get fieldsInJsonFormat() {
12
+ // IMPLENT;
13
+ return {};
14
+ }
15
+ // biome-ignore lint/correctness/noUnusedFunctionParameters: child will use them
16
+ async validateFields(_data, { query, body, appInfo }) {
17
+ // IMPLENT;
18
+ return true;
19
+ }
20
+ async castFields() {
21
+ // IMPLENT;
22
+ return true;
23
+ }
24
+ static get loggerGroup() {
25
+ return 'AbstractValidator_';
26
+ }
27
+ }
28
+ export default AbstractValidator;
29
+ //# sourceMappingURL=AbstractValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AbstractValidator.js","sourceRoot":"","sources":["../../../../src/services/validate/drivers/AbstractValidator.js"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,0BAA0B,CAAC;AAE5C,MAAM,iBAAkB,SAAQ,IAAI;IAClC,YAAY,GAAG,EAAE,IAAI;QACnB,KAAK,CAAC,GAAG,CAAC,CAAC;QACX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,OAAO;QAChC,WAAW;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,kBAAkB;QACpB,WAAW;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;QAClD,WAAW;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU;QACd,WAAW;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,WAAW;QACpB,OAAO,oBAAoB,CAAC;IAC9B,CAAC;CACF;AACD,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export default CustomValidator;
2
+ declare class CustomValidator extends AbstractValidator {
3
+ validateFields(data: any, { query, body, appInfo }: {
4
+ query: any;
5
+ body: any;
6
+ appInfo: any;
7
+ }): Promise<void>;
8
+ castFields(data: any, { query, body, appInfo }: {
9
+ query: any;
10
+ body: any;
11
+ appInfo: any;
12
+ }): Promise<any>;
13
+ }
14
+ import AbstractValidator from './AbstractValidator.js';
@@ -0,0 +1,48 @@
1
+ import { ValidationError } from 'yup';
2
+ import AbstractValidator from './AbstractValidator.js';
3
+ class CustomValidator extends AbstractValidator {
4
+ async validateFields(data, { query, body, appInfo }) {
5
+ if (this.body) {
6
+ if (typeof this.body.validate !== 'function') {
7
+ this.logger.error('request.validate should be a function');
8
+ }
9
+ }
10
+ try {
11
+ await this.body.validate(data, {
12
+ req: {
13
+ query,
14
+ body,
15
+ appInfo,
16
+ },
17
+ });
18
+ }
19
+ catch (e) {
20
+ this.logger.warn(`CustomValidator validateFields ${e}`);
21
+ if (e.path) {
22
+ throw new ValidationError({
23
+ [e.path]: e.message,
24
+ });
25
+ }
26
+ throw new Error(e);
27
+ }
28
+ }
29
+ async castFields(data, { query, body, appInfo }) {
30
+ if (this.body) {
31
+ if (typeof this.body.cast !== 'function') {
32
+ this.logger.error('request.validate should be a function');
33
+ }
34
+ }
35
+ return this.body.cast(data, {
36
+ req: {
37
+ query,
38
+ body,
39
+ appInfo,
40
+ },
41
+ });
42
+ }
43
+ static get loggerGroup() {
44
+ return 'CustomValidator_';
45
+ }
46
+ }
47
+ export default CustomValidator;
48
+ //# sourceMappingURL=CustomValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomValidator.js","sourceRoot":"","sources":["../../../../src/services/validate/drivers/CustomValidator.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AACtC,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD,MAAM,eAAgB,SAAQ,iBAAiB;IAC7C,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;QACjD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC7C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC7B,GAAG,EAAE;oBACH,KAAK;oBACL,IAAI;oBACJ,OAAO;iBACR;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACX,MAAM,IAAI,eAAe,CAAC;oBACxB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO;iBACpB,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE;QAC7C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAC1B,GAAG,EAAE;gBACH,KAAK;gBACL,IAAI;gBACJ,OAAO;aACR;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,KAAK,WAAW;QACpB,OAAO,kBAAkB,CAAC;IAC5B,CAAC;CACF;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,13 @@
1
+ export default YupValidator;
2
+ declare class YupValidator extends AbstractValidator {
3
+ validateFields(data: any, { query, body, appInfo }: {
4
+ query: any;
5
+ body: any;
6
+ appInfo: any;
7
+ }): Promise<void>;
8
+ castFields(data: any, { query, body }: {
9
+ query: any;
10
+ body: any;
11
+ }): Promise<any>;
12
+ }
13
+ import AbstractValidator from './AbstractValidator.js';
@@ -0,0 +1,86 @@
1
+ import { ValidationError } from 'yup';
2
+ import AbstractValidator from './AbstractValidator.js';
3
+ class YupValidator extends AbstractValidator {
4
+ get fieldsInJsonFormat() {
5
+ return YupValidator.convertFieldsToJson(this.body);
6
+ }
7
+ static convertFieldsToJson(fields) {
8
+ const convertedFields = {};
9
+ const entries = Object.entries(fields.describe().fields);
10
+ if (!entries?.length) {
11
+ return convertedFields;
12
+ }
13
+ const requiredFields = [];
14
+ for (const [field, fieldProp] of entries) {
15
+ const isRequired = fieldProp?.tests?.find((prop) => prop.name === 'required');
16
+ if (isRequired) {
17
+ requiredFields.push(field);
18
+ }
19
+ }
20
+ entries.forEach(([key, value]) => {
21
+ if (!convertedFields[key]) {
22
+ convertedFields[key] = {};
23
+ }
24
+ convertedFields[key] = {
25
+ type: value.type,
26
+ required: requiredFields?.includes(key),
27
+ };
28
+ });
29
+ return convertedFields;
30
+ }
31
+ async validateFields(data, { query, body, appInfo }) {
32
+ const yupSchema = this.body;
33
+ const { controllerValidationAbortEarly } = this.app.getConfig('validate');
34
+ if (yupSchema) {
35
+ if (typeof yupSchema.validate !== 'function') {
36
+ this.logger.error('request.validate should be a function');
37
+ }
38
+ }
39
+ try {
40
+ await yupSchema.validate(data, {
41
+ abortEarly: controllerValidationAbortEarly,
42
+ req: { query, body },
43
+ });
44
+ }
45
+ catch (e) {
46
+ let { errors } = e;
47
+ // translate it
48
+ if (appInfo.i18n && errors) {
49
+ errors = errors.map((err) => appInfo.i18n.t(err, err));
50
+ }
51
+ this.logger.error(`Request validation failed with message: ${e.message}. errors: ${errors}`);
52
+ const errorAnswer = {};
53
+ if (!e.inner || !e.inner.length) {
54
+ errorAnswer[e.path] = errors;
55
+ }
56
+ else {
57
+ e.inner.forEach((err) => {
58
+ errorAnswer[err.path] = err.errors;
59
+ if (appInfo.i18n && err.errors) {
60
+ errorAnswer[err.path] = err.errors.map((err1) => appInfo.i18n.t(err1, err1, err.params));
61
+ }
62
+ });
63
+ }
64
+ throw new ValidationError({
65
+ ...errorAnswer,
66
+ });
67
+ }
68
+ }
69
+ async castFields(data, { query, body }) {
70
+ const yupSchema = this.body;
71
+ if (yupSchema) {
72
+ if (typeof yupSchema.cast !== 'function') {
73
+ this.logger.error('request.cast should be a function');
74
+ }
75
+ }
76
+ return yupSchema.cast(data, {
77
+ stripUnknown: true,
78
+ req: { query, body },
79
+ });
80
+ }
81
+ static get loggerGroup() {
82
+ return 'YupValidator_';
83
+ }
84
+ }
85
+ export default YupValidator;
86
+ //# sourceMappingURL=YupValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"YupValidator.js","sourceRoot":"","sources":["../../../../src/services/validate/drivers/YupValidator.js"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { afterAll, beforeAll } from 'vitest';
2
+ import { createDefaultTestUser } from "./testHelpers.js";
3
+ beforeAll(async () => {
4
+ await createDefaultTestUser();
5
+ });
6
+ afterAll(async () => {
7
+ // do seomthing
8
+ });
9
+ //# sourceMappingURL=frameworkVitestSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frameworkVitestSetup.js","sourceRoot":"","sources":["../../src/tests/frameworkVitestSetup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,qBAAqB,EAAE,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,eAAe;AACjB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const setup: () => Promise<void>;
2
+ declare const teardown: () => Promise<void>;
3
+ export { setup, teardown };
@@ -0,0 +1,29 @@
1
+ import { MongoMemoryReplSet } from 'mongodb-memory-server';
2
+ let isTeardown = false;
3
+ let mongoMemoryServerInstance;
4
+ const setup = async () => {
5
+ console.log('GLOBAL SETUP PREPARE RUNNING...');
6
+ console.time('GLOBAL TEST PREPARE. DONE');
7
+ mongoMemoryServerInstance = await MongoMemoryReplSet.create({
8
+ // binary: { version: '4.4.6' },
9
+ replSet: { count: 1, storageEngine: 'wiredTiger' },
10
+ });
11
+ await mongoMemoryServerInstance.waitUntilRunning();
12
+ const connectionStringMongo = await mongoMemoryServerInstance.getUri('__DB_TO_REPLACE__');
13
+ process.env.TEST_MONGO_URI = connectionStringMongo;
14
+ // console.info('MONGO_URI: ', connectionStringMongo);
15
+ console.timeEnd('GLOBAL TEST PREPARE. DONE');
16
+ };
17
+ const teardown = async () => {
18
+ if (isTeardown) {
19
+ throw new Error('teardown called twice');
20
+ }
21
+ console.time('GLOBAL TEARDOWN RUNNING. DONE');
22
+ isTeardown = true;
23
+ console.log('GLOBAL TEARDOWN RUNNING...');
24
+ await mongoMemoryServerInstance.stop();
25
+ console.timeEnd('GLOBAL TEARDOWN RUNNING. DONE');
26
+ return Promise.resolve();
27
+ };
28
+ export { setup, teardown };
29
+ //# sourceMappingURL=globalSetupVitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"globalSetupVitest.js","sourceRoot":"","sources":["../../src/tests/globalSetupVitest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,yBAA6C,CAAC;AAElD,MAAM,KAAK,GAAG,KAAK,IAAI,EAAE;IACvB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IAC/C,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAC1C,yBAAyB,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC;QAC1D,gCAAgC;QAChC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE;KACnD,CAAC,CAAC;IACH,MAAM,yBAAyB,CAAC,gBAAgB,EAAE,CAAC;IACnD,MAAM,qBAAqB,GACzB,MAAM,yBAAyB,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC9D,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,qBAAqB,CAAC;IACnD,sDAAsD;IACtD,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;IAC1B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAE9C,UAAU,GAAG,IAAI,CAAC;IAClB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,MAAM,yBAAyB,CAAC,IAAI,EAAE,CAAC;IACvC,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;IAEjD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;AAC3B,CAAC,CAAC;AAEF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,91 @@
1
+ import crypto from 'node:crypto';
2
+ import path from 'node:path';
3
+ import { createClient } from '@redis/client';
4
+ import mongoose from 'mongoose'; // we do not need create indexes on tests
5
+ import { afterAll, afterEach, beforeAll, beforeEach } from 'vitest';
6
+ import { clearNamespace } from "../helpers/redis/clearNamespace.js";
7
+ import Server from "../server.js";
8
+ import { serverInstance, setServerInstance } from "./testHelpers.js";
9
+ mongoose.set('autoIndex', false);
10
+ const basePath = new URL('.', import.meta.url).pathname;
11
+ beforeAll(async () => {
12
+ process.env.LOGGER_CONSOLE_LEVEL = 'error';
13
+ process.env.AUTH_SALT = crypto.randomBytes(16).toString('hex');
14
+ const server = new Server({
15
+ folders: {
16
+ config: process.env.TEST_FOLDER_CONFIG || path.resolve(basePath, '../config'),
17
+ controllers: process.env.TEST_FOLDER_CONTROLLERS ||
18
+ path.resolve(basePath, '../controllers'),
19
+ models: process.env.TEST_FOLDER_MODELS || path.resolve(basePath, '../models'),
20
+ emails: process.env.TEST_FOLDER_EMAIL ||
21
+ process.env.TEST_FOLDER_EMAILS ||
22
+ path.resolve(basePath, '../services/messaging/email/templates'),
23
+ locales: process.env.TEST_FOLDER_LOCALES || path.resolve(basePath, '../locales'),
24
+ commands: process.env.TEST_FOLDER_COMMANDS ||
25
+ path.resolve(basePath, '../commands'),
26
+ migrations: process.env.TEST_FOLDER_MIGRATIONS ||
27
+ path.resolve(basePath, '../migrations'),
28
+ },
29
+ });
30
+ setServerInstance(server);
31
+ await server.init({ isSkipModelInit: true });
32
+ const connectionString = process.env.TEST_MONGO_URI.replace('__DB_TO_REPLACE__', `TEST_${crypto.randomUUID()}`);
33
+ server.updateConfig('mongo', {
34
+ connectionString,
35
+ });
36
+ server.updateConfig('http', { port: 0 }); // allow to use random
37
+ server.updateConfig('mail', { transport: 'stub' });
38
+ await server.initAllModels();
39
+ // if (!global.testSetup) {
40
+ // global.testSetup = {};
41
+ // }
42
+ // server.testingGetUrl = (urlPart) => {
43
+ // console.error(
44
+ // 'global.server.testingGetUrl is deprcated. Please use testHelper.getServerBaseURL()',
45
+ // );
46
+ // return `http://127.0.0.1:${global.server.getConfig('http').port}${urlPart}`;
47
+ // };
48
+ // if (typeof global.testSetup.beforeAll === 'function') {
49
+ // await global.testSetup.beforeAll();
50
+ // }
51
+ await server.startServer();
52
+ });
53
+ beforeEach(() => {
54
+ if (serverInstance) {
55
+ const key = `test-${Math.random().toString(36).substring(7)}`;
56
+ serverInstance.app.updateConfig('redis', {
57
+ namespace: key,
58
+ });
59
+ }
60
+ });
61
+ afterEach(async () => {
62
+ if (serverInstance) {
63
+ const { url, namespace } = serverInstance.getConfig('redis');
64
+ const redisClient = createClient({ url });
65
+ try {
66
+ await redisClient.connect();
67
+ await clearNamespace(redisClient, namespace);
68
+ await redisClient.destroy();
69
+ }
70
+ catch {
71
+ // that ok. No redis connection
72
+ }
73
+ }
74
+ });
75
+ afterAll(async () => {
76
+ if (serverInstance) {
77
+ serverInstance.app.httpServer?.shutdown();
78
+ serverInstance.app.events.emit('shutdown');
79
+ }
80
+ // if (typeof global.testSetup.afterAll === 'function') {
81
+ // await global.testSetup.afterAll();
82
+ // }
83
+ try {
84
+ await mongoose.connection.db?.dropDatabase(); // clean database after test
85
+ }
86
+ catch {
87
+ // that ok. No mongoose connection
88
+ }
89
+ await mongoose.disconnect();
90
+ });
91
+ //# sourceMappingURL=setupVitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupVitest.js","sourceRoot":"","sources":["../../src/tests/setupVitest.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,QAAQ,MAAM,UAAU,CAAC,CAAC,yCAAyC;AAC1E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErE,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAEjC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;AAExD,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,OAAO,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,OAAO,EAAE;YACP,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;YACvE,WAAW,EACT,OAAO,CAAC,GAAG,CAAC,uBAAuB;gBACnC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC;YAC1C,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;YACvE,MAAM,EACJ,OAAO,CAAC,GAAG,CAAC,iBAAiB;gBAC7B,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBAC9B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,uCAAuC,CAAC;YACjE,OAAO,EACL,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,YAAY,CAAC;YACzE,QAAQ,EACN,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC;YACvC,UAAU,EACR,OAAO,CAAC,GAAG,CAAC,sBAAsB;gBAClC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC;SAC1C;KACF,CAAC,CAAC;IACH,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,gBAAgB,GAAI,OAAO,CAAC,GAAG,CAAC,cAAyB,CAAC,OAAO,CACrE,mBAAmB,EACnB,QAAQ,MAAM,CAAC,UAAU,EAAE,EAAE,CAC9B,CAAC;IACF,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE;QAC3B,gBAAgB;KACjB,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,sBAAsB;IAChE,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;IAE7B,2BAA2B;IAC3B,2BAA2B;IAC3B,IAAI;IACJ,wCAAwC;IACxC,mBAAmB;IACnB,4FAA4F;IAC5F,OAAO;IACP,iFAAiF;IACjF,KAAK;IAEL,0DAA0D;IAC1D,wCAAwC;IACxC,IAAI;IACJ,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE;YACvC,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,SAAS,CACjD,OAAO,CACc,CAAC;QACxB,MAAM,WAAW,GAAG,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,cAAc,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;IAClB,IAAI,cAAc,EAAE,CAAC;QACnB,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC;QAC1C,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,CAAC;IACD,yDAAyD;IACzD,uCAAuC;IACvC,IAAI;IACJ,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,4BAA4B;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;AAC9B,CAAC,CAAC,CAAC"}