@adaptivestone/framework 5.0.0-beta.2 → 5.0.0-beta.21

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 (285) hide show
  1. package/CHANGELOG.md +126 -1
  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 +81 -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 +12 -0
  22. package/dist/commands/GenerateTypes.js +60 -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 +32 -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 +46 -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 +10 -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 +22 -0
  49. package/dist/config/log.js +23 -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 +15 -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 +74 -0
  64. package/dist/controllers/Auth.js +181 -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 +24 -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 +15 -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 +14 -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 +28 -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/yup.d.ts +13 -0
  91. package/{helpers → dist/helpers}/yup.js +9 -12
  92. package/dist/helpers/yup.js.map +1 -0
  93. package/dist/index.d.ts +1 -0
  94. package/dist/index.js +7 -0
  95. package/dist/index.js.map +1 -0
  96. package/dist/models/Lock.d.ts +89 -0
  97. package/dist/models/Lock.js +99 -0
  98. package/dist/models/Lock.js.map +1 -0
  99. package/dist/models/Migration.d.ts +10 -0
  100. package/dist/models/Migration.js +13 -0
  101. package/dist/models/Migration.js.map +1 -0
  102. package/dist/models/Sequence.d.ts +27 -0
  103. package/dist/models/Sequence.js +19 -0
  104. package/dist/models/Sequence.js.map +1 -0
  105. package/dist/models/User.d.ts +2372 -0
  106. package/dist/models/User.js +280 -0
  107. package/dist/models/User.js.map +1 -0
  108. package/dist/models/UserOld.d.ts +179 -0
  109. package/dist/models/UserOld.js +230 -0
  110. package/dist/models/UserOld.js.map +1 -0
  111. package/dist/modules/AbstractCommand.d.ts +34 -0
  112. package/dist/modules/AbstractCommand.js +48 -0
  113. package/dist/modules/AbstractCommand.js.map +1 -0
  114. package/dist/modules/AbstractConnector.d.ts +5 -0
  115. package/dist/modules/AbstractConnector.js +8 -0
  116. package/dist/modules/AbstractConnector.js.map +1 -0
  117. package/dist/modules/AbstractController.d.ts +90 -0
  118. package/dist/modules/AbstractController.js +324 -0
  119. package/dist/modules/AbstractController.js.map +1 -0
  120. package/dist/modules/AbstractModel.d.ts +29 -0
  121. package/dist/modules/AbstractModel.js +43 -0
  122. package/dist/modules/AbstractModel.js.map +1 -0
  123. package/dist/modules/Base.d.ts +29 -0
  124. package/dist/modules/Base.js +58 -0
  125. package/dist/modules/Base.js.map +1 -0
  126. package/dist/modules/BaseCli.d.ts +25 -0
  127. package/dist/modules/BaseCli.js +147 -0
  128. package/dist/modules/BaseCli.js.map +1 -0
  129. package/dist/modules/BaseModel.d.ts +41 -0
  130. package/dist/modules/BaseModel.js +36 -0
  131. package/dist/modules/BaseModel.js.map +1 -0
  132. package/dist/server.d.ts +121 -0
  133. package/dist/server.js +432 -0
  134. package/dist/server.js.map +1 -0
  135. package/dist/services/cache/Cache.d.ts +31 -0
  136. package/dist/services/cache/Cache.js +115 -0
  137. package/dist/services/cache/Cache.js.map +1 -0
  138. package/dist/services/documentation/DocumentationGenerator.d.ts +11 -0
  139. package/dist/services/documentation/DocumentationGenerator.js +134 -0
  140. package/dist/services/documentation/DocumentationGenerator.js.map +1 -0
  141. package/dist/services/http/HttpServer.d.ts +35 -0
  142. package/dist/services/http/HttpServer.js +71 -0
  143. package/dist/services/http/HttpServer.js.map +1 -0
  144. package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
  145. package/dist/services/http/middleware/AbstractMiddleware.js +43 -0
  146. package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
  147. package/dist/services/http/middleware/Auth.d.ts +9 -0
  148. package/dist/services/http/middleware/Auth.js +18 -0
  149. package/dist/services/http/middleware/Auth.js.map +1 -0
  150. package/dist/services/http/middleware/Cors.d.ts +10 -0
  151. package/dist/services/http/middleware/Cors.js +36 -0
  152. package/dist/services/http/middleware/Cors.js.map +1 -0
  153. package/dist/services/http/middleware/GetUserByToken.d.ts +19 -0
  154. package/dist/services/http/middleware/GetUserByToken.js +40 -0
  155. package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
  156. package/dist/services/http/middleware/I18n.d.ts +26 -0
  157. package/dist/services/http/middleware/I18n.js +97 -0
  158. package/dist/services/http/middleware/I18n.js.map +1 -0
  159. package/dist/services/http/middleware/IpDetector.d.ts +12 -0
  160. package/dist/services/http/middleware/IpDetector.js +51 -0
  161. package/dist/services/http/middleware/IpDetector.js.map +1 -0
  162. package/dist/services/http/middleware/Pagination.d.ts +27 -0
  163. package/dist/services/http/middleware/Pagination.js +47 -0
  164. package/dist/services/http/middleware/Pagination.js.map +1 -0
  165. package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
  166. package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
  167. package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
  168. package/dist/services/http/middleware/RateLimiter.d.ts +18 -0
  169. package/dist/services/http/middleware/RateLimiter.js +106 -0
  170. package/dist/services/http/middleware/RateLimiter.js.map +1 -0
  171. package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
  172. package/dist/services/http/middleware/RequestLogger.js +18 -0
  173. package/dist/services/http/middleware/RequestLogger.js.map +1 -0
  174. package/dist/services/http/middleware/RequestParser.d.ts +8 -0
  175. package/dist/services/http/middleware/RequestParser.js +35 -0
  176. package/dist/services/http/middleware/RequestParser.js.map +1 -0
  177. package/dist/services/http/middleware/Role.d.ts +9 -0
  178. package/dist/services/http/middleware/Role.js +24 -0
  179. package/dist/services/http/middleware/Role.js.map +1 -0
  180. package/dist/services/validate/ValidateService.d.ts +31 -0
  181. package/dist/services/validate/ValidateService.js +96 -0
  182. package/dist/services/validate/ValidateService.js.map +1 -0
  183. package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
  184. package/dist/services/validate/drivers/AbstractValidator.js +32 -0
  185. package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
  186. package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
  187. package/dist/services/validate/drivers/CustomValidator.js +48 -0
  188. package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
  189. package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
  190. package/dist/services/validate/drivers/YupValidator.js +86 -0
  191. package/dist/services/validate/drivers/YupValidator.js.map +1 -0
  192. package/dist/tests/globalSetupVitest.d.ts +2 -0
  193. package/dist/tests/globalSetupVitest.js +29 -0
  194. package/dist/tests/globalSetupVitest.js.map +1 -0
  195. package/dist/tests/setupVitest.d.ts +1 -0
  196. package/dist/tests/setupVitest.js +99 -0
  197. package/dist/tests/setupVitest.js.map +1 -0
  198. package/package.json +38 -23
  199. package/Cli.js +0 -22
  200. package/cluster.js +0 -27
  201. package/commands/CreateUser.js +0 -75
  202. package/commands/Documentation.js +0 -17
  203. package/commands/DropIndex.js +0 -29
  204. package/commands/GenerateRandomBytes.js +0 -21
  205. package/commands/GetOpenApiJson.js +0 -325
  206. package/commands/SyncIndexes.js +0 -39
  207. package/commands/migration/Create.js +0 -61
  208. package/commands/migration/Migrate.js +0 -55
  209. package/config/auth.js +0 -9
  210. package/config/http.js +0 -9
  211. package/config/i18n.js +0 -12
  212. package/config/ipDetector.js +0 -14
  213. package/config/log.js +0 -22
  214. package/config/mail.js +0 -29
  215. package/config/mongo.js +0 -3
  216. package/config/rateLimiter.js +0 -16
  217. package/config/redis.js +0 -4
  218. package/config/validate.js +0 -3
  219. package/controllers/Auth.js +0 -210
  220. package/controllers/Home.js +0 -28
  221. package/controllers/index.js +0 -60
  222. package/folderConfig.js +0 -14
  223. package/helpers/files.js +0 -79
  224. package/helpers/logger.js +0 -17
  225. package/helpers/redis/clearNamespace.js +0 -14
  226. package/index.js +0 -8
  227. package/jsconfig.json +0 -9
  228. package/locales/en/translation.json +0 -27
  229. package/locales/ru/translation.json +0 -27
  230. package/migrations/.gitkeep +0 -0
  231. package/models/Migration.js +0 -15
  232. package/models/Sequence.js +0 -22
  233. package/models/User.js +0 -263
  234. package/modules/AbstractCommand.js +0 -43
  235. package/modules/AbstractConnector.js +0 -9
  236. package/modules/AbstractController.js +0 -413
  237. package/modules/AbstractModel.d.ts +0 -48
  238. package/modules/AbstractModel.js +0 -86
  239. package/modules/Base.d.ts +0 -37
  240. package/modules/Base.js +0 -63
  241. package/modules/BaseCli.js +0 -97
  242. package/server.d.ts +0 -98
  243. package/server.js +0 -429
  244. package/services/cache/Cache.d.ts +0 -35
  245. package/services/cache/Cache.js +0 -124
  246. package/services/documentation/DocumentationGenerator.js +0 -169
  247. package/services/http/HttpServer.js +0 -96
  248. package/services/http/middleware/AbstractMiddleware.js +0 -51
  249. package/services/http/middleware/Auth.js +0 -20
  250. package/services/http/middleware/Cors.js +0 -46
  251. package/services/http/middleware/GetUserByToken.js +0 -47
  252. package/services/http/middleware/I18n.js +0 -117
  253. package/services/http/middleware/IpDetector.js +0 -59
  254. package/services/http/middleware/Pagination.js +0 -57
  255. package/services/http/middleware/PrepareAppInfo.js +0 -18
  256. package/services/http/middleware/RateLimiter.js +0 -134
  257. package/services/http/middleware/RequestLogger.js +0 -22
  258. package/services/http/middleware/RequestParser.js +0 -40
  259. package/services/http/middleware/Role.js +0 -29
  260. package/services/messaging/email/index.js +0 -217
  261. package/services/messaging/email/resources/.gitkeep +0 -1
  262. package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
  263. package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
  264. package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
  265. package/services/messaging/email/templates/recovery/html.pug +0 -8
  266. package/services/messaging/email/templates/recovery/subject.pug +0 -2
  267. package/services/messaging/email/templates/recovery/text.pug +0 -3
  268. package/services/messaging/email/templates/verification/html.pug +0 -10
  269. package/services/messaging/email/templates/verification/subject.pug +0 -1
  270. package/services/messaging/email/templates/verification/text.pug +0 -1
  271. package/services/messaging/index.js +0 -3
  272. package/services/validate/ValidateService.js +0 -157
  273. package/services/validate/drivers/AbstractValidator.js +0 -37
  274. package/services/validate/drivers/CustomValidator.js +0 -51
  275. package/services/validate/drivers/YupValidator.js +0 -103
  276. package/tests/globalSetupVitest.js +0 -35
  277. package/tests/setup.js +0 -118
  278. package/tests/setupVitest.js +0 -109
  279. package/types/Expand.d.ts +0 -11
  280. package/types/TFoldersConfig.d.ts +0 -17
  281. package/views/404.pug +0 -3
  282. package/views/home.pug +0 -3
  283. package/views/layouts/base.pug +0 -39
  284. package/vitest.config.js +0 -16
  285. /package/{commands → dist/migrations}/.gitkeep +0 -0
@@ -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,2 @@
1
+ export function setup(): Promise<void>;
2
+ export function teardown(): Promise<void>;
@@ -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.js"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,IAAI,yBAAyB,CAAC;AAE9B,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,99 @@
1
+ import path from 'node:path';
2
+ import crypto from 'node:crypto';
3
+ import { beforeAll, beforeEach, afterEach, afterAll } from 'vitest';
4
+ import mongoose from 'mongoose'; // we do not need create indexes on tests
5
+ import { createClient } from '@redis/client';
6
+ import { clearRedisNamespace } from "../helpers/redis/clearNamespace.js";
7
+ import Server from "../server.js";
8
+ mongoose.set('autoIndex', false);
9
+ const basePath = new URL('.', import.meta.url).pathname;
10
+ beforeAll(async () => {
11
+ process.env.LOGGER_CONSOLE_LEVEL = 'error';
12
+ process.env.AUTH_SALT = crypto.randomBytes(16).toString('hex');
13
+ global.server = new Server({
14
+ folders: {
15
+ config: process.env.TEST_FOLDER_CONFIG || path.resolve(basePath, '../config'),
16
+ controllers: process.env.TEST_FOLDER_CONTROLLERS ||
17
+ path.resolve(basePath, '../controllers'),
18
+ models: process.env.TEST_FOLDER_MODELS || path.resolve(basePath, '../models'),
19
+ emails: process.env.TEST_FOLDER_EMAIL ||
20
+ process.env.TEST_FOLDER_EMAILS ||
21
+ path.resolve(basePath, '../services/messaging/email/templates'),
22
+ locales: process.env.TEST_FOLDER_LOCALES || path.resolve(basePath, '../locales'),
23
+ commands: process.env.TEST_FOLDER_COMMANDS ||
24
+ path.resolve(basePath, '../commands'),
25
+ migrations: process.env.TEST_FOLDER_MIGRATIONS ||
26
+ path.resolve(basePath, '../migrations'),
27
+ },
28
+ });
29
+ await global.server.init({ isSkipModelInit: true });
30
+ const connectionString = process.env.TEST_MONGO_URI.replace('__DB_TO_REPLACE__', `TEST_${crypto.randomUUID()}`);
31
+ global.server.updateConfig('mongo', {
32
+ connectionString,
33
+ });
34
+ global.server.updateConfig('http', { port: 0 }); // allow to use random
35
+ global.server.updateConfig('mail', { transport: 'stub' });
36
+ await global.server.initAllModels();
37
+ if (!global.testSetup) {
38
+ global.testSetup = {};
39
+ }
40
+ global.server.testingGetUrl = (urlPart) => `http://127.0.0.1:${global.server.getConfig('http').port}${urlPart}`;
41
+ if (!global.testSetup.disableUserCreate) {
42
+ const User = global.server.app.getModel('User');
43
+ global.user = await User.create({
44
+ email: 'test@test.com',
45
+ password: 'testPassword',
46
+ isVerified: true,
47
+ name: {
48
+ nick: 'testUserNickName',
49
+ },
50
+ }).catch((e) => {
51
+ console.error(e);
52
+ console.info('That error can happens in case you have custom user model. Please use global.testSetup.disableUserCreate flag to skip user creating');
53
+ });
54
+ global.authToken = await global.user.generateToken();
55
+ }
56
+ if (typeof global.testSetup.beforeAll === 'function') {
57
+ await global.testSetup.beforeAll();
58
+ }
59
+ await global.server.startServer();
60
+ });
61
+ beforeEach(() => {
62
+ if (global.server) {
63
+ const key = `test-${Math.random().toString(36).substring(7)}`;
64
+ global.server.app.updateConfig('redis', {
65
+ namespace: key,
66
+ });
67
+ }
68
+ });
69
+ afterEach(async () => {
70
+ if (global.server) {
71
+ const { url, namespace } = global.server.getConfig('redis');
72
+ const redisClient = createClient({ url });
73
+ try {
74
+ await redisClient.connect();
75
+ await clearRedisNamespace(redisClient, namespace);
76
+ await redisClient.disconnect();
77
+ }
78
+ catch {
79
+ // that ok. No redis connection
80
+ }
81
+ }
82
+ });
83
+ afterAll(async () => {
84
+ if (global.server) {
85
+ global.server.app.httpServer.shutdown();
86
+ global.server.app.events.emit('shutdown');
87
+ }
88
+ if (typeof global.testSetup.afterAll === 'function') {
89
+ await global.testSetup.afterAll();
90
+ }
91
+ try {
92
+ await mongoose.connection.db.dropDatabase(); // clean database after test
93
+ }
94
+ catch {
95
+ // that ok. No mongoose connection
96
+ }
97
+ await mongoose.disconnect();
98
+ });
99
+ //# sourceMappingURL=setupVitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupVitest.js","sourceRoot":"","sources":["../../src/tests/setupVitest.js"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,28 +1,35 @@
1
1
  {
2
2
  "name": "@adaptivestone/framework",
3
- "version": "5.0.0-beta.2",
3
+ "version": "5.0.0-beta.21",
4
4
  "description": "Adaptive stone node js framework",
5
- "main": "index.js",
6
5
  "type": "module",
7
6
  "engines": {
8
- "node": ">=20.12.0"
7
+ "node": ">=23.6.0"
8
+ },
9
+ "exports": {
10
+ "./package.json": "./package.json",
11
+ "./*": "./dist/*"
9
12
  },
10
13
  "repository": {
11
14
  "type": "git",
12
- "url": "https://gitlab.com/adaptivestone/framework"
15
+ "url": "git+https://github.com/adaptivestone/framework.git"
13
16
  },
14
17
  "homepage": "https://framework.adaptivestone.com/",
15
18
  "scripts": {
16
- "dev": "node --watch ./index.js",
17
- "prod": "node --watch ./cluster.js",
19
+ "build": "rm -rf dist && tsc",
20
+ "postbuild": "cp -R ./src/migrations ./dist/migrations",
21
+ "check:types": "tsc --noEmit",
22
+ "dev": "node --watch ./src/index.ts",
23
+ "prod": "node --watch ./src/cluster.ts",
18
24
  "test": "vitest run",
19
25
  "t": "vitest --coverage=false --reporter=default",
20
26
  "prettier": "prettier --check '**/*.(js|jsx|ts|tsx|json|css|scss|md)'",
21
- "lint": "eslint '**/*.js'",
22
- "lint:fix": "eslint '**/*.js' --fix",
27
+ "lint": "eslint --flag unstable_native_nodejs_ts_config",
28
+ "lint:fix": "eslint --fix",
23
29
  "codestyle": "npm run prettier && npm run lint",
24
30
  "prepare": "husky",
25
- "cli": "node cliCommand",
31
+ "prepublishOnly": "npm run build",
32
+ "cli": "node cliCommand.ts",
26
33
  "benchmark": "h2load -n 10000 -c 50 -p 'http/1.1' http://localhost:3300/",
27
34
  "benchmark2": "h2load -n 10000 -c 50 https://localhost:3300/",
28
35
  "redis:docker": "docker run --rm -p 6379:6379 redis"
@@ -30,38 +37,46 @@
30
37
  "author": "Andrey Logunov",
31
38
  "license": "MIT",
32
39
  "dependencies": {
40
+ "@redis/client": "^5.0.0",
33
41
  "deepmerge": "^4.2.2",
34
42
  "express": "^5.0.1",
35
43
  "formidable": "^3.5.1",
36
- "html-to-text": "^9.0.3",
37
- "i18next": "^24.0.0",
44
+ "i18next": "^25.0.0",
38
45
  "i18next-fs-backend": "^2.0.0",
39
- "juice": "^11.0.0",
40
- "minimist": "^1.2.5",
41
46
  "mongoose": "^8.0.0",
42
- "nodemailer": "^6.6.3",
43
- "nodemailer-sendmail-transport": "^1.0.2",
44
- "nodemailer-stub-transport": "^1.1.0",
45
- "pug": "^3.0.2",
46
- "rate-limiter-flexible": "^5.0.0",
47
- "redis": "^4.3.1",
47
+ "rate-limiter-flexible": "^7.0.0",
48
48
  "winston": "^3.3.3",
49
49
  "winston-transport-sentry-node": "^3.0.0",
50
50
  "yup": "^1.0.0"
51
51
  },
52
52
  "devDependencies": {
53
+ "@eslint/js": "^9.24.0",
54
+ "@types/express": "^5.0.1",
55
+ "@types/formidable": "^3.4.5",
56
+ "@types/node": "^22.13.1",
53
57
  "@vitest/coverage-v8": "^3.0.0",
54
- "eslint": "^8.0.0",
55
- "eslint-config-airbnb-base": "^15.0.0",
58
+ "@vitest/eslint-plugin": "^1.1.25",
59
+ "eslint": "^9.24.0",
56
60
  "eslint-config-prettier": "^10.0.0",
61
+ "eslint-plugin-import-x": "^4.6.1",
57
62
  "eslint-plugin-prettier": "^5.0.0",
58
- "eslint-plugin-vitest": "^0.4.0",
63
+ "globals": "^16.0.0",
59
64
  "husky": "^9.0.0",
60
- "lint-staged": "^15.0.0",
65
+ "lint-staged": "^16.0.0",
61
66
  "mongodb-memory-server": "^10.0.0",
62
67
  "prettier": "^3.0.0",
68
+ "typescript": "^5.8.3",
69
+ "typescript-eslint": "^8.30.1",
63
70
  "vitest": "^3.0.0"
64
71
  },
72
+ "peerDependencies": {
73
+ "@adaptivestone/framework-module-email": "^1.0.0"
74
+ },
75
+ "peerDependenciesMeta": {
76
+ "@adaptivestone/framework-module-email": {
77
+ "optional": true
78
+ }
79
+ },
65
80
  "lint-staged": {
66
81
  "**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
67
82
  "prettier --write"
package/Cli.js DELETED
@@ -1,22 +0,0 @@
1
- import parseArgs from 'minimist';
2
- import mongoose from 'mongoose';
3
- import BaseCli from './modules/BaseCli.js';
4
- import Server from './server.js';
5
-
6
- class Cli extends BaseCli {
7
- constructor(serverConfig) {
8
- mongoose.set('autoIndex', false); // we do not need create indexes on CLI.
9
- const server = new Server(serverConfig);
10
- super(server);
11
- this.args = parseArgs(process.argv.slice(3));
12
- }
13
-
14
- async run() {
15
- await this.server.init({ isSkipModelInit: true, isSkipModelLoading: true });
16
- const command = process.argv[2]?.toLowerCase();
17
- await super.run(command, this.args);
18
- this.app.events.emit('shutdown');
19
- }
20
- }
21
-
22
- export default Cli;
package/cluster.js DELETED
@@ -1,27 +0,0 @@
1
- import cluster from 'node:cluster';
2
- import { cpus } from 'node:os';
3
-
4
- const numCPUs = cpus().length;
5
-
6
- if (cluster.isPrimary) {
7
- // eslint-disable-next-line no-console
8
- console.log(`Master ${process.pid} is running`);
9
- // Fork workers.
10
- for (let i = 0; i < numCPUs; i += 1) {
11
- cluster.fork();
12
- }
13
-
14
- cluster.on('exit', (worker, code, signal) => {
15
- // eslint-disable-next-line no-console
16
- console.log(
17
- `Worker \x1B[45m ${
18
- worker.process.pid
19
- } \x1B[49m \x1B[41m †††† died †††† \x1B[49m. Code: ${
20
- signal || code
21
- }. Restarting...`,
22
- );
23
- cluster.fork();
24
- });
25
- } else {
26
- import('./server.js');
27
- }
@@ -1,75 +0,0 @@
1
- import AbstractCommand from '../modules/AbstractCommand.js';
2
-
3
- // Example: node src/cli createuser --email=somemail@gmail.com --password=somePassword --roles=user,admin,someOtherRoles
4
- class CreateUser extends AbstractCommand {
5
- static get description() {
6
- return 'Create user in a database';
7
- }
8
-
9
- async run() {
10
- const User = this.app.getModel('User');
11
- const { id, email, password, roles, update } = this.args;
12
-
13
- if (!email && !id) {
14
- this.logger.error('Input validation failded');
15
- this.logger.error('Please add "email" or "id" variables');
16
- return false;
17
- }
18
-
19
- let user;
20
-
21
- if (id) {
22
- user = await User.findOne({ _id: id });
23
- } else if (email) {
24
- user = await User.findOne({ email });
25
- }
26
-
27
- if (user && !update) {
28
- this.logger.error(
29
- 'We are found a user in database. But "update" option is not providing. Exitin',
30
- );
31
- return false;
32
- }
33
-
34
- if (!user && !password) {
35
- this.logger.error(
36
- 'For a new user we alway asking for a password. Please provide it and rerun command',
37
- );
38
- return false;
39
- }
40
-
41
- if (!user && !email) {
42
- this.logger.error(
43
- 'For a new user we alway asking for a email. Please provide it and rerun command',
44
- );
45
- return false;
46
- }
47
-
48
- if (!user) {
49
- user = new User();
50
- }
51
-
52
- if (password) {
53
- user.password = password;
54
- }
55
- if (email) {
56
- user.email = email;
57
- }
58
-
59
- if (roles) {
60
- user.roles = roles.split(',');
61
- }
62
-
63
- await user.save();
64
-
65
- await user.generateToken();
66
-
67
- this.logger.info(
68
- `User was created/updated ${JSON.stringify(user, null, 4)}`,
69
- );
70
-
71
- return user;
72
- }
73
- }
74
-
75
- export default CreateUser;
@@ -1,17 +0,0 @@
1
- import AbstractCommand from '../modules/AbstractCommand.js';
2
- import ControllerManager from '../controllers/index.js';
3
-
4
- class Documentation extends AbstractCommand {
5
- static get description() {
6
- return 'Generate documentation (internal)';
7
- }
8
-
9
- async run() {
10
- const CM = new ControllerManager(this.app);
11
- this.app.documentation = [];
12
- await CM.initControllers();
13
- return this.app.documentation;
14
- }
15
- }
16
-
17
- export default Documentation;
@@ -1,29 +0,0 @@
1
- import AbstractCommand from '../modules/AbstractCommand.js';
2
-
3
- class DropIndex extends AbstractCommand {
4
- static get description() {
5
- return 'Drop indexes of model';
6
- }
7
-
8
- async run() {
9
- if (!this.args.model) {
10
- this.logger.error('Please provide model name as "--model=BestUserModel"');
11
- return false;
12
- }
13
-
14
- const Model = this.app.getModel(this.args.model);
15
-
16
- if (!Model) {
17
- this.logger.error('Not able to find model');
18
- return false;
19
- }
20
-
21
- await Model.collection.dropIndexes();
22
-
23
- this.logger.info('Success');
24
-
25
- return true;
26
- }
27
- }
28
-
29
- export default DropIndex;
@@ -1,21 +0,0 @@
1
- import { randomBytes } from 'node:crypto';
2
- import AbstractCommand from '../modules/AbstractCommand.js';
3
-
4
- class GenerateRandomBytes extends AbstractCommand {
5
- static get description() {
6
- return 'Generate random bytes ising randomBytes from node:crypto';
7
- }
8
-
9
- static isShouldInitModels = false;
10
-
11
- async run() {
12
- const sizes = [16, 32, 64, 128, 256];
13
- for (const size of sizes) {
14
- const bytes = randomBytes(size).toString('hex');
15
- this.logger.info(`${size} bytes: ${bytes}`);
16
- }
17
- return true;
18
- }
19
- }
20
-
21
- export default GenerateRandomBytes;