@adaptivestone/framework 5.0.0-beta.3 → 5.0.0-beta.31

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 (298) hide show
  1. package/CHANGELOG.md +1054 -526
  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 +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 +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/createStore.d.ts +2 -0
  73. package/dist/createStore.js +3 -0
  74. package/dist/createStore.js.map +1 -0
  75. package/dist/folderConfig.d.ts +34 -0
  76. package/dist/folderConfig.js +14 -0
  77. package/dist/folderConfig.js.map +1 -0
  78. package/dist/helpers/appInstance.d.ts +3 -0
  79. package/dist/helpers/appInstance.js +8 -0
  80. package/dist/helpers/appInstance.js.map +1 -0
  81. package/dist/helpers/crypto.d.ts +3 -0
  82. package/dist/helpers/crypto.js +17 -0
  83. package/dist/helpers/crypto.js.map +1 -0
  84. package/dist/helpers/files.d.ts +16 -0
  85. package/dist/helpers/files.js +76 -0
  86. package/dist/helpers/files.js.map +1 -0
  87. package/dist/helpers/logger.d.ts +4 -0
  88. package/dist/helpers/logger.js +20 -0
  89. package/dist/helpers/logger.js.map +1 -0
  90. package/dist/helpers/redis/clearNamespace.d.ts +2 -0
  91. package/dist/helpers/redis/clearNamespace.js +14 -0
  92. package/dist/helpers/redis/clearNamespace.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 +94 -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 +120 -0
  136. package/dist/server.js +440 -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 +113 -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/createStore.d.ts +2 -0
  148. package/dist/services/http/createStore.js +3 -0
  149. package/dist/services/http/createStore.js.map +1 -0
  150. package/dist/services/http/middleware/AbstractMiddleware.d.ts +25 -0
  151. package/dist/services/http/middleware/AbstractMiddleware.js +41 -0
  152. package/dist/services/http/middleware/AbstractMiddleware.js.map +1 -0
  153. package/dist/services/http/middleware/Auth.d.ts +9 -0
  154. package/dist/services/http/middleware/Auth.js +18 -0
  155. package/dist/services/http/middleware/Auth.js.map +1 -0
  156. package/dist/services/http/middleware/Cors.d.ts +12 -0
  157. package/dist/services/http/middleware/Cors.js +36 -0
  158. package/dist/services/http/middleware/Cors.js.map +1 -0
  159. package/dist/services/http/middleware/GetUserByToken.d.ts +20 -0
  160. package/dist/services/http/middleware/GetUserByToken.js +39 -0
  161. package/dist/services/http/middleware/GetUserByToken.js.map +1 -0
  162. package/dist/services/http/middleware/I18n.d.ts +30 -0
  163. package/dist/services/http/middleware/I18n.js +96 -0
  164. package/dist/services/http/middleware/I18n.js.map +1 -0
  165. package/dist/services/http/middleware/IpDetector.d.ts +12 -0
  166. package/dist/services/http/middleware/IpDetector.js +51 -0
  167. package/dist/services/http/middleware/IpDetector.js.map +1 -0
  168. package/dist/services/http/middleware/Pagination.d.ts +27 -0
  169. package/dist/services/http/middleware/Pagination.js +46 -0
  170. package/dist/services/http/middleware/Pagination.js.map +1 -0
  171. package/dist/services/http/middleware/PrepareAppInfo.d.ts +8 -0
  172. package/dist/services/http/middleware/PrepareAppInfo.js +17 -0
  173. package/dist/services/http/middleware/PrepareAppInfo.js.map +1 -0
  174. package/dist/services/http/middleware/RateLimiter.d.ts +19 -0
  175. package/dist/services/http/middleware/RateLimiter.js +109 -0
  176. package/dist/services/http/middleware/RateLimiter.js.map +1 -0
  177. package/dist/services/http/middleware/RequestLogger.d.ts +8 -0
  178. package/dist/services/http/middleware/RequestLogger.js +18 -0
  179. package/dist/services/http/middleware/RequestLogger.js.map +1 -0
  180. package/dist/services/http/middleware/RequestParser.d.ts +8 -0
  181. package/dist/services/http/middleware/RequestParser.js +35 -0
  182. package/dist/services/http/middleware/RequestParser.js.map +1 -0
  183. package/dist/services/http/middleware/Role.d.ts +12 -0
  184. package/dist/services/http/middleware/Role.js +24 -0
  185. package/dist/services/http/middleware/Role.js.map +1 -0
  186. package/dist/services/validate/ValidateService.d.ts +31 -0
  187. package/dist/services/validate/ValidateService.js +95 -0
  188. package/dist/services/validate/ValidateService.js.map +1 -0
  189. package/dist/services/validate/drivers/AbstractValidator.d.ts +14 -0
  190. package/dist/services/validate/drivers/AbstractValidator.js +29 -0
  191. package/dist/services/validate/drivers/AbstractValidator.js.map +1 -0
  192. package/dist/services/validate/drivers/CustomValidator.d.ts +14 -0
  193. package/dist/services/validate/drivers/CustomValidator.js +48 -0
  194. package/dist/services/validate/drivers/CustomValidator.js.map +1 -0
  195. package/dist/services/validate/drivers/YupValidator.d.ts +13 -0
  196. package/dist/services/validate/drivers/YupValidator.js +86 -0
  197. package/dist/services/validate/drivers/YupValidator.js.map +1 -0
  198. package/dist/tests/frameworkVitestSetup.d.ts +1 -0
  199. package/dist/tests/frameworkVitestSetup.js +9 -0
  200. package/dist/tests/frameworkVitestSetup.js.map +1 -0
  201. package/dist/tests/globalSetupVitest.d.ts +3 -0
  202. package/dist/tests/globalSetupVitest.js +29 -0
  203. package/dist/tests/globalSetupVitest.js.map +1 -0
  204. package/dist/tests/setupVitest.d.ts +1 -0
  205. package/dist/tests/setupVitest.js +91 -0
  206. package/dist/tests/setupVitest.js.map +1 -0
  207. package/dist/tests/testHelpers.d.ts +340 -0
  208. package/dist/tests/testHelpers.js +48 -0
  209. package/dist/tests/testHelpers.js.map +1 -0
  210. package/package.json +38 -35
  211. package/Cli.js +0 -22
  212. package/cluster.js +0 -27
  213. package/commands/CreateUser.js +0 -75
  214. package/commands/Documentation.js +0 -17
  215. package/commands/DropIndex.js +0 -29
  216. package/commands/GenerateRandomBytes.js +0 -21
  217. package/commands/GetOpenApiJson.js +0 -325
  218. package/commands/SyncIndexes.js +0 -39
  219. package/commands/migration/Create.js +0 -61
  220. package/commands/migration/Migrate.js +0 -55
  221. package/config/auth.js +0 -9
  222. package/config/http.js +0 -9
  223. package/config/i18n.js +0 -12
  224. package/config/ipDetector.js +0 -14
  225. package/config/log.js +0 -22
  226. package/config/mail.js +0 -29
  227. package/config/mongo.js +0 -3
  228. package/config/rateLimiter.js +0 -16
  229. package/config/redis.js +0 -4
  230. package/config/validate.js +0 -3
  231. package/controllers/Auth.js +0 -210
  232. package/controllers/Home.js +0 -28
  233. package/controllers/index.js +0 -60
  234. package/folderConfig.js +0 -14
  235. package/helpers/files.js +0 -79
  236. package/helpers/logger.js +0 -17
  237. package/helpers/redis/clearNamespace.js +0 -14
  238. package/helpers/yup.js +0 -24
  239. package/index.js +0 -8
  240. package/jsconfig.json +0 -9
  241. package/locales/en/translation.json +0 -27
  242. package/locales/ru/translation.json +0 -27
  243. package/migrations/.gitkeep +0 -0
  244. package/models/Migration.js +0 -15
  245. package/models/Sequence.js +0 -22
  246. package/models/User.js +0 -263
  247. package/modules/AbstractCommand.js +0 -43
  248. package/modules/AbstractConnector.js +0 -9
  249. package/modules/AbstractController.js +0 -413
  250. package/modules/AbstractModel.d.ts +0 -48
  251. package/modules/AbstractModel.js +0 -88
  252. package/modules/Base.d.ts +0 -37
  253. package/modules/Base.js +0 -63
  254. package/modules/BaseCli.js +0 -97
  255. package/server.d.ts +0 -98
  256. package/server.js +0 -429
  257. package/services/cache/Cache.d.ts +0 -35
  258. package/services/cache/Cache.js +0 -124
  259. package/services/documentation/DocumentationGenerator.js +0 -169
  260. package/services/http/HttpServer.js +0 -96
  261. package/services/http/middleware/AbstractMiddleware.js +0 -51
  262. package/services/http/middleware/Auth.js +0 -20
  263. package/services/http/middleware/Cors.js +0 -46
  264. package/services/http/middleware/GetUserByToken.js +0 -47
  265. package/services/http/middleware/I18n.js +0 -117
  266. package/services/http/middleware/IpDetector.js +0 -59
  267. package/services/http/middleware/Pagination.js +0 -57
  268. package/services/http/middleware/PrepareAppInfo.js +0 -18
  269. package/services/http/middleware/RateLimiter.js +0 -134
  270. package/services/http/middleware/RequestLogger.js +0 -22
  271. package/services/http/middleware/RequestParser.js +0 -40
  272. package/services/http/middleware/Role.js +0 -29
  273. package/services/messaging/email/index.js +0 -217
  274. package/services/messaging/email/resources/.gitkeep +0 -1
  275. package/services/messaging/email/templates/emptyTemplate/html.pug +0 -9
  276. package/services/messaging/email/templates/emptyTemplate/subject.pug +0 -1
  277. package/services/messaging/email/templates/emptyTemplate/text.pug +0 -1
  278. package/services/messaging/email/templates/recovery/html.pug +0 -8
  279. package/services/messaging/email/templates/recovery/subject.pug +0 -2
  280. package/services/messaging/email/templates/recovery/text.pug +0 -3
  281. package/services/messaging/email/templates/verification/html.pug +0 -10
  282. package/services/messaging/email/templates/verification/subject.pug +0 -1
  283. package/services/messaging/email/templates/verification/text.pug +0 -1
  284. package/services/messaging/index.js +0 -3
  285. package/services/validate/ValidateService.js +0 -157
  286. package/services/validate/drivers/AbstractValidator.js +0 -37
  287. package/services/validate/drivers/CustomValidator.js +0 -51
  288. package/services/validate/drivers/YupValidator.js +0 -103
  289. package/tests/globalSetupVitest.js +0 -35
  290. package/tests/setup.js +0 -118
  291. package/tests/setupVitest.js +0 -109
  292. package/types/Expand.d.ts +0 -11
  293. package/types/TFoldersConfig.d.ts +0 -17
  294. package/views/404.pug +0 -3
  295. package/views/home.pug +0 -3
  296. package/views/layouts/base.pug +0 -39
  297. package/vitest.config.js +0 -16
  298. /package/{commands → dist/migrations}/.gitkeep +0 -0
@@ -0,0 +1,48 @@
1
+ import { appInstance } from "../helpers/appInstance.js";
2
+ export let serverInstance;
3
+ export let defaultUser;
4
+ export let defaultAuthToken;
5
+ export const setServerInstance = (serverInstanceToSet) => {
6
+ if (serverInstance) {
7
+ throw new Error('Server instance is already set');
8
+ }
9
+ serverInstance = serverInstanceToSet;
10
+ };
11
+ export const setDefaultUser = (userToSet) => {
12
+ if (defaultUser) {
13
+ throw new Error('Default user is already set');
14
+ }
15
+ defaultUser = userToSet;
16
+ };
17
+ export const setDefaultAuthToken = (tokenToSet) => {
18
+ if (defaultAuthToken) {
19
+ throw new Error('Auth token is already set');
20
+ }
21
+ defaultAuthToken = tokenToSet;
22
+ };
23
+ export const getTestServerURL = (urlPart) => `http://127.0.0.1:${appInstance.getConfig('http').port}${urlPart}`;
24
+ export const createDefaultTestUser = async () => {
25
+ if (defaultUser) {
26
+ throw new Error('You already have created default user');
27
+ }
28
+ const User = appInstance.getModel('User');
29
+ const user = await User.create({
30
+ email: 'test@test.com',
31
+ password: 'testPassword',
32
+ isVerified: true,
33
+ name: {
34
+ nick: 'testUserNickName',
35
+ },
36
+ }).catch((e) => {
37
+ console.error(e);
38
+ console.info('That error can happens in case you have custom user model. Please implment user creation by youself');
39
+ });
40
+ if (!user) {
41
+ return false;
42
+ }
43
+ setDefaultUser(user);
44
+ const token = await user.generateToken();
45
+ setDefaultAuthToken(token.token);
46
+ return { user, token: token.token };
47
+ };
48
+ //# sourceMappingURL=testHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testHelpers.js","sourceRoot":"","sources":["../../src/tests/testHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAMxD,MAAM,CAAC,IAAI,cAAuB,CAAC;AACnC,MAAM,CAAC,IAAI,WAAkE,CAAC;AAC9E,MAAM,CAAC,IAAI,gBAAwB,CAAC;AAEpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,mBAA2B,EAAE,EAAE;IAC/D,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,cAAc,GAAG,mBAAmB,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,SAAgE,EAChE,EAAE;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,WAAW,GAAG,SAAS,CAAC;AAC1B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAE,EAAE;IACxD,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,gBAAgB,GAAG,UAAU,CAAC;AAChC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAE,EAAE,CACnD,oBAAoB,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;AAErE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAI,EAAE;IAC9C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAqB,CAAC;IAC9D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;QAC7B,KAAK,EAAE,eAAe;QACtB,QAAQ,EAAE,cAAc;QACxB,UAAU,EAAE,IAAI;QAChB,IAAI,EAAE;YACJ,IAAI,EAAE,kBAAkB;SACzB;KACF,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,CAAC,IAAI,CACV,qGAAqG,CACtG,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACf,CAAC;IACD,cAAc,CAAC,IAAI,CAAC,CAAC;IACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;IACzC,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AACtC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,70 +1,73 @@
1
1
  {
2
2
  "name": "@adaptivestone/framework",
3
- "version": "5.0.0-beta.3",
3
+ "version": "5.0.0-beta.31",
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
- "prettier": "prettier --check '**/*.(js|jsx|ts|tsx|json|css|scss|md)'",
21
- "lint": "eslint '**/*.js'",
22
- "lint:fix": "eslint '**/*.js' --fix",
23
- "codestyle": "npm run prettier && npm run lint",
24
- "prepare": "husky",
25
- "cli": "node cliCommand",
26
+ "format": "biome format",
27
+ "format:fix": "biome format --write",
28
+ "knip": "knip",
29
+ "lint": "biome lint",
30
+ "lint:fix": "biome lint --write",
31
+ "check": "biome check",
32
+ "check:fix": "biome check --write",
33
+ "prepublishOnly": "npm run build",
34
+ "cli": "node cliCommand.ts",
26
35
  "benchmark": "h2load -n 10000 -c 50 -p 'http/1.1' http://localhost:3300/",
27
36
  "benchmark2": "h2load -n 10000 -c 50 https://localhost:3300/",
28
37
  "redis:docker": "docker run --rm -p 6379:6379 redis"
29
38
  },
30
- "author": "Andrey Logunov",
39
+ "author": "Andrei Lahunou",
31
40
  "license": "MIT",
32
41
  "dependencies": {
42
+ "@redis/client": "^5.0.0",
33
43
  "deepmerge": "^4.2.2",
34
44
  "express": "^5.0.1",
35
45
  "formidable": "^3.5.1",
36
- "html-to-text": "^9.0.3",
37
- "i18next": "^24.0.0",
46
+ "i18next": "^25.0.0",
38
47
  "i18next-fs-backend": "^2.0.0",
39
- "juice": "^11.0.0",
40
- "minimist": "^1.2.5",
41
48
  "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",
49
+ "rate-limiter-flexible": "^7.0.0",
48
50
  "winston": "^3.3.3",
49
51
  "winston-transport-sentry-node": "^3.0.0",
50
52
  "yup": "^1.0.0"
51
53
  },
52
54
  "devDependencies": {
55
+ "@biomejs/biome": "^2.0.6",
56
+ "@types/express": "^5.0.1",
57
+ "@types/formidable": "^3.4.5",
58
+ "@types/node": "^24.0.0",
53
59
  "@vitest/coverage-v8": "^3.0.0",
54
- "eslint": "^8.0.0",
55
- "eslint-config-airbnb-base": "^15.0.0",
56
- "eslint-config-prettier": "^10.0.0",
57
- "eslint-plugin-prettier": "^5.0.0",
58
- "eslint-plugin-vitest": "^0.4.0",
59
- "husky": "^9.0.0",
60
- "lint-staged": "^15.0.0",
60
+ "lefthook": "^1.11.14",
61
61
  "mongodb-memory-server": "^10.0.0",
62
- "prettier": "^3.0.0",
62
+ "typescript": "^5.8.3",
63
63
  "vitest": "^3.0.0"
64
64
  },
65
- "lint-staged": {
66
- "**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
67
- "prettier --write"
68
- ]
65
+ "peerDependencies": {
66
+ "@adaptivestone/framework-module-email": "^1.0.0"
67
+ },
68
+ "peerDependenciesMeta": {
69
+ "@adaptivestone/framework-module-email": {
70
+ "optional": true
71
+ }
69
72
  }
70
73
  }
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;
@@ -1,325 +0,0 @@
1
- import { promises as fs } from 'node:fs';
2
- import AbstractCommand from '../modules/AbstractCommand.js';
3
-
4
- /**
5
- * Command for generate documentation json file openApi
6
- */
7
- class GetOpenApiJson extends AbstractCommand {
8
- static get description() {
9
- return 'Generate documentation (openApi) ';
10
- }
11
-
12
- async run() {
13
- const { myDomain } = this.app.getConfig('http');
14
- let jsonFile = process.env.npm_package_json;
15
- if (!jsonFile) {
16
- jsonFile = `${process.env.PWD}/package.json`;
17
- }
18
-
19
- try {
20
- jsonFile = JSON.parse(await fs.readFile(jsonFile, 'utf8'));
21
- } catch (e) {
22
- this.logger.error(
23
- 'No npm package detected. Please start this command via NPM as it depends on package.json',
24
- );
25
- }
26
-
27
- if (!jsonFile) {
28
- jsonFile = {
29
- name: 'UNDETECTD PROJECT',
30
- description: 'UNDETECTD PROJECT DECCRIPTION',
31
- version: '0.0.0-undetrcted',
32
- author: {
33
- email: 'none@example.com',
34
- },
35
- };
36
- }
37
-
38
- if (!jsonFile.author) {
39
- jsonFile.author = 'none@example.com';
40
- }
41
-
42
- const openApi = {
43
- openapi: '3.0.0',
44
- info: {
45
- title: jsonFile.name,
46
- description: jsonFile.description,
47
- contact: {
48
- email: jsonFile.author.email,
49
- },
50
- version: jsonFile.version,
51
- },
52
- servers: [
53
- {
54
- url: 'http://localhost:3300',
55
- description: 'Localhost',
56
- },
57
- {
58
- url: myDomain,
59
- description: 'Domain from config',
60
- },
61
- ],
62
- };
63
-
64
- const baseDocumentation = await this.app.runCliCommand('documentation');
65
-
66
- if (!baseDocumentation) {
67
- throw new Error('Problems with basic documenation generation');
68
- }
69
-
70
- openApi.components = {};
71
- openApi.components.securitySchemes = {};
72
-
73
- openApi.tags = [];
74
-
75
- for (const controller of baseDocumentation) {
76
- const controllerName = controller.contollerName.split('/')[0];
77
- if (!openApi.tags.find((tag) => tag.name === controllerName)) {
78
- openApi.tags.push({
79
- name: controllerName,
80
- description: '',
81
- });
82
- }
83
- }
84
-
85
- openApi.paths = {};
86
-
87
- const permissionWithRoutes = {};
88
- for (const controller of baseDocumentation) {
89
- for (const route of controller.routesInfo) {
90
- const routeInfo = route[Object.keys(route)?.[0]];
91
- const middlewares = [
92
- ...routeInfo.controllerMiddlewares,
93
- ...routeInfo.routeMiddlewares,
94
- ];
95
-
96
- const securitySchemaNames = [];
97
-
98
- permissionWithRoutes[Object.keys(route)?.[0]] = [];
99
-
100
- if (middlewares?.length) {
101
- for (const middleware of middlewares) {
102
- if (middleware?.authParams?.length) {
103
- for (const authParam of middleware.authParams) {
104
- const { permissions, ...mainFields } = authParam;
105
- const fullName = authParam.name;
106
- if (permissions) {
107
- permissionWithRoutes[Object.keys(route)?.[0]].push(
108
- permissions,
109
- );
110
- }
111
-
112
- if (!openApi.components.securitySchemes[fullName]) {
113
- openApi.components.securitySchemes[fullName] = mainFields;
114
- }
115
-
116
- securitySchemaNames.push({
117
- [fullName]: [],
118
- });
119
- }
120
- }
121
- }
122
- }
123
-
124
- let routeName = Object.keys(route)[0];
125
- if (routeName === '/') {
126
- // eslint-disable-next-line no-continue
127
- continue;
128
- }
129
-
130
- if (routeName.slice(-1) === '/') {
131
- routeName = routeName.substring(0, routeName.length - 1);
132
- }
133
-
134
- const partsRoute = routeName.split('/');
135
-
136
- const newRoute = [];
137
- const routeParameters = [];
138
- for (const routeDetail of partsRoute) {
139
- let routeCopy = routeDetail;
140
-
141
- if (routeDetail.startsWith(':')) {
142
- const routeChange = routeCopy.split('');
143
- routeChange[0] = '{';
144
- routeChange.push('}');
145
- routeCopy = routeChange.join('');
146
- routeParameters.push(routeCopy.replace(/^.|.$/g, ''));
147
- }
148
-
149
- newRoute.push(routeCopy);
150
- }
151
-
152
- routeName = newRoute.join('/');
153
-
154
- if (!openApi.paths[routeName]) {
155
- openApi.paths[routeName] = {};
156
- }
157
-
158
- const routeDescription =
159
- route[Object.keys(route)[0]]?.description || 'empty description';
160
- const permissions =
161
- permissionWithRoutes[Object.keys(route)[0]][
162
- permissionWithRoutes[Object.keys(route)[0]].length - 1
163
- ];
164
- const routeDescriptionWithPermissions = `${
165
- permissions || ''
166
- } ${routeDescription}`;
167
- const methodName = route[Object.keys(route)[0]].method.toLowerCase();
168
- const routeTitle = route[Object.keys(route)[0]].name;
169
-
170
- const routeFields = route[Object.keys(route)[0]].fields;
171
- const routeQueryFields = route[Object.keys(route)[0]].queryFields;
172
-
173
- if (!openApi.paths[routeName][methodName]) {
174
- openApi.paths[routeName][methodName] = {};
175
- }
176
-
177
- openApi.paths[routeName][methodName].tags = [];
178
-
179
- openApi.paths[routeName][methodName].tags.push(
180
- controller.contollerName.split('/')[0],
181
- );
182
-
183
- openApi.paths[routeName][methodName].summary = routeTitle;
184
- openApi.paths[routeName][methodName].description =
185
- routeDescriptionWithPermissions;
186
- openApi.paths[routeName][methodName].parameters = [];
187
- openApi.paths[routeName][methodName].security = securitySchemaNames;
188
-
189
- openApi.paths[routeName][methodName].responses = {
190
- 200: {
191
- description: 'Successfully',
192
- },
193
- 201: {
194
- description: 'The resource was created successfully',
195
- },
196
- 400: {
197
- description: 'There is a syntax error in the request',
198
- },
199
- 401: {
200
- description:
201
- 'Authentication is required to access the requested resource',
202
- },
203
- 404: {
204
- description:
205
- 'The server accepted the request, but did not find the corresponding resource at the specified URI',
206
- },
207
- };
208
-
209
- for (const queryField of routeQueryFields) {
210
- openApi.paths[routeName][methodName].parameters.push({
211
- name: queryField.name,
212
- in: 'query',
213
- required: queryField?.required,
214
- schema: {
215
- type: queryField.type,
216
- },
217
- });
218
- }
219
-
220
- for (const routeField of routeParameters) {
221
- openApi.paths[routeName][methodName].parameters.push({
222
- name: routeField,
223
- in: 'path',
224
- required: true,
225
- schema: {
226
- type: 'string',
227
- },
228
- });
229
- }
230
-
231
- if (routeFields.length) {
232
- const groupBodyFields = {};
233
- const requiredFields = [];
234
- let isMultipartFormaData = false;
235
- for (const field of routeFields) {
236
- if (field.required) {
237
- requiredFields.push(field.name);
238
- }
239
-
240
- switch (field.type) {
241
- case 'object':
242
- groupBodyFields[field.name] = {
243
- properties: {},
244
- };
245
-
246
- for (const objField of field.fields) {
247
- groupBodyFields[field.name].properties[objField.name] = {
248
- // fields file has mixed type but openApi doesnt have this type
249
- type: objField.type === 'mixed' ? 'string' : objField.type,
250
- };
251
- }
252
-
253
- break;
254
-
255
- case 'array':
256
- groupBodyFields[field.name] = {
257
- items: {
258
- type: field.innerType,
259
- },
260
- };
261
- break;
262
-
263
- case 'lazy':
264
- groupBodyFields[field.name] = {
265
- oneOf: [
266
- {
267
- type: 'object',
268
- },
269
- {
270
- type: 'string',
271
- },
272
- ],
273
- };
274
- break;
275
-
276
- case 'file':
277
- groupBodyFields[field.name] = {
278
- type: 'string',
279
- format: 'binary',
280
- };
281
- isMultipartFormaData = true;
282
- break;
283
- default:
284
- groupBodyFields[field.name] = {
285
- type: field.type,
286
- };
287
- }
288
- }
289
-
290
- const contentType = isMultipartFormaData
291
- ? 'multipart/form-data'
292
- : 'application/json';
293
-
294
- openApi.paths[routeName][methodName].requestBody = {
295
- content: {
296
- [contentType]: {
297
- schema: {
298
- type: 'object',
299
- properties: groupBodyFields,
300
- },
301
- },
302
- },
303
- };
304
-
305
- if (requiredFields.length) {
306
- openApi.paths[routeName][methodName].requestBody.content[
307
- contentType
308
- ].schema.required = requiredFields;
309
- }
310
- }
311
- }
312
- }
313
-
314
- const result = JSON.stringify(openApi);
315
-
316
- if (this.args.output) {
317
- await fs.writeFile(this.args.output, result);
318
- this.logger.info(`Output to: ${this.args.output}`);
319
- }
320
-
321
- return result;
322
- }
323
- }
324
-
325
- export default GetOpenApiJson;