@syngrisi/syngrisi 2.2.2 → 2.2.6-alpha.0

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 (613) hide show
  1. package/README.md +49 -27
  2. package/dist/server/api-docs/openAPIDocumentGenerator.js +6489 -0
  3. package/dist/server/api-docs/openAPIDocumentGenerator.js.map +1 -0
  4. package/dist/server/api-docs/openAPIResponseBuilders.js +89 -0
  5. package/dist/server/api-docs/openAPIResponseBuilders.js.map +1 -0
  6. package/dist/server/api-docs/openAPIRouter.js +6505 -0
  7. package/dist/server/api-docs/openAPIRouter.js.map +1 -0
  8. package/dist/server/api-docs/serviceResponse.js +39 -0
  9. package/dist/server/api-docs/serviceResponse.js.map +1 -0
  10. package/dist/server/app.js +6751 -0
  11. package/dist/server/app.js.map +1 -0
  12. package/dist/server/config.js +1055 -0
  13. package/dist/server/config.js.map +1 -0
  14. package/dist/server/controllers/app.controller.js +1949 -0
  15. package/dist/server/controllers/app.controller.js.map +1 -0
  16. package/dist/server/controllers/auth.controller.js +2079 -0
  17. package/dist/server/controllers/auth.controller.js.map +1 -0
  18. package/dist/server/controllers/baseline.controller.js +1976 -0
  19. package/dist/server/controllers/baseline.controller.js.map +1 -0
  20. package/dist/server/controllers/check.controller.js +2289 -0
  21. package/dist/server/controllers/check.controller.js.map +1 -0
  22. package/dist/server/controllers/client.controller.js +2994 -0
  23. package/dist/server/controllers/client.controller.js.map +1 -0
  24. package/dist/server/controllers/index.js +4289 -0
  25. package/dist/server/controllers/index.js.map +1 -0
  26. package/dist/server/controllers/logs.controller.js +1954 -0
  27. package/dist/server/controllers/logs.controller.js.map +1 -0
  28. package/dist/server/controllers/runs.controller.js +2293 -0
  29. package/dist/server/controllers/runs.controller.js.map +1 -0
  30. package/dist/server/controllers/settings.controller.js +843 -0
  31. package/dist/server/controllers/settings.controller.js.map +1 -0
  32. package/dist/server/controllers/snapshots.controller.js +1953 -0
  33. package/dist/server/controllers/snapshots.controller.js.map +1 -0
  34. package/dist/server/controllers/suite.controller.js +2288 -0
  35. package/dist/server/controllers/suite.controller.js.map +1 -0
  36. package/dist/server/controllers/tasks.controller.js +2378 -0
  37. package/dist/server/controllers/tasks.controller.js.map +1 -0
  38. package/dist/server/controllers/test.controller.js +2312 -0
  39. package/dist/server/controllers/test.controller.js.map +1 -0
  40. package/dist/server/controllers/users.controller.js +2056 -0
  41. package/dist/server/controllers/users.controller.js.map +1 -0
  42. package/dist/server/envConfig.js +70 -0
  43. package/dist/server/envConfig.js.map +1 -0
  44. package/dist/server/lib/AppSettings/AppSettings.js +814 -0
  45. package/dist/server/lib/AppSettings/AppSettings.js.map +1 -0
  46. package/dist/server/lib/AppSettings/index.js +814 -0
  47. package/dist/server/lib/AppSettings/index.js.map +1 -0
  48. package/dist/server/lib/connectDb.js +1873 -0
  49. package/dist/server/lib/connectDb.js.map +1 -0
  50. package/dist/server/lib/dbItems/createAppIfNotExist.js +1878 -0
  51. package/dist/server/lib/dbItems/createAppIfNotExist.js.map +1 -0
  52. package/dist/server/lib/dbItems/createItemIfNotExist.js +1883 -0
  53. package/dist/server/lib/dbItems/createItemIfNotExist.js.map +1 -0
  54. package/dist/server/lib/dbItems/createItemProm.js +1877 -0
  55. package/dist/server/lib/dbItems/createItemProm.js.map +1 -0
  56. package/dist/server/lib/dbItems/createRunIfNotExist.js +1898 -0
  57. package/dist/server/lib/dbItems/createRunIfNotExist.js.map +1 -0
  58. package/dist/server/lib/dbItems/createSuiteIfNotExist.js +1878 -0
  59. package/dist/server/lib/dbItems/createSuiteIfNotExist.js.map +1 -0
  60. package/dist/server/lib/dbItems/createTest.js +1884 -0
  61. package/dist/server/lib/dbItems/createTest.js.map +1 -0
  62. package/dist/server/lib/dbItems/createUser.js +1884 -0
  63. package/dist/server/lib/dbItems/createUser.js.map +1 -0
  64. package/dist/server/lib/dbItems/index.js +2043 -0
  65. package/dist/server/lib/dbItems/index.js.map +1 -0
  66. package/dist/server/lib/dbItems/updateItem.js +1873 -0
  67. package/dist/server/lib/dbItems/updateItem.js.map +1 -0
  68. package/dist/server/lib/dbItems/updateItemDate.js +1872 -0
  69. package/dist/server/lib/dbItems/updateItemDate.js.map +1 -0
  70. package/dist/server/lib/httpLogger.js +1066 -0
  71. package/dist/server/lib/httpLogger.js.map +1 -0
  72. package/dist/server/lib/logger.js +1852 -0
  73. package/dist/server/lib/logger.js.map +1 -0
  74. package/dist/server/lib/startup/createBasicUsers.js +1901 -0
  75. package/dist/server/lib/startup/createBasicUsers.js.map +1 -0
  76. package/dist/server/lib/startup/createInitialSettings.js +820 -0
  77. package/dist/server/lib/startup/createInitialSettings.js.map +1 -0
  78. package/dist/server/lib/startup/createTempDir.js +1066 -0
  79. package/dist/server/lib/startup/createTempDir.js.map +1 -0
  80. package/dist/server/lib/startup/createTestsUsers.js +1916 -0
  81. package/dist/server/lib/startup/createTestsUsers.js.map +1 -0
  82. package/dist/server/lib/startup/index.js +2071 -0
  83. package/dist/server/lib/startup/index.js.map +1 -0
  84. package/dist/server/lib//321/201omparison/comparator.js +1955 -0
  85. package/dist/server/lib//321/201omparison/comparator.js.map +1 -0
  86. package/dist/server/lib//321/201omparison/compareImagesNode.js +91 -0
  87. package/dist/server/lib//321/201omparison/compareImagesNode.js.map +1 -0
  88. package/dist/server/lib//321/201omparison/index.js +1955 -0
  89. package/dist/server/lib//321/201omparison/index.js.map +1 -0
  90. package/dist/server/middlewares/authorization.js +1994 -0
  91. package/dist/server/middlewares/authorization.js.map +1 -0
  92. package/dist/server/middlewares/compressionFilter.js +47 -0
  93. package/dist/server/middlewares/compressionFilter.js.map +1 -0
  94. package/dist/server/middlewares/disableCors.js +1073 -0
  95. package/dist/server/middlewares/disableCors.js.map +1 -0
  96. package/dist/server/middlewares/ensureLogin/ensureLoggedIn.js +2103 -0
  97. package/dist/server/middlewares/ensureLogin/ensureLoggedIn.js.map +1 -0
  98. package/dist/server/middlewares/ensureLogin/index.js +2087 -0
  99. package/dist/server/middlewares/ensureLogin/index.js.map +1 -0
  100. package/dist/server/middlewares/errorHandler.js +1886 -0
  101. package/dist/server/middlewares/errorHandler.js.map +1 -0
  102. package/dist/server/middlewares/index.js +2025 -0
  103. package/dist/server/middlewares/index.js.map +1 -0
  104. package/dist/server/models/App.model.js +145 -0
  105. package/dist/server/models/App.model.js.map +1 -0
  106. package/dist/server/models/AppSettings.model.js +105 -0
  107. package/dist/server/models/AppSettings.model.js.map +1 -0
  108. package/dist/server/models/Baseline.model.js +187 -0
  109. package/dist/server/models/Baseline.model.js.map +1 -0
  110. package/dist/server/models/Check.model.js +241 -0
  111. package/dist/server/models/Check.model.js.map +1 -0
  112. package/dist/server/models/Log.model.js +139 -0
  113. package/dist/server/models/Log.model.js.map +1 -0
  114. package/dist/server/models/Run.model.js +154 -0
  115. package/dist/server/models/Run.model.js.map +1 -0
  116. package/dist/server/models/Snapshot.model.js +148 -0
  117. package/dist/server/models/Snapshot.model.js.map +1 -0
  118. package/dist/server/models/Suite.model.js +151 -0
  119. package/dist/server/models/Suite.model.js.map +1 -0
  120. package/dist/server/models/Test.model.js +248 -0
  121. package/dist/server/models/Test.model.js.map +1 -0
  122. package/dist/server/models/User.model.js +169 -0
  123. package/dist/server/models/User.model.js.map +1 -0
  124. package/dist/server/models/index.js +720 -0
  125. package/dist/server/models/index.js.map +1 -0
  126. package/dist/server/models/plugins/index.js +159 -0
  127. package/dist/server/models/plugins/index.js.map +1 -0
  128. package/dist/server/models/plugins/paginate.plugin.js +68 -0
  129. package/dist/server/models/plugins/paginate.plugin.js.map +1 -0
  130. package/dist/server/models/plugins/paginateDistinct.plugin.js +73 -0
  131. package/dist/server/models/plugins/paginateDistinct.plugin.js.map +1 -0
  132. package/dist/server/models/plugins/toJSON.plugin.js +56 -0
  133. package/dist/server/models/plugins/toJSON.plugin.js.map +1 -0
  134. package/dist/server/models/plugins/utils.js +19 -0
  135. package/dist/server/models/plugins/utils.js.map +1 -0
  136. package/dist/server/routes/ui/admin.js +2082 -0
  137. package/dist/server/routes/ui/admin.js.map +1 -0
  138. package/dist/server/routes/ui/auth.js +711 -0
  139. package/dist/server/routes/ui/auth.js.map +1 -0
  140. package/dist/server/routes/ui/index.js +2036 -0
  141. package/dist/server/routes/ui/index.js.map +1 -0
  142. package/dist/server/routes/v1/app.route.js +4372 -0
  143. package/dist/server/routes/v1/app.route.js.map +1 -0
  144. package/dist/server/routes/v1/auth.route.js +2325 -0
  145. package/dist/server/routes/v1/auth.route.js.map +1 -0
  146. package/dist/server/routes/v1/baselines.route.js +2487 -0
  147. package/dist/server/routes/v1/baselines.route.js.map +1 -0
  148. package/dist/server/routes/v1/checks.route.js +2840 -0
  149. package/dist/server/routes/v1/checks.route.js.map +1 -0
  150. package/dist/server/routes/v1/client.route.js +3764 -0
  151. package/dist/server/routes/v1/client.route.js.map +1 -0
  152. package/dist/server/routes/v1/index.route.js +6536 -0
  153. package/dist/server/routes/v1/index.route.js.map +1 -0
  154. package/dist/server/routes/v1/logs.route.js +2426 -0
  155. package/dist/server/routes/v1/logs.route.js.map +1 -0
  156. package/dist/server/routes/v1/runs.route.js +2771 -0
  157. package/dist/server/routes/v1/runs.route.js.map +1 -0
  158. package/dist/server/routes/v1/settings.route.js +2349 -0
  159. package/dist/server/routes/v1/settings.route.js.map +1 -0
  160. package/dist/server/routes/v1/snapshots.route.js +2361 -0
  161. package/dist/server/routes/v1/snapshots.route.js.map +1 -0
  162. package/dist/server/routes/v1/suites.route.js +2713 -0
  163. package/dist/server/routes/v1/suites.route.js.map +1 -0
  164. package/dist/server/routes/v1/tasks.route.js +2761 -0
  165. package/dist/server/routes/v1/tasks.route.js.map +1 -0
  166. package/dist/server/routes/v1/test_distinct.route.js +2714 -0
  167. package/dist/server/routes/v1/test_distinct.route.js.map +1 -0
  168. package/dist/server/routes/v1/tests.route.js +2895 -0
  169. package/dist/server/routes/v1/tests.route.js.map +1 -0
  170. package/dist/server/routes/v1/users.route.js +4619 -0
  171. package/dist/server/routes/v1/users.route.js.map +1 -0
  172. package/dist/server/schemas/App.schema.js +102 -0
  173. package/dist/server/schemas/App.schema.js.map +1 -0
  174. package/dist/server/schemas/Auth.schema.js +116 -0
  175. package/dist/server/schemas/Auth.schema.js.map +1 -0
  176. package/dist/server/schemas/Baseline.schema.js +183 -0
  177. package/dist/server/schemas/Baseline.schema.js.map +1 -0
  178. package/dist/server/schemas/Check.schema.js +198 -0
  179. package/dist/server/schemas/Check.schema.js.map +1 -0
  180. package/dist/server/schemas/Client.schema.js +455 -0
  181. package/dist/server/schemas/Client.schema.js.map +1 -0
  182. package/dist/server/schemas/CreateCheck.shema.js +47 -0
  183. package/dist/server/schemas/CreateCheck.shema.js.map +1 -0
  184. package/dist/server/schemas/GetBaseline.shema.js +56 -0
  185. package/dist/server/schemas/GetBaseline.shema.js.map +1 -0
  186. package/dist/server/schemas/Logs.schema.js +140 -0
  187. package/dist/server/schemas/Logs.schema.js.map +1 -0
  188. package/dist/server/schemas/Runs.schema.js +128 -0
  189. package/dist/server/schemas/Runs.schema.js.map +1 -0
  190. package/dist/server/schemas/Settings.schema.js +156 -0
  191. package/dist/server/schemas/Settings.schema.js.map +1 -0
  192. package/dist/server/schemas/SkipValid.schema.js +32 -0
  193. package/dist/server/schemas/SkipValid.schema.js.map +1 -0
  194. package/dist/server/schemas/SnapshotDiff.schema.js +44 -0
  195. package/dist/server/schemas/SnapshotDiff.schema.js.map +1 -0
  196. package/dist/server/schemas/Snapshots.schema.js +115 -0
  197. package/dist/server/schemas/Snapshots.schema.js.map +1 -0
  198. package/dist/server/schemas/Suite.schema.js +114 -0
  199. package/dist/server/schemas/Suite.schema.js.map +1 -0
  200. package/dist/server/schemas/Test.schema.js +204 -0
  201. package/dist/server/schemas/Test.schema.js.map +1 -0
  202. package/dist/server/schemas/TestDistinct.schema.js +63 -0
  203. package/dist/server/schemas/TestDistinct.schema.js.map +1 -0
  204. package/dist/server/schemas/User.schema.js +139 -0
  205. package/dist/server/schemas/User.schema.js.map +1 -0
  206. package/dist/server/schemas/common/ApiError.schema.js +51 -0
  207. package/dist/server/schemas/common/ApiError.schema.js.map +1 -0
  208. package/dist/server/schemas/common/Error.schema.js +47 -0
  209. package/dist/server/schemas/common/Error.schema.js.map +1 -0
  210. package/dist/server/schemas/common/RequestPagination.schema.js +121 -0
  211. package/dist/server/schemas/common/RequestPagination.schema.js.map +1 -0
  212. package/dist/server/schemas/common/Version.schema.js +36 -0
  213. package/dist/server/schemas/common/Version.schema.js.map +1 -0
  214. package/dist/server/schemas/common/requestQueryFilterSchema.schema.js +53 -0
  215. package/dist/server/schemas/common/requestQueryFilterSchema.schema.js.map +1 -0
  216. package/dist/server/schemas/index.js +155 -0
  217. package/dist/server/schemas/index.js.map +1 -0
  218. package/dist/server/schemas/utils/commonValidations.js +82 -0
  219. package/dist/server/schemas/utils/commonValidations.js.map +1 -0
  220. package/dist/server/schemas/utils/createRequestBodySchema.js +32 -0
  221. package/dist/server/schemas/utils/createRequestBodySchema.js.map +1 -0
  222. package/dist/server/schemas/utils/createRequestOpenApiBodySchema.js +35 -0
  223. package/dist/server/schemas/utils/createRequestOpenApiBodySchema.js.map +1 -0
  224. package/dist/server/schemas/utils/createRequestParamsSchema.js +93 -0
  225. package/dist/server/schemas/utils/createRequestParamsSchema.js.map +1 -0
  226. package/dist/server/schemas/utils/createRequestQuerySchema.js +32 -0
  227. package/dist/server/schemas/utils/createRequestQuerySchema.js.map +1 -0
  228. package/dist/server/schemas/utils/index.js +84 -0
  229. package/dist/server/schemas/utils/index.js.map +1 -0
  230. package/dist/server/server.js +6921 -0
  231. package/dist/server/server.js.map +1 -0
  232. package/dist/server/server_old.js +7284 -0
  233. package/dist/server/server_old.js.map +1 -0
  234. package/dist/server/services/app.service.js +696 -0
  235. package/dist/server/services/app.service.js.map +1 -0
  236. package/dist/server/services/auth.service.js +2025 -0
  237. package/dist/server/services/auth.service.js.map +1 -0
  238. package/dist/server/services/check.service.js +2149 -0
  239. package/dist/server/services/check.service.js.map +1 -0
  240. package/dist/server/services/client.service.js +2648 -0
  241. package/dist/server/services/client.service.js.map +1 -0
  242. package/dist/server/services/generic.service.js +1888 -0
  243. package/dist/server/services/generic.service.js.map +1 -0
  244. package/dist/server/services/index.js +3548 -0
  245. package/dist/server/services/index.js.map +1 -0
  246. package/dist/server/services/logs.service.js +1875 -0
  247. package/dist/server/services/logs.service.js.map +1 -0
  248. package/dist/server/services/run.service.js +2221 -0
  249. package/dist/server/services/run.service.js.map +1 -0
  250. package/dist/server/services/snapshot.service.js +1921 -0
  251. package/dist/server/services/snapshot.service.js.map +1 -0
  252. package/dist/server/services/suite.service.js +2218 -0
  253. package/dist/server/services/suite.service.js.map +1 -0
  254. package/dist/server/services/tasks.service.js +2288 -0
  255. package/dist/server/services/tasks.service.js.map +1 -0
  256. package/dist/server/services/test.service.js +2230 -0
  257. package/dist/server/services/test.service.js.map +1 -0
  258. package/dist/server/services/user.service.js +1925 -0
  259. package/dist/server/services/user.service.js.map +1 -0
  260. package/dist/server/utils/ApiError.js +39 -0
  261. package/dist/server/utils/ApiError.js.map +1 -0
  262. package/dist/server/utils/ProgressBar.js +54 -0
  263. package/dist/server/utils/ProgressBar.js.map +1 -0
  264. package/dist/server/utils/ServiceResponse.js +45 -0
  265. package/dist/server/utils/ServiceResponse.js.map +1 -0
  266. package/dist/server/utils/buildIdentObject.js +52 -0
  267. package/dist/server/utils/buildIdentObject.js.map +1 -0
  268. package/dist/server/utils/calculateAcceptedStatus.js +710 -0
  269. package/dist/server/utils/calculateAcceptedStatus.js.map +1 -0
  270. package/dist/server/utils/catchAsync.js +32 -0
  271. package/dist/server/utils/catchAsync.js.map +1 -0
  272. package/dist/server/utils/checkIdent.js +36 -0
  273. package/dist/server/utils/checkIdent.js.map +1 -0
  274. package/dist/server/utils/dateToISO8601.js +30 -0
  275. package/dist/server/utils/dateToISO8601.js.map +1 -0
  276. package/dist/server/utils/deserializeIfJSON.js +706 -0
  277. package/dist/server/utils/deserializeIfJSON.js.map +1 -0
  278. package/dist/server/utils/errMsg.js +33 -0
  279. package/dist/server/utils/errMsg.js.map +1 -0
  280. package/dist/server/utils/formatISOToDateTime.js +31 -0
  281. package/dist/server/utils/formatISOToDateTime.js.map +1 -0
  282. package/dist/server/utils/ident.js +31 -0
  283. package/dist/server/utils/ident.js.map +1 -0
  284. package/dist/server/utils/index.js +910 -0
  285. package/dist/server/utils/index.js.map +1 -0
  286. package/dist/server/utils/isJSON.js +34 -0
  287. package/dist/server/utils/isJSON.js.map +1 -0
  288. package/dist/server/utils/paramsGuard.js +45 -0
  289. package/dist/server/utils/paramsGuard.js.map +1 -0
  290. package/dist/server/utils/pick.js +35 -0
  291. package/dist/server/utils/pick.js.map +1 -0
  292. package/dist/server/utils/prettyCheckParams.js +37 -0
  293. package/dist/server/utils/prettyCheckParams.js.map +1 -0
  294. package/dist/server/utils/removeEmptyProperties.js +34 -0
  295. package/dist/server/utils/removeEmptyProperties.js.map +1 -0
  296. package/dist/server/utils/subDays.js +32 -0
  297. package/dist/server/utils/subDays.js.map +1 -0
  298. package/dist/server/utils/validateRequest.js +1922 -0
  299. package/dist/server/utils/validateRequest.js.map +1 -0
  300. package/dist/server/utils/waitUntil.js +43 -0
  301. package/dist/server/utils/waitUntil.js.map +1 -0
  302. package/dist/tasks/backup.js +1085 -0
  303. package/dist/tasks/backup.js.map +1 -0
  304. package/dist/tasks/lib/index.js +717 -0
  305. package/dist/tasks/lib/index.js.map +1 -0
  306. package/dist/tasks/lib/utils.js +1070 -0
  307. package/dist/tasks/lib/utils.js.map +1 -0
  308. package/dist/tasks/migrations/2.0.migration.js +908 -0
  309. package/dist/tasks/migrations/2.0.migration.js.map +1 -0
  310. package/dist/tasks/reindex.js +1742 -0
  311. package/dist/tasks/reindex.js.map +1 -0
  312. package/dist/tasks/restore.js +1097 -0
  313. package/dist/tasks/restore.js.map +1 -0
  314. package/docker-compose.yml +3 -3
  315. package/mvc/views/react/admin/index.html +4 -4
  316. package/mvc/views/react/assets/{LogicalGroup.6c0a9f4a.js → LogicalGroup.80e37bbf.js} +1 -22
  317. package/mvc/views/react/assets/{PasswordInput.b97a4ef7.js → PasswordInput.eb05d2ed.js} +1 -1
  318. package/mvc/views/react/assets/{admin.6d843d1b.js → admin.d6aa02f7.js} +3 -3
  319. package/mvc/views/react/assets/{auth.ecf25364.js → auth.e49d0968.js} +3 -2
  320. package/mvc/views/react/assets/{root.25abcc85.js → root.b071750f.js} +7 -9
  321. package/mvc/views/react/assets/{use-form.10003abf.js → use-form.c4a2cf47.js} +203 -151
  322. package/mvc/views/react/auth/index.html +3 -3
  323. package/mvc/views/react/index2/index.html +3 -3
  324. package/package.json +45 -14
  325. package/src/seeds/testAdmin.json +10 -0
  326. package/src/server/api-docs/openAPIDocumentGenerator.ts +48 -0
  327. package/src/server/api-docs/openAPIResponseBuilders.ts +38 -0
  328. package/src/server/api-docs/openAPIRouter.ts +18 -0
  329. package/src/server/api-docs/serviceResponse.ts +11 -0
  330. package/src/server/app.ts +77 -0
  331. package/src/server/config.ts +57 -0
  332. package/src/server/controllers/app.controller.ts +23 -0
  333. package/src/server/controllers/auth.controller.ts +149 -0
  334. package/src/server/controllers/baseline.controller.ts +32 -0
  335. package/src/server/controllers/{check.controller.js → check.controller.ts} +17 -14
  336. package/src/server/controllers/client.controller.ts +134 -0
  337. package/src/server/controllers/index.ts +27 -0
  338. package/src/server/controllers/logs.controller.ts +36 -0
  339. package/src/server/controllers/runs.controller.ts +32 -0
  340. package/src/server/controllers/settings.controller.ts +28 -0
  341. package/src/server/controllers/snapshots.controller.ts +24 -0
  342. package/src/server/controllers/suite.controller.ts +30 -0
  343. package/src/server/controllers/tasks.controller.ts +47 -0
  344. package/src/server/controllers/test.controller.ts +62 -0
  345. package/src/server/controllers/users.controller.ts +89 -0
  346. package/src/server/envConfig.ts +36 -0
  347. package/src/server/lib/AppSettings/AppSettings.ts +88 -0
  348. package/src/server/lib/AppSettings/index.ts +1 -0
  349. package/src/server/lib/connectDb.ts +18 -0
  350. package/src/server/lib/dbItems/createAppIfNotExist.ts +26 -0
  351. package/src/server/lib/dbItems/createItemIfNotExist.ts +29 -0
  352. package/src/server/lib/dbItems/createItemProm.ts +22 -0
  353. package/src/server/lib/dbItems/createRunIfNotExist.ts +44 -0
  354. package/src/server/lib/dbItems/createSuiteIfNotExist.ts +26 -0
  355. package/src/server/lib/dbItems/createTest.ts +7 -0
  356. package/src/server/lib/dbItems/createUser.ts +7 -0
  357. package/src/server/lib/dbItems/index.ts +12 -0
  358. package/src/server/lib/dbItems/updateItem.ts +17 -0
  359. package/src/server/lib/dbItems/updateItemDate.ts +18 -0
  360. package/src/server/lib/httpLogger.ts +14 -0
  361. package/src/server/lib/logger.ts +147 -0
  362. package/src/server/lib/startup/createBasicUsers.ts +25 -0
  363. package/src/server/lib/startup/createInitialSettings.ts +8 -0
  364. package/src/server/lib/startup/createTempDir.ts +9 -0
  365. package/src/server/lib/startup/createTestsUsers.ts +17 -0
  366. package/src/server/lib/startup/index.ts +4 -0
  367. package/src/server/lib//321/201omparison/comparator.ts +49 -0
  368. package/src/server/lib//321/201omparison/compareImagesNode.ts +61 -0
  369. package/src/server/lib//321/201omparison/index.ts +1 -0
  370. package/src/server/middlewares/{authorization.js → authorization.ts} +23 -14
  371. package/src/server/middlewares/compressionFilter.ts +9 -0
  372. package/src/server/middlewares/disableCors.ts +32 -0
  373. package/src/server/{lib/ensureLogin/ensureLoggedIn.js → middlewares/ensureLogin/ensureLoggedIn.ts} +60 -63
  374. package/src/server/middlewares/ensureLogin/index.ts +2 -0
  375. package/src/server/middlewares/errorHandler.ts +42 -0
  376. package/src/server/middlewares/index.ts +4 -0
  377. package/src/server/models/App.model.ts +42 -0
  378. package/src/server/models/AppSettings.model.ts +48 -0
  379. package/src/server/models/Baseline.model.ts +98 -0
  380. package/src/server/models/Check.model.ts +166 -0
  381. package/src/server/models/Log.model.ts +36 -0
  382. package/src/server/models/Run.model.ts +55 -0
  383. package/src/server/models/Snapshot.model.ts +47 -0
  384. package/src/server/models/Suite.model.ts +50 -0
  385. package/src/server/models/Test.model.ts +117 -0
  386. package/src/server/models/User.model.ts +77 -0
  387. package/src/server/models/index.ts +11 -0
  388. package/src/server/models/plugins/index.ts +3 -0
  389. package/src/server/models/plugins/paginate.plugin.ts +74 -0
  390. package/src/server/models/plugins/paginateDistinct.plugin.ts +90 -0
  391. package/src/server/models/plugins/toJSON.plugin.ts +41 -0
  392. package/src/server/models/plugins/utils.ts +34 -0
  393. package/src/server/routes/ui/admin.ts +29 -0
  394. package/src/server/routes/ui/auth.ts +22 -0
  395. package/src/server/routes/ui/index.ts +25 -0
  396. package/src/server/routes/v1/app.route.ts +48 -0
  397. package/src/server/routes/v1/auth.route.ts +88 -0
  398. package/src/server/routes/v1/baselines.route.ts +52 -0
  399. package/src/server/routes/v1/checks.route.ts +85 -0
  400. package/src/server/routes/v1/client.route.ts +123 -0
  401. package/src/server/routes/v1/{index.js → index.route.ts} +16 -16
  402. package/src/server/routes/v1/logs.route.ts +65 -0
  403. package/src/server/routes/v1/runs.route.ts +55 -0
  404. package/src/server/routes/v1/settings.route.ts +54 -0
  405. package/src/server/routes/v1/snapshots.route.ts +32 -0
  406. package/src/server/routes/v1/suites.route.ts +52 -0
  407. package/src/server/routes/v1/tasks.route.ts +121 -0
  408. package/src/server/routes/v1/test_distinct.route.ts +32 -0
  409. package/src/server/routes/v1/tests.route.ts +90 -0
  410. package/src/server/routes/v1/users.route.ts +115 -0
  411. package/src/server/schemas/App.schema.ts +19 -0
  412. package/src/server/schemas/Auth.schema.ts +27 -0
  413. package/src/server/schemas/Baseline.schema.ts +106 -0
  414. package/src/server/schemas/Check.schema.ts +117 -0
  415. package/src/server/schemas/Client.schema.ts +380 -0
  416. package/src/server/schemas/GetBaseline.shema.ts +34 -0
  417. package/src/server/schemas/Logs.schema.ts +61 -0
  418. package/src/server/schemas/Runs.schema.ts +45 -0
  419. package/src/server/schemas/Settings.schema.ts +71 -0
  420. package/src/server/schemas/SkipValid.schema.ts +2 -0
  421. package/src/server/schemas/SnapshotDiff.schema.ts +18 -0
  422. package/src/server/schemas/Snapshots.schema.ts +42 -0
  423. package/src/server/schemas/Suite.schema.ts +34 -0
  424. package/src/server/schemas/Test.schema.ts +126 -0
  425. package/src/server/schemas/TestDistinct.schema.ts +36 -0
  426. package/src/server/schemas/User.schema.ts +59 -0
  427. package/src/server/schemas/common/ApiError.schema.ts +23 -0
  428. package/src/server/schemas/common/Error.schema.ts +19 -0
  429. package/src/server/schemas/common/RequestPagination.schema.ts +16 -0
  430. package/src/server/schemas/common/Version.schema.ts +14 -0
  431. package/src/server/schemas/common/requestQueryFilterSchema.schema.ts +32 -0
  432. package/src/server/schemas/index.ts +4 -0
  433. package/src/server/schemas/utils/commonValidations.ts +51 -0
  434. package/src/server/schemas/utils/createRequestBodySchema.ts +2 -0
  435. package/src/server/schemas/utils/createRequestOpenApiBodySchema.ts +6 -0
  436. package/src/server/schemas/utils/createRequestParamsSchema.ts +7 -0
  437. package/src/server/schemas/utils/createRequestQuerySchema.ts +2 -0
  438. package/src/server/schemas/utils/index.ts +3 -0
  439. package/src/server/server.ts +54 -0
  440. package/src/server/server_old.ts +185 -0
  441. package/src/server/services/app.service.ts +9 -0
  442. package/src/server/services/auth.service.ts +94 -0
  443. package/src/server/services/check.service.ts +241 -0
  444. package/src/server/services/client.service.ts +691 -0
  445. package/src/server/services/generic.service.ts +37 -0
  446. package/src/server/services/index.ts +24 -0
  447. package/src/server/services/logs.service.ts +27 -0
  448. package/src/server/services/run.service.ts +32 -0
  449. package/src/server/services/snapshot.service.ts +78 -0
  450. package/src/server/services/suite.service.ts +30 -0
  451. package/src/server/services/{tasks.service.js → tasks.service.ts} +157 -228
  452. package/src/server/services/test.service.ts +65 -0
  453. package/src/server/services/user.service.ts +90 -0
  454. package/src/server/utils/{ApiError.js → ApiError.ts} +5 -2
  455. package/src/server/utils/ProgressBar.ts +35 -0
  456. package/src/server/utils/ServiceResponse.ts +18 -0
  457. package/src/server/utils/buildIdentObject.ts +34 -0
  458. package/src/server/utils/calculateAcceptedStatus.ts +22 -0
  459. package/src/server/utils/catchAsync.ts +11 -0
  460. package/src/server/utils/checkIdent.ts +4 -0
  461. package/src/server/utils/dateToISO8601.ts +5 -0
  462. package/src/server/utils/deserializeIfJSON.ts +9 -0
  463. package/src/server/utils/errMsg.ts +3 -0
  464. package/src/server/utils/{formatISOToDateTime.js → formatISOToDateTime.ts} +2 -2
  465. package/src/server/utils/ident.ts +1 -0
  466. package/src/server/utils/index.ts +24 -0
  467. package/src/server/utils/isJSON.ts +14 -0
  468. package/src/server/utils/paramsGuard.ts +7 -6
  469. package/src/server/utils/pick.ts +17 -0
  470. package/src/server/utils/prettyCheckParams.ts +18 -0
  471. package/src/server/utils/removeEmptyProperties.ts +5 -0
  472. package/src/server/utils/{subDays.js → subDays.ts} +2 -2
  473. package/src/server/utils/validateRequest.ts +56 -0
  474. package/src/server/utils/waitUntil.ts +14 -0
  475. package/src/tasks/backup.ts +1 -1
  476. package/src/tasks/lib/index.ts +13 -0
  477. package/src/tasks/lib/utils.ts +14 -0
  478. package/src/tasks/migrations/2.0.migration.ts +2 -2
  479. package/src/tasks/reindex.ts +34 -0
  480. package/src/tasks/restore.ts +1 -1
  481. package/src/types/ExtRequest.ts +10 -0
  482. package/src/types/LogOpts.ts +20 -0
  483. package/src/types/Midleware.ts +3 -0
  484. package/src/types/RequestUser.ts +14 -0
  485. package/src/types/index.ts +4 -0
  486. package/src/ui-app/README.md +2 -2
  487. package/src/ui-app/auth/components/ChangePasswordForm.tsx +1 -1
  488. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/mainView.ts +3 -3
  489. package/src/ui-app/index2/components/Tests/Table/Checks/Checks.tsx +30 -2
  490. package/src/ui-app/package-lock.json +10 -16
  491. package/src/ui-app/package.json +2 -2
  492. package/src/ui-app/shared/services/checks.service.ts +1 -1
  493. package/src/ui-app/shared/services/generic.service.ts +0 -28
  494. package/src/ui-app/tsconfig.json +3 -2
  495. package/config.js +0 -17
  496. package/dist/config.js +0 -16
  497. package/dist/src/server/models/index.js +0 -508
  498. package/dist/src/server/models/plugins/index.js +0 -4
  499. package/dist/src/server/models/plugins/paginate.plugin.js +0 -76
  500. package/dist/src/server/models/plugins/paginateDistinct.plugin.js +0 -76
  501. package/dist/src/server/models/plugins/toJSON.plugin.js +0 -39
  502. package/dist/src/server/schemas/createCheck.shema.js +0 -17
  503. package/dist/src/server/schemas/getBaseline.shema.js +0 -12
  504. package/dist/src/server/utils/paramsGuard.js +0 -18
  505. package/dist/src/tasks/backup.js +0 -68
  506. package/dist/src/tasks/lib/common.js +0 -14
  507. package/dist/src/tasks/lib/utils.js +0 -14
  508. package/dist/src/tasks/migrations/2.0.migration.js +0 -86
  509. package/dist/src/tasks/migrations/2.0.migration_mql.js +0 -57
  510. package/dist/src/tasks/reindex.js +0 -28
  511. package/dist/src/tasks/restore.js +0 -86
  512. package/dist/tsconfig.tsbuildinfo +0 -1
  513. package/mvc/views/react/index.html +0 -19
  514. package/server.js +0 -166
  515. package/src/server/controllers/app.controller.js +0 -21
  516. package/src/server/controllers/auth.controller.js +0 -156
  517. package/src/server/controllers/baseline.controller.js +0 -24
  518. package/src/server/controllers/client.controller.js +0 -173
  519. package/src/server/controllers/index.js +0 -12
  520. package/src/server/controllers/logs.controller.js +0 -30
  521. package/src/server/controllers/runs.controller.js +0 -25
  522. package/src/server/controllers/settings.controller.js +0 -23
  523. package/src/server/controllers/snapshots.controller.js +0 -17
  524. package/src/server/controllers/suite.controller.js +0 -24
  525. package/src/server/controllers/tasks.controller.js +0 -47
  526. package/src/server/controllers/test.controller.js +0 -70
  527. package/src/server/controllers/users.controller.js +0 -79
  528. package/src/server/data/custom_devices.json +0 -8
  529. package/src/server/lib/AppSettings.js +0 -56
  530. package/src/server/lib/comparator.js +0 -147
  531. package/src/server/lib/compareImagesNode.js +0 -60
  532. package/src/server/lib/dbItems.js +0 -215
  533. package/src/server/lib/ensureLogin/ensureLoggedOut.js +0 -44
  534. package/src/server/lib/getElementsByPixPositionsFromDump.js +0 -72
  535. package/src/server/lib/logger.js +0 -95
  536. package/src/server/lib/onStart.js +0 -53
  537. package/src/server/lib/parseDiff.js.bak +0 -72
  538. package/src/server/middlewares/disableCors.js +0 -19
  539. package/src/server/models/index.js +0 -534
  540. package/src/server/models/plugins/index.js +0 -3
  541. package/src/server/models/plugins/paginate.plugin.js +0 -83
  542. package/src/server/models/plugins/paginateDistinct.plugin.js +0 -80
  543. package/src/server/models/plugins/toJSON.plugin.js +0 -44
  544. package/src/server/routes/ui/admin.js +0 -20
  545. package/src/server/routes/ui/auth.js +0 -15
  546. package/src/server/routes/ui/index.js +0 -19
  547. package/src/server/routes/v1/app.route.js +0 -9
  548. package/src/server/routes/v1/auth.route.js +0 -12
  549. package/src/server/routes/v1/baselines.route.js +0 -14
  550. package/src/server/routes/v1/checks.route.js +0 -25
  551. package/src/server/routes/v1/client.route.js +0 -39
  552. package/src/server/routes/v1/logs.route.js +0 -16
  553. package/src/server/routes/v1/runs.route.js +0 -15
  554. package/src/server/routes/v1/settings.route.js +0 -23
  555. package/src/server/routes/v1/snapshots.route.js +0 -11
  556. package/src/server/routes/v1/suites.route.js +0 -15
  557. package/src/server/routes/v1/tasks.route.js +0 -59
  558. package/src/server/routes/v1/test.route.js +0 -20
  559. package/src/server/routes/v1/test_distinct.route.js +0 -14
  560. package/src/server/routes/v1/users.route.js +0 -36
  561. package/src/server/schemas/getBaseline.shema.ts +0 -12
  562. package/src/server/services/app.service.js +0 -23
  563. package/src/server/services/check.service.js +0 -178
  564. package/src/server/services/client.service.js +0 -648
  565. package/src/server/services/generic.service.js +0 -51
  566. package/src/server/services/index.js +0 -12
  567. package/src/server/services/logs.service.js +0 -38
  568. package/src/server/services/run.service.js +0 -40
  569. package/src/server/services/suite.service.js +0 -39
  570. package/src/server/services/test.service.js +0 -72
  571. package/src/server/services/user.service.js +0 -128
  572. package/src/server/utils/catchAsync.js +0 -8
  573. package/src/server/utils/check.js +0 -58
  574. package/src/server/utils/dateToISO8601.js +0 -2
  575. package/src/server/utils/deserializeIfJSON.js +0 -9
  576. package/src/server/utils/index.js +0 -10
  577. package/src/server/utils/isJSON.js +0 -6
  578. package/src/server/utils/pick.js +0 -15
  579. package/src/server/utils/prettyCheckParams.js +0 -13
  580. package/src/server/utils/snapshots.js +0 -73
  581. package/src/server/utils/tests.js +0 -36
  582. package/src/server/utils/utils.js +0 -146
  583. package/src/tasks/backup.js.bak +0 -84
  584. package/src/tasks/lib/common.js +0 -24
  585. package/src/tasks/lib/utils.js +0 -15
  586. package/src/tasks/reindex.js +0 -36
  587. package/src/tasks/restore.js.bak +0 -100
  588. package/src/ui-app/tsconfig.node.json +0 -12
  589. package/static/js/canvasjs.min.js.bak +0 -957
  590. package/static/js/chart.js.bak +0 -92
  591. package/static/js/jquery-3.3.1.slim.js.bak +0 -8269
  592. package/static/js/jquery-3.3.1.slim.min.js.bak +0 -2
  593. package/static/js/moment.min.js.bak +0 -2
  594. /package/src/{server/lib → seeds}/admin.json +0 -0
  595. /package/src/{server/lib → seeds}/guest.json +0 -0
  596. /package/src/{server/lib → seeds}/initialAppSettings.json +0 -0
  597. /package/src/{server/lib/testAdmin.json → seeds/testAdmin copy.json} +0 -0
  598. /package/src/{server/lib → seeds}/testUsers.json +0 -0
  599. /package/src/server/schemas/{createCheck.shema.ts → CreateCheck.shema.ts} +0 -0
  600. /package/{static → src/server/static/static}/A.png +0 -0
  601. /package/{static → src/server/static/static}/B.png +0 -0
  602. /package/{static → src/server/static/static}/affected.html +0 -0
  603. /package/{static → src/server/static/static}/affected_2.html +0 -0
  604. /package/{static → src/server/static/static}/data/custom_devices.json +0 -0
  605. /package/{static → src/server/static/static}/grids/desktop-higher.html +0 -0
  606. /package/{static → src/server/static/static}/grids/desktop-wider.html +0 -0
  607. /package/{static → src/server/static/static}/grids/desktop.html +0 -0
  608. /package/{static → src/server/static/static}/grids/fit-in-view.html +0 -0
  609. /package/{static → src/server/static/static}/low_diff_0.png +0 -0
  610. /package/{static → src/server/static/static}/low_diff_1.png +0 -0
  611. /package/{static → src/server/static/static}/vShift.png +0 -0
  612. /package/{static → src/server/static/static}/vShift_bottom.png +0 -0
  613. /package/{static → src/server/static/static}/vShift_top.png +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/server/app.ts","../../src/server/lib/logger.ts","../../src/server/utils/formatISOToDateTime.ts","../../src/server/config.ts","../../package.json","../../src/server/envConfig.ts","../../src/server/data/devices.json","../../src/server/utils/pick.ts","../../src/server/utils/isJSON.ts","../../src/server/utils/catchAsync.ts","../../src/server/utils/dateToISO8601.ts","../../src/server/utils/ProgressBar.ts","../../src/server/utils/ApiError.ts","../../src/server/utils/removeEmptyProperties.ts","../../src/server/utils/deserializeIfJSON.ts","../../src/server/utils/prettyCheckParams.ts","../../src/server/utils/waitUntil.ts","../../src/server/utils/paramsGuard.ts","../../src/server/utils/ident.ts","../../src/server/utils/buildIdentObject.ts","../../src/server/models/Check.model.ts","../../src/server/models/plugins/paginate.plugin.ts","../../src/server/models/plugins/toJSON.plugin.ts","../../src/server/models/plugins/paginateDistinct.plugin.ts","../../src/server/models/Log.model.ts","../../src/server/models/App.model.ts","../../src/server/models/Snapshot.model.ts","../../src/server/models/AppSettings.model.ts","../../src/server/models/Suite.model.ts","../../src/server/models/Run.model.ts","../../src/server/models/User.model.ts","../../src/server/models/Baseline.model.ts","../../src/server/models/Test.model.ts","../../src/server/utils/calculateAcceptedStatus.ts","../../src/server/utils/subDays.ts","../../src/server/utils/errMsg.ts","../../src/server/routes/v1/index.route.ts","../../src/server/routes/v1/auth.route.ts","../../src/server/controllers/auth.controller.ts","../../src/seeds/initialAppSettings.json","../../src/server/lib/AppSettings/AppSettings.ts","../../src/server/utils/validateRequest.ts","../../src/server/utils/ServiceResponse.ts","../../src/server/schemas/Auth.schema.ts","../../src/server/schemas/utils/commonValidations.ts","../../src/server/schemas/common/Version.schema.ts","../../src/server/api-docs/openAPIResponseBuilders.ts","../../src/server/api-docs/serviceResponse.ts","../../src/server/schemas/SkipValid.schema.ts","../../src/server/schemas/utils/createRequestBodySchema.ts","../../src/server/schemas/utils/createRequestOpenApiBodySchema.ts","../../src/server/routes/v1/app.route.ts","../../src/server/controllers/baseline.controller.ts","../../src/server/services/run.service.ts","../../src/server/services/test.service.ts","../../src/server/services/suite.service.ts","../../src/server/services/logs.service.ts","../../src/server/services/generic.service.ts","../../src/server/services/app.service.ts","../../src/server/services/tasks.service.ts","../../src/seeds/testAdmin.json","../../src/server/services/client.service.ts","../../src/server/lib/dbItems/updateItem.ts","../../src/server/lib/dbItems/updateItemDate.ts","../../src/server/lib/dbItems/createItemIfNotExist.ts","../../src/server/lib/dbItems/createItemProm.ts","../../src/server/lib/dbItems/createTest.ts","../../src/server/lib/dbItems/createSuiteIfNotExist.ts","../../src/server/lib/dbItems/createRunIfNotExist.ts","../../src/server/lib/сomparison/compareImagesNode.ts","../../src/server/lib/сomparison/comparator.ts","../../src/server/services/user.service.ts","../../src/server/services/check.service.ts","../../src/server/services/snapshot.service.ts","../../src/server/controllers/check.controller.ts","../../src/server/controllers/client.controller.ts","../../src/server/schemas/CreateCheck.shema.ts","../../src/server/schemas/GetBaseline.shema.ts","../../src/server/schemas/App.schema.ts","../../src/server/controllers/logs.controller.ts","../../src/server/controllers/snapshots.controller.ts","../../src/server/controllers/tasks.controller.ts","../../src/server/controllers/test.controller.ts","../../src/server/controllers/users.controller.ts","../../src/server/controllers/app.controller.ts","../../src/server/controllers/settings.controller.ts","../../src/server/controllers/runs.controller.ts","../../src/server/controllers/suite.controller.ts","../../src/server/schemas/common/RequestPagination.schema.ts","../../src/server/schemas/common/requestQueryFilterSchema.schema.ts","../../src/server/schemas/utils/createRequestQuerySchema.ts","../../src/server/routes/v1/tests.route.ts","../../src/server/schemas/Test.schema.ts","../../src/server/middlewares/ensureLogin/ensureLoggedIn.ts","../../src/server/schemas/utils/createRequestParamsSchema.ts","../../src/server/schemas/TestDistinct.schema.ts","../../src/server/routes/v1/users.route.ts","../../src/server/middlewares/disableCors.ts","../../src/server/middlewares/authorization.ts","../../src/server/middlewares/compressionFilter.ts","../../src/server/schemas/User.schema.ts","../../src/server/routes/v1/logs.route.ts","../../src/server/schemas/Logs.schema.ts","../../src/server/routes/v1/runs.route.ts","../../src/server/schemas/Runs.schema.ts","../../src/server/schemas/common/ApiError.schema.ts","../../src/server/routes/v1/snapshots.route.ts","../../src/server/schemas/Snapshots.schema.ts","../../src/server/routes/v1/checks.route.ts","../../src/server/schemas/Check.schema.ts","../../src/server/routes/v1/baselines.route.ts","../../src/server/schemas/Baseline.schema.ts","../../src/server/routes/v1/suites.route.ts","../../src/server/schemas/Suite.schema.ts","../../src/server/routes/v1/settings.route.ts","../../src/server/schemas/Settings.schema.ts","../../src/server/routes/v1/test_distinct.route.ts","../../src/server/routes/v1/tasks.route.ts","../../src/server/routes/v1/client.route.ts","../../src/server/schemas/Client.schema.ts","../../src/server/routes/ui/auth.ts","../../src/server/routes/ui/admin.ts","../../src/server/routes/ui/index.ts","../../src/server/lib/httpLogger.ts","../../src/server/middlewares/errorHandler.ts","../../src/server/api-docs/openAPIRouter.ts","../../src/server/api-docs/openAPIDocumentGenerator.ts"],"sourcesContent":["import express from 'express';\nimport helmet from 'helmet';\nimport compression from 'compression';\nimport fileUpload from 'express-fileupload';\nimport cookieParser from 'cookie-parser';\nimport session from 'express-session';\nimport MongoStore from 'connect-mongo';\nimport passport from 'passport';\nimport { Strategy as LocalStrategy } from 'passport-local';\nimport path from 'path';\nimport log from '@logger';\nimport { config } from '@config';\nimport routes from './routes/v1/index.route';\nimport authRoutes from './routes/ui/auth';\nimport adminRoutes from './routes/ui/admin';\nimport uiRoutes from './routes/ui';\n\nimport { compressionFilter, disableCors } from './middlewares';\nimport { User } from './models';\nimport httpLogger from '@lib/httpLogger';\nimport errorHandler from './middlewares/errorHandler';\nimport { openAPIRouter } from './api-docs/openAPIRouter';\nimport { LogOpts } from '../types';\n\nconst logMeta: LogOpts = { scope: 'app.ts', msgType: \"Init\" };\n\nlog.info('Init the application', logMeta);\nconst app = express();\n\nlog.info('\\t- basic http conf', logMeta);\n\napp.use(helmet(config.helmet));\napp.use(disableCors);\n\napp.use(compression({ filter: compressionFilter }));\n// app.use(bodyParser.urlencoded({ extended: true }));\n\napp.use(express.urlencoded({ extended: true }));\n\napp.use(cookieParser());\napp.use(fileUpload({ limits: { fileSize: config.fileUploadMaxSize } }));\napp.use(express.json({ limit: config.jsonLimit }));\nif (config.enableHttpLogger) app.use(httpLogger);\n\nlog.info('\\t- authentication', logMeta);\n// Session and Passport setup\napp.use(session({\n secret: config.storeSessionKey,\n resave: true,\n saveUninitialized: false,\n cookie: { secure: false },\n store: MongoStore.create({ mongoUrl: config.connectionString }),\n}));\napp.use(passport.initialize());\napp.use(passport.session());\npassport.use(new LocalStrategy({}, User.authenticate()));\n\npassport.serializeUser(User.serializeUser() as ((user: Express.User, done: (err: unknown) => void) => void));\npassport.deserializeUser(User.deserializeUser());\n\nlog.info('\\t- static files', logMeta);\nconst baseDir = process.cwd();\napp.use('/snapshoots', express.static(path.join(baseDir, config.defaultImagesPath)));\napp.use('/assets', express.static(path.join(baseDir, './mvc/views/react/assets')));\napp.use('../static', express.static(path.join(baseDir, './src/server/static/static')));\n\nlog.info('\\t- routes', logMeta);\napp.use('/v1', routes);\napp.use('/auth', authRoutes);\napp.use('/admin*', adminRoutes);\napp.use('/', uiRoutes);\n\napp.use('/swagger', openAPIRouter);\n\napp.use(errorHandler());\n\nexport default app;\n","import winston, { Logger as WinstonLogger } from 'winston';\nimport 'winston-mongodb';\nimport { blue, gray, magenta } from 'chalk';\nimport formatISOToDateTime from '@utils/formatISOToDateTime';\nimport { config } from '@config';\nimport path from 'path';\nimport { LogOpts } from '@types';\nimport { ApiError } from '../utils';\nimport { env } from \"@env\";\n\nconst logLevel: string = env.SYNGRISI_LOG_LEVEL;\n\ninterface LoggerOptions {\n dbConnectionString: string;\n}\nfunction getScriptLine(): string {\n const stack = new Error().stack;\n\n if (stack) {\n const stackLines = stack.split('\\n');\n let loggerLineIndex = -1;\n\n // last string contains 'lib/logger'\n for (let i = 0; i < stackLines.length; i++) {\n if (stackLines[i].includes('lib/logger')) {\n loggerLineIndex = i;\n }\n }\n\n // check string after 'lib/logger'\n const targetLineIndex = loggerLineIndex + 1;\n if (targetLineIndex >= 0 && targetLineIndex < stackLines.length) {\n const targetLine = stackLines[targetLineIndex];\n const match = targetLine.match(/at\\s+(?:.+\\s+\\()?(.+):(\\d+):(\\d+)\\)?/);\n if (match) {\n const scriptPath = match[1];\n const relativePath = path.relative(process.cwd(), scriptPath);\n const lineNumber = match[2];\n return `${relativePath}:${lineNumber}`;\n }\n }\n }\n return 'unknown';\n}\n\nfunction createWinstonLogger(opts: LoggerOptions): WinstonLogger {\n return winston.createLogger({\n transports: [\n new winston.transports.Console({\n level: logLevel || 'silly',\n format: winston.format.combine(\n winston.format.colorize(),\n winston.format.timestamp(),\n winston.format.ms(),\n winston.format.metadata(),\n winston.format.printf((info) => {\n const user = info.metadata.user ? blue(` <${info.metadata.user}>`) : '';\n const ref = info.metadata.ref ? gray(` ${info.metadata.ref}`) : '';\n const msgType = info.metadata.msgType ? ` ${info.metadata.msgType}` : '';\n const itemType = info.metadata.itemType ? magenta(` ${info.metadata.itemType}`) : '';\n const scope = info.metadata.scope ? magenta(` [${info.metadata.scope}] `) : magenta(` [${getScriptLine()}] `);\n const msg = typeof info.message === 'object'\n ? `\\n${JSON.stringify(info.message, null, 2)}`\n : info.message;\n\n return `${info.level} ${scope}${formatISOToDateTime(info.metadata.timestamp)} `\n + `${info.metadata.ms}${user}${ref}${msgType}${itemType} '${msg}'`;\n }),\n winston.format.padLevels(),\n ),\n }),\n new winston.transports.MongoDB({\n level: logLevel || 'debug',\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.json(),\n winston.format.metadata(),\n ),\n options: {\n useUnifiedTopology: true,\n },\n db: opts.dbConnectionString,\n collection: 'vrslogs',\n }),\n ],\n });\n}\n\nclass Logger {\n private winstonLogger: WinstonLogger;\n\n constructor(opts: LoggerOptions = { dbConnectionString: config.connectionString }) {\n this.winstonLogger = createWinstonLogger(opts);\n }\n\n private static mergeMeta(objects: LogOpts[]): LogOpts {\n return objects.reduce((acc, obj) => {\n return { ...acc, ...obj };\n }, {});\n }\n\n private log(severity: string, msg: string | object, meta: LogOpts[]): void {\n const mergedMeta = Logger.mergeMeta(meta);\n if (!mergedMeta.scope) {\n mergedMeta.scope = getScriptLine();\n }\n const formattedMsg = typeof msg === 'object' ? JSON.stringify(msg, null, 2) : msg;\n this.winstonLogger.log(severity, formattedMsg, mergedMeta);\n }\n\n public error(msg: string | object | unknown, ...meta: LogOpts[]): void {\n let message: unknown = String(msg);\n let code = 0;\n if ((msg instanceof Object)) {\n message = JSON.stringify(msg);\n }\n if ((msg instanceof Error)) {\n message = msg.stack;\n }\n if ((msg instanceof ApiError)) {\n code = msg.statusCode;\n }\n this.log('error', `${code !== 0 ? '[' + code + ']' : ''}${message}\\n stacktrace: ${new Error().stack}`, meta);\n }\n\n public warn(msg: string | object, ...meta: LogOpts[]): void {\n this.log('warn', `${msg}\\n stacktrace: ${new Error().stack}`, meta);\n }\n\n public info(msg: string | object, ...meta: LogOpts[]): void {\n this.log('info', msg, meta);\n }\n\n public verbose(msg: string | object, ...meta: LogOpts[]): void {\n this.log('verbose', msg, meta);\n }\n\n public debug(msg: string | object, ...meta: LogOpts[]): void {\n this.log('debug', msg, meta);\n }\n\n public silly(msg: string | object, ...meta: LogOpts[]): void {\n this.log('silly', msg, meta);\n }\n}\n\nexport default new Logger();\n","function formatISOToDateTime(isoDateString: string): string {\n const date = new Date(isoDateString);\n return `${date.toISOString().slice(0, 10)} ${date.toTimeString().slice(0, 8)}`;\n}\n\nexport default formatISOToDateTime;\n","import fs from 'fs';\nimport dotenv from 'dotenv';\nimport { version } from '@root/package.json';\nimport crypto from 'crypto';\nimport { env } from \"./envConfig\";\n\nimport devices from \"./data/devices.json\";\nconst customDevicesPath = './server/data/custom_devices.json';\nconst logsFolder = './logs';\ndotenv.config();\n\nexport const config = {\n version,\n // this isn't used \n getDevices: async () => {\n if (fs.existsSync(customDevicesPath)) {\n return [...devices, ...(await import(customDevicesPath)).default];\n }\n return devices;\n },\n defaultImagesPath: env.SYNGRISI_IMAGES_PATH,\n connectionString: env.SYNGRISI_DB_URI || 'mongodb://127.0.0.1:27017/SyngrisiDb',\n host: env.SYNGRISI_HOSTNAME,\n port: env.SYNGRISI_APP_PORT || 3000,\n backupsFolder: './backups',\n enableHttpLogger: env.SYNGRISI_HTTP_LOG,\n httpLoggerFilePath: `${logsFolder}/http.log`,\n storeSessionKey: env.SYNGRISI_SESSION_STORE_KEY || crypto.randomBytes(64).toString('hex'),\n codeCoverage: env.SYNGRISI_COVERAGE,\n disableCors: env.SYNGRISI_DISABLE_DEV_CORS,\n fileUploadMaxSize: 50 * 1024 * 1024,\n testMode: env.SYNGRISI_TEST_MODE,\n jsonLimit: '50mb',\n tmpDir: env.SYNGRISI_TMP_DIR,\n helmet: {\n crossOriginEmbedderPolicy: !env.SYNGRISI_DISABLE_DEV_CORS,\n crossOriginResourcePolicy: !env.SYNGRISI_DISABLE_DEV_CORS,\n contentSecurityPolicy: {\n directives: {\n frameAncestors: [\"'self'\", \"vscode-webview:\", \"vscode-resource:\", \"https:\", \"http:\"],\n frameSrc: [\"'self'\", \"vscode-webview:\", \"https:\", \"http:\"],\n scriptSrc: [\"'self'\", \"'unsafe-inline'\"],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"]\n },\n },\n }\n};\n\nif (!fs.existsSync(config.defaultImagesPath)) {\n fs.mkdirSync(config.defaultImagesPath, { recursive: true });\n}\n\nif (!fs.existsSync(logsFolder)) {\n fs.mkdirSync(logsFolder, { recursive: true });\n}\n\n\n","{\n \"name\": \"@syngrisi/syngrisi\",\n \"version\": \"2.2.3\",\n \"description\": \"Syngrisi - Visual Testing Tool\",\n \"main\": \"./dist/server/server.js\",\n \"type\": \"commonjs\",\n \"bin\": {\n \"sy\": \"server.js\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/syngrisi/syngrisi\"\n },\n \"engines\": {\n \"node\": \">=20\"\n },\n \"files\": [\n \"src\",\n \"dist\",\n \"mvc\",\n \"static\",\n \"src/tasks\",\n \"config.js\",\n \"server.js\",\n \"docker-compose.yml\",\n \".nvmrc\"\n ],\n \"homepage\": \"https://github.com/syngrisi/syngrisi/tree/main/packages/syngrisi\",\n \"keywords\": [\n \"testing\",\n \"regression\",\n \"visual\",\n \"screenshots\",\n \"comparison\"\n ],\n \"nodemonConfig\": {\n \"ignore\": [\n \"mvc/views/lib/*.js\"\n ],\n \"include\": [\n \"dist\"\n ],\n \"delay\": 500\n },\n \"scripts\": {\n \"server:watch\": \"npx tsup --watch --onSuccess \\\"node ./dist/server/server.js\\\" # compile all server ts files changes\",\n \"start\": \"if [ \\\"$NODE_ENV\\\" = \\\"development\\\" ]; then npm run server:watch; else node ./dist/server/server.js; fi\",\n \"start_old\": \"SYNGRISI_AUTH=false nodemon --ignore 'mvc/views/lib/*.js' --ignore 'tests'\",\n \"test\": \"npm run build && cd tests && npm run test\",\n \"build\": \"npm run build:ui && npm run build:server\",\n \"clean:server\": \"rimraf dist\",\n \"build:ui\": \"rm -rf mvc/views/react/assets && cross-env VITE_ROOT_PATH='./src/ui-app/' vite build\",\n \"build:server\": \"npm run clean:server&& npx tsup\",\n \"install:server\": \"npm i\",\n \"install:ui\": \"cd src/ui-app && npm i && cd --\",\n \"install:all\": \"npm run install:server && npm run install:ui\",\n \"test:docker\": \"cd tests && npm run test:docker\",\n \"smoke\": \"cd tests && npm run smoke\",\n \"dev\": \"cross-env VITE_SYNGRISI_BASED_URL='http://localhost:3000' VITE_INDEX_ROUTE='index2/' vite\",\n \"dev:admin\": \"cross-env VITE_SYNGRISI_BASED_URL='http://localhost:3000' VITE_INDEX_ROUTE='admin/' vite/' vite #(!) open http://localhost:8080/admin/ \",\n \"build:watch\": \"cross-env VITE_ROOT_PATH='./src/ui-app/' vite build --watch\",\n \"pub\": \"np --yolo --no-publish\",\n \"starttest\": \"node server.js\",\n \"tasks:reindex\": \"node src/tasks/reindex.js\",\n \"tasks:backup\": \"node dist/src/tasks/backup.js\",\n \"tasks:restore\": \"node dist/src/tasks/restore.js\",\n \"tasks:migration_2_0\": \"node src/tasks/migrations/2.0.migration.js\",\n \"startservice\": \"forever start -l forever.log -o out.log -e err.log server.js\",\n \"clean\": \"read -p \\\"Are you sure you want to clean the project? [y/n] \\\" REPLY; if [[ $REPLY =~ ^[Yy]$ ]]; then mongosh SyngrisiDb --eval \\\"db.dropDatabase();\\\" && rm -f ./baselines/*.png; fi\",\n \"start_test\": \"cross-env SYNGRISI_DB_URI='mongodb://localhost/SyngrisiDbTest' nodemon server.js\",\n \"clear_test\": \"mongosh SyngrisiDbTest$CID --eval \\\"db.dropDatabase();\\\" && rm -rf ./baselinesTest/$CID\",\n \"clear_test_db_only\": \"mongosh SyngrisiDbTest$CID --eval \\\"db.dropDatabase();\\\"\",\n \"docker_clear_test\": \"rm -rf ./data/db_data && rm -rf ./baselinesTest/$CID\",\n \"docker_clear_test_db_only\": \"rm -rf ./data/db_data\",\n \"clear_test_screenshots_only\": \"rm -rf ./baselinesTest/$CID/*\",\n \"deadfile:be\": \"npx deadfile ./server.js --exclude tests src/tasks backups data docs mvc/views/react src/ui-app baseline*\",\n \"deadfile:fe\": \"deadfile ./mvc/views/react/index2/index.html ./mvc/views/react/auth/index.html --dir ./mvc/views/react\",\n \"pkglist\": \"npx npm-packlist # list of files that will be published in syngrisi package, show the files section\"\n },\n \"author\": {\n \"name\": \"Viktar Silakou\",\n \"email\": \"1105714@gmail.com\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/syngrisi/syngrisi/issues\"\n },\n \"license\": \"MIT\",\n \"dependencies\": {\n \"@asteasolutions/zod-to-openapi\": \"^7.0.0\",\n \"@inquirer/prompts\": \"^3.3.0\",\n \"@syngrisi/node-resemble.js\": \"^2.1.36-alpha.0\",\n \"@types/compression\": \"^1.7.5\",\n \"body-parser\": \"^1.19.0\",\n \"bottleneck\": \"^2.19.5\",\n \"bson\": \"^5.5.1\",\n \"chalk\": \"^4.1.2\",\n \"compression\": \"^1.7.4\",\n \"connect-mongo\": \"^5.1.0\",\n \"cookie-parser\": \"^1.4.6\",\n \"dotenv\": \"^16.0.0\",\n \"envalid\": \"^8.0.0\",\n \"eslint-plugin-custom-rules\": \"^0.0.0\",\n \"express\": \"^4.18.2\",\n \"express-fileupload\": \"^1.5.0\",\n \"express-session\": \"^1.17.1\",\n \"hasha\": \"^5.1.0\",\n \"helmet\": \"^7.1.0\",\n \"http-status\": \"^1.5.2\",\n \"mongoose\": \"^7.6.4\",\n \"nodemon\": \"^3.0.1\",\n \"p-queue\": \"^6.4.0\",\n \"passport\": \"^0.6.0\",\n \"passport-local\": \"^1.0.0\",\n \"passport-local-mongoose\": \"^8.0.0\",\n \"pino\": \"^8.16.1\",\n \"pino-http\": \"^8.5.1\",\n \"source-map-support\": \"^0.5.21\",\n \"string-table\": \"^0.1.5\",\n \"swagger-ui-express\": \"^5.0.1\",\n \"uuid-apikey\": \"^1.5.2\",\n \"winston\": \"^3.11.0\",\n \"winston-mongodb\": \"^5.1.1\",\n \"zod\": \"^3.23.8\"\n },\n \"devDependencies\": {\n \"@playwright/test\": \"^1.43.1\",\n \"@types/cookie-parser\": \"^1.4.7\",\n \"@types/express\": \"^4.17.21\",\n \"@types/express-fileupload\": \"^1.5.0\",\n \"@types/express-session\": \"^1.18.0\",\n \"@types/fabric\": \"^4.5.12\",\n \"@types/jquery\": \"^3.5.14\",\n \"@types/mongoose\": \"^5.11.97\",\n \"@types/node\": \"^20.9.0\",\n \"@types/passport\": \"^1.0.16\",\n \"@types/passport-local\": \"^1.0.38\",\n \"@types/react\": \"^18.0.15\",\n \"@types/react-dom\": \"^18.0.6\",\n \"@types/swagger-ui-express\": \"^4.1.6\",\n \"@typescript-eslint/eslint-plugin\": \"^6.21.0\",\n \"@typescript-eslint/parser\": \"^6.21.0\",\n \"@vitejs/plugin-react\": \"^2.0.0\",\n \"babel-eslint\": \"^10.1.0\",\n \"c8\": \"^8.0.1\",\n \"cross-env\": \"^7.0.3\",\n \"eslint\": \"^8.57.0\",\n \"eslint-plugin-custom\": \"file:.eslint\",\n \"form-data\": \"^4.0.0\",\n \"parcel\": \"^2.10.2\",\n \"rimraf\": \"^5.0.7\",\n \"sass\": \"^1.54.0\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.2.2\",\n \"vite\": \"^3.0.9\",\n \"vite-tsconfig-paths\": \"^4.3.2\"\n },\n \"nyc\": {\n \"all\": true,\n \"include\": [\n \"src/server/**/*.js\"\n ],\n \"exclude\": [\n \"**/*.test.js\",\n \"coverage/**\",\n \"node_modules/**\"\n ],\n \"reporter\": [\n \"json\"\n ],\n \"extension\": [\n \".js\"\n ]\n },\n \"gitHead\": \"a0d3926ab3ce0c104e75f1e41f3be19211442142\"\n}\n","import { cleanEnv, host, num, port, str, bool } from 'envalid';\nimport crypto from 'crypto';\nimport path from 'path';\n\nimport dotenv from 'dotenv';\ndotenv.config();\n\nexport const env = cleanEnv(process.env, {\n NODE_ENV: str({ choices: ['development', 'production', 'test'] }),\n SYNGRISI_DB_URI: str({ devDefault: 'mongodb://127.0.0.1:27017/SyngrisiDb' }),\n SYNGRISI_APP_PORT: port({ devDefault: 3000 }),\n SYNGRISI_IMAGES_PATH: str({ devDefault: \"./.snapshots-images/\" }),\n SYNGRISI_TMP_DIR: str({ default: path.join(process.cwd(), '.tmp') }),\n SYNGRISI_HTTP_LOG: bool({ devDefault: false }),\n SYNGRISI_COVERAGE: bool({ devDefault: false }),\n\n SYNGRISI_HOSTNAME: host({ devDefault: 'localhost' }),\n\n SYNGRISI_AUTH: bool({ default: true }),\n SYNGRISI_TEST_MODE: bool({ default: false }),\n SYNGRISI_DISABLE_FIRST_RUN: bool({ default: false }),\n\n MONGODB_ROOT_USERNAME: str({ default: '' }),\n MONGODB_ROOT_PASSWORD: str({ default: '' }),\n LOGLEVEL: str({ choices: ['error', 'warn', 'info', 'verbose', 'debug', 'silly'], default: 'debug' }),\n SYNGRISI_PAGINATION_SIZE: num({ default: 50 }),\n SYNGRISI_DISABLE_DEV_CORS: bool({ default: false, devDefault: true }),\n SYNGRISI_SESSION_STORE_KEY: str({ default: crypto.randomBytes(64).toString('hex') }),\n SYNGRISI_LOG_LEVEL: str({ default: 'debug' }),\n\n // trunk features\n SYNGRISI_TRUNK_FEATURE_AI_SEVERITY: bool({ default: false }),\n SYNGRISI_AI_KEY: str({ default: '' }),\n OPENAI_API_BASE_URL: str({ default: 'https://api.openai.com/v1' }),\n OPENAI_API_KEY: str({ default: '' }),\n});\n","[\n {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 14 Pro Max\",\n \"realMobile\": true\n }, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 14 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 14 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 14\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 12 Pro Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 12 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 12 Mini\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPhone 11 Pro Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone XS\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 13 Pro Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 13 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 13 Mini\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 13\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 11 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 11\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone XS\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone 12 Pro Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone 12 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone 12 Mini\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone 12\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone 11 Pro Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPhone 11\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPhone XS\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPhone 11 Pro Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPhone 11 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPhone 11\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone XS\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone XS Max\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone XR\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone XR\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone X\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone 8\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPhone 8\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone 8\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone 8\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone 8 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone 8 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone 7\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"10\",\n \"device\": \"iPhone 7\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPhone 6S\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone 6S\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone 6S Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone 6\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPhone SE 2022\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPhone SE 2020\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPhone SE\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPad Air 4\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPad 9th\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPad Pro 12.9 2022\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPad Pro 12.9 2020\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPad Pro 11 2022\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPad 10th\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPad Air 5\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPad Pro 12.9 2021\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPad Pro 12.9 2020\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPad Pro 11 2021\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPad Pro 12.9 2020\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"16\",\n \"device\": \"iPad 8th\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPad Pro 12.9 2018\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"15\",\n \"device\": \"iPad Mini 2021\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"14\",\n \"device\": \"iPad 8th\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPad Pro 12.9 2018\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPad Pro 11 2020\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPad Mini 2019\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPad Air 2019\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"13\",\n \"device\": \"iPad 7th\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPad Pro 12.9 2018\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPad Pro 11 2018\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPad Mini 2019\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"12\",\n \"device\": \"iPad Air 2019\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPad Pro 9.7 2016\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPad Pro 12.9 2017\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPad Mini 4\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPad 6th\",\n \"realMobile\": true\n}, {\n \"os\": \"ios\",\n \"os_version\": \"11\",\n \"device\": \"iPad 5th\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Samsung Galaxy S22 Ultra\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Samsung Galaxy S22 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Samsung Galaxy S22\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Samsung Galaxy S21\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy S21 Ultra\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy S21\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy S21 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy S20\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy S20 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy S20 Ultra\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy M52\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy M32\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy A52\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy Note 20 Ultra\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy Note 20\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy A51\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy A11\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy S9 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy S10e\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy S10 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy S10\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy Note 10 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy Note 10\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy A10\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"8.1\",\n \"device\": \"Samsung Galaxy Note 9\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"8.1\",\n \"device\": \"Samsung Galaxy J7 Prime\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"8.0\",\n \"device\": \"Samsung Galaxy S9 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"8.0\",\n \"device\": \"Samsung Galaxy S9\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"7.1\",\n \"device\": \"Samsung Galaxy Note 8\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"7.1\",\n \"device\": \"Samsung Galaxy A8\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"7.0\",\n \"device\": \"Samsung Galaxy S8 Plus\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"7.0\",\n \"device\": \"Samsung Galaxy S8\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"6.0\",\n \"device\": \"Samsung Galaxy S7\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"5.0\",\n \"device\": \"Samsung Galaxy S6\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"13.0\",\n \"device\": \"Google Pixel 7 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"13.0\",\n \"device\": \"Google Pixel 7\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"13.0\",\n \"device\": \"Google Pixel 6 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Google Pixel 6 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Google Pixel 6\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Google Pixel 5\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Google Pixel 5\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Google Pixel 4\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Google Pixel 4 XL\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Google Pixel 4\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Google Pixel 3\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Google Pixel 3a XL\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Google Pixel 3a\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Google Pixel 3 XL\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Google Pixel 3\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Google Pixel 2\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"8.0\",\n \"device\": \"Google Pixel 2\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"7.1\",\n \"device\": \"Google Pixel\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"6.0\",\n \"device\": \"Google Nexus 6\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"4.4\",\n \"device\": \"Google Nexus 5\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"OnePlus 9\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"OnePlus 8\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"OnePlus 7T\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"OnePlus 7\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"OnePlus 6T\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Xiaomi Redmi Note 11\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Xiaomi Redmi Note 9\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Xiaomi Redmi Note 8\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Xiaomi Redmi Note 7\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Vivo Y21\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Vivo V21\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Vivo Y50\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Oppo Reno 6\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Oppo A96\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Oppo Reno 3 Pro\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Motorola Moto G71 5G\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Motorola Moto G9 Play\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Motorola Moto G7 Play\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Huawei P30\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"12.0\",\n \"device\": \"Samsung Galaxy Tab S8\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"11.0\",\n \"device\": \"Samsung Galaxy Tab S7\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"10.0\",\n \"device\": \"Samsung Galaxy Tab S7\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy Tab S6\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"9.0\",\n \"device\": \"Samsung Galaxy Tab S5e\",\n \"realMobile\": true\n}, {\n \"os\": \"android\",\n \"os_version\": \"8.1\",\n \"device\": \"Samsung Galaxy Tab S4\",\n \"realMobile\": true\n}\n]\n","/**\n * Create an object composed of the picked object properties\n * @param {T} object input object\n * @param {Array<keyof T>} keys fields to pick\n * @returns {Partial<T>} new object\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst pick = <T extends Record<string, any>>(object: T, keys: Array<keyof T>): Partial<T> => {\n return keys.reduce((obj, key) => {\n if (object && Object.prototype.hasOwnProperty.call(object, key)) {\n if (object[key] !== undefined) obj[key] = object[key];\n }\n return obj;\n }, {} as Partial<T>);\n};\n\nexport default pick;\n","const isJSON = (text: string | null): boolean => {\n if (!text) return false;\n\n const isValid = /^[\\],:{}\\s]*$/.test(\n text\n .replace(/\\\\[\"\\\\\\/bfnrtu]/g, '@')\n .replace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']')\n .replace(/(?:^|:|,)(?:\\s*\\[)+/g, '')\n );\n\n return isValid;\n};\n\nexport default isJSON;\n","import { Response, NextFunction } from 'express';\nimport { ExtRequest } from '@types';\n\nconst catchAsync = (fn: (req: ExtRequest, res: Response, next: NextFunction) => Promise<void>) =>\n (req: ExtRequest, res: Response, next: NextFunction) => {\n Promise.resolve(fn(req, res, next)).catch((err) => {\n return next(err);\n });\n };\n\nexport default catchAsync;\n","const dateToISO8601 = (date: string | Date): string => {\n return new Date(new Date(date)).toISOString().split('T')[0];\n};\n\nexport default dateToISO8601;\n","import { Response } from 'express';\n\nexport class ProgressBar {\n length: number;\n percentLenght: number;\n prevPercent: number;\n currentPercent: number;\n progressString: string;\n\n constructor(length: number) {\n this.length = length;\n this.percentLenght = parseFloat((length / 100).toString());\n this.prevPercent = 0;\n this.currentPercent = 0;\n this.progressString = '';\n }\n\n isChange(current: number): boolean {\n this.currentPercent = parseInt((current / this.percentLenght).toString(), 10);\n if (this.prevPercent === this.currentPercent) {\n return false;\n }\n this.prevPercent = this.currentPercent;\n this.progressString += '#';\n return true;\n }\n\n writeIfChange(index: number, count: number, fn: (message: string, res: Response) => void, res: Response): void {\n if (this.isChange(index)) {\n const placeholderString = Array.from(new Array(99 - this.currentPercent))\n .reduce((accum) => accum += '.', '');\n fn(`[${this.progressString}${placeholderString}](${index}/${count})`, res);\n }\n }\n}\n","class ApiError extends Error {\n statusCode: number;\n isOperational: boolean;\n\n constructor(statusCode: number, message: string, isOperational: boolean = true, stack: string = '') {\n super(message);\n this.statusCode = statusCode;\n this.isOperational = isOperational;\n if (stack) {\n this.stack = stack;\n } else {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n\nexport default ApiError;\n","export const removeEmptyProperties = (obj: { [key: string]: unknown }): { [key: string]: unknown } =>\n Object.fromEntries(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Object.entries(obj).filter(([_, v]) => (v != null) && (v !== ''))\n );\n","import { EJSON } from 'bson';\nimport { isJSON } from '.';\n\nconst deserializeIfJSON = (text: string) => {\n if (isJSON(text)) return EJSON.parse(text) || undefined;\n return text;\n};\n\nexport default deserializeIfJSON;\n","interface Result {\n domDump?: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nconst prettyCheckParams = (result: Result): string => {\n if (!result.domDump) {\n return JSON.stringify(result);\n }\n const dump = JSON.parse(result.domDump);\n const resObs = { ...result };\n delete resObs.domDump;\n resObs.domDump = `${JSON.stringify(dump).substr(0, 20)}... and about ${dump.length} items]`;\n return JSON.stringify(resObs);\n};\n\nexport default prettyCheckParams;\n","export const waitUntil = async (cb: () => Promise<boolean>, attempts: number = 5, interval: number = 700): Promise<boolean> => {\n let result = false;\n let iteration = 0;\n while (result === false) {\n result = await cb();\n await new Promise((r) => setTimeout(r, interval));\n iteration += 1;\n\n if (iteration > attempts) {\n result = true;\n }\n }\n return result;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ZodObject, SafeParseError } from 'zod';\n\nexport const paramsGuard = (params: any, functionName: string, schema: ZodObject<any>) => {\n const result = schema.safeParse(params);\n if (result.success) {\n return true;\n } else {\n const errorDetails = (result as SafeParseError<any>).error.format();\n throw new Error(`\n Invalid '${functionName}' parameters: ${JSON.stringify(errorDetails)}\n \\n error: ${(result as SafeParseError<any>).error.stack || (result as SafeParseError<any>).error}\n \\n params: ${JSON.stringify(params, null, 2)}\n `);\n }\n}\n","export const ident = ['name', 'viewport', 'browserName', 'os', 'app', 'branch'];\n","import { ident } from './ident';\n\nexport interface IdentType {\n name: string;\n viewport: string;\n browserName: string;\n os: string;\n app: string;\n branch: string;\n}\n\ntype IdentableObject = Partial<IdentType> & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: any;\n}\n\nclass MissingIdentFieldError extends Error {\n constructor(field: string) {\n super(`Missing required ident field: ${field}`);\n this.name = 'MissingIdentFieldError';\n }\n}\n\nexport const buildIdentObject = (params: IdentableObject): IdentType => {\n const result = {} as IdentType;\n for (const key of ident) {\n if (key in params && params[key] !== undefined) {\n result[key as keyof IdentType] = params[key] as string;\n } else {\n throw new MissingIdentFieldError(key);\n }\n }\n return result;\n};","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface CheckDocument extends Document {\n name: string;\n test: Schema.Types.ObjectId;\n suite: Schema.Types.ObjectId;\n app: Schema.Types.ObjectId;\n branch?: string;\n realBaselineId?: Schema.Types.ObjectId;\n baselineId?: Schema.Types.ObjectId;\n actualSnapshotId?: Schema.Types.ObjectId;\n diffId?: Schema.Types.ObjectId;\n createdDate: Date;\n updatedDate?: Date;\n // status: ['new', 'pending', 'approved', 'running', 'passed', 'failed', 'aborted'];\n status: ('new' | 'pending' | 'approved' | 'running' | 'passed' | 'failed' | 'aborted' | 'blinking')[];\n browserName?: string;\n browserVersion?: string;\n browserFullVersion?: string;\n viewport?: string;\n os?: string;\n domDump?: string;\n result?: string;\n run?: Schema.Types.ObjectId;\n markedAs?: 'bug' | 'accepted';\n markedDate?: Date;\n markedById?: Schema.Types.ObjectId;\n markedByUsername?: string;\n markedBugComment?: string;\n creatorId?: Schema.Types.ObjectId;\n creatorUsername?: string;\n failReasons?: string[];\n vOffset?: string;\n topStablePixels?: string;\n meta?: Record<string, unknown>;\n}\n\n// const CheckSchema: Schema<CheckDocument> = new Schema({\nconst CheckSchema = new Schema<CheckDocument>({\n name: {\n type: String,\n required: [true, 'CheckSchema: The \"name\" field must be required'],\n },\n test: {\n type: Schema.Types.ObjectId,\n ref: 'VRSTest',\n required: [true, 'CheckSchema: The \"test\" field must be required'],\n },\n suite: {\n type: Schema.Types.ObjectId,\n ref: 'VRSSuite',\n required: [true, 'CheckSchema: The \"suite\" field must be required'],\n },\n app: {\n type: Schema.Types.ObjectId,\n ref: 'VRSApp',\n required: [true, 'CheckSchema: The \"app\" field must be required'],\n },\n branch: {\n type: String,\n },\n realBaselineId: {\n type: Schema.Types.ObjectId,\n ref: 'VRSBaseline',\n },\n baselineId: {\n type: Schema.Types.ObjectId,\n ref: 'VRSSnapshot',\n },\n actualSnapshotId: {\n type: Schema.Types.ObjectId,\n ref: 'VRSSnapshot',\n },\n diffId: {\n type: Schema.Types.ObjectId,\n ref: 'VRSSnapshot',\n },\n createdDate: {\n type: Date,\n required: true,\n default: Date.now,\n },\n updatedDate: {\n type: Date,\n },\n status: {\n type: [{\n type: String,\n enum: {\n values: ['new', 'pending', 'approved', 'running', 'passed', 'failed', 'aborted'],\n message: 'status is required',\n },\n }],\n default: ['new'],\n },\n browserName: {\n type: String,\n },\n browserVersion: {\n type: String,\n },\n browserFullVersion: {\n type: String,\n },\n viewport: {\n type: String,\n },\n os: {\n type: String,\n },\n domDump: {\n type: String,\n },\n result: {\n type: String,\n default: '{}',\n },\n run: {\n type: Schema.Types.ObjectId,\n },\n markedAs: {\n type: String,\n enum: ['bug', 'accepted'],\n },\n markedDate: {\n type: Date,\n },\n markedById: {\n type: Schema.Types.ObjectId,\n ref: 'VRSUser',\n },\n markedByUsername: {\n type: String,\n },\n markedBugComment: {\n type: String,\n },\n creatorId: {\n type: Schema.Types.ObjectId,\n ref: 'VRSUser',\n },\n creatorUsername: {\n type: String,\n },\n failReasons: {\n type: [String],\n },\n vOffset: {\n type: String,\n },\n topStablePixels: {\n type: String,\n },\n meta: {\n type: Object,\n },\n});\n\nCheckSchema.plugin(toJSON);\nCheckSchema.plugin(paginate);\n\nconst Check: Model<CheckDocument> = mongoose.model<CheckDocument>('VRSCheck', CheckSchema);\nexport default Check as PluginExtededModel<CheckDocument>;\n\n","import { Schema, Document, FilterQuery } from 'mongoose';\nimport { PaginateOptions, QueryResult } from './utils';\n\nconst paginate = (schema: Schema) => {\n /**\n * Query for documents with pagination\n * @param {Object} [filter] - Mongo filter\n * @param {Object} [options] - Query options\n * @param {string} [options.sortBy] - Sorting criteria using the format: sortField:(desc|asc).\n * Multiple sorting criteria should be separated by commas (,)\n * @param {string} [options.populate] - Populate data fields. Hierarchy of fields should be separated by (.).\n * Multiple populating criteria should be separated by commas (,)\n * @param {number} [options.limit] - Maximum number of results per page (default = 10)\n * @param {number} [options.page] - Current page (default = 1)\n * @returns {Promise<QueryResult>}\n */\n schema.statics.paginate = async function (filter: FilterQuery<unknown>, options: PaginateOptions): Promise<QueryResult> {\n let sort: string | object;\n if (options.sortBy) {\n const sortingCriteria: string[] = [];\n options.sortBy.split(',')\n .forEach((sortOption: string) => {\n const [key, order] = sortOption.split(':');\n sortingCriteria.push((order === 'desc' ? '-' : '') + key);\n });\n sort = sortingCriteria.join(' ');\n } else {\n sort = { _id: -1 };\n }\n\n const limit = options.limit && parseInt(options.limit.toString(), 10) >= 0 ? parseInt(options.limit.toString(), 10) : 10;\n const page = options.page && parseInt(options.page.toString(), 10) > 0 ? parseInt(options.page.toString(), 10) : 1;\n const skip = (page - 1) * limit;\n\n const countPromise = this.countDocuments(filter).exec();\n let docsPromise = this.find(filter)\n .sort(sort)\n .skip(skip)\n .limit(limit);\n\n if (options.populate) {\n options.populate.split(',')\n .forEach((populateOption: string) => {\n docsPromise = docsPromise.populate(\n populateOption\n .split('.')\n .reverse()\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n .reduce((a, b) => ({ path: b, populate: a }))\n );\n });\n }\n\n docsPromise = docsPromise.exec();\n\n return Promise.all([countPromise, docsPromise])\n .then((values: [number, Document[]]) => {\n const [totalResults, results] = values;\n const totalPages = Math.ceil(totalResults / limit);\n const result: QueryResult = {\n results,\n page,\n limit,\n totalPages,\n totalResults,\n timestamp: Number(Date.now() + String(process.hrtime()[1]).slice(3, 6)),\n };\n return Promise.resolve(result);\n });\n };\n};\n\nexport default paginate;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-param-reassign */\n\n// import { Schema } from 'mongoose';\n\nconst deleteAtPath = (obj: any, path: string[], index: number): void => {\n if (index === path.length - 1) {\n delete obj[path[index]];\n return;\n }\n deleteAtPath(obj[path[index]], path, index + 1);\n};\n\nconst toJSON = (schema: any): void => {\n let transform: any;\n if (schema.options.toJSON && schema.options.toJSON.transform) {\n transform = schema.options.toJSON.transform;\n }\n\n schema.options.toJSON = Object.assign(schema.options.toJSON || {}, {\n transform(doc: any, ret: any, options: any) {\n Object.keys(schema.paths).forEach((path) => {\n if (schema.paths[path].options && schema.paths[path].options.private) {\n deleteAtPath(ret, path.split('.'), 0);\n }\n });\n\n ret.id = ret._id.toString();\n // delete ret._id;\n // eslint-disable-next-line no-underscore-dangle\n delete ret.__v;\n delete ret.createdAt;\n delete ret.updatedAt;\n if (transform) {\n return transform(doc, ret, options);\n }\n },\n });\n};\n\nexport default toJSON;\n","import { Schema, Document, FilterQuery } from 'mongoose';\nimport { EJSON } from 'bson';\nimport { PaginateOptions, QueryResult } from './utils';\n\n// type QueryResult = {\n// results: Document[];\n// page: number;\n// limit: number;\n// totalPages: number;\n// totalResults: number;\n// timestamp: number;\n// };\n\n// type PaginateOptions = {\n// sortBy?: string;\n// populate?: string;\n// limit?: number;\n// page?: number;\n// field: string;\n// };\n\nconst paginateDistinct = (schema: Schema): void => {\n /**\n * Query for documents with pagination\n * @param {Object} [filter] - Mongo filter\n * @param {Object} [options] - Query options\n * @param {string} [options.sortBy] - Sorting criteria using the format: sortField:(desc|asc).\n * Multiple sorting criteria should be separated by commas (,)\n * @param {string} [options.populate] - Populate data fields. Hierarchy of fields should be separated by (.).\n * Multiple populating criteria should be separated by commas (,)\n * @param {number} [options.limit] - Maximum number of results per page (default = 10)\n * @param {number} [options.page] - Current page (default = 1)\n * @returns {Promise<QueryResult>}\n */\n schema.statics.paginateDistinct = async function (filter: FilterQuery<unknown>, options: PaginateOptions): Promise<QueryResult> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let sort: any;\n if (options.sortBy) {\n options.sortBy.split(',')\n .forEach((sortOption: string) => {\n const [key, order] = sortOption.split(':');\n sort[key] = (order === 'desc') ? -1 : 1;\n });\n } else {\n sort = { _id: -1 };\n }\n\n let limit = options.limit && parseInt(options.limit.toString(), 10) >= 0 ? parseInt(options.limit.toString(), 10) : 10;\n limit = limit === 0 ? 9007199254740991 : limit;\n const page = options.page && parseInt(options.page.toString(), 10) > 0 ? parseInt(options.page.toString(), 10) : 1;\n const skip = (page - 1) * limit;\n\n const groupAggregateObj = { $group: { _id: `$${options.field}` } };\n\n const documentsCount = (await this.aggregate([groupAggregateObj])\n .exec()).length;\n const aggregateArr = [\n { $match: EJSON.parse(filter.filter || '{}') },\n groupAggregateObj,\n { $sort: sort },\n { $skip: skip },\n { $limit: limit },\n ];\n const aggregatedDocs = (await this.aggregate(aggregateArr))\n .filter((x) => x._id)\n .map((x) => {\n if (x[options.field!]) {\n return x[options.field!][0];\n }\n return { name: x._id };\n });\n\n return Promise.all([documentsCount, aggregatedDocs])\n .then((values: [number, Document[]]) => {\n const [totalResults, results] = values;\n const totalPages = Math.ceil(totalResults / limit);\n const result: QueryResult = {\n results,\n page,\n limit,\n totalPages,\n totalResults,\n timestamp: new Date().getTime(),\n };\n return Promise.resolve(result);\n });\n };\n};\n\nexport default paginateDistinct;\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface LogDocument extends Document {\n timestamp?: Date;\n level?: string;\n message?: string;\n meta?: Record<string, unknown>;\n hostname?: string;\n}\n\nconst LogSchema: Schema<LogDocument> = new Schema({\n timestamp: {\n type: Date,\n },\n level: {\n type: String,\n },\n message: {\n type: String,\n },\n meta: {\n type: Object,\n },\n hostname: {\n type: Object,\n },\n});\n\nLogSchema.plugin(toJSON);\nLogSchema.plugin(paginate);\n\nconst Log: Model<LogDocument> = mongoose.model<LogDocument>('VRSLog', LogSchema);\nexport default Log as PluginExtededModel<LogDocument>;\n\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface AppDocument extends Document {\n name: string;\n description?: string;\n version?: string;\n updatedDate?: Date;\n createdDate?: Date;\n meta?: Record<string, unknown>;\n}\n\nconst AppSchema: Schema<AppDocument> = new Schema({\n name: {\n type: String,\n default: 'Others',\n unique: true,\n required: [true, 'AppSchema: The \"name\" field must be required'],\n },\n description: {\n type: String,\n },\n version: {\n type: String,\n },\n updatedDate: {\n type: Date,\n },\n createdDate: {\n type: Date,\n },\n meta: {\n type: Object,\n },\n});\n\nAppSchema.plugin(paginate);\nAppSchema.plugin(toJSON);\n\nconst App: Model<AppDocument> = mongoose.model<AppDocument>('VRSApp', AppSchema);\nexport default App as PluginExtededModel<AppDocument>;\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface SnapshotDocument extends Document {\n name: string;\n path?: string;\n filename?: string;\n imghash: string;\n createdDate?: Date;\n vOffset?: number;\n hOffset?: number;\n}\n\nconst SnapshotSchema: Schema<SnapshotDocument> = new Schema({\n name: {\n type: String,\n required: [true, 'SnapshotSchema: The \"name\" field must be required'],\n },\n path: {\n type: String,\n },\n filename: {\n type: String,\n },\n imghash: {\n type: String,\n required: [true, 'SnapshotSchema: The \"imghash\" field must be required'],\n },\n createdDate: {\n type: Date,\n default: Date.now,\n },\n vOffset: {\n type: Number,\n },\n hOffset: {\n type: Number,\n },\n});\n\nSnapshotSchema.plugin(toJSON);\nSnapshotSchema.plugin(paginate);\n\nconst Snapshot: Model<SnapshotDocument> = mongoose.model<SnapshotDocument>('VRSSnapshot', SnapshotSchema);\n\nexport default Snapshot as PluginExtededModel<SnapshotDocument>;\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface AppSettingsDocument extends Document {\n name: string;\n label: string;\n description?: string;\n type: { [key: string]: string };\n value: Schema.Types.Mixed;\n env_variable?: string;\n enabled?: boolean;\n}\n\nconst AppSettingsSchema: Schema<AppSettingsDocument> = new Schema({\n name: {\n type: String,\n unique: true,\n required: [true, 'AppSettingsSchema: The \"name\" field must be required'],\n },\n label: {\n type: String,\n required: [true, 'AppSettingsSchema: The \"label\" field must be required'],\n },\n description: {\n type: String,\n },\n type: {\n type: String,\n required: [true, 'AppSettingsSchema: The \"type\" field must be required'],\n },\n value: {\n type: Schema.Types.Mixed,\n required: [true, 'AppSettingsSchema: The \"value\" field must be required'],\n },\n env_variable: {\n type: String,\n },\n enabled: {\n type: Boolean,\n },\n});\n\nAppSettingsSchema.plugin(toJSON);\n\nconst AppSettings: Model<AppSettingsDocument> = mongoose.model<AppSettingsDocument>('VRSAppSettings', AppSettingsSchema);\nexport default AppSettings as PluginExtededModel<AppSettingsDocument>;\n\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface SuiteDocument extends Document {\n name: string;\n tags?: string[];\n app: Schema.Types.ObjectId;\n description?: string;\n updatedDate?: Date;\n createdDate?: Date;\n meta?: Record<string, unknown>;\n}\n\nconst SuiteSchema: Schema<SuiteDocument> = new Schema({\n name: {\n type: String,\n default: 'Others',\n unique: true,\n required: [true, 'SuiteSchema: The \"name\" field must be required'],\n },\n tags: {\n type: [String],\n },\n app: {\n type: Schema.Types.ObjectId,\n ref: 'VRSApp',\n required: [true, 'SuiteSchema: The \"app\" field must be required'],\n },\n description: {\n type: String,\n },\n updatedDate: {\n type: Date,\n default: Date.now,\n },\n createdDate: {\n type: Date,\n },\n meta: {\n type: Object,\n },\n});\n\nSuiteSchema.plugin(paginate);\nSuiteSchema.plugin(toJSON);\n\nconst Suite: Model<SuiteDocument> = mongoose.model<SuiteDocument>('VRSSuite', SuiteSchema);\n\nexport default Suite as PluginExtededModel<SuiteDocument>;\n","\nimport mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface RunDocument extends Document {\n name: string;\n app: Schema.Types.ObjectId;\n ident: string;\n description?: string;\n updatedDate?: Date;\n createdDate?: Date;\n parameters?: string[];\n meta?: Record<string, unknown>;\n}\n\nconst RunSchema: Schema<RunDocument> = new Schema({\n name: {\n type: String,\n required: [true, 'RunSchema: The \"name\" field must be required'],\n },\n app: {\n type: Schema.Types.ObjectId,\n ref: 'VRSApp',\n required: [true, 'RunSchema: The \"app\" field must be required'],\n },\n ident: {\n type: String,\n unique: true,\n required: [true, 'RunSchema: The \"ident\" field must be required'],\n },\n description: {\n type: String,\n },\n updatedDate: {\n type: Date,\n default: Date.now,\n },\n createdDate: {\n type: Date,\n },\n parameters: {\n type: [String],\n },\n meta: {\n type: Object,\n },\n});\n\nRunSchema.plugin(paginate);\nRunSchema.plugin(toJSON);\n\nconst Run: Model<RunDocument> = mongoose.model<RunDocument>('VRSRun', RunSchema);\nexport default Run as PluginExtededModel<RunDocument>;\n\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport passportLocalMongoose from 'passport-local-mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport type UserRole = 'admin' | 'reviewer' | 'user';\n\nexport interface UserDocument extends Document {\n username: string;\n firstName: string;\n lastName: string;\n role: UserRole;\n password?: string;\n token?: string;\n apiKey?: string;\n createdDate?: Date;\n updatedDate?: Date;\n expiration?: Date;\n meta?: Record<string, unknown>;\n isEmailTaken: (username: string) => Promise<boolean>;\n setPassword: (password: string) => Promise<UserDocument>;\n}\n\nconst UserSchema = new Schema<UserDocument>({\n username: {\n type: String,\n unique: true,\n required: [true, 'UserSchema: The \"username\" field must be required'],\n },\n firstName: {\n type: String,\n required: [true, 'UserSchema: The \"firstName\" field must be required'],\n },\n lastName: {\n type: String,\n required: [true, 'UserSchema: The \"lastName\" field must be required'],\n },\n role: {\n type: String,\n enum: ['admin', 'reviewer', 'user'],\n required: [true, 'UserSchema: The \"role\" field must be required'],\n },\n password: {\n type: String,\n },\n token: {\n type: String,\n },\n apiKey: {\n type: String,\n },\n createdDate: {\n type: Date,\n },\n updatedDate: {\n type: Date,\n },\n expiration: {\n type: Date,\n },\n meta: {\n type: Object,\n },\n});\n\nUserSchema.statics.isEmailTaken = async function (username, excludeUserId) {\n const user = await this.findOne({ username, _id: { $ne: excludeUserId } });\n return !!user;\n};\n\nUserSchema.plugin(toJSON);\nUserSchema.plugin(paginate);\nUserSchema.plugin(passportLocalMongoose, { hashField: 'password' });\n\nconst User: Model<UserDocument> = mongoose.model<UserDocument>('VRSUser', UserSchema);\n\nexport default User as PluginExtededModel<UserDocument>;","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface BaselineDocument extends Document {\n snapshootId: Schema.Types.ObjectId;\n name: string;\n app: Schema.Types.ObjectId;\n branch?: string;\n browserName?: string;\n browserVersion?: string;\n browserFullVersion?: string;\n viewport?: string;\n os?: string;\n markedAs?: 'bug' | 'accepted';\n lastMarkedDate?: Date;\n createdDate?: Date;\n updatedDate?: Date;\n markedById?: Schema.Types.ObjectId;\n markedByUsername?: string;\n ignoreRegions?: string;\n boundRegions?: string;\n matchType?: 'antialiasing' | 'nothing' | 'colors';\n meta?: Record<string, unknown>;\n}\n\nconst BaselineSchema: Schema<BaselineDocument> = new Schema({\n snapshootId: {\n type: Schema.Types.ObjectId,\n },\n name: {\n type: String,\n required: [true, 'VRSBaselineSchema: The \"name\" field must be required'],\n },\n app: {\n type: Schema.Types.ObjectId,\n ref: 'VRSApp',\n required: [true, 'VRSBaselineSchema: The \"app\" field must be required'],\n },\n branch: {\n type: String,\n },\n browserName: {\n type: String,\n },\n browserVersion: {\n type: String,\n },\n browserFullVersion: {\n type: String,\n },\n viewport: {\n type: String,\n },\n os: {\n type: String,\n },\n markedAs: {\n type: String,\n enum: ['bug', 'accepted'],\n },\n lastMarkedDate: {\n type: Date,\n },\n createdDate: {\n type: Date,\n },\n updatedDate: {\n type: Date,\n },\n markedById: {\n type: Schema.Types.ObjectId,\n ref: 'VRSUser',\n },\n markedByUsername: {\n type: String,\n },\n ignoreRegions: {\n type: String,\n },\n boundRegions: {\n type: String,\n },\n matchType: {\n type: String,\n enum: ['antialiasing', 'nothing', 'colors'],\n },\n meta: {\n type: Object,\n },\n});\n\nBaselineSchema.plugin(toJSON);\nBaselineSchema.plugin(paginate);\n\nconst Baseline: Model<BaselineDocument> = mongoose.model<BaselineDocument>('VRSBaseline', BaselineSchema);\nexport default Baseline as PluginExtededModel<BaselineDocument>;\n\n","import mongoose, { Schema, Document, Model } from 'mongoose';\nimport { toJSON, paginate, paginateDistinct } from './plugins';\nimport { PluginExtededModel } from './plugins/utils';\n\nexport interface TestDocument extends Document {\n name: string;\n description?: string;\n status?: string;\n browserName: string;\n browserVersion: string;\n branch?: string;\n tags?: string[];\n viewport: string;\n calculatedViewport?: string;\n // calculatedStatus?: string;\n os: string;\n app: Schema.Types.ObjectId;\n blinking?: number;\n updatedDate: Date;\n startDate: Date;\n checks?: Schema.Types.ObjectId[];\n suite?: Schema.Types.ObjectId;\n run: Schema.Types.ObjectId;\n markedAs?: 'Bug' | 'Accepted' | 'Unaccepted' | 'Partially';\n creatorId?: Schema.Types.ObjectId;\n creatorUsername?: string;\n meta?: Record<string, unknown>;\n}\n\nconst TestSchema: Schema<TestDocument> = new Schema(\n {\n name: {\n type: String,\n required: 'TestSchema: the test name is empty',\n },\n description: {\n type: String,\n },\n status: {\n type: String,\n },\n browserName: {\n type: String,\n },\n browserVersion: {\n type: String,\n },\n branch: {\n type: String,\n },\n tags: {\n type: [String],\n },\n viewport: {\n type: String,\n },\n calculatedViewport: {\n type: String,\n },\n os: {\n type: String,\n },\n app: {\n type: Schema.Types.ObjectId,\n ref: 'VRSApp',\n required: [true, 'TestSchema: The \"app\" field must be required'],\n\n },\n blinking: {\n type: Number,\n default: 0,\n },\n updatedDate: {\n type: Date,\n },\n startDate: {\n type: Date,\n },\n checks: [\n {\n type: mongoose.Schema.Types.ObjectId,\n ref: 'VRSCheck',\n },\n ],\n suite: {\n type: Schema.Types.ObjectId,\n ref: 'VRSSuite',\n },\n run: {\n type: Schema.Types.ObjectId,\n ref: 'VRSRun',\n },\n markedAs: {\n type: String,\n enum: ['Bug', 'Accepted', 'Unaccepted', 'Partially'],\n },\n creatorId: {\n type: Schema.Types.ObjectId,\n ref: 'VRSUser',\n },\n creatorUsername: {\n type: String,\n },\n meta: {\n type: Object,\n },\n },\n { strictQuery: true }\n);\n\nTestSchema.plugin(toJSON);\nTestSchema.plugin(paginate);\nTestSchema.plugin(paginateDistinct);\n\nconst Test: Model<TestDocument> = mongoose.model<TestDocument>('VRSTest', TestSchema);\n\nexport default Test as PluginExtededModel<TestDocument>;\n","import { Check } from '@models';\nimport { Schema } from 'mongoose';\n\n\ntype statusType = 'Bug' | 'Accepted' | 'Unaccepted' | 'Partially';\n\nexport const calculateAcceptedStatus = async function calculateAcceptedStatus(testId: string | Schema.Types.ObjectId): Promise<statusType> {\n const checksInTest = await Check.find({ test: testId });\n const statuses = checksInTest.map((x) => x.markedAs);\n if (statuses.length < 1) {\n return 'Unaccepted';\n }\n let testCalculatedStatus: statusType = 'Unaccepted';\n if (statuses.some((x) => x === 'accepted')) {\n testCalculatedStatus = 'Partially';\n }\n if (statuses.every((x) => x === 'accepted')) {\n testCalculatedStatus = 'Accepted';\n }\n // console.log({ testCalculatedStatus });\n return testCalculatedStatus;\n};\n","const subDays = (date: Date, days: number): Date => {\n const result = new Date(date);\n result.setDate(result.getDate() - days);\n return result;\n};\n\nexport default subDays;\n","export const errMsg = (e: unknown) => {\n return String((e instanceof Error) ? e.stack : e)\n}","import express from 'express';\nimport authRoute from './auth.route';\nimport appRoute from './app.route';\nimport testsRoute from './tests.route';\nimport usersRoute from './users.route';\nimport logsRoute from './logs.route';\nimport runsRoute from './runs.route';\nimport snapshotRoute from './snapshots.route';\nimport checkRoute from './checks.route';\nimport baselinesRoute from './baselines.route';\nimport suitesRoute from './suites.route';\nimport settingsRoute from './settings.route';\nimport testDistinctRoute from './test_distinct.route';\nimport tasksRoute from './tasks.route';\nimport clientRoute from './client.route';\n\nconst router = express.Router();\n\nconst defaultRoutes = [\n {\n path: '/auth',\n route: authRoute,\n },\n {\n path: '/client',\n route: clientRoute,\n },\n {\n path: '/tasks',\n route: tasksRoute,\n },\n {\n path: '/users',\n route: usersRoute,\n },\n {\n path: '/app',\n route: appRoute,\n },\n {\n path: '/tests',\n route: testsRoute,\n },\n {\n path: '/logs',\n route: logsRoute,\n },\n {\n path: '/runs',\n route: runsRoute,\n },\n {\n path: '/snapshots',\n route: snapshotRoute,\n },\n {\n path: '/checks',\n route: checkRoute,\n },\n {\n path: '/baselines',\n route: baselinesRoute,\n },\n {\n path: '/suites',\n route: suitesRoute,\n },\n {\n path: '/settings',\n route: settingsRoute,\n },\n {\n path: '/test-distinct',\n route: testDistinctRoute,\n },\n];\n\ndefaultRoutes.forEach((route) => {\n router.use(route.path, route.route);\n});\n\nexport default router;\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as authController from '@controllers/auth.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { AuthLoginSchema, AuthChangePasswordSchema, AuthApiKeyRespSchema, AuthLoginSuccessRespSchema, AuthChangePasswordFirstRunSchema } from '@schemas/Auth.schema';\nimport { createApiResponse, createApiEmptyResponse } from '@api-docs/openAPIResponseBuilders';\nimport { SkipValid } from '../../schemas/SkipValid.schema';\nimport { createRequestBodySchema } from '../../schemas/utils/createRequestBodySchema';\nimport { createRequestOpenApiBodySchema } from '../../schemas/utils/createRequestOpenApiBodySchema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/auth/logout',\n summary: 'Logout the current user.',\n tags: ['Auth'],\n responses: createApiEmptyResponse('Logout success'),\n});\n\nrouter.get(\n '/logout',\n validateRequest(SkipValid, 'get, /v1/auth/logout'),\n authController.logout as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/auth/apikey',\n summary: 'Generate a new API key for the current user.',\n tags: ['Auth'],\n responses: createApiResponse(AuthApiKeyRespSchema, 'API Key generated'),\n});\n\nrouter.get(\n '/apikey',\n validateRequest(SkipValid, 'get, /v1/auth/apikey'),\n authController.apikey as Midleware\n);\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/auth/login',\n summary: 'Login a user with username and password.',\n tags: ['Auth'],\n request: { body: createRequestOpenApiBodySchema(AuthLoginSchema) },\n responses: createApiResponse(AuthLoginSuccessRespSchema, 'Login success'),\n});\n\nrouter.post(\n '/login',\n validateRequest(createRequestBodySchema(AuthLoginSchema), 'post, /v1/auth/login'),\n authController.login as Midleware\n);\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/auth/change',\n summary: 'Change the password for the current user.',\n tags: ['Auth'],\n request: { body: createRequestOpenApiBodySchema(AuthChangePasswordSchema) },\n responses: createApiEmptyResponse('Password changed'),\n});\n\nrouter.post(\n '/change',\n validateRequest(createRequestBodySchema(AuthChangePasswordSchema), 'post, /v1/auth/change'),\n authController.changePassword as Midleware\n);\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/auth/change_first_run',\n summary: 'Change the password for the first run.',\n tags: ['Auth'],\n request: { body: createRequestOpenApiBodySchema(AuthChangePasswordFirstRunSchema) },\n responses: createApiEmptyResponse('First run password changed'),\n});\n\nrouter.post(\n '/change_first_run',\n validateRequest(createRequestBodySchema(AuthChangePasswordFirstRunSchema), 'post, /v1/auth/change_first_run'),\n authController.changePasswordFirstRun as Midleware\n);\n\nexport default router;\n","import httpStatus from 'http-status';\nimport passport from 'passport';\nimport hasha from 'hasha';\nimport uuidAPIKey from 'uuid-apikey';\nimport { Response, NextFunction } from \"express\"\nimport { User } from '@models';\nimport { catchAsync, errMsg } from '@utils';\nimport log from \"@logger\";\nimport { RequestUser, ExtRequest } from '@types';\nimport { appSettings } from \"@settings\";\n\nfunction getApiKey(): string {\n return uuidAPIKey.create().apiKey;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst apikey = catchAsync(async (req: ExtRequest, res: Response) => {\n const logOpts = {\n user: req?.user?.username || undefined,\n scope: 'apikey',\n msgType: 'GENERATE_API'\n };\n\n const apiKey = getApiKey();\n log.debug(\n `generate API Key for user: '${req.user?.username}'`,\n logOpts\n );\n const hash = hasha(apiKey);\n\n if (!req.user?.username) throw new Error(`Username is empty`);\n\n const user = await User.findOne({ username: req.user.username });\n if (!user) throw new Error(`cannot find the user with username: '${req.user.username}'`);\n\n user.apiKey = hash;\n await user!.save();\n res.status(200).json({ apikey: apiKey });\n});\n\nconst login = catchAsync(async (req: ExtRequest, res: Response, next: NextFunction) => {\n const logOpts = {\n scope: 'login',\n msgType: 'AUTHENTICATION',\n };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n passport.authenticate('local', (err: unknown, user: any, info: any) => {\n if (err) {\n log.error(`Authentication error: '${err}'`, logOpts);\n return res.status(httpStatus.UNAUTHORIZED).json({ message: 'authentication error' });\n }\n if (!user) {\n log.error(`Authentication error: '${info.message}'`, logOpts);\n return res.status(httpStatus.UNAUTHORIZED).json({ message: `Authentication error: '${info.message}'` });\n }\n\n req.logIn(user, (e: unknown) => {\n if (e) {\n log.error(e, logOpts);\n return next(e);\n }\n log.info('user is logged in', { user: user.username });\n return res.status(200).json({ message: 'success' });\n });\n })(req, res, next);\n});\n\nconst logout = catchAsync(async (req: ExtRequest, res: Response) => {\n const logOpts = {\n scope: 'logout',\n msgType: 'AUTHENTICATION',\n };\n try {\n log.debug(`try to log out user: '${req?.user?.username}'`, logOpts);\n await req.logout({}, () => res.status(httpStatus.OK).json({ message: 'success' }));\n } catch (e: unknown) {\n log.error(e, logOpts);\n res.status(httpStatus.INTERNAL_SERVER_ERROR).json({ message: 'fail' });\n }\n});\n\nconst changePassword = catchAsync(async (req: ExtRequest, res: Response) => {\n const logOpts = {\n scope: 'changePassword',\n msgType: 'CHANGE_PASSWORD',\n itemType: 'user',\n ref: req?.user?.username,\n };\n\n const { currentPassword, newPassword } = req.body;\n\n const username = req?.user?.username;\n\n log.debug(`change password for '${username}', params: '${JSON.stringify(req.body)}'`, logOpts);\n\n const user: RequestUser | null = await User.findOne({ username });\n // if (!user) throw new Error(`cannot find user with username: ${username}`);\n\n if (!user) {\n log.error('user is not logged in', logOpts);\n return res.status(httpStatus.UNAUTHORIZED).json({ message: 'user is not logged in' });\n }\n\n try {\n await user.changePassword(currentPassword, newPassword);\n } catch (e: unknown) {\n log.error(e, logOpts);\n return res.status(httpStatus.INTERNAL_SERVER_ERROR).json({ message: errMsg(e) });\n }\n\n log.debug(`password was successfully changed for user: ${req.user?.username}`, logOpts);\n return res.status(200).json({ message: 'success' });\n});\n\nconst changePasswordFirstRun = catchAsync(async (req: ExtRequest, res: Response) => {\n const logOpts = {\n scope: 'changePasswordFirstRun',\n msgType: 'CHANGE_PASSWORD_FIRST_RUN',\n itemType: 'user',\n ref: req?.user?.username,\n };\n\n const { newPassword } = req.body;\n\n const AppSettings = await appSettings;\n\n if ((await AppSettings.isAuthEnabled()) && ((await AppSettings.isFirstRun()))) {\n log.debug(`first run, change password for default 'Administrator', params: '${JSON.stringify(req.body)}'`, logOpts);\n const user = await User.findOne({ username: 'Administrator' }).exec();\n if (!user) throw new Error(`cannot find the Administrator`);\n logOpts.ref = String(user?.username);\n await user.setPassword(newPassword);\n await user.save();\n log.debug('password was successfully changed for default Administrator', logOpts);\n await AppSettings.set('first_run', false);\n res.status(200).json({ message: 'success' });\n } else {\n log.error(`trying to use first run API with no first run state, auth: '${await AppSettings.isAuthEnabled()}', global settings: '${JSON.stringify(await AppSettings.get('first_run'))}'`, logOpts);\n res.status(httpStatus.FORBIDDEN).json({ message: 'forbidden' });\n }\n});\n\nexport {\n login,\n changePassword,\n changePasswordFirstRun,\n logout,\n apikey,\n};\n","[\n {\n \"name\": \"first_run\",\n \"label\": \"First Run\",\n \"description\": \"Indicates if the application is running the first time\",\n \"type\": \"Boolean\",\n \"value\": \"true\",\n \"enabled\": true\n },\n {\n \"name\": \"authentication\",\n \"label\": \"Authentication\",\n \"description\": \"Enable application authentication\",\n \"type\": \"Boolean\",\n \"value\": \"false\",\n \"enabled\": true\n }\n]\n","/* eslint-disable dot-notation */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { AppSettings as AppSettingsModel } from '@models';\nimport initialAppSettings from '../../../seeds/initialAppSettings.json';\nimport { env } from \"@/server/envConfig\";\n\nclass AppSettings {\n private model: any;\n public cache: any;\n\n constructor() {\n this.model = AppSettingsModel;\n this.cache = null; // Initialize cache as null to indicate uninitialized state\n }\n\n async init() {\n this.cache = await this.model.find().lean().exec();\n return this;\n }\n\n private ensureInitialized() {\n if (!this.cache) {\n throw new Error('AppSettings is not initialized. Please call init() before using this method.');\n }\n }\n\n async count(): Promise<number> {\n this.ensureInitialized();\n return this.model.countDocuments().exec();\n }\n\n async loadInitialFromFile(): Promise<void> {\n this.ensureInitialized();\n const settings = initialAppSettings;\n await this.model.insertMany(settings);\n this.cache = settings;\n }\n\n async get(name: string): Promise<any> {\n this.ensureInitialized();\n return this.cache.find((x: any) => x.name === name)\n || (this.model.findOne({ name }).exec());\n }\n\n async set(name: string, value: any): Promise<void> {\n this.ensureInitialized();\n const item = await this.model.findOneAndUpdate({ name }, { value });\n await item.save();\n const cachedItem = this.cache.find((x: any) => x.name === name);\n if (cachedItem) {\n cachedItem['value'] = value;\n }\n }\n\n async enable(name: string): Promise<void> {\n this.ensureInitialized();\n const item = await this.model.findOneAndUpdate({ name }, { enabled: true });\n await item.save();\n const cachedItem = this.cache.find((x: any) => x.name === name);\n if (cachedItem) {\n cachedItem['enabled'] = true;\n }\n }\n\n async disable(name: string): Promise<void> {\n this.ensureInitialized();\n const item = await this.model.findOneAndUpdate({ name }, { enabled: false });\n await item.save();\n const cachedItem = this.cache.find((x: any) => x.name === name);\n if (cachedItem) {\n cachedItem['enabled'] = false;\n }\n }\n\n async isAuthEnabled(): Promise<boolean> {\n this.ensureInitialized();\n return env.SYNGRISI_AUTH || (await this.get('authentication'))?.value === 'true';\n }\n\n async isFirstRun(): Promise<boolean> {\n this.ensureInitialized();\n return (await this.get('first_run'))?.value === 'true';\n }\n}\n\nconst appSettings = (new AppSettings()).init();\nexport { AppSettings, appSettings };\n","import { NextFunction, Request, Response } from 'express';\nimport StatusCodes from 'http-status';\nimport { ZodError, ZodSchema } from 'zod';\nimport { ResponseStatus, ServiceResponse } from './ServiceResponse';\nimport log from '@logger';\nimport { LogOpts } from '@root/src/types';\nimport { errMsg } from './errMsg';\n\nconst logOpts: LogOpts = {\n scope: 'validateRequests',\n itemType: 'type',\n msgType: 'VALIDATION',\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getReceivedValueFromRequest(request: { body: any; query: any; params: any }, path: (string | number)[]): any {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let currentValue: any = request;\n path.forEach(segment => {\n currentValue = currentValue[segment];\n });\n return currentValue;\n}\n\nexport const validateRequest = (schema: ZodSchema, endpoint = '') => (req: Request, res: Response, next: NextFunction) => {\n try {\n schema.parse({\n body: req.body,\n query: req.query,\n params: req.params\n });\n next();\n } catch (err) {\n \n if (err instanceof ZodError) {\n const errors = err.errors.map((e) => {\n const receivedValue = getReceivedValueFromRequest(\n { body: req.body, query: req.query, params: req.params },\n e.path\n );\n return `\\nError path: '${e.path.join('.')}': \\nError ${e.message}, but received ${JSON.stringify(receivedValue)}`;\n }).join(', ');\n\n const errorMessage = ` ${endpoint ? '\\nValidation error in the endpoint: \"' + endpoint + '\"' : ''}`\n + `${errors}, \\nHTTP PROPERTIES:\\n\\tbody: ${JSON.stringify(req.body, null, '\\t')}, `\n +`\\n\\tquery: ${JSON.stringify(req.query, null, '\\t')}, \\n\\tparams: ${JSON.stringify(req.params, null, '\\t')}`;\n\n const statusCode = StatusCodes.BAD_REQUEST;\n log.error(errorMessage, logOpts);\n res.status(statusCode).send(new ServiceResponse<null>(ResponseStatus.Failed, errorMessage, null, statusCode));\n } else {\n log.error(`Unexpected error: ${errMsg(err)}`, logOpts);\n next(err);\n }\n }\n};\n","export enum ResponseStatus {\n Success,\n Failed,\n}\n\nexport class ServiceResponse<T = null> {\n success: boolean;\n message: string;\n responseObject: T;\n statusCode: number;\n\n constructor(status: ResponseStatus, message: string, responseObject: T, statusCode: number) {\n this.success = status === ResponseStatus.Success;\n this.message = message;\n this.responseObject = responseObject;\n this.statusCode = statusCode;\n }\n}","import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';\nimport { z } from 'zod';\nimport { commonValidations } from './utils';\n\nextendZodWithOpenApi(z);\nexport const AuthLoginSchema = z.object({\n username: commonValidations.username,\n password: commonValidations.password\n});\n\nexport const AuthLoginSuccessRespSchema = commonValidations.success;\nexport const AuthChangePasswordSchema = z.object({\n currentPassword: commonValidations.password,\n newPassword: commonValidations.password,\n});\n\nexport const AuthChangePasswordFirstRunSchema = z.object({\n // currentPassword: commonValidations.password,\n newPassword: commonValidations.password,\n});\n\n\nexport const AuthApiKeyRespSchema = z.object({\n apikey: z.string().regex(/^[A-Z0-9]{7}-[A-Z0-9]{7}-[A-Z0-9]{7}-[A-Z0-9]{7}$/).openapi({ example: 'J3QQ400-H7H2V00-2HCH400-M3HK800' }),\n});\n\nexport const AuthLogoutRespSchema = commonValidations.success;\n","import { z } from 'zod';\nimport { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';\n\nimport VersionSchema from '@schemas/common/Version.schema';\nextendZodWithOpenApi(z);\n\nconst mongooseIdRegex = /^[0-9a-fA-F]{24}$/;\nconst id = z\n .string()\n .regex(mongooseIdRegex, {\n message: 'Invalid Mongoose ObjectId format: /^[0-9a-fA-F]{24}$/',\n })\n .openapi({\n description: 'baseline ID',\n example: \"6bbF35cAB3C59dA969edAe79\"\n });\n\nexport const commonValidations = {\n id,\n version: VersionSchema.openapi({ example: \"1.1.2\" }),\n positiveNumberString: z.string().refine(value => {\n const num = Number(value);\n return Number.isInteger(num) && num >= 0;\n }, {\n message: \"String must be a positive number or 0\"\n }),\n password: z.string()\n .min(6)\n .regex(/(?=.*[0-9])/, \"Password must include a number\")\n .regex(/(?=.*[a-z])/, \"Password must include a lowercase letter\")\n .regex(/(?=.*[A-Z])/, \"Password must include an uppercase letter\")\n .refine(value => {\n return /(?=.*[!@#$%^&*(),.?\":{}|<>-])/.test(value);\n }, {\n message: \"Password must include a special symbol\"\n })\n .openapi({ example: \"Aa1!IJASSNOJ\" }),\n username: z.string().min(1).openapi({ example: \"john.doe@example.com\" }),\n // TODO: workaround TBD\n date: z.string().refine(val => {\n const date = new Date(val);\n return !isNaN(date.getTime());\n }, {\n message: 'Invalid date format'\n }),\n paramsId: { params: z.object({ id }) },\n paramsTestId: { params: z.object({ testid: id }) },\n success: z.object({\n message: z.literal(\"success\")\n }),\n};\n","import { z } from 'zod';\n\nconst VersionSchema = z.string()\n .regex(/^\\d+\\.\\d+\\.\\d+$/, 'Version must be in the format \"x.y.z\"')\n .transform((value) => {\n const parts = value.split('.');\n return {\n major: parseInt(parts[0]),\n minor: parseInt(parts[1]),\n patch: parseInt(parts[2]),\n };\n });\n\nexport default VersionSchema;","import StatusCodes from 'http-status';\nimport { z } from 'zod';\nimport { ServiceResponsePaginationSchema } from './serviceResponse';\n\nexport function createApiResponse(schema: z.ZodTypeAny, description: string, statusCode: number = StatusCodes.OK) {\n return {\n [statusCode]: {\n description,\n content: {\n 'application/json': {\n schema,\n },\n },\n },\n };\n}\n\nexport function createApiEmptyResponse(description: string, statusCode: number = StatusCodes.OK) {\n return {\n [statusCode]: {\n description,\n },\n };\n}\n\n\nexport function createPaginatedApiResponse(schema: z.ZodTypeAny, description: string, statusCode:number = StatusCodes.OK) {\n return {\n [statusCode]: {\n description,\n content: {\n 'application/json': {\n schema: ServiceResponsePaginationSchema(schema),\n },\n },\n },\n };\n}\n","import { z } from 'zod';\n\nexport const ServiceResponsePaginationSchema = <T extends z.ZodTypeAny>(dataSchema: T) =>\n z.object({\n results: z.array(dataSchema.optional()),\n page: z.number().openapi({ example: 1 }),\n limit: z.number().openapi({ example: 10 }),\n totalPages: z.number().openapi({ example: 2 }),\n totalResults: z.number().openapi({ example: 12 }),\n timestamp: z.number().openapi({ example: 1718035239731968 }),\n });\n","import { z } from 'zod';\nexport const SkipValid = z.any();\n","import { z } from 'zod';\nexport const createRequestBodySchema = (schema: z.ZodTypeAny) => z.object({ body: schema })","import { z } from 'zod';\nexport const createRequestOpenApiBodySchema = (schema: z.ZodTypeAny) => ({\n content: {\n 'application/json': { schema: schema }\n }\n})","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport { appController } from '@controllers';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { AppInfoRespSchema, AppRespSchema } from '@root/src/server/schemas/App.schema';\nimport {\n createApiResponse,\n createPaginatedApiResponse,\n} from '@api-docs/openAPIResponseBuilders';\nimport { SkipValid } from '@schemas/SkipValid.schema';\nimport { RequestPaginationSchema } from '../../schemas/common/RequestPagination.schema';\nimport { createRequestQuerySchema } from '../../schemas/utils/createRequestQuerySchema';\n\nexport const registry = new OpenAPIRegistry();\n\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/app/info',\n summary: \"The current Syngrisi instance information.\",\n tags: ['App'],\n responses: createApiResponse(AppInfoRespSchema, 'Success'),\n});\n\nrouter.get(\n '/info',\n validateRequest(SkipValid, 'get, /v1/app/info'),\n appController.info as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/app',\n summary: \"List of applications (projects) with pagination, and optional filtering and sorting.\",\n tags: ['App'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(AppRespSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/app'),\n appController.get as Midleware\n);\n\nexport default router;\n","import httpStatus from 'http-status';\nimport { catchAsync } from '@utils';\nimport { genericService } from '@services';\n\nimport { deserializeIfJSON, pick } from '@utils';\nimport { Response } from \"express\";\n\nimport { ApiError } from '@utils';\nimport { ExtRequest } from '@types';\n\nconst get = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = typeof req.query.filter === 'string'\n ? deserializeIfJSON(req.query.filter)\n : {};\n\n // const filter = req.query.filter ? deserializeIfJSON(pick(req.query, ['filter']).filter) : {};\n const options = pick(req.query, ['sortBy', 'limit', 'page', 'populate']);\n const result = await genericService.get('VRSBaseline', filter, options);\n res.send(result);\n});\n\nconst put = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!id) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot update the baseline - Id not found');\n const result = await genericService.put('VRSBaseline', id, req.body, req?.user);\n res.send(result);\n});\n\nexport {\n get,\n put,\n};\n","import { Test, Run } from '@models';\nimport log from '@lib/logger';\nimport * as testService from './test.service';\nimport { RequestUser } from '@types';\nimport httpStatus from 'http-status';\nimport { ApiError } from '../utils';\n\nconst remove = async (id: string, user: RequestUser) => {\n \n const logOpts = {\n scope: 'removeRun',\n itemType: 'run',\n ref: id,\n user: user?.username,\n msgType: 'REMOVE',\n };\n log.info(`remove run with, id: '${id}', user: '${user.username}'`, logOpts);\n const tests = await Test.find({ run: id }).exec();\n\n for (const test of tests) {\n await testService.remove(test._id, user);\n }\n const run = await Run.findByIdAndDelete(id).exec();\n if (!run) {\n throw new ApiError(httpStatus.NOT_FOUND, `cannot remove run with id: '${id}', not found`);\n }\n return run;\n};\n\nexport {\n remove,\n};\n","import { checkService } from './index';\nimport { Test, Check } from '@models';\nimport log from \"../lib/logger\";\nimport { RequestUser } from '@types';\nimport { FilterQuery } from 'mongoose';\nimport { PaginateOptions } from '../models/plugins/utils';\n\n\nconst queryTests = async (filter: FilterQuery<typeof Test>, options: PaginateOptions) => {\n const tests = await Test.paginate(filter, options);\n return tests;\n};\n\nconst queryTestsDistinct = async (filter: FilterQuery<typeof Test>, options: PaginateOptions) => {\n const tests = await Test.paginateDistinct({filter: filter ? JSON.stringify(filter) : null}, options);\n return tests;\n};\n\nconst remove = async (id: string, user: RequestUser) => {\n const logOpts = {\n scope: 'removeTest',\n itemType: 'test',\n ref: id,\n user: user?.username,\n msgType: 'REMOVE',\n };\n log.info(`remove test with, id: '${id}', user: '${user.username}'`, logOpts);\n\n try {\n log.debug(`try to delete all checks associated to test with ID: '${id}'`, logOpts);\n const checks = await Check.find({ test: id });\n for (const check of checks) {\n await checkService.remove(check._id, user);\n }\n return Test.findByIdAndDelete(id);\n } catch (e: unknown) {\n log.error(`cannot remove test with id: ${id} error: ${(e instanceof Error) ? e.stack : String(e)}`, logOpts);\n throw new Error();\n }\n};\n\nconst accept = async (id: string, user: RequestUser) => {\n const logOpts = {\n scope: 'acceptTest',\n itemType: 'test',\n ref: id,\n user: user?.username,\n msgType: 'ACCEPT',\n };\n log.info(`accept test with, id: '${id}', user: '${user.username}'`, logOpts);\n\n const checks = await Check.find({ test: id }).exec();\n\n for (const check of checks) {\n await checkService.accept(check._id, String(check.actualSnapshotId), user);\n }\n return { message: 'success' };\n};\n\nexport {\n queryTests,\n queryTestsDistinct,\n remove,\n accept,\n};\n","import { Test, Suite } from '@models';\nimport * as testService from './test.service';\nimport log from '@lib/logger';\nimport { RequestUser } from '@types';\nimport { ApiError } from '../utils';\nimport httpStatus from 'http-status';\n\nconst remove = async (id: string, user: RequestUser) => {\n const logOpts = {\n scope: 'removeSuite',\n itemType: 'suite',\n ref: id,\n user: user?.username,\n msgType: 'REMOVE',\n };\n log.info(`remove suite with, id: '${id}', user: '${user.username}'`, logOpts);\n const tests = await Test.find({ suite: id }).exec();\n\n for (const test of tests) {\n await testService.remove(test._id, user);\n }\n const suite = await Suite.findByIdAndDelete(id).exec();\n if (!suite) throw new ApiError(httpStatus.NOT_FOUND, `cannot remove suite with id: '${id}', not found`);\n \n return suite;\n};\n\nexport {\n remove,\n};\n","import { Log } from '@models';\nimport log from '@lib/logger';\nimport { LogOpts } from '@root/src/types';\nimport { FilterQuery } from 'mongoose';\nimport { PaginateOptions } from '@models/plugins/utils';\n\n\nconst queryLogs = async (filter: FilterQuery<typeof Log>, options: PaginateOptions) => Log.paginate(filter, options);\n\nconst distinct = async (field: string) => Log.distinct(field);\n\ntype LogBody = LogOpts & { message: string; level?: string };\n\nconst createLogs = async (body: LogBody) => {\n log[(body.level || 'debug') as keyof typeof log](body.message, {\n user: body.user,\n scope: body.scope || 'test_scope',\n msgType: body.msgType || 'TEST_MSG_TYPE',\n });\n return { message: 'success' };\n};\n\nexport {\n queryLogs,\n distinct,\n createLogs,\n};\n","import mongoose, { FilterQuery } from 'mongoose';\nimport { removeEmptyProperties } from '@utils';\nimport log from '@logger';\nimport { ExtededModelMembers, PaginateOptions } from '@models/plugins/utils';\nimport { RequestUser } from '@root/src/types';\n\nconst get = async (modelName: string, filter: FilterQuery<typeof Test>, options: PaginateOptions) => {\n const itemModel = mongoose.model(modelName);\n return (itemModel as unknown as ExtededModelMembers<typeof itemModel>).paginate(filter, options);\n};\n\nconst put = async (modelName: string, id: string, options: { [key: string]: unknown }, user: RequestUser) => {\n const itemModel = mongoose.model(modelName);\n\n const logOpts = {\n scope: 'generic.service.put',\n ref: id,\n itemType: modelName,\n msgType: 'UPDATE',\n user: user?.username,\n };\n\n const opts = removeEmptyProperties(options);\n log.debug(`start update '${modelName}' with id: '${id}', body: '${JSON.stringify(opts)}'`, logOpts);\n const item = await itemModel.findByIdAndUpdate(id, options).exec();\n if (!item) throw new Error(`cannot find the item: ${modelName}, id: ${id}, options: ${JSON.stringify(options)}`);\n\n\n await item.save();\n log.debug(`baseline with id: '${id}' and opts: '${JSON.stringify(opts)}' was updated`, logOpts);\n return item;\n};\n\nexport {\n get,\n put,\n};\n","import { App } from '@models';\nimport { FilterQuery } from 'mongoose';\nimport { PaginateOptions } from '@models/plugins/utils';\n\nconst get = async (filter: FilterQuery<typeof App> , options: PaginateOptions) => App.paginate(filter, options);\n\nexport {\n get,\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable camelcase */\nimport { Response } from \"express\";\nimport { env } from \"@/server/envConfig\";\n\ninterface StringTable {\n create(data: { [key: string]: any }[]): string;\n}\n\nimport fs, { promises as fsp } from 'fs';\n// @ts-ignore\nimport st from 'string-table';\nimport { config } from '@config';\nimport { subDays, dateToISO8601 } from '@utils';\nimport { ProgressBar } from '@utils';\nimport log from \"../lib/logger\";\nimport testAdminUser from '../../seeds/testAdmin.json'\nconst stringTable: StringTable = st;\n\nimport {\n Snapshot,\n Check,\n Test,\n Run,\n Suite,\n User,\n Log,\n Baseline,\n} from '@models';\nimport { ExtRequest } from '@types';\n\nfunction taskOutput(msg: any, res: any) {\n res.write(`${msg.toString()}\\n`);\n log.debug(msg.toString());\n}\n\nfunction parseHrtimeToSeconds(hrtime: any) {\n return (hrtime[0] + (hrtime[1] / 1e9)).toFixed(3);\n}\n\nconst status = async (currentUser: any) => {\n const count = await User.countDocuments().exec();\n\n log.silly(`server status: check users counts: ${count}`);\n if (count > 1) {\n return { alive: true, currentUser: currentUser?.username };\n }\n return { alive: false };\n};\n\nconst screenshots = async () => {\n const files = fs.readdirSync(config.defaultImagesPath);\n return files;\n};\n\nconst loadTestUser = async () => {\n const logOpts = {\n itemType: 'user',\n msgType: 'LOAD',\n ref: 'Administrator',\n };\n if (!env.SYNGRISI_TEST_MODE) {\n return { message: 'the feature works only in test mode' };\n }\n const testAdmin = await User.findOne({ username: 'Test' }).exec();\n if (!testAdmin) {\n log.info('create the test Administrator', logOpts);\n const admin = await User.create(testAdminUser);\n log.info(`test Administrator with id: '${admin._id}' was created`, logOpts);\n return admin;\n }\n\n log.info(`test admin is exists: ${JSON.stringify(testAdmin, null, 2)}`, logOpts);\n return { msg: `already exist '${testAdmin}'` };\n};\n\nconst task_handle_database_consistency = async (options: any, res: any) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Content-Encoding': 'none',\n 'x-no-compression': 'true',\n });\n try {\n const startTime = process.hrtime();\n taskOutput('- starting...\\n', res);\n taskOutput('---------------------------------', res);\n taskOutput('STAGE #1: Calculate Common stats', res);\n taskOutput('get runs data', res);\n const allRunsBefore = await Run.find().exec();\n taskOutput('get suites data', res);\n const allSuitesBefore = await Suite.find().exec();\n taskOutput('get tests data', res);\n const allTestsBefore = await Test.find().lean().exec();\n taskOutput('get checks data', res);\n const allChecksBefore = await Check.find().lean().exec();\n taskOutput('get snapshots data', res);\n const allSnapshotsBefore = await Snapshot.find().lean().exec();\n taskOutput('get files data', res);\n const allFilesBefore = (await fsp.readdir(config.defaultImagesPath, { withFileTypes: true }))\n .filter((item: any) => !item.isDirectory())\n .map((x: any) => x.name)\n .filter((x: any) => x.includes('.png'));\n\n taskOutput('-----------------------------', res);\n const beforeStatTable = stringTable.create([\n { item: 'suites', count: allSuitesBefore.length },\n { item: 'runs', count: allRunsBefore.length },\n { item: 'tests', count: allTestsBefore.length },\n { item: 'checks', count: allChecksBefore.length },\n { item: 'snapshots', count: allSnapshotsBefore.length },\n { item: 'files', count: allFilesBefore.length },\n ]);\n res.flush();\n taskOutput(beforeStatTable, res);\n\n taskOutput('---------------------------------', res);\n taskOutput('STAGE #2: Calculate Inconsistent Items', res);\n taskOutput('> calculate abandoned snapshots', res);\n const abandonedSnapshots = allSnapshotsBefore.filter((sn: any) => !fs.existsSync(`${config.defaultImagesPath}/${sn.filename}`));\n\n taskOutput('> calculate abandoned files', res);\n const snapshotsUniqueFiles = Array.from(new Set(allSnapshotsBefore.map((x: any) => x.filename)));\n const abandonedFiles: any[] = [];\n const progress = new ProgressBar(allFilesBefore.length);\n for (const [index, file] of allFilesBefore.entries()) {\n setTimeout(() => {\n progress.writeIfChange(index, allFilesBefore.length, taskOutput, res);\n }, 10);\n\n if (!snapshotsUniqueFiles.includes(file.toString())) {\n abandonedFiles.push(file);\n }\n }\n taskOutput('> calculate abandoned checks', res);\n const allSnapshotsBeforeIds = allSnapshotsBefore.map((x: any) => x._id.valueOf());\n\n const allChecksBeforeLight = allChecksBefore.map((x: any) => ({\n _id: x._id.valueOf(), baselineId: x.baselineId.valueOf(), actualSnapshotId: x.actualSnapshotId.valueOf(),\n }));\n const abandonedChecks: any[] = [];\n const progressChecks = new ProgressBar(allChecksBefore.length);\n for (const [index, check] of allChecksBeforeLight.entries()) {\n progressChecks.writeIfChange(index, allChecksBeforeLight.length, taskOutput, res);\n if (!allSnapshotsBeforeIds.includes(check.baselineId) || !allSnapshotsBeforeIds.includes(check.actualSnapshotId.valueOf())) {\n abandonedChecks.push(check._id.valueOf());\n }\n }\n\n taskOutput('> calculate empty tests', res);\n const checksUniqueTests = (await Check.find().lean().distinct('test').exec()).map((x: any) => x.valueOf());\n\n const emptyTests: any[] = [];\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for (const [index, test] of allTestsBefore.entries()) {\n if (!checksUniqueTests.includes(test._id.valueOf())) {\n emptyTests.push(test._id.valueOf());\n }\n }\n\n taskOutput('> calculate empty runs', res);\n\n const checksUniqueRuns = (await Check.find().distinct('run').exec()).map((x: any) => x.valueOf());\n\n const emptyRuns: any[] = [];\n for (const run of allRunsBefore) {\n if (!checksUniqueRuns.includes(run._id.valueOf())) {\n emptyRuns.push(run._id.valueOf());\n }\n }\n\n taskOutput('> calculate empty suites', res);\n\n const checksUniqueSuites = (await Check.find().distinct('suite').exec()).map((x: any) => x.valueOf());\n\n const emptySuites: any[] = [];\n for (const suite of allSuitesBefore) {\n if (!checksUniqueSuites.includes(suite._id.valueOf())) {\n emptySuites.push(suite._id.valueOf());\n }\n }\n taskOutput('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', res);\n taskOutput('Current inconsistent items:', res);\n const inconsistentStatTable = stringTable.create([\n { item: 'empty suites', count: emptySuites.length },\n { item: 'empty runs', count: emptyRuns.length },\n { item: 'empty tests', count: emptyTests.length },\n { item: 'abandoned checks', count: abandonedChecks.length },\n { item: 'abandoned snapshots', count: abandonedSnapshots.length },\n { item: 'abandoned files', count: abandonedFiles.length },\n ]);\n taskOutput(inconsistentStatTable, res);\n\n if (options.clean) {\n taskOutput('---------------------------------', res);\n taskOutput('STAGE #3: Remove non consistent items', res);\n\n taskOutput('> remove empty suites', res);\n await Suite.deleteMany({ _id: { $in: emptySuites } });\n taskOutput('> remove empty runs', res);\n await Run.deleteMany({ _id: { $in: emptyRuns } });\n taskOutput('> remove empty tests', res);\n await Test.deleteMany({ _id: { $in: emptyTests } });\n taskOutput('> remove abandoned checks', res);\n await Check.deleteMany({ _id: { $in: abandonedChecks } });\n taskOutput('> remove abandoned snapshots', res);\n await Snapshot.deleteMany({ _id: { $in: abandonedSnapshots } });\n taskOutput('> remove abandoned files', res);\n await Promise.all(abandonedFiles.map((filename) => fsp.unlink(`${config.defaultImagesPath}/${filename}`)));\n const allFilesAfter = fs.readdirSync(config.defaultImagesPath, { withFileTypes: true })\n .filter((item: any) => !item.isDirectory())\n .map((x: any) => x.name)\n .filter((x: any) => x.includes('.png'));\n\n taskOutput('STAGE #4: Calculate Common stats after cleaning', res);\n taskOutput('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~', res);\n taskOutput('Current items:', res);\n const afterStatTable = stringTable.create([\n { item: 'suites', count: await Suite.countDocuments() },\n { item: 'runs', count: await Run.countDocuments() },\n { item: 'tests', count: await Test.countDocuments() },\n { item: 'checks', count: await Check.countDocuments() },\n { item: 'snapshots', count: await Snapshot.countDocuments() },\n { item: 'files', count: allFilesAfter.length },\n ]);\n taskOutput(afterStatTable, res);\n }\n\n const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(startTime));\n taskOutput(`> Done in ${elapsedSeconds} seconds, ${elapsedSeconds / 60} min`, res);\n taskOutput('- end...\\n', res);\n } catch (e: unknown) {\n const errMsg = e instanceof Error ? e.message : String(e);\n log.error(errMsg);\n taskOutput(errMsg, res);\n } finally {\n res.end();\n }\n};\n\nconst task_remove_old_logs = async (options: any, res: any) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Content-Encoding': 'none',\n });\n const trashHoldDate = subDays(new Date(), parseInt(options.days, 10));\n const filter = { timestamp: { $lt: trashHoldDate } };\n const allLogsCountBefore = await Log.find({}).countDocuments();\n const oldLogsCount = await Log.find(filter).countDocuments();\n taskOutput(`- the count of all documents is: '${allLogsCountBefore}'\\n`, res);\n taskOutput(`- the count of documents to be removed is: '${oldLogsCount}'\\n`, res);\n if (options.statistics === 'false') {\n taskOutput(`- will remove all logs older that: '${options.days}' days, '${dateToISO8601(trashHoldDate)}'\\n`, res);\n await Log.deleteMany(filter);\n const allLogsCountAfter = await Log.find({}).countDocuments();\n taskOutput(`- the count of all documents now is: '${allLogsCountAfter}'\\n`, res);\n }\n\n taskOutput('> Done', res);\n res.end();\n};\n\nconst task_handle_old_checks = async (options: any, res: any) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Content-Encoding': 'none',\n });\n try {\n const startTime = process.hrtime();\n taskOutput('- starting...\\n', res);\n\n taskOutput('STAGE #1 Calculate common stats', res);\n\n const trashHoldDate = subDays(new Date(), parseInt(options.days, 10));\n\n taskOutput('> get all checks data', res);\n const allChecksBefore = await Check.find().lean().exec();\n taskOutput('> get snapshots data', res);\n const allSnapshotsBefore = await Snapshot.find().lean().exec();\n taskOutput('> get files data', res);\n const allFilesBefore = (await fsp.readdir(config.defaultImagesPath, { withFileTypes: true }))\n .filter((item: any) => !item.isDirectory())\n .map((x: any) => x.name)\n .filter((x: any) => x.includes('.png'));\n\n taskOutput('> get old checks data', res);\n const oldChecks = await Check.find({ createdDate: { $lt: trashHoldDate } }).lean().exec();\n\n taskOutput('>>> collect all baselineIds for old Checks ', res);\n const oldSnapshotsBaselineIdIds = oldChecks.map((x: any) => x.baselineId).filter((x: any) => x);\n\n taskOutput('>>> collect all actualSnapshotId for old Checks ', res);\n const oldSnapshotsActualSnapshotIdIds = oldChecks.map((x: any) => x.actualSnapshotId).filter((x: any) => x);\n\n taskOutput('>>> collect all diffId for old Checks ', res);\n const oldSnapshotsDiffIds = oldChecks.map((x: any) => x.diffId).filter((x: any) => x);\n\n taskOutput('>>> calculate all unique snapshots ids for old Checks ', res);\n\n const allOldSnapshotsUniqueIds = Array.from(new Set([...oldSnapshotsBaselineIdIds, ...oldSnapshotsActualSnapshotIdIds, ...oldSnapshotsDiffIds]))\n .map((x: any) => x.valueOf());\n\n taskOutput('>>> collect all old snapshots', res);\n const oldSnapshots = await Snapshot.find({ _id: { $in: allOldSnapshotsUniqueIds } }).lean();\n\n const outTable = stringTable.create([\n { item: 'all checks', count: allChecksBefore.length },\n { item: 'all snapshots', count: allSnapshotsBefore.length },\n { item: 'all files', count: allFilesBefore.length },\n { item: `checks older than: '${options.days}' days`, count: oldChecks.length },\n { item: 'old snapshots baseline ids', count: oldSnapshotsBaselineIdIds.length },\n { item: 'old snapshots actual snapshotId', count: oldSnapshotsActualSnapshotIdIds.length },\n { item: 'old snapshots diffIds', count: oldSnapshotsDiffIds.length },\n { item: 'all old snapshots unique Ids', count: allOldSnapshotsUniqueIds.length },\n { item: 'all old snapshots', count: oldSnapshots.length },\n ]);\n\n taskOutput(outTable, res);\n\n if (options.remove === 'true') {\n taskOutput(`STAGE #2 Remove checks that older that: '${options.days}' days, '${dateToISO8601(trashHoldDate)}'\\n`, res);\n\n taskOutput('> remove checks', res);\n const checkRemovingResult = await Check.deleteMany({ createdDate: { $lt: trashHoldDate } });\n taskOutput(`>>> removed: '${checkRemovingResult.deletedCount}'`, res);\n\n taskOutput('> remove snapshots', res);\n\n taskOutput('>> collect data to removing', res);\n taskOutput('>>> get all baselines snapshots id`s', res);\n const baselinesSnapshotsIds = (await Baseline.find({}).distinct('snapshootId'));\n\n taskOutput('>>> get all checks snapshots baselineId', res);\n const checksSnapshotsBaselineId = (await Check.find({}).distinct('baselineId'));\n\n taskOutput('>>> get all checks snapshots actualSnapshotId', res);\n const checksSnapshotsActualSnapshotId = (await Check.find({}).distinct('actualSnapshotId'));\n\n taskOutput('>> remove baselines snapshots', res);\n\n taskOutput('>> remove all old snapshots that not related to new baseline and check items', res);\n const removedByBaselineSnapshotsResult = await Snapshot.deleteMany({\n $and: [\n { _id: { $nin: checksSnapshotsBaselineId } },\n { _id: { $nin: checksSnapshotsActualSnapshotId } },\n { _id: { $nin: baselinesSnapshotsIds } },\n { _id: { $in: oldSnapshotsBaselineIdIds } },\n ],\n });\n taskOutput(`>>> removed: '${removedByBaselineSnapshotsResult.deletedCount}'`, res);\n\n taskOutput('>> remove actual snapshots', res);\n taskOutput('>> remove all old snapshots that not related to new baseline and check items', res);\n const removedByActualSnapshotsResult = await Snapshot.deleteMany({\n $and: [\n { _id: { $nin: checksSnapshotsBaselineId } },\n { _id: { $nin: checksSnapshotsActualSnapshotId } },\n { _id: { $nin: baselinesSnapshotsIds } },\n { _id: { $in: oldSnapshotsActualSnapshotIdIds } },\n ],\n });\n taskOutput(`>>> removed: '${removedByActualSnapshotsResult.deletedCount}'`, res);\n\n taskOutput('>> remove all old diff snapshots', res);\n const removedByDiffSnapshotsResult = await Snapshot.deleteMany({\n $and: [\n { _id: { $in: oldSnapshotsDiffIds } },\n ],\n });\n taskOutput(`>>> removed: '${removedByDiffSnapshotsResult.deletedCount}'`, res);\n\n taskOutput('> remove files', res);\n taskOutput('>>> collect all old snapshots filenames', res);\n const oldSnapshotsUniqueFilenames = Array.from(new Set(oldSnapshots.map((x: any) => x.filename)));\n taskOutput(`>> found: ${oldSnapshotsUniqueFilenames.length}`, res);\n\n taskOutput('> get all current snapshots filenames', res);\n const allCurrentSnapshotsFilenames = await Snapshot.find().distinct('filename').exec();\n\n taskOutput('>> calculate interception between all current snapshot filenames and old shapshots filenames', res);\n const arrayIntersection = (arr1: any, arr2: any) => arr1.filter((x: any) => arr2.includes(x));\n const filesInterception = arrayIntersection(allCurrentSnapshotsFilenames, oldSnapshotsUniqueFilenames);\n taskOutput(`>> found: ${filesInterception.length}`, res);\n\n taskOutput('>> calculate filenames to remove', res);\n const arrayDiff = (arr1: any, arr2: any) => arr1.filter((x: any) => !arr2.includes(x));\n const filesToDelete = arrayDiff(oldSnapshotsUniqueFilenames, filesInterception);\n taskOutput(`>> found: ${filesToDelete.length}`, res);\n\n taskOutput(`>> remove these files: ${filesToDelete.length}`, res);\n await Promise.all(filesToDelete.map((filename: string) => fsp.unlink(`${config.defaultImagesPath}/${filename}`)));\n taskOutput(`>> done: ${filesToDelete.length}`, res);\n\n taskOutput('STAGE #3 Calculate common stats after Removing', res);\n\n taskOutput('> get all checks data', res);\n const allChecksAfter = await Check.find().lean().exec();\n taskOutput('> get snapshots data', res);\n const allSnapshotsAfter = await Snapshot.find().lean().exec();\n taskOutput('> get files data', res);\n const allFilesAfter = (await fsp.readdir(config.defaultImagesPath, { withFileTypes: true }))\n .filter((item: any) => !item.isDirectory())\n .map((x: any) => x.name)\n .filter((x: any) => x.includes('.png'));\n\n const outTableAfter = stringTable.create([\n { item: 'all checks', count: allChecksAfter.length },\n { item: 'all snapshots', count: allSnapshotsAfter.length },\n { item: 'all files', count: allFilesAfter.length },\n ]);\n\n taskOutput(outTableAfter, res);\n }\n const elapsedSeconds = parseHrtimeToSeconds(process.hrtime(startTime));\n\n taskOutput(`> done in ${elapsedSeconds} seconds ${elapsedSeconds / 60} min`, res);\n } catch (e: unknown) {\n const errMsg = e instanceof Error ? e.message : String(e);\n log.error(errMsg);\n taskOutput(errMsg, res);\n } finally {\n res.end();\n }\n};\n\nconst task_test = async (options = 'empty', req: ExtRequest, res: Response) => {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Content-Encoding': 'none',\n });\n\n const x = 1000;\n // const interval = 30;\n let isAborted = false;\n\n req.on('close', () => {\n isAborted = true;\n });\n\n for (let i = 0; i < x; i += 1) {\n // await new Promise((r) => setTimeout(() => r(), interval));\n taskOutput(`- Task Output: '${i}', options: ${options}\\n`, res);\n if (isAborted) {\n taskOutput('the task was aborted\\n', res);\n log.warn('the task was aborted');\n (res as any).flush();\n return res.end();\n }\n }\n return res.end();\n};\n\nexport {\n task_test,\n task_handle_old_checks,\n task_handle_database_consistency,\n task_remove_old_logs,\n status,\n loadTestUser,\n screenshots,\n};\n","{\n\t\"username\" : \"Test\",\n \"firstName\": \"Test\",\n \"lastName\": \"Admin\",\n\t\"role\" : \"admin\",\n \"openPassw\": \"123456aA-\",\n\t\"password\" : \"5b8d4960316d1fb0c92498c90da6c397cdf247cae71f01467a88e2b42d7af6f5ac7ca75d3bea6e3e0078111a2e5dfc1611f9a9a8908a5a3af5bcd64c42989608977de192829bdf8ada113a60f8f0704443c659789761865e29a3103dbf0773f5bf31e4685d475ece56afaceb949b6e7467eaa287a02e4142d095bcbf84acaefe47ee080799a28188890d39d3397e285d8b46c9a0efe9517428825b64ee1ebcc96d92c084733db866c767341381b6254aaa1ef36d1bf3d24e3f5b8d8b6b4080589b130e9c90914a3da74e5b6adf5f569bfd77460abae8ae4f87c2a375397a37f09861b9e114cead0cc34fff2d631fd4294260dea17e4fe098940dbee2cb80c62eb3701d40f5b204de776b8252d55e5f567c599b1fbcdae79278d1f375a4c8244a26a3b721dbeec56c8f39b3eb810942d392aae371ea81ded6b820dd4b489566a33c495f5c291ff238d07202d2ff04c52426828e44af98ec056a42d13f4b166ec170083e2fff9efe2b8cfdde529f3bce56b8427cf2d188861808ad07fd13e073b2a804e818b2882c13f559d52420b49f301263a9de34fe22b6df4a82ae70e7e4c29c88479878d2c21fbb810532532e7ad9a28f610b63033520e703f178e7b44d3e101ec0d4339c085ccc8bb290b3cb996c75c2b8deaacba8098b9ec02c7e47542891da3bd887c31cd8e0bdfa56bb844b1703368afe8dc42d668ff2e3374b939b4f\",\n\t\"apiKey\" : \"\",\n\t\"salt\" : \"c6211751bdc372f491a86bcbd8e4196dc393d14e14e5f17019d5c317afd5bc27\"\n}","import fs, { promises as fsp } from 'fs';\nimport hasha from 'hasha';\nimport { Snapshot, Check, Test, App, Baseline, CheckDocument } from '@models';\nimport { removeEmptyProperties, waitUntil, buildIdentObject, calculateAcceptedStatus, ident, errMsg, ApiError } from '@utils';\nimport { updateItemDate, createTest, createItemIfNotExistAsync, createRunIfNotExist, createSuiteIfNotExist } from '@lib/dbItems';\nimport { config } from '@config';\nimport { prettyCheckParams } from '@utils';\nimport { getDiff } from '@lib/сomparison';\nimport log from \"@logger\";\nimport { LogOpts } from '@types';\nimport { UpdateTestType } from '@schemas/Test.schema';\nimport { ClientStartSessionType } from '@schemas/Client.schema';\nimport { RequiredIdentOptionsType } from '@schemas';\nimport { SnapshotDiff } from '@schemas/SnapshotDiff.schema';\nimport { SnapshotDocument } from '@models/Snapshot.model';\n// import { BaselineType } from '@schemas/Baseline.schema';\nimport { PaginateOptions } from '@models/plugins/utils';\nimport httpStatus from 'http-status';\nimport { UserDocument } from '@models/User.model';\nimport { UploadedFile } from 'express-fileupload';\nimport { TestDocument } from '@models/Test.model';\nimport { AppDocument } from '@models/App.model';\nimport { IdentType } from '@utils/buildIdentObject';\nimport StatusCodes from 'http-status';\nimport { SuiteDocument } from '@models/Suite.model';\nimport { BaselineDocument } from '../models/Baseline.model';\n\n\nasync function updateTest(id: string, update: UpdateTestType) {\n const logOpts: LogOpts = {\n scope: 'updateTest',\n itemType: 'test',\n msgType: 'UPDATE',\n ref: id,\n };\n log.debug(`update test id '${id}' with params '${JSON.stringify(update)}'`, logOpts);\n const updatedDate = update.updatedDate || Date.now();\n const test = await Test.findByIdAndUpdate(\n id,\n { ...update, updatedDate }\n ).exec();\n await test?.save();\n return test;\n}\n\nconst startSession = async (params: ClientStartSessionType, username: string) => {\n const logOpts = {\n scope: 'createTest',\n user: username,\n itemType: 'test',\n msgType: 'CREATE',\n };\n log.info(`create test with name '${params.name}', params: '${JSON.stringify(params)}'`, logOpts);\n const opts = removeEmptyProperties({\n name: params.name,\n status: 'Running',\n app: params.app,\n tags: params.tags && JSON.parse(params.tags),\n branch: params.branch,\n viewport: params.viewport,\n browserName: params.browser,\n browserVersion: params.browserVersion,\n browserFullVersion: params.browserFullVersion,\n os: params.os,\n startDate: new Date(),\n updatedDate: new Date(),\n });\n try {\n const app = await createItemIfNotExistAsync(\n 'VRSApp',\n { name: params.app },\n { user: username, itemType: 'app' }\n );\n opts.app = app._id;\n\n const run = await createRunIfNotExist(\n { name: params.run, ident: params.runident, app: app._id },\n { user: username, itemType: 'run' }\n );\n opts.run = run._id;\n\n const suite = await createSuiteIfNotExist(\n { name: params.suite || 'Others', app: app._id, createdDate: new Date() },\n { user: username, itemType: 'suite' }\n );\n\n opts.suite = suite._id;\n\n const test = await createTest(opts);\n return test;\n } catch (e: unknown) {\n log.error(`cannot start session '${params.name}', params: '${JSON.stringify(params)}', error: ${errMsg(e)}`, logOpts);\n throw e;\n }\n};\n\nconst endSession = async (testId: string, username: string) => {\n const logOpts = {\n scope: 'stopSession',\n msgType: 'END_SESSION',\n user: username,\n itemType: 'test',\n ref: testId,\n };\n await waitUntil(async () => (await Check.find({ test: testId }).exec()).filter((ch) => ch.status.toString() !== 'pending').length > 0);\n const sessionChecks = await Check.find({ test: testId }).lean().exec();\n\n const checksStatuses = sessionChecks.map((x) => x.status[0]);\n // const checksViewports = sessionChecks.map((x) => x.viewport);\n\n // const uniqueChecksViewports = Array.from(new Set(checksViewports));\n // let calculatedViewport: string | undefined;\n // if (uniqueChecksViewports.length === 1) {\n // calculatedViewport = uniqueChecksViewports[0];\n // } else {\n // calculatedViewport = String(uniqueChecksViewports.length);\n // }\n\n let status = 'not set';\n if (checksStatuses.some((st) => st === 'failed')) {\n status = 'Failed';\n }\n if (checksStatuses.some((st) => st === 'passed') && !checksStatuses.some((st) => st === 'failed')) {\n status = 'Passed';\n }\n if (checksStatuses.some((st) => st === 'new') && !checksStatuses.some((st) => st === 'failed')) {\n status = 'Passed';\n }\n if (checksStatuses.some((st) => st === 'blinking') && !checksStatuses.some((st) => st === 'failed')) {\n status = 'Passed';\n }\n if (checksStatuses.every((st) => st === 'new')) {\n status = 'New';\n }\n const blinking = checksStatuses.filter((g) => g === 'blinking').length;\n const testParams = {\n status,\n blinking,\n // calculatedViewport,\n };\n log.info(`the session is over, the test will be updated with parameters: '${JSON.stringify(testParams)}'`, logOpts);\n const updatedTest = await updateTest(testId, testParams);\n const result = updatedTest?.toObject();\n // result.calculatedStatus = status;\n return result;\n};\n\nasync function getAcceptedBaseline(params: IdentType) {\n const identFieldsAccepted = Object.assign(buildIdentObject(params), { markedAs: 'accepted' });\n const acceptedBaseline = await Baseline.findOne(identFieldsAccepted, {}, { sort: { createdDate: -1 } });\n log.debug(`acceptedBaseline: '${acceptedBaseline ? JSON.stringify(acceptedBaseline) : 'not found'}'`, { itemType: 'baseline' });\n if (acceptedBaseline) return acceptedBaseline;\n return null;\n}\n\nasync function getLastSuccessCheck(identifier: RequiredIdentOptionsType) {\n const condition = [{\n ...identifier,\n status: 'new',\n }, {\n ...identifier,\n status: 'passed',\n }];\n return (await Check.find({ $or: condition }).sort({ updatedDate: -1 }).limit(1))[0];\n}\n\nasync function getNotPendingChecksByIdent(identifier: RequiredIdentOptionsType) {\n return Check.find({\n ...identifier,\n status: { $ne: 'pending' },\n }).sort({ updatedDate: -1 }).exec();\n}\n\nasync function getSnapshotByImgHash(hash: string): Promise<SnapshotDocument | null> {\n return Snapshot.findOne({ imghash: hash });\n}\n\ninterface CreateSnapshotParameters {\n name: string;\n fileData: Buffer | null;\n hashCode?: string;\n}\n\nasync function createSnapshot(parameters: CreateSnapshotParameters) {\n const logOpts: LogOpts = {\n scope: 'createSnapshot',\n itemType: 'snapshot',\n msgType: 'CREATE'\n };\n\n const { name, fileData, hashCode } = parameters;\n\n const opts: Partial<SnapshotDocument> = { name };\n // const opts: SnapshotUpdateType = { name };\n\n // if (!fileData) throw new Error(`cannot create the snapshot, the 'fileData' is not set, name: '${name}'`);\n if (fileData === null) throw new ApiError(httpStatus.BAD_REQUEST, `cannot create the snapshot, the 'fileData' is not set, name: '${name}'`);\n\n\n opts.imghash = hashCode || hasha(fileData);\n const snapshot = new Snapshot(opts);\n const filename = `${snapshot.id}.png`;\n const path = `${config.defaultImagesPath}${filename}`;\n log.debug(`save screenshot for: '${name}' snapshot to: '${path}'`, logOpts);\n await fsp.writeFile(path, fileData);\n snapshot.filename = filename;\n await snapshot.save();\n log.debug(`snapshot was saved: '${JSON.stringify(snapshot)}'`, { ...logOpts, ...{ ref: snapshot._id } });\n return snapshot;\n}\n\nasync function cloneSnapshot(sourceSnapshot: SnapshotDocument, name: string) {\n const { filename } = sourceSnapshot;\n const hashCode = sourceSnapshot.imghash;\n const newSnapshot = new Snapshot({ name, filename, imghash: hashCode });\n await newSnapshot.save();\n return newSnapshot;\n}\n\ninterface CompareSnapshotsOptions {\n vShifting?: boolean;\n ignore?: string;\n ignoredBoxes?: string;\n}\n\nasync function compareSnapshots(baselineSnapshot: SnapshotDocument, actual: SnapshotDocument, opts: CompareSnapshotsOptions = {}) {\n const logOpts = {\n scope: 'compareSnapshots',\n ref: baselineSnapshot.id,\n itemType: 'snapshot',\n msgType: 'COMPARE',\n };\n try {\n log.debug(`compare baseline and actual snapshots with ids: [${baselineSnapshot.id}, ${actual.id}]`, logOpts);\n log.debug(`current baseline snapshot: ${JSON.stringify(baselineSnapshot)}`, logOpts);\n let diff: SnapshotDiff;\n if (baselineSnapshot.imghash === actual.imghash) {\n log.debug(`baseline and actual snapshot have the identical image hashes: '${baselineSnapshot.imghash}'`, logOpts);\n diff = {\n isSameDimensions: true,\n dimensionDifference: { width: 0, height: 0 },\n rawMisMatchPercentage: 0,\n misMatchPercentage: '0.00',\n analysisTime: 0,\n executionTotalTime: '0',\n getBuffer: null\n };\n } else {\n const baselinePath = `${config.defaultImagesPath}${baselineSnapshot.filename}`;\n const actualPath = `${config.defaultImagesPath}${actual.filename}`;\n const baselineData = await fsp.readFile(baselinePath);\n const actualData = await fsp.readFile(actualPath);\n log.debug(`baseline path: ${baselinePath}`, logOpts);\n log.debug(`actual path: ${actualPath}`, logOpts);\n const options = opts;\n const baseline = await Baseline.findOne({ snapshootId: baselineSnapshot._id }).exec();\n\n if (baseline) { // ts refactoring TODO: find out a proper way\n if (baseline.ignoreRegions) {\n log.debug(`ignore regions: '${baseline.ignoreRegions}', type: '${typeof baseline.ignoreRegions}'`);\n options.ignoredBoxes = JSON.parse(baseline.ignoreRegions);\n }\n options.ignore = baseline.matchType || 'nothing';\n }\n\n diff = await getDiff(baselineData, actualData, options);\n }\n\n log.silly(`the diff is: '${JSON.stringify(diff, null, 2)}'`);\n if (diff.rawMisMatchPercentage.toString() !== '0') {\n log.debug(`images are different, ids: [${baselineSnapshot.id}, ${actual.id}], rawMisMatchPercentage: '${diff.rawMisMatchPercentage}'`);\n }\n if (diff.stabMethod && diff.vOffset) {\n if (diff.stabMethod === 'downup') {\n actual.vOffset = -diff.vOffset;\n await actual.save();\n }\n if (diff.stabMethod === 'updown') {\n baselineSnapshot.vOffset = -diff.vOffset;\n await baselineSnapshot.save();\n }\n }\n return diff;\n } catch (e: unknown) {\n const errMsg = `cannot compare snapshots: ${e}\\n ${e instanceof Error ? e.stack : e}`;\n log.error(errMsg, logOpts);\n throw new Error(String(e));\n }\n}\n\nconst isBaselineValid = (baseline: BaselineDocument) => {\n const keys = [\n 'name', 'app', 'branch', 'browserName', 'viewport', 'os',\n 'createdDate', 'lastMarkedDate', 'markedAs', 'markedById', 'markedByUsername', 'snapshootId',\n ];\n for (const key of keys) {\n if (!baseline[key as keyof BaselineDocument]) {\n log.error(`invalid baseline, the '${key}' property is empty`);\n return false;\n }\n }\n return true;\n};\n\nconst updateCheckParamsFromBaseline = (params: CreateCheckParamsExtended, baseline: BaselineDocument): CreateCheckParamsExtended => {\n const updatedParams = { ...params };\n updatedParams.baselineId = baseline.snapshootId.toString();\n updatedParams.markedAs = baseline.markedAs;\n updatedParams.markedDate = baseline.lastMarkedDate?.toString();\n updatedParams.markedByUsername = baseline.markedByUsername;\n return updatedParams;\n};\n\nconst prepareActualSnapshot = async (checkParam: CreateCheckParams, snapshotFoundedByHashcode: SnapshotDocument | null, logOpts: LogOpts) => {\n let currentSnapshot: SnapshotDocument;\n const fileData = checkParam.files ? checkParam.files.file.data : null;\n\n if (snapshotFoundedByHashcode) {\n const fullFilename = `${config.defaultImagesPath}${snapshotFoundedByHashcode.filename}`;\n if (!fs.existsSync(fullFilename)) {\n throw new Error(`Couldn't find the baseline file: '${fullFilename}'`);\n }\n\n log.debug(`snapshot with such hashcode: '${checkParam.hashCode}' is already exists, will clone it`, logOpts);\n\n if (!checkParam.name) throw new ApiError(httpStatus.BAD_REQUEST, `Cannot prepareActualSnapshot name is empty, hashe: ${checkParam.hashCode}`);\n currentSnapshot = await cloneSnapshot(snapshotFoundedByHashcode, checkParam.name);\n } else {\n log.debug(`snapshot with such hashcode: '${checkParam.hashCode}' does not exists, will create it`, logOpts);\n currentSnapshot = await createSnapshot({ name: checkParam.name!, fileData, hashCode: checkParam.hashCode });\n }\n\n return currentSnapshot;\n};\n\nasync function isNeedFiles(checkParam: CreateCheckParams, logOpts: LogOpts)\n : Promise<{ needFilesStatus: boolean; snapshotFoundedByHashcode: SnapshotDocument | null; }> {\n const snapshotFoundedByHashcode = await getSnapshotByImgHash(checkParam.hashCode);\n\n if (!checkParam.hashCode && !checkParam.files) {\n log.debug('hashCode or files parameters should be present', logOpts);\n return { needFilesStatus: true, snapshotFoundedByHashcode };\n }\n\n if (!checkParam.files && !snapshotFoundedByHashcode) {\n log.debug(`cannot find the snapshot with hash: '${checkParam.hashCode}'`, logOpts);\n return { needFilesStatus: true, snapshotFoundedByHashcode };\n }\n return { needFilesStatus: false, snapshotFoundedByHashcode };\n}\n\nasync function inspectBaseline(\n newCheckParams: CreateCheckParamsExtended,\n storedBaseline: BaselineDocument | null,\n checkIdent: IdentType,\n currentSnapshot: SnapshotDocument,\n logOpts: LogOpts\n): Promise<{ inspectBaselineParams: CreateCheckParamsExtended, currentBaselineSnapshot: SnapshotDocument }> {\n\n let currentBaselineSnapshot: SnapshotDocument | null = null;\n const params: Partial<(CreateCheckParamsExtended)> = {};\n params.failReasons = [];\n if (storedBaseline !== null) {\n log.debug(`a baseline for check name: '${newCheckParams.name}', id: '${storedBaseline.snapshootId}' is already exists`, logOpts);\n if (!isBaselineValid(storedBaseline)) {\n newCheckParams.failReasons.push('invalid_baseline');\n }\n Object.assign(params, updateCheckParamsFromBaseline(newCheckParams, storedBaseline));\n currentBaselineSnapshot = await Snapshot.findById(storedBaseline.snapshootId);\n if (!currentBaselineSnapshot) throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `Cannot find the snapshot with id: ${storedBaseline.snapshootId}`);\n } else {\n const checksWithSameIdent = await getNotPendingChecksByIdent(checkIdent);\n if (checksWithSameIdent.length > 0) {\n log.error(`checks with ident'${JSON.stringify(checkIdent)}' exist, but baseline is absent`, logOpts);\n params.failReasons.push('not_accepted');\n params.baselineId = currentSnapshot.id.toString();\n currentBaselineSnapshot = currentSnapshot;\n } else {\n params.baselineId = currentSnapshot.id;\n params.status = 'new';\n currentBaselineSnapshot = currentSnapshot;\n log.debug(`create the new check with params: '${prettyCheckParams(params)}'`, logOpts);\n }\n }\n\n return { inspectBaselineParams: params as CreateCheckParamsExtended, currentBaselineSnapshot };\n}\n\ntype DimensionType = { height: number, width: number };\n\nconst ignoreDifferentResolutions = ({ height, width }: DimensionType) => {\n if ((width === 0) && (height === -1)) return true;\n if ((width === 0) && (height === 1)) return true;\n return false;\n};\n\ninterface CompareResult {\n failReasons: string[];\n diffId: string;\n diffSnapshot: SnapshotDocument;\n status: string;\n result: string;\n isSameDimensions: boolean;\n dimensionDifference: DimensionType;\n}\n\nconst compare = async (\n expectedSnapshot: SnapshotDocument,\n actualSnapshot: SnapshotDocument,\n newCheckParams: CreateCheckParamsExtended,\n // vShifting: boolean,\n skipSaveOnCompareError: boolean,\n currentUser: UserDocument\n): Promise<CompareResult> => {\n const logOpts: LogOpts = {\n scope: 'createCheck.compare',\n user: currentUser.username,\n itemType: 'check',\n msgType: 'COMPARE',\n };\n\n const executionTimer = process.hrtime();\n const compareResult: Partial<CompareResult> = {};\n compareResult.failReasons = [...newCheckParams.failReasons];\n\n let checkCompareResult: SnapshotDiff;\n let diffSnapshot: SnapshotDocument | null = null;\n\n const areSnapshotsDifferent = (result: SnapshotDiff) => result.rawMisMatchPercentage.toString() !== '0';\n const areSnapshotsWrongDimensions = (result: Partial<CompareResult>) => !result.isSameDimensions && !ignoreDifferentResolutions(result.dimensionDifference!);\n\n if ((newCheckParams.status !== 'new') && (!compareResult.failReasons.includes('not_accepted'))) {\n try {\n log.debug(`'the check with name: '${newCheckParams.name}' isn't new, make comparing'`, logOpts);\n checkCompareResult = await compareSnapshots(expectedSnapshot, actualSnapshot, { vShifting: newCheckParams.vShifting });\n log.silly(`ignoreDifferentResolutions: '${ignoreDifferentResolutions(checkCompareResult.dimensionDifference)}'`);\n log.silly(`dimensionDifference: '${JSON.stringify(checkCompareResult.dimensionDifference)}`);\n\n if (areSnapshotsDifferent(checkCompareResult) || areSnapshotsWrongDimensions(checkCompareResult)) {\n let logMsg;\n if (areSnapshotsWrongDimensions(checkCompareResult)) {\n logMsg = 'snapshots have different dimensions';\n compareResult.failReasons.push('wrong_dimensions');\n }\n if (areSnapshotsDifferent(checkCompareResult)) {\n logMsg = 'snapshots have differences';\n compareResult.failReasons.push('different_images');\n }\n\n if (logMsg) log.debug(logMsg, logOpts);\n log.debug(`saving diff snapshot for check with name: '${newCheckParams.name}'`, logOpts);\n if (!skipSaveOnCompareError) {\n diffSnapshot = await createSnapshot({\n name: newCheckParams.name,\n fileData: checkCompareResult.getBuffer!(),\n });\n compareResult.diffId = diffSnapshot.id;\n compareResult.diffSnapshot = diffSnapshot;\n }\n compareResult.status = 'failed';\n } else {\n compareResult.status = 'passed';\n }\n\n checkCompareResult.totalCheckHandleTime = process.hrtime(executionTimer).toString();\n compareResult.result = JSON.stringify(checkCompareResult, null, '\\t');\n } catch (e: unknown) {\n // compareResult.updatedDate = Date.now();\n compareResult.status = 'failed';\n compareResult.result = JSON.stringify({ server_error: `error during comparing - ${errMsg(e)}` });\n compareResult.failReasons.push('internal_server_error');\n throw new ApiError(httpStatus.INTERNAL_SERVER_ERROR, `error during comparing: ${errMsg(e)}`);\n }\n }\n\n if (compareResult.failReasons.length > 0) {\n compareResult.status = 'failed';\n }\n return compareResult as CompareResult;\n};\n\nexport interface CreateCheckParams {\n name: string;\n // status: 'new' | 'pending' | 'passed' | 'failed' | 'blinking';\n status: 'new' | 'pending' | 'passed' | 'failed';\n viewport: string;\n browserName: string;\n browserVersion: string;\n browserFullVersion: string;\n os: string;\n updatedDate: number;\n suite: string;\n app: string;\n branch: string;\n domDump?: string;\n run: string;\n creatorId: string;\n creatorUsername: string;\n failReasons: string[];\n actualSnapshotId?: string\n result?: string,\n files?: { file: UploadedFile },\n hashCode: string,\n vShifting?: boolean\n}\nexport interface CreateCheckParamsExtended {\n test: string;\n name: string;\n // status: 'new' | 'pending' | 'passed' | 'failed' | 'blinking';\n status: 'new' | 'pending' | 'passed' | 'failed';\n viewport: string;\n browserName: string;\n browserVersion: string;\n browserFullVersion: string;\n os: string;\n updatedDate: number;\n suite: string;\n app: string;\n branch: string;\n domDump?: string;\n run: string;\n creatorId: string;\n creatorUsername: string;\n failReasons: string[];\n actualSnapshotId?: string\n result?: string,\n files?: { file: UploadedFile },\n hashCode: string,\n vShifting?: boolean,\n baselineId?: string,\n markedAs?: string\n markedDate?: string,\n markedByUsername?: string,\n}\n\nconst createCheckParams = (checkParam: CreateCheckParams, suite: SuiteDocument, app: AppDocument, test: TestDocument, currentUser: UserDocument): CreateCheckParamsExtended => ({\n test: test.id,\n name: checkParam.name,\n status: 'pending',\n viewport: checkParam.viewport,\n browserName: checkParam.browserName,\n browserVersion: checkParam.browserVersion,\n browserFullVersion: checkParam.browserFullVersion,\n os: checkParam.os,\n updatedDate: Date.now(),\n suite: suite.id,\n app: app.id,\n branch: checkParam.branch,\n domDump: checkParam.domDump,\n run: test.run.toString(),\n creatorId: currentUser._id.toString(),\n creatorUsername: currentUser.username,\n hashCode: checkParam.hashCode,\n failReasons: [],\n});\n\n\nconst createCheck = async (checkParam: CreateCheckParams, test: TestDocument, suite: SuiteDocument, app: AppDocument, currentUser: UserDocument, skipSaveOnCompareError = false) => {\n const logOpts: LogOpts = {\n scope: 'createCheck',\n user: currentUser.username,\n itemType: 'check',\n msgType: 'CREATE',\n };\n let actualSnapshot: SnapshotDocument;\n let currentBaselineSnapshot: SnapshotDocument;\n\n const newCheckParams = createCheckParams(checkParam, suite, app, test, currentUser);\n const checkIdent = buildIdentObject(newCheckParams);\n\n let check: CheckDocument | null = null;\n const totalCheckHandleTime = 0;\n // const diffSnapshot: object | null = null;\n\n const addCheck = (test: TestDocument, check: CheckDocument) => {\n if (test.checks) {\n test.checks.push(check.id);\n } else {\n test.checks = [check.id];\n }\n }\n\n try {\n const { needFilesStatus, snapshotFoundedByHashcode } = await isNeedFiles(checkParam, logOpts);\n if (needFilesStatus) return { status: 'needFiles' };\n\n actualSnapshot = await prepareActualSnapshot(checkParam, snapshotFoundedByHashcode, logOpts);\n newCheckParams.actualSnapshotId = actualSnapshot.id;\n\n log.info(`find a baseline for the check with identifier: '${JSON.stringify(checkIdent)}'`, logOpts);\n const storedBaseline = await getAcceptedBaseline(checkIdent);\n\n const inspectBaselineResult = await inspectBaseline(newCheckParams, storedBaseline, checkIdent, actualSnapshot, logOpts);\n Object.assign(newCheckParams, inspectBaselineResult.inspectBaselineParams);\n currentBaselineSnapshot = inspectBaselineResult.currentBaselineSnapshot;\n\n const compareResult = await compare(currentBaselineSnapshot, actualSnapshot, newCheckParams, skipSaveOnCompareError, currentUser);\n\n Object.assign(newCheckParams, compareResult);\n\n log.debug(`create the new check document with params: '${prettyCheckParams(newCheckParams)}'`, logOpts);\n check = await Check.create(newCheckParams);\n const savedCheck = await check.save();\n\n log.debug(`the check with id: '${check.id}', was created, will updated with data during creating process`, logOpts);\n logOpts.ref = String(check.id);\n log.debug(`update test with check id: '${check.id}'`, logOpts);\n\n addCheck(test, check);\n\n test.markedAs = await calculateAcceptedStatus(check.test);\n test.updatedDate = new Date();\n\n await test.save();\n\n log.debug('update suite and run', logOpts);\n\n await updateItemDate('VRSSuite', check.suite);\n await updateItemDate('VRSRun', check.run);\n\n const lastSuccessCheck = await getLastSuccessCheck(checkIdent);\n\n const checkObject = savedCheck.toObject();\n\n type CheckResult = (typeof checkObject) & {\n currentSnapshot: SnapshotDocument,\n expectedSnapshot: SnapshotDocument,\n diffSnapshot: SnapshotDocument,\n executeTime: number,\n lastSuccess: string,\n }\n\n const result: CheckResult = {\n ...checkObject,\n currentSnapshot: actualSnapshot,\n expectedSnapshot: currentBaselineSnapshot,\n diffSnapshot: compareResult.diffSnapshot,\n executeTime: totalCheckHandleTime,\n lastSuccess: lastSuccessCheck ? lastSuccessCheck.id : null,\n };\n\n return result;\n } catch (e: unknown) {\n newCheckParams.status = 'failed';\n newCheckParams.result = `{ \"server error\": \"${errMsg(e)}\" }`;\n newCheckParams.failReasons.push('internal_server_error');\n\n if (!check) {\n log.debug(`create the new check document with params: '${prettyCheckParams(newCheckParams)}'`, logOpts);\n check = await Check.create(newCheckParams);\n await check.save();\n } else {\n check.set(newCheckParams)\n await check.save();\n }\n\n log.debug(`the check with id: '${check.id}', was created, will updated with data during creating process`, logOpts);\n logOpts.ref = check.id;\n log.debug(`update test with check id: '${check.id}'`, logOpts);\n addCheck(test, check);\n await test.save();\n\n throw new ApiError(StatusCodes.INTERNAL_SERVER_ERROR, errMsg(e));\n }\n};\n\nconst getIdent = () => ident;\n\nconst getBaselines = async (filter: RequiredIdentOptionsType, options: PaginateOptions) => {\n const logOpts: LogOpts = {\n scope: 'getBaselines',\n itemType: 'baseline',\n msgType: 'GET',\n };\n const app = await App.findOne({ name: filter.app });\n if (!app) {\n log.error(`Cannot find the app: '${filter.app}'`, logOpts);\n return {};\n }\n filter.app = app._id;\n log.debug(`Get baselines with filter: '${JSON.stringify(filter)}', options: '${JSON.stringify(options)}'`, logOpts);\n return Baseline.paginate(filter, options);\n};\n\nexport {\n startSession,\n endSession,\n createCheck,\n getIdent,\n getBaselines,\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport mongoose from 'mongoose';\nimport log from \"@logger\";\n\n\nexport async function updateItem(itemType: string, filter: any, params: any): Promise<any> {\n const logOpts = {\n scope: 'updateItem',\n msgType: 'UPDATE',\n itemType,\n };\n log.debug(`update item type: '${itemType}', filter: '${JSON.stringify(filter)}', params: '${JSON.stringify(params)}'`, logOpts);\n const itemModel = await mongoose.model(itemType).findOne(filter);\n const updatedItem = await itemModel?.updateOne(params);\n log.debug(`'${itemType}' was updated: '${JSON.stringify(updatedItem)}'`, { ...logOpts, ...{ ref: String(itemModel?._id) } });\n return updatedItem;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport mongoose from 'mongoose';\nimport log from \"@logger\";\n\n\nconst logOpts = {\n scope: 'dbitems',\n msgType: 'DB',\n};\n\nexport async function updateItemDate(mdClass: string, id: any): Promise<any> {\n log.debug(`update date for the item: '${mdClass}' with id: '${id}'`, logOpts);\n const itemModel = await mongoose.model(mdClass).findById(id);\n const updatedItem = await itemModel?.updateOne({ updatedDate: Date.now() });\n log.debug(`'${mdClass}' date updated: '${JSON.stringify(itemModel)}'`, logOpts);\n return updatedItem;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport mongoose from 'mongoose';\nimport log from \"@logger\";\n\nexport async function createItemIfNotExist(modelName: string, params: any, logsMeta = {}): Promise<any> {\n const logOpts = {\n scope: 'createItemIfNotExist',\n msgType: 'CREATE',\n itemType: modelName,\n };\n try {\n const itemModel = mongoose.model(modelName);\n const options = {\n upsert: true,\n new: true,\n setDefaultsOnInsert: true,\n };\n\n await itemModel.init();\n const item = await itemModel.findOneAndUpdate(params, params, options);\n\n log.info(`ORM item '${modelName}' was created: '${JSON.stringify(item)}'`, { ...logOpts, ...{ ref: String(item?._id) }, ...logsMeta });\n return item;\n } catch (e: any) {\n log.debug(`cannot create '${modelName}' ORM item, error: '${e.stack || e}'`, { ...logOpts, ...logsMeta });\n }\n return null;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport mongoose from 'mongoose';\nimport log from \"@logger\";\n\nconst logOpts = {\n scope: 'dbitems',\n msgType: 'DB',\n};\n\nexport async function createItemProm(modelName: string, params: any): Promise<any> {\n try {\n const itemModel = mongoose.model(modelName);\n log.debug(`start to create ORM item via promise: '${modelName}', params: '${JSON.stringify(params)}'`, logOpts);\n const item = await itemModel.create(params);\n return item;\n } catch (e: any) {\n const errMsg = `cannot create '${modelName}', error: '${e.stack || e}'`;\n log.error(errMsg, logOpts);\n throw new Error(errMsg);\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { createItemProm } from './createItemProm';\n\nexport async function createTest(params: any): Promise<any> {\n return createItemProm('VRSTest', params);\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Suite } from '@models';\nimport log from \"@logger\";\n\nexport async function createSuiteIfNotExist(params: any, logsMeta = {}): Promise<any> {\n const logOpts = {\n scope: 'createSuiteIfNotExist',\n msgType: 'CREATE',\n itemType: 'VRSSuite',\n };\n if (!params.name || !params.app) throw new Error(`Cannot create suite, wrong params: '${JSON.stringify(params)}'`);\n\n log.debug(`try to create suite if exist, params: '${JSON.stringify(params)}'`, { ...logOpts, ...logsMeta });\n\n let suite = await Suite.findOne({ name: params.name }).exec();\n\n if (suite) {\n log.debug(`suite already exist: '${JSON.stringify(params)}'`, { ...logOpts, ...logsMeta });\n return suite;\n }\n\n suite = await Suite.create(params);\n\n log.debug(`suite with name: '${params.name}' was created`, { ...logOpts, ...logsMeta });\n return suite;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Run } from '@models';\nimport { errMsg } from '@utils';\nimport log from \"@logger\";\n\nexport async function createRunIfNotExist(params: any, logsMeta = {}): Promise<any> {\n const logOpts = {\n scope: 'createRunIfNotExist',\n msgType: 'CREATE',\n itemType: 'VRSRun',\n };\n let run;\n try {\n if (!params.name || !params.app || !params.ident) {\n throw new Error(`Cannot create run, wrong params: '${JSON.stringify(params)}'`);\n }\n\n log.debug(`try to create run if exist, params: '${JSON.stringify(params)}'`, { ...logOpts, ...logsMeta });\n\n run = await Run.findOne({ ident: params.ident }).exec();\n\n if (run) {\n log.debug(`run already exist: '${JSON.stringify(params)}'`, { ...logOpts, ...logsMeta });\n return run;\n }\n\n run = await Run.create({\n ...params,\n createdDate: params.createdDate || new Date(),\n });\n\n log.debug(`run with name: '${params.name}' was created: ${run}`, { ...logOpts, ...logsMeta });\n return run;\n } catch (e: any) {\n if (e.code === 11000) {\n log.warn(`run key duplication collision: '${JSON.stringify(params)}', error: '${errMsg(e)}'`, { ...logOpts, ...logsMeta });\n run = await Run.findOne({ name: params.name, ident: params.ident });\n log.warn(`run key duplication collision, found: '${JSON.stringify(run)}'`, { ...logOpts, ...logsMeta });\n if (run) return run;\n }\n log.error(`cannot create run, params: '${JSON.stringify(params)}', error: '${errMsg(e)}', obj: ${JSON.stringify(e)}`, { ...logOpts, ...logsMeta });\n throw e;\n }\n}\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// @ts-ignore\nimport resemble from '@syngrisi/node-resemble.js';\n\nasync function streamToBuffer(stream: any): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const data: Buffer[] = [];\n\n stream.on('data', (chunk: Buffer) => {\n data.push(chunk);\n });\n\n stream.on('end', () => {\n resolve(Buffer.concat(data));\n });\n\n stream.on('error', (err: Error) => {\n reject(err);\n });\n });\n}\n\nexport default function compareImages(image1: any, image2: any, options: any): Promise<any> {\n return new Promise((resolve, reject) => {\n try {\n const ignoreTransform: any = {\n antialiasing: 'ignoreAntialiasing',\n colors: 'ignoreColors',\n nothing: 'ignoreNothing',\n };\n const ignoreMethod = ignoreTransform[options.ignore] ? ignoreTransform[options.ignore] : 'ignoreNothing';\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n console.log('ignoreMethod', ignoreMethod);\n\n const outputOpts = options.output;\n resemble.outputSettings(outputOpts);\n let ignoredRect;\n if (options.ignoreRectangles) {\n ignoredRect = options.ignoreRectangles.map((it: any) => {\n delete it.name;\n return [it.left, it.top, it.right - it.left, it.bottom - it.top];\n });\n }\n\n resemble(image1)\n .compareTo(image2)[ignoreMethod]()\n .ignoreRectangles(ignoredRect)\n .onComplete(async (data: any) => {\n console.log(data);\n const stream = await data.getDiffImage();\n const buffer = await streamToBuffer(stream.pack());\n data.getBuffer = function () {\n return buffer;\n };\n resolve(data);\n });\n } catch (e) {\n reject(e);\n }\n });\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { errMsg } from \"@utils\";\nimport log from \"@logger\";\nimport compareImages from './compareImagesNode';\n\nconst DEFAULT_OPTIONS = {\n output: {\n largeImageThreshold: 0,\n outputDiff: true,\n errorType: 'flat',\n transparency: 0,\n },\n ignore: 'nothing',\n};\n\nasync function makeDiff(imgData1: any, imgData2: any, options: any = {}): Promise<any> {\n const opts = Object.assign(DEFAULT_OPTIONS, options);\n opts.ignoreRectangles = options.ignoredBoxes;\n const compareData = await compareImages(imgData1, imgData2, opts);\n return compareData;\n}\n\nasync function getDiff(baselineOrigin: any, actualOrigin: any, opts: any = {}): Promise<any> {\n const logOpts = {\n scope: 'getDiff',\n itemType: 'image',\n msgType: 'GET_DIFF',\n };\n try {\n const executionTimer = process.hrtime();\n\n log.debug(`SAMPLE #1: ${process.hrtime(executionTimer).toString()}`, logOpts);\n\n const directDiff = await makeDiff(baselineOrigin, actualOrigin, opts);\n log.debug(`SAMPLE #2: ${process.hrtime(executionTimer).toString()}`, logOpts);\n\n directDiff.executionTotalTime = process.hrtime(executionTimer).toString();\n\n log.debug(`SAMPLE #3: ${process.hrtime(executionTimer).toString()}`, logOpts);\n log.debug(`the diff is: ${JSON.stringify(directDiff, null, 4)}`, logOpts);\n\n return directDiff;\n } catch (e: unknown) {\n log.error(errMsg(e), logOpts);\n throw new Error(errMsg(e));\n }\n}\n\nexport { getDiff };\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport httpStatus from 'http-status';\nimport { User } from '@models';\nimport { ApiError } from '@utils';\nimport log from \"../lib/logger\";\nimport { UserCreateReq } from '../schemas/User.schema';\nimport { FilterQuery } from 'mongoose';\nimport { PaginateOptions } from '../models/plugins/utils';\n\nconst createUser = async (userBody: UserCreateReq) => {\n // @ts-ignore\n if (await User.isEmailTaken(userBody.username)) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken');\n }\n const logOpts = {\n msgType: 'CREATE',\n itemType: 'user',\n ref: userBody.username,\n scope: 'createUser',\n };\n log.debug(`create the user with name '${userBody.username}', params: '${JSON.stringify(userBody)}'`, logOpts);\n\n const user = await User.create({ ...userBody, createdDate: Date.now() });\n\n const updatedUser = await user.setPassword(userBody.password);\n await updatedUser.save();\n\n log.debug(`password for user: '${userBody.username}' set successfully`, logOpts);\n\n const userWithSelectedFields = await User.findById(updatedUser._id)\n .select('username firstName lastName role createdDate updatedDate createdDate')\n .exec();\n\n return userWithSelectedFields;\n};\nconst queryUsers = async (filter: FilterQuery<typeof Test>, options: PaginateOptions) => {\n const users = await User.paginate(filter, options);\n return users;\n};\n\nconst getUserById = async (id: string) => User.findById(id)\n .select('username firstName lastName role createdDate updatedDate createdDate')\n .exec();\n\nconst getUserByEmail = async (email: string) => User.findOne({ email });\n\nconst updateUserById = async (userId: string, updateBody: UserCreateReq) => {\n const logOpts = {\n msgType: 'UPDATE',\n itemType: 'user',\n scope: 'updateUserById',\n ref: userId,\n };\n\n log.info(`update user with id: '${userId}' name '${updateBody.username}', params: '${JSON.stringify(updateBody)}'`, logOpts);\n const user = await getUserById(userId);\n if (!user) {\n throw new ApiError(httpStatus.NOT_FOUND, 'User not found');\n }\n // @ts-ignore\n if (updateBody.email && (await User.isEmailTaken(updateBody.email, userId))) {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Email already taken');\n }\n if (updateBody.password) {\n log.debug(`update password for '${updateBody.username}'`, logOpts);\n await user.setPassword(updateBody.password);\n await user.save();\n log.debug(`password for '${updateBody.username}' was updated`, logOpts);\n }\n log.debug(`user '${updateBody.username}' was updated successfully`, logOpts);\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { password, ...newupdateBody } = updateBody;\n Object.assign(user, {\n ...newupdateBody, updatedDate: Date.now(),\n });\n await user.save();\n return user;\n};\n\nconst deleteUserById = async (userId: string) => User.findByIdAndDelete(userId).exec();\n\nexport {\n createUser,\n queryUsers,\n getUserById,\n getUserByEmail,\n updateUserById,\n deleteUserById,\n};\n","import {\n Check,\n Test,\n Suite,\n Baseline,\n CheckDocument,\n} from '@models';\n\nimport { calculateAcceptedStatus, buildIdentObject } from '@utils';\nimport * as snapshotService from './snapshot.service';\nimport * as orm from '@lib/dbItems';\nimport log from '@lib/logger';\nimport { BaselineDocument } from '@models/Baseline.model';\nimport { Schema } from 'mongoose';\nimport { LogOpts, RequestUser } from '@root/src/types';\n\nasync function calculateTestStatus(testId: string): Promise<string> {\n const checksInTest = await Check.find({ test: testId });\n const statuses = checksInTest.map((x: CheckDocument) => x.status[0]);\n let testCalculatedStatus = 'Failed';\n if (statuses.every((x: string) => (x === 'new') || (x === 'passed'))) {\n testCalculatedStatus = 'Passed';\n }\n if (statuses.every((x: string) => (x === 'new'))) {\n testCalculatedStatus = 'New';\n }\n return testCalculatedStatus;\n}\n\n\nexport interface baselineParamsType extends Document {\n snapshootId?: string;\n name: string;\n app: string;\n branch: string;\n browserName: string;\n browserVersion?: string;\n browserFullVersion?: string;\n viewport: string;\n os: string;\n markedAs?: 'bug' | 'accepted';\n lastMarkedDate?: Date;\n createdDate?: Date;\n updatedDate?: Date;\n markedById?: Schema.Types.ObjectId;\n markedByUsername?: string;\n ignoreRegions?: string;\n boundRegions?: string;\n matchType?: 'antialiasing' | 'nothing' | 'colors';\n meta?: object;\n actualSnapshotId: Schema.Types.ObjectId;\n markedDate: Date;\n}\n\n\nconst validateBaselineParam = (params: baselineParamsType): void => {\n const mandatoryParams = ['markedAs', 'markedById', 'markedByUsername', 'markedDate'];\n for (const param of mandatoryParams) {\n if (!params[param as keyof baselineParamsType]) {\n const errMsg = `invalid baseline parameters, '${param}' is empty, params: ${JSON.stringify(params)}`;\n log.error(errMsg);\n throw new Error(errMsg);\n }\n }\n};\n\nasync function createNewBaseline(params: baselineParamsType): Promise<BaselineDocument> {\n const logOpts = {\n scope: 'createNewBaseline',\n msgType: 'CREATE',\n };\n\n\n validateBaselineParam(params);\n\n const identFields = buildIdentObject(params);\n\n const lastBaseline = await Baseline.findOne(identFields).exec();\n const sameBaseline = await Baseline.findOne({ ...identFields, snapshootId: params.actualSnapshotId }).exec();\n\n const baselineParams = lastBaseline?.ignoreRegions\n ? { ...identFields, ignoreRegions: lastBaseline.ignoreRegions }\n : identFields;\n\n if (sameBaseline) {\n log.debug(`the baseline with same ident and snapshot id: ${params.actualSnapshotId} already exist`, logOpts);\n } else {\n log.debug(`the baseline with same ident and snapshot id: ${params.actualSnapshotId} does not exist,\n create new one, baselineParams: ${JSON.stringify(baselineParams)}`, logOpts);\n }\n\n log.silly({ sameBaseline });\n\n const resultedBaseline: BaselineDocument = sameBaseline || await Baseline.create(baselineParams);\n\n resultedBaseline.markedAs = params.markedAs;\n resultedBaseline.markedById = params.markedById //? new Schema.Types.ObjectId(String(params.markedById)) : undefined;\n resultedBaseline.markedByUsername = params.markedByUsername;\n resultedBaseline.lastMarkedDate = params.markedDate;\n resultedBaseline.createdDate = new Date();\n resultedBaseline.snapshootId = params.actualSnapshotId //? new Schema.Types.ObjectId(String(params.actualSnapshotId)) : undefined;\n\n return resultedBaseline.save();\n}\n\nconst accept = async (id: string, baselineId: string, user: RequestUser): Promise<CheckDocument> => {\n const logOpts = {\n msgType: 'ACCEPT',\n itemType: 'check',\n ref: id,\n user: user?.username,\n scope: 'accept',\n };\n log.debug(`accept check: ${id}`, logOpts);\n const check = await Check.findById(id).exec();\n if (!check) throw new Error(`cannot find check with id: ${id}`);\n const test = await Test.findById(check.test).exec();\n if (!test) throw new Error(`cannot find test with id: ${check.test}`);\n check.markedById = user._id;\n check.markedByUsername = user.username;\n check.markedDate = new Date();\n check.markedAs = 'accepted';\n check.status = (check.status[0] === 'new') ? ['new'] : ['passed'];\n check.updatedDate = new Date();\n\n // check.baselineId = baselineId as unknown as Schema.Types.ObjectId;\n\n log.debug(`update check with options: '${JSON.stringify(check.toObject())}'`, logOpts);\n await createNewBaseline(check.toObject());\n await check.save();\n\n const testCalculatedStatus = await calculateTestStatus(String(check.test));\n const testCalculatedAcceptedStatus = await calculateAcceptedStatus(check.test);\n\n test.status = testCalculatedStatus;\n test.markedAs = testCalculatedAcceptedStatus;\n test.updatedDate = new Date();\n\n await Suite.findByIdAndUpdate(check.suite, { updatedDate: Date.now() });\n log.debug(`update test with status: '${testCalculatedStatus}', marked: '${testCalculatedAcceptedStatus}'`, logOpts, {\n msgType: 'UPDATE',\n itemType: 'test',\n ref: test._id,\n });\n await test.save();\n await check.save();\n log.debug(`check with id: '${id}' was updated`, logOpts);\n return check;\n};\n\nasync function removeCheck(id: string, user: RequestUser): Promise<CheckDocument> {\n const logMeta = {\n scope: 'removeCheck',\n itemType: 'check',\n ref: id,\n msgType: 'REMOVE',\n user: user?.username,\n };\n\n try {\n const check = (await Check.findByIdAndDelete(id).exec()) as unknown as CheckDocument;\n if (!check) throw new Error(`cannot find check with id: ${id}`);\n\n log.debug(`check with id: '${id}' was removed, update test: ${check.test}`, logMeta);\n\n const test = await Test.findById(check.test).exec();\n if (!test) throw new Error(`cannot find test with id: ${check.test}`);\n\n const testCalculatedStatus = await calculateTestStatus(String(check.test));\n const testCalculatedAcceptedStatus = await calculateAcceptedStatus(check.test);\n test.status = testCalculatedStatus;\n test.markedAs = testCalculatedAcceptedStatus;\n test.updatedDate = new Date();\n await orm.updateItemDate('VRSSuite', check.suite);\n await test.save();\n\n if (check.baselineId && String(check.baselineId) !== 'undefined') {\n log.debug(`try to remove the snapshot, baseline: ${check.baselineId}`, logMeta);\n await snapshotService.remove(check.baselineId.toString());\n }\n\n if (check.actualSnapshotId && String(check.baselineId) !== 'undefined') {\n log.debug(`try to remove the snapshot, actual: ${check.actualSnapshotId}`, logMeta);\n await snapshotService.remove(check.actualSnapshotId.toString());\n }\n\n if (check.diffId && String(check.baselineId) !== 'undefined') {\n log.debug(`try to remove snapshot, diff: ${check.diffId}`, logMeta);\n await snapshotService.remove(check.diffId.toString());\n }\n return check;\n } catch (e: unknown) {\n const errMsg = `cannot remove a check with id: '${id}', error: '${e instanceof Error ? e.stack : String(e)}'`;\n log.error(errMsg, logMeta);\n throw new Error(errMsg);\n }\n}\n\nconst remove = async (id: string, user: RequestUser): Promise<CheckDocument> => {\n const logOpts = {\n scope: 'removeCheck',\n itemType: 'check',\n ref: id,\n user: user?.username,\n msgType: 'REMOVE',\n };\n log.info(`remove check with, id: '${id}', user: '${user.username}'`, logOpts);\n return removeCheck(id, user);\n};\n\nconst update = async (id: string, opts: Partial<CheckDocument>, user: string): Promise<CheckDocument> => {\n const logMeta: LogOpts = {\n msgType: 'UPDATE',\n itemType: 'check',\n ref: id,\n user,\n scope: 'updateCheck',\n };\n log.debug(`update check with id '${id}' with params '${JSON.stringify(opts, null, 2)}'`, logMeta);\n\n const check = await Check.findOneAndUpdate({ _id: id }, opts, { new: true }).exec();\n if (!check) throw new Error(`cannot find check with id: ${id}`);\n\n const test = await Test.findOne({ _id: check.test }).exec();\n if (!test) throw new Error(`cannot find test with id: ${check.test}`);\n\n test.status = await calculateTestStatus(String(check.test));\n\n await orm.updateItemDate('VRSCheck', check);\n await orm.updateItemDate('VRSTest', test);\n await test.save();\n await check.save();\n return check;\n};\n\nexport {\n accept,\n remove,\n update,\n};\n","import fs from 'fs';\nimport { config } from '@config';\nimport { Baseline, Snapshot } from '@models';\nimport log from \"../lib/logger\";\nimport { SnapshotDocument } from '@models/Snapshot';\n\nconst logOpts = {\n scope: 'snapshot_helper',\n msgType: 'API',\n};\n\nconst removeSnapshotFile = async (snapshot: SnapshotDocument) => {\n let relatedSnapshots: SnapshotDocument[];\n if (snapshot.filename) {\n relatedSnapshots = await Snapshot.find({ filename: snapshot.filename });\n log.debug(`there are '${relatedSnapshots.length}' snapshots with filename: '${snapshot.filename}'`, logOpts);\n }\n\n const isLastSnapshotFile = () => {\n if (!snapshot.filename) {\n return true;\n }\n return (relatedSnapshots.length === 0);\n };\n\n log.debug({ isLastSnapshotFile: isLastSnapshotFile() });\n\n if (isLastSnapshotFile()) {\n const path = `${config.defaultImagesPath}${snapshot.filename}`;\n log.silly(`path: ${path}`, logOpts);\n if (fs.existsSync(path)) {\n log.debug(`removing file: '${path}'`, logOpts, {\n msgType: 'REMOVE',\n itemType: 'file',\n });\n fs.unlinkSync(path);\n }\n }\n};\n\nconst remove = async (id: string) => {\n const logOpts = {\n scope: 'removeSnapshot',\n msgType: 'REMOVE',\n itemType: 'snapshot',\n ref: id,\n };\n log.silly(`deleting snapshot with id: '${id}'`, logOpts);\n\n if (!id) {\n log.warn('id is empty');\n return;\n }\n\n const snapshot: SnapshotDocument | null = await Snapshot.findById(id).lean().exec();\n if (!snapshot) {\n log.warn(`cannot find snapshot with id: '${id}'`);\n return;\n }\n\n const baseline = await Baseline.findOne({ snapshootId: id });\n if (baseline) {\n log.debug(`snapshot: '${id}' is related to a baseline, skipping deletion`, logOpts);\n return;\n }\n\n log.debug(`snapshot: '${id}' is not related to a baseline, attempting to remove it`, logOpts);\n await Snapshot.findByIdAndDelete(id);\n log.debug(`snapshot: '${id}' was removed`, logOpts);\n\n const path = `${config.defaultImagesPath}${snapshot.filename}`;\n log.debug(`attempting to remove snapshot file, id: '${snapshot._id}', filename: '${path}'`, logOpts);\n await removeSnapshotFile(snapshot);\n};\n\nexport {\n remove,\n};\n","import httpStatus from 'http-status';\nimport { ApiError, catchAsync, deserializeIfJSON, pick, removeEmptyProperties } from '@utils';\nimport { genericService, checkService } from '@services';\nimport { ExtRequest } from '@types';\nimport { Response } from \"express\";\n\nconst get = catchAsync(async (req: ExtRequest, res: Response) => {\n // const filter = req.query.filter ? deserializeIfJSON(pick(req.query, ['filter']).filter) : {};\n const filter = typeof req.query.filter === 'string'\n ? deserializeIfJSON(req.query.filter)\n : {};\n\n if (req.user?.role === 'user') {\n filter.creatorUsername = req.user?.username;\n }\n\n const options = pick(req.query, ['sortBy', 'limit', 'page', 'populate']);\n const result = await genericService.get('VRSCheck', filter, options);\n res.send(result);\n});\n\nconst getViaPost = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = req.body.filter ? pick(req.body, ['filter']).filter : {};\n const options = req.body.options ? pick(req.body, ['options']).options : {};\n const result = await genericService.get('VRSCheck', filter, options);\n res.send(result);\n});\n\nconst update = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!id) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot accept the check - Id not found');\n const opts = removeEmptyProperties(req.body);\n const user = req?.user?.username;\n const result = await checkService.update(id, opts, user);\n res.send(result);\n});\n\nconst accept = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!id) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot accept the check - Id not found');\n if (!req.body.baselineId) throw new ApiError(httpStatus.BAD_REQUEST, `Cannot accept the check: ${id} - new Baseline Id not found`);\n const result = await checkService.accept(id, req.body.baselineId, req?.user);\n res.send(result);\n});\n\nconst remove = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!id) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot remove the check - Id not found');\n const result = await checkService.remove(id, req?.user);\n res.send(result);\n});\n\nexport {\n getViaPost,\n get,\n accept,\n remove,\n update,\n};\n","import httpStatus from 'http-status';\nimport { ApiError, catchAsync, pick, deserializeIfJSON, paramsGuard } from '@utils';\nimport { clientService, genericService } from '@services';\nimport { updateItem } from '@lib/dbItems';\nimport { RequiredIdentOptionsSchema, RequiredIdentOptionsType, createCheckParamsSchema } from '@schemas';\nimport { User, Test, App, Suite } from '@models';\nimport { Response } from \"express\";\nimport log from \"../lib/logger\";\nimport { ExtRequest } from '@types';\nimport { ClientStartSessionType } from '../schemas/Client.schema';\nimport { CreateCheckParams } from '../services/client.service';\n\nconst startSession = catchAsync(async (req: ExtRequest, res: Response) => {\n const params = pick(\n req.body,\n ['name', 'status', 'app', 'tags', 'branch', 'viewport', 'browser', 'browserVersion', 'browserFullVersion',\n 'os', 'run', 'runident', 'suite']\n ) as ClientStartSessionType;\n const result = await clientService.startSession(params, String(req?.user?.username));\n res.send(result);\n});\n\nconst endSession = catchAsync(async (req: ExtRequest, res: Response) => {\n const testId = req.params.testid;\n if (!testId || testId === 'undefined') {\n throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot stop test Session testId is empty');\n }\n\n const result = await clientService.endSession(testId, String(req?.user?.username));\n res.send(result);\n});\n\nconst createCheck = catchAsync(async (req: ExtRequest, res: Response) => {\n const params = req.body;\n paramsGuard(params, 'createCheck, params', createCheckParamsSchema);\n\n const apiKey = req.headers.apikey;\n const currentUser = await User.findOne({ apiKey });\n if (!currentUser) throw new ApiError(httpStatus.NOT_FOUND, `cannot get current user by API`);\n\n\n const logOpts = {\n scope: 'createCheck',\n user: currentUser.username,\n itemType: 'check',\n msgType: 'CREATE',\n };\n\n log.info(`start to create check: '${params.name}'`, logOpts);\n\n log.debug(`try to find test with id: '${params.testid}'`, logOpts);\n const test = await Test.findById(params.testid);\n if (!test) {\n const errMsg = `can't find test with id: '${params.testid}', `\n + `parameters: '${JSON.stringify(req.body)}', username: '${currentUser.username}', apiKey: ${apiKey}`;\n // res.status(400).send({ status: 'testNotFound', message: errMsg });\n throw new ApiError(httpStatus.NOT_FOUND, errMsg);\n }\n const app = await App.findOne({ name: params.appName });\n if (!app) throw new ApiError(httpStatus.NOT_FOUND, `cannot get the app: ${params.appName}`);\n const suite = await Suite.findOne({ name: params.suitename });\n if (!suite) throw new ApiError(httpStatus.NOT_FOUND, `cannot get the suite: ${params.suitename}`);\n\n await updateItem('VRSTest', { _id: test.id }, {\n suite: suite.id,\n creatorId: currentUser._id,\n creatorUsername: currentUser.username,\n });\n\n const result = await clientService.createCheck(\n {\n branch: params.branch,\n hashCode: params.hashcode,\n // testId: params.testid,\n name: params.name,\n viewport: params.viewport,\n browserName: params.browserName,\n browserVersion: params.browserVersion,\n browserFullVersion: params.browserFullVersion,\n os: params.os,\n files: req.files,\n domDump: params.domdump,\n vShifting: params.vShifting,\n } as CreateCheckParams,\n test,\n suite,\n app,\n currentUser\n );\n if (result.status === 'needFiles') {\n res.status(206).json({\n status: 'requiredFileData',\n message: 'could not find a snapshot with such a hash code, please add image file data and resend request',\n hashCode: params.hashcode,\n });\n return;\n }\n res.json(result);\n});\n\nconst getIdent = catchAsync(async (req: ExtRequest, res: Response) => {\n const result = clientService.getIdent();\n res.send(result);\n});\n\nconst getBaselines = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = pick(\n (req.query.filter ? deserializeIfJSON(String(req.query.filter)) : {}),\n ['name', 'viewport', 'browserName', 'os', 'app', 'branch']\n ) as RequiredIdentOptionsType;\n paramsGuard(filter, 'getBaseline, filter', RequiredIdentOptionsSchema);\n const options = pick(req.query, ['sortBy', 'limit', 'page', 'populate']);\n const result = await clientService.getBaselines(filter, options);\n res.send(result);\n});\n\nconst getSnapshots = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = pick(\n (req.query.filter ? deserializeIfJSON(String(req.query.filter)) : {}),\n ['_id', 'name', 'imghash', 'createdDate', 'filename', 'id']\n );\n const options = pick(req.query, ['sortBy', 'limit', 'page', 'populate']);\n const result = await genericService.get('VRSSnapshot', filter, options);\n res.send(result);\n});\n\nexport {\n startSession,\n endSession,\n createCheck,\n getIdent,\n getBaselines,\n getSnapshots,\n};\n","import { z } from 'zod';\n\nexport const createCheckParamsSchema = z.object({\n branch: z.string().min(1),\n appName: z.string().min(1),\n suitename: z.string().min(1),\n testid: z.string().regex(/^[a-f0-9]{24}$/), // Regex for 24 hex characters\n name: z.string().min(1),\n viewport: z.string().regex(/^\\d+x\\d+$/), // \"WidthxHeight\" format\n browserName: z.string().min(1),\n browserVersion: z.string().min(1),\n browserFullVersion: z.string(),\n os: z.string().min(1),\n hashcode: z.string().length(128) // Assuming hashcode is always 128 chars length\n});\n\nexport type createCheckParam = z.infer<typeof createCheckParamsSchema>;\n","import { z } from 'zod';\n\nexport const RequiredIdentOptionsSchema = z.object({\n name: z.string().min(1),\n viewport: z.string().min(3),\n browserName: z.string().min(1),\n os: z.string().min(1),\n app: z.string().min(1),\n branch: z.string().min(1),\n})\n\nexport type RequiredIdentOptionsType = z.infer<typeof RequiredIdentOptionsSchema>\n\nexport const IdentJSONStringSchema = z\n .string()\n .optional()\n .refine((data) => {\n if (!data) return false;\n try {\n const parsed = JSON.parse(data);\n RequiredIdentOptionsSchema.parse(parsed); // Проверяем поля внутри объекта\n return true;\n } catch (e) {\n return false;\n }\n }, {\n message: \"Invalid JSON string or does not match the required schema\",\n })\n .openapi({\n description: \"baseline filter based on ident\",\n example: '{\"name\": \"Login page\", \"viewport\": \"1366x768\", \"browserName\": \"chrome\", \"os\": \"macOS\", \"app\": \"My App\", \"branch\": \"master\"}',\n });\n\nexport type RequiredIdentOptions = z.infer<typeof RequiredIdentOptionsSchema>;\n","import { extendZodWithOpenApi, OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport { commonValidations } from '@schemas/utils';\nimport { z } from 'zod';\n\nextendZodWithOpenApi(z);\n\nexport const registry = new OpenAPIRegistry();\n\nexport const AppInfoRespSchema = z.object({\n version: commonValidations.version,\n});\n\nexport const AppRespSchema = z.object({\n _id: commonValidations.id,\n id: commonValidations.id,\n name: z.string().min(1, 'AppRespSchema: the name is empty').openapi({ example: \"Admin Panel\" }),\n});\n\n// export type AppType = z.infer<typeof AppRespSchema>;\n","import httpStatus from 'http-status';\nimport { EJSON } from 'bson';\nimport { catchAsync } from '@utils';\nimport { logsService } from '@services';\nimport { Response } from \"express\";\n\nimport { pick } from '@utils';\nimport { ExtRequest } from '@types';\n\nconst getLogs = catchAsync(async (req: ExtRequest, res: Response) => {\n // const filter = req.query.filter ? EJSON.parse(pick(req.query, ['filter']).filter) : {};\n const filter = typeof req.query.filter === 'string'\n ? EJSON.parse(req.query.filter)\n : {};\n\n const options = pick(req.query, ['sortBy', 'limit', 'page']);\n const result = await logsService.queryLogs(filter, options);\n res.send(result);\n});\n\nconst distinct = catchAsync(async (req: ExtRequest, res: Response) => {\n const { field } = pick(req.query, ['field']);\n const result = await logsService.distinct(String(field));\n res.send(result);\n});\n\nconst createLog = catchAsync(async (req: ExtRequest, res: Response) => {\n const user = await logsService.createLogs(req.body);\n res.status(httpStatus.CREATED).send(user);\n});\n\nexport {\n getLogs,\n distinct,\n createLog,\n};\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport httpStatus from 'http-status';\nimport { EJSON } from 'bson';\nimport { catchAsync } from '@utils';\nimport { genericService } from '@services';\nimport { Response } from \"express\";\n\nimport { pick } from '@utils';\nimport { ExtRequest } from '@types';\n\nconst get = catchAsync(async (req: ExtRequest, res: Response) => {\n // const filter = req.query.filter ? EJSON.parse(pick(req.query, ['filter']).filter) : {};\n const filter = typeof req.query.filter === 'string'\n ? EJSON.parse(req.query.filter)\n : {};\n\n const options = pick(req.query, ['sortBy', 'limit', 'page']);\n const result = await genericService.get('VRSSnapshot', filter, options);\n res.send(result);\n});\n\nexport {\n get,\n};\n","import { catchAsync, pick } from '@utils';\nimport { tasksService } from '@services';\nimport { Response } from \"express\";\nimport { ExtRequest } from '@types';\n\n\nconst task_test = catchAsync(async (req: ExtRequest, res: Response) => {\n const { options } = pick(req.query, ['options']);\n await tasksService.task_test(String(options), req, res);\n});\n\nconst task_handle_old_checks = catchAsync(async (req: ExtRequest, res: Response) => {\n const options = pick(req.query, ['days', 'remove']);\n await tasksService.task_handle_old_checks(options, res);\n});\n\nconst task_handle_database_consistency = catchAsync(async (req: ExtRequest, res: Response) => {\n const options = pick(req.query, ['days', 'clean']);\n await tasksService.task_handle_database_consistency(options, res);\n});\n\nconst task_remove_old_logs = catchAsync(async (req: ExtRequest, res: Response) => {\n const options = pick(req.query, ['days', 'statistics']);\n await tasksService.task_remove_old_logs(options, res);\n});\n\nconst status = catchAsync(async (req: ExtRequest, res: Response) => {\n res.send(await tasksService.status(req.user));\n});\n\nconst screenshots = catchAsync(async (req: ExtRequest, res: Response) => {\n res.send(await tasksService.screenshots());\n});\n\nconst loadTestUser = catchAsync(async (req: ExtRequest, res: Response) => {\n res.send(await tasksService.loadTestUser());\n});\n\nexport {\n task_test,\n task_handle_old_checks,\n task_handle_database_consistency,\n task_remove_old_logs,\n status,\n loadTestUser,\n screenshots,\n};\n","import httpStatus from 'http-status';\nimport { pick, ApiError, catchAsync, deserializeIfJSON } from '@utils';\nimport { testService } from '@services';\nimport { Response } from \"express\";\nimport { ExtRequest } from '@types';\n\nconst getTest = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = {\n ...deserializeIfJSON(String(req.query.base_filter)),\n ...deserializeIfJSON(String(req.query.filter)),\n };\n\n if (req.user?.role === 'user') {\n filter.creatorUsername = req.user?.username;\n }\n\n const options = pick(req.query, ['sortBy', 'limit', 'page', 'populate']);\n const result = await testService.queryTests(filter, options);\n res.status(httpStatus.OK).send(result);\n});\n\n\nexport const distinct_with_filter = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = req.query.filter ? deserializeIfJSON(String(req.query.filter)) : undefined;\n const options = { ...pick(req.query, ['sortBy', 'limit', 'page', 'populate']), field: req.params.field };\n const result = await testService.queryTestsDistinct( filter , options);\n res.status(httpStatus.OK).send(result);\n});\n\n// TODO: [Obsolete] use 'distinct_with_filter' instead of this\nconst distinct = catchAsync(async (req: ExtRequest, res: Response) => {\n\n //⚠️ the filter is obsolete there, for filtering use `/v1/test/distict`\n const filter = {};\n\n const options = { ...pick(req.query, ['sortBy', 'limit', 'page', 'populate']), field: req.params.id };\n const result = await testService.queryTestsDistinct( filter , options);\n res.status(httpStatus.OK).send(result);\n});\n\nconst remove = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!id) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot remove the test - Id not found');\n if (!req.user) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot remove the test - req.user is empty');\n const result = await testService.remove(id, req?.user);\n res.send(result);\n});\n\nconst accept = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!id) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot accept the check - Id not found');\n if (!req.user) throw new ApiError(httpStatus.BAD_REQUEST, 'Cannot accept the check - req.user is empty');\n const result = await testService.accept(id, req?.user);\n res.send(result);\n});\n\nexport {\n getTest,\n distinct,\n remove,\n accept,\n};\n","\nimport httpStatus from 'http-status';\nimport { EJSON } from 'bson';\nimport { ApiError, catchAsync, pick } from '@utils';\nimport { usersService } from '@services';\nimport log from \"../lib/logger\";\nimport { ExtRequest } from '@types';\nimport { Response } from \"express\";\nimport { errMsg } from '../utils/errMsg';\n\nconst current = catchAsync(async (req: ExtRequest, res: Response) => {\n const logOpts = {\n scope: 'users',\n msgType: 'GET_CURRENT_USER',\n };\n log.debug(`current user is: '${req?.user?.username || 'not_logged'}'`, logOpts);\n res.status(httpStatus.OK).json({\n id: req?.user?.id,\n username: req?.user?.username,\n firstName: req?.user?.firstName,\n lastName: req?.user?.lastName,\n role: req?.user?.role,\n });\n});\n\nconst get = catchAsync(async (req: ExtRequest, res: Response) => {\n const filter = typeof req.query.filter === 'string'\n ? EJSON.parse(req.query.filter)\n : {};\n\n const options = pick(req.query, ['sortBy', 'limit', 'page']);\n const result = await usersService.queryUsers(filter, options);\n res.send(result);\n});\n\n\nconst getById = catchAsync(async (req: ExtRequest, res: Response) => {\n const user = await usersService.getUserById(req.params.userId);\n res.send(user);\n});\n\nconst create = catchAsync(async (req: ExtRequest, res: Response) => {\n const logOpts = {\n scope: 'users',\n msgType: 'CREATE',\n };\n\n try {\n const userData = pick(req.body, [\n 'username',\n 'firstName',\n 'lastName',\n 'role',\n 'password',\n 'apiKey',\n 'expiration',\n 'meta',\n ]);\n const user = await usersService.createUser(userData);\n res.status(httpStatus.CREATED).send(user);\n } catch (e: unknown) {\n if (e instanceof ApiError && e.statusCode) {\n log.error(e, logOpts);\n res.status(e.statusCode).json({ message: e.message });\n } else {\n log.error(errMsg(e), logOpts);\n throw e;\n }\n }\n});\n\nconst update = catchAsync(async (req: ExtRequest, res: Response) => {\n const user = await usersService.updateUserById(req.params.userId, req.body);\n res.send(user);\n});\n\nconst remove = catchAsync(async (req: ExtRequest, res: Response) => {\n await usersService.deleteUserById(req.params.userId);\n res.status(httpStatus.NO_CONTENT).send();\n});\n\nexport {\n current,\n create,\n update,\n remove,\n get,\n getById,\n};\n","import httpStatus from 'http-status';\nimport { catchAsync, deserializeIfJSON, pick } from '@utils';\nimport { appService } from '@services';\nimport { Request, Response } from \"express\"\nimport { config } from \"@config\";\n\nconst info = catchAsync(async (req: Request, res: Response) => {\n res.status(httpStatus.OK).json({ version: config.version });\n});\n\nconst get = catchAsync(async (req: Request, res: Response) => {\n const filter = typeof req.query.filter === 'string'\n ? deserializeIfJSON(req.query.filter)\n : {};\n const options = pick(req.query, ['sortBy', 'limit', 'page']);\n const result = await appService.get(filter, options);\n res.send(result);\n});\n\nexport {\n info,\n get,\n};\n","import { ExtRequest } from '@types';\nimport { catchAsync } from '@utils';\nimport { Response } from \"express\";\nimport { appSettings } from \"@settings\";\n\nconst getSettings = catchAsync(async (req: ExtRequest, res: Response) => {\n const AppSettings = await appSettings;\n const result = AppSettings.cache;\n res.json(result);\n});\n\nconst updateSetting = catchAsync(async (req: ExtRequest, res: Response) => {\n const AppSettings = await appSettings;\n\n const { name } = req.params;\n await AppSettings.set(name, req.body.value);\n if (req.body.enabled === false) {\n await AppSettings.disable(name);\n } else {\n await AppSettings.enable(name);\n }\n res.json({ message: 'success' });\n});\n\nexport {\n getSettings,\n updateSetting,\n};\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport httpStatus from 'http-status';\nimport { EJSON } from 'bson';\nimport { catchAsync, pick } from '@utils';\nimport { genericService, runService } from '@services';\nimport { ExtRequest } from '@types';\nimport { Response } from \"express\";\n\n\nconst get = catchAsync(async (req: ExtRequest, res: Response) => {\n // const filter = req.query.filter ? EJSON.parse(pick(req.query, ['filter']).filter) : {};\n const filter = typeof req.query.filter === 'string'\n ? EJSON.parse(req.query.filter)\n : {};\n\n const options = pick(req.query, ['sortBy', 'limit', 'page']);\n const result = await genericService.get('VRSRun', filter, options);\n res.send(result);\n});\n\nconst remove = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if (!req.user) throw new Error(\"req.user is empty\");\n\n const result = await runService.remove(id, req?.user);\n res.send(result);\n});\n\nexport {\n get,\n remove,\n};\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport httpStatus from 'http-status';\nimport { EJSON } from 'bson';\nimport { catchAsync, pick } from '@utils';\nimport { genericService, suiteService } from '@services';\nimport { Response } from \"express\";\nimport { ExtRequest } from '@types';\n\nconst get = catchAsync(async (req: ExtRequest, res: Response) => {\n // const filter = req.query.filter ? EJSON.parse(pick(req.query, ['filter']).filter) : {};\n const filter = typeof req.query.filter === 'string'\n ? EJSON.parse(req.query.filter)\n : {};\n\n const options = pick(req.query, ['sortBy', 'limit', 'page']);\n const result = await genericService.get('VRSSuite', filter, options);\n res.send(result);\n});\n\nconst remove = catchAsync(async (req: ExtRequest, res: Response) => {\n const { id } = req.params;\n if(!req.user) throw new Error(\"req.user is empty\");\n const result = await suiteService.remove(id, req?.user);\n res.send(result);\n});\n\nexport {\n get,\n remove,\n};\n","\nimport { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';\nimport { z } from 'zod';\nimport { requestQueryFilterSchema } from './requestQueryFilterSchema.schema';\nimport { commonValidations } from '../utils';\nextendZodWithOpenApi(z);\n\nexport const RequestPaginationSchema =\n z.object({\n filter: requestQueryFilterSchema.optional(),\n limit: commonValidations.positiveNumberString.optional().openapi({example: \"10\"}),\n page: commonValidations.positiveNumberString.optional().openapi({example: \"1\"}),\n sortBy: z.string().optional().openapi({example: \"name:desc\"}),\n populate: z.string().optional().openapi({example: \"test\"}),\n });\n\n","import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';\nimport { z } from 'zod';\n\nextendZodWithOpenApi(z);\n\nexport const requestQueryFilterSchema = z\n .string()\n .optional()\n .refine((data) => {\n if(!data) return false\n try {\n const parsed = JSON.parse(data);\n\n // Define a recursive schema to support nested objects and arrays\n const valueSchema = z.lazy(() => z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.array(z.any()),\n z.record(z.any())\n ]));\n\n const schema = z.record(valueSchema);\n schema.parse(parsed);\n return true;\n } catch (e) {\n return false;\n }\n }, {\n message: \"Invalid JSON string or does not match the required schema\",\n })\n .openapi({ example: '{\"key1\": \"value1\", \"key2\": 123, \"key3\": true, \"$and\":[{\"name\":\"CheckName\"}]}' });\n","import { z } from 'zod';\nexport const createRequestQuerySchema = (schema: z.ZodTypeAny) => z.object({ query: schema })\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as testController from '@controllers/test.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { TestDistinctRequestFieldParamsSchema, TestGetSchema } from '@schemas/Test.schema';\nimport { createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { commonValidations } from '@schemas/utils';\nimport { createRequestParamsSchema, getByIdParamsSchema } from '@schemas/utils/createRequestParamsSchema';\nimport { TestDistinctResponseSchema } from '@schemas/TestDistinct.schema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tests',\n summary: \"Get list of tests\",\n tags: ['Tests'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(TestGetSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/checks'),\n testController.getTest as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tests/distinct/{field}',\n summary: \"List of certain unique fields across all tests\",\n tags: ['Tests'],\n request: { params: TestDistinctRequestFieldParamsSchema, query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(TestDistinctResponseSchema, 'Success'),\n});\n\nrouter.get(\n '/distinct/:field',\n ensureLoggedIn(),\n validateRequest(\n createRequestParamsSchema(TestDistinctRequestFieldParamsSchema)\n .merge(createRequestQuerySchema(RequestPaginationSchema)\n ),\n 'get, /distinct/:field'\n ),\n testController.distinct_with_filter as Midleware\n);\n\nregistry.registerPath({\n method: 'delete',\n path: '/v1/tests/{id}',\n summary: \"Delete a test by ID\",\n tags: ['Tests'],\n request: commonValidations.paramsId,\n responses: createApiResponse(TestGetSchema, 'Success'),\n});\n\nrouter.delete(\n '/:id',\n ensureLoggedIn(),\n // validateRequest(getByIdParamsSchema(), '/v1/runs/{id}'),\n\n validateRequest(getByIdParamsSchema(), 'delete, /v1/tests/{id}'),\n testController.remove as Midleware\n);\n\nregistry.registerPath({\n method: 'put',\n path: '/v1/tests/accept/{id}',\n summary: \"Accept a test by ID\",\n tags: ['Tests'],\n request: commonValidations.paramsId,\n // request: { params: TestDistinctRequestParamsSchema, body: createRequestOpenApiBodySchema(TestAcceptSchema) },\n responses: createApiResponse(commonValidations.success, 'Success'),\n});\n\nrouter.put(\n '/accept/:id',\n ensureLoggedIn(),\n validateRequest(getByIdParamsSchema(), 'put, /v1/tests/accept/{id}'),\n testController.accept as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst TestGetSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the test',\n example: 'Get IP'\n }),\n status: z.string().openapi({\n description: 'Status of the test',\n example: 'Failed'\n }),\n browserName: z.string().openapi({\n description: 'Name of the browser',\n example: 'chrome'\n }),\n browserVersion: z.string().openapi({\n description: 'Version of the browser',\n example: '125'\n }),\n branch: z.string().openapi({\n description: 'Branch name',\n example: 'master'\n }),\n tags: z.array(z.string()).openapi({\n description: 'Tags associated with the test',\n example: ['@smoke', '@regression']\n }),\n viewport: z.string().openapi({\n description: 'Viewport size',\n example: '1366x768'\n }),\n os: z.string().openapi({\n description: 'Operating system',\n example: 'macOS'\n }),\n app: commonValidations.id.openapi({\n description: 'Application identifier',\n example: '6651dd45b9c3e1e0b8c1ce26'\n }),\n blinking: z.number().openapi({\n description: 'Blinking count',\n example: 0\n }),\n updatedDate: commonValidations.date.openapi({\n description: 'Last update date of the test',\n example: '2024-06-13T19:55:40.108Z'\n }),\n startDate: commonValidations.date.openapi({\n description: 'Start date of the test',\n example: '2024-06-13T19:54:28.409Z'\n }),\n checks: z.array(commonValidations.id).openapi({\n description: 'List of checks associated with the test',\n example: ['666b4e7e421977cbf466b458', '666b4ebc421977cbf466b47c']\n }),\n suite: commonValidations.id.openapi({\n description: 'Suite identifier',\n example: '666b3b828833d0cf24a670d7'\n }),\n run: commonValidations.id.openapi({\n description: 'Run identifier',\n example: '666b4e74421977cbf466b443'\n }),\n creatorId: commonValidations.id.openapi({\n description: 'Creator identifier',\n example: '66519e582c2c701cc438ce59'\n }),\n creatorUsername: z.string().openapi({\n description: 'Username of the creator',\n example: 'Guest'\n }),\n markedAs: z.string().openapi({\n description: 'Marked as status',\n example: 'Unaccepted'\n }),\n calculatedViewport: z.string().openapi({\n description: 'Calculated viewport size',\n example: '1366x768'\n }),\n id: commonValidations.id.openapi({\n description: 'ID of the test',\n example: '666b4e74421977cbf466b446'\n })\n});\n\n// export type TestType = z.infer<typeof TestGetSchema>;\n\nconst UpdateTestSchema = TestGetSchema.omit({ id: true, _id: true }).partial();\n\nexport type UpdateTestType = z.infer<typeof UpdateTestSchema>;\n\nconst TestAcceptSchema = z.object({\n id: commonValidations.id,\n});\n\nconst validIds = [\n 'suite',\n 'run',\n 'markedAs',\n 'creatorId',\n 'creatorUsername',\n 'name',\n 'status',\n 'browserName',\n 'browserVersion',\n 'branch',\n 'tags',\n 'viewport',\n 'os',\n 'app',\n 'startDate',\n\n] as const;\n\nexport const TestDistinctRequestFieldParamsSchema = z.object({\n field: z.enum(validIds).openapi({\n description: 'Parameter identifier',\n example: 'suite'\n })\n});\n\nconst TestDistinctSchema = TestGetSchema;\n\nexport { TestGetSchema, TestAcceptSchema, TestDistinctSchema };\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n// @ts-nocheck\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Ensure that a user is logged in before proceeding to next route middleware.\n *\n * This middleware ensures that a user is logged in. If a request is received\n * that is unauthenticated, the request will be redirected to a login page (by\n * default to `/login`).\n *\n * Additionally, `returnTo` will be be set in the session to the URL of the\n * current request. After authentication, this value can be used to redirect\n * the user to the page that was originally requested.\n *\n * Options:\n * - `redirectTo` URL to redirect to for login, defaults to _/login_\n * - `setReturnTo` set redirectTo in session, defaults to _true_\n *\n * Examples:\n *\n * app.get('/profile',\n * ensureLoggedIn(),\n * function(req, res) { ... });\n *\n * app.get('/profile',\n * ensureLoggedIn('/signin'),\n * function(req, res) { ... });\n *\n * app.get('/profile',\n * ensureLoggedIn({ redirectTo: '/session/new', setReturnTo: false }),\n * function(req, res) { ... });\n *\n * @param {Object} options\n * @return {Function}\n * @api public\n */\n\nimport { Request, Response, NextFunction } from 'express';\nimport { User } from '@models';\nimport log from \"../../lib/logger\";\nimport { ExtRequest } from '../../../types/ExtRequest';\nimport { appSettings } from \"@settings\";\nimport { env } from \"@/server/envConfig\";\n\n\n\nconst handleBasicAuth = async (req: ExtRequest): Promise<any> => {\n const logOpts = {\n scope: 'handleBasicAuth',\n msgType: 'AUTH_API',\n };\n\n if (req.isAuthenticated()) {\n return { type: 'success', status: 200 };\n }\n const AppSettings = await appSettings;\n if (!(await AppSettings.isAuthEnabled())) {\n const guest = await User.findOne({ username: 'Guest' });\n const result = new Promise((resolve) => {\n req.logIn(guest, (err: any) => {\n if (err) {\n log.error(`cannot find guest user: '${err}'`, logOpts);\n resolve({\n type: 'redirect',\n status: 301,\n value: `/auth?=Error: cannot find guest user: ${err}`,\n user: null,\n });\n } else {\n resolve({\n type: 'success',\n status: 200,\n value: '',\n user: guest,\n });\n }\n });\n });\n return result;\n }\n\n const result: any = {\n type: 'error',\n status: 400,\n value: '',\n user: null,\n };\n if ((await AppSettings.isAuthEnabled())\n && ((await AppSettings.isFirstRun()))\n && !env.SYNGRISI_DISABLE_FIRST_RUN\n ) {\n log.info('first run, set admin password', logOpts);\n result.type = 'redirect';\n result.status = 301;\n result.value = '/auth/change?first_run=true';\n return result;\n }\n\n if (await AppSettings.isAuthEnabled()) {\n log.info(`user is not authenticated, will redirected - ${req.originalUrl}`, logOpts);\n\n result.type = 'redirect';\n result.status = 301;\n\n if (req?.originalUrl !== '/') {\n result.value = `/auth?origin=${encodeURIComponent(req.originalUrl)}`;\n return result;\n }\n\n result.value = '/auth';\n return result;\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport function ensureLoggedIn(options?: any): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n const result = await handleBasicAuth(req);\n req.user = result.user || req.user;\n if (result.type === 'success') {\n return next();\n }\n res.status(result.status).redirect(result.value);\n return next('redirect');\n };\n}\n\nconst handleAPIAuth = async (hashedApiKey: string): Promise<any> => {\n const logOpts = {\n scope: 'handleAPIAuth',\n msgType: 'AUTH_API',\n };\n\n const result: any = {\n status: 400,\n type: 'error',\n value: '',\n user: null,\n };\n const AppSettings = await appSettings; \n if (!(await AppSettings.isAuthEnabled())) {\n const guest = await User.findOne({ username: 'Guest' });\n\n if (!guest) {\n log.error('cannot find Guest user', logOpts);\n result.type = 'error';\n result.value = 'cannot find Guest user';\n return result;\n }\n log.debug('authentication disabled', logOpts, { user: 'Guest' });\n result.type = 'success';\n result.user = guest;\n result.status = 200;\n return result;\n }\n\n if (!hashedApiKey) {\n log.debug('API key missing', logOpts);\n result.type = 'error';\n result.status = 401;\n result.value = 'API key missing';\n return result;\n }\n\n const user = await User.findOne({ apiKey: hashedApiKey });\n if (!user) {\n log.error(`wrong API key: ${hashedApiKey}`, logOpts);\n result.type = 'error';\n result.status = 401;\n result.value = 'wrong API key';\n return result;\n }\n log.debug('authenticated', { ...logOpts, ...{ user: user?.username } });\n result.type = 'success';\n result.status = 200;\n result.user = user;\n return result;\n};\n\nexport function ensureApiKey(): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n const logOpts = {\n scope: 'ensureApiKey',\n msgType: 'AUTH_API',\n };\n return async (req: Request, res: Response, next: NextFunction) => {\n log.silly(`headers: ${JSON.stringify(req.headers, null, '..')}`, logOpts);\n log.silly(`SYNGRISI_AUTH: '${env.SYNGRISI_AUTH}'`);\n const hashedApiKey = req.headers.apikey || req.query.apikey;\n const result = await handleAPIAuth(hashedApiKey);\n req.user = req.user || result.user;\n req.headers.apikey = result?.user?.apiKey || req?.headers?.apikey;\n if (result.type !== 'success') {\n log.info(`${result.value} - ${req.originalUrl}`, logOpts);\n res.status(result.status).json({ error: result.value });\n return next(new Error(result.value));\n }\n return next();\n };\n}\n\nexport function ensureLoggedInOrApiKey(): (req: Request, res: Response, next: NextFunction) => Promise<void> {\n return async (req: Request, res: Response, next: NextFunction) => {\n const basicAuthResult = await handleBasicAuth(req);\n\n const hashedApiKey = req.headers.apikey || req.query.apikey;\n const apiKeyResult = await handleAPIAuth(hashedApiKey);\n req.user = req.user || apiKeyResult.user;\n\n if (\n (basicAuthResult.type !== 'success')\n && (apiKeyResult.type !== 'success')\n ) {\n log.info(`Unauthorized - ${req.originalUrl}`);\n res.status(401).json({ error: `Unauthorized - ${req.originalUrl}` });\n return next(new Error(`Unauthorized - ${req.originalUrl}`));\n }\n return next();\n };\n}\n","import { z } from 'zod';\nimport { commonValidations } from './commonValidations';\nexport const createRequestParamsSchema = (schema: z.ZodTypeAny) => z.object({ params: schema })\n\nexport const getByIdParamsSchema = (id = 'id') => createRequestParamsSchema(\n z.object({ [id]: commonValidations.id })\n);\n","import { z } from 'zod';\n\nconst validIds = [\n 'suite',\n 'run',\n 'markedAs',\n 'creatorId',\n 'creatorUsername',\n 'name',\n 'status',\n 'browserName',\n 'browserVersion',\n 'branch',\n 'tags',\n 'viewport',\n 'os',\n 'app',\n 'startDate',\n 'filter',\n] as const;\n\nconst TestDistinctRequestParamsSchema = z.object({\n id: z.enum(validIds).openapi({\n description: 'Parameter identifier',\n example: 'suite'\n })\n});\n\nconst TestDistinctResponseSchema = z.object({\n name: z.string().min(1).openapi({\n description: 'Distinct field value',\n example: 'chrome'\n })\n});\n\nexport { TestDistinctRequestParamsSchema, TestDistinctResponseSchema };\n","import express from 'express';\nimport StatusCodes from 'http-status';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport { Midleware } from '@types';\nimport { usersController } from '@controllers';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { authorization } from '@middlewares';\nimport { validateRequest } from '@utils/validateRequest';\nimport { UserCreateReqSchema, UserCreateRespSchema, UserCurrentRespSchema, UserGetRespSchema, UserSchema } from '@schemas/User.schema';\nimport { SkipValid } from '@schemas/SkipValid.schema';\nimport { createApiEmptyResponse, createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { createRequestOpenApiBodySchema } from '@schemas/utils/createRequestOpenApiBodySchema';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { createRequestBodySchema } from '@schemas/utils/createRequestBodySchema';\nimport { getByIdParamsSchema } from '@schemas/utils/createRequestParamsSchema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/users/current',\n summary: 'Retrieve current user details.',\n tags: ['Users'],\n responses: createApiResponse(UserCurrentRespSchema, 'Success'),\n});\n\nrouter.get('/current',\n validateRequest(SkipValid, 'get, /v1/users/current'),\n usersController.current as Midleware);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/users/',\n summary: 'List users with pagination, and optional filtering and sorting.',\n tags: ['Users'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(UserSchema, 'Success'),\n});\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/users/',\n summary: 'Create a new user.',\n tags: ['Users'],\n request: { body: createRequestOpenApiBodySchema(UserCreateReqSchema) },\n responses: createApiResponse(UserCreateRespSchema, 'Success'),\n});\n\nrouter\n .route('/')\n .get(\n ensureLoggedIn(),\n authorization('user') as Midleware,\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/users/'),\n usersController.get as Midleware\n )\n .post(\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(createRequestBodySchema(UserCreateReqSchema), 'post, /v1/users/'),\n usersController.create as Midleware\n );\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/users/{userId}',\n summary: 'Retrieve user details by user ID.',\n tags: ['Users'],\n request: {params: getByIdParamsSchema('userId')},\n responses: createApiResponse(UserGetRespSchema, 'Success'),\n});\n\nregistry.registerPath({\n method: 'patch',\n path: '/v1/users/{userId}',\n summary: 'Update user details by user ID.',\n tags: ['Users'],\n request: { params: getByIdParamsSchema('userId'), body: createRequestOpenApiBodySchema(UserSchema) },\n responses: createApiResponse(UserGetRespSchema, 'Success'),\n});\n\nregistry.registerPath({\n method: 'delete',\n path: '/v1/users/{userId}',\n summary: 'Remove user by user ID.',\n tags: ['Users'],\n request: { params: getByIdParamsSchema('userId') },\n responses: createApiEmptyResponse('No Content', StatusCodes.NO_CONTENT),\n});\n\nrouter\n .route('/:userId')\n .get(\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(getByIdParamsSchema('userId'), 'get, /v1/users/{userId}'),\n usersController.getById as Midleware\n )\n .patch(\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(getByIdParamsSchema('userId'), 'patch, /v1/users/{userId}'),\n usersController.update as Midleware\n )\n .delete(\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(getByIdParamsSchema('userId'), 'delete, /v1/users/{userId}'),\n\n usersController.remove as Midleware\n );\n\nexport default router;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Request, Response, NextFunction } from 'express';\nimport { config } from '@config';\n\n// disable CORS for development purposes\nexport const disableCors = (req: Request, res: Response, next: NextFunction): void => {\n if (!config.disableCors) return next();\n // Website you wish to allow to connect\n // res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8080');\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('X-Frame-Options', 'ALLOWALL');\n res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');\n\n // Request methods you wish to allow\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');\n\n // Request headers you wish to allow\n res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');\n\n // Set to true if you need the website to include cookies in the requests sent\n // to the API (e.g. in case you use sessions)\n res.setHeader('Access-Control-Allow-Credentials', 'true');\n\n // Handle preflight requests\n if (req.method === 'OPTIONS') {\n res.status(200).end();\n return;\n }\n\n // Pass to next layer of middleware\n return next();\n};\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport httpStatus from 'http-status';\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { Response, NextFunction } from 'express';\nimport { ApiError } from '@utils';\nimport { catchAsync } from '@utils';\nimport log from '@lib/logger';\nimport { ExtRequest } from '@types';\nimport { appSettings } from \"@settings\";\n// import { createLog } from '@controllers/logs.controller';\n// import AppSettings from '@models/AppSettings';\n\n\nexport const authorization = (type: string) => {\n\n const types: { [key: string]: (req: any, res: any, next: NextFunction) => any } = {\n admin: catchAsync(async (req: ExtRequest, res: Response, next: NextFunction) => {\n const AppSettings = await appSettings;\n if (!(await AppSettings.isAuthEnabled())) {\n return next();\n }\n if (req.user?.role === 'admin') {\n log.silly(`user: '${req.user?.username}' was successfully authorized, type: '${type}'`);\n return next();\n }\n log.warn(`user authorization: '${req.user?.username}' wrong role, type: '${type}'`);\n throw new ApiError(httpStatus.FORBIDDEN, 'Authorization Error - wrong Role');\n }),\n user: catchAsync(async (req: ExtRequest, res: Response, next: NextFunction) => {\n const AppSettings = await appSettings;\n\n // @ts-ignore\n if (!(await AppSettings.isAuthEnabled())) {\n return next();\n }\n if (req.user?.role === 'admin') {\n log.silly(`user: '${req.user?.username}' was successfully authorized, type: '${type}'`);\n return next();\n }\n if (\n type === 'user'\n && (req.user?.role === 'user' || req.user?.role === 'reviewer')\n ) {\n log.silly(`user: '${req.user?.username}' was successfully authorized, type: '${type}'`);\n return next();\n }\n log.warn(`user authorization: '${req.user?.username}' wrong role, type: '${type}'`);\n throw new ApiError(httpStatus.FORBIDDEN, 'Authorization Error - wrong Role');\n }),\n };\n if (types[type]) return types[type];\n return catchAsync(\n () => {\n log.error(JSON.stringify(new ApiError(httpStatus.FORBIDDEN, 'Wrong type of authorization')));\n throw new ApiError(httpStatus.FORBIDDEN, 'Authorization Error - wrong type of authorization');\n }\n );\n};\n","import { Request, Response } from \"express\";\nimport compression from 'compression';\n\nexport function compressionFilter(req: Request, res: Response) {\n if (req.headers['x-no-compression']) {\n return false;\n }\n return compression.filter(req, res);\n}\n","import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';\nimport { z } from 'zod';\nimport { commonValidations } from '@schemas/utils';\n\nextendZodWithOpenApi(z);\n\nexport type User = z.infer<typeof UserSchema>;\n\n\nexport const UserSchema = z.object({\n username: z.string().min(1, 'UserSchema: the username name is empty').openapi({ example: \"johndoe@example.com\" }),\n firstName: z.string().min(1, 'UserSchema: the firstName name is empty').openapi({ example: \"John\" }),\n lastName: z.string().min(1, 'UserSchema: the lastName name is empty').openapi({ example: \"Doe\" }),\n role: z.enum(['admin', 'reviewer', 'user']),\n password: z.string().optional(),\n token: z.string().optional(),\n apiKey: z.string().optional(),\n createdDate: z.date().optional().openapi({ example: \"2024-05-25T15:23:21.150Z\" }),\n updatedDate: z.date().optional().openapi({ example: \"2024-05-26T15:23:21.150Z\" }),\n expiration: z.date().optional(),\n meta: z.record(z.any()).optional(),\n _id: commonValidations.id.openapi({ example: \"6bbF35cAB3C59dA969edAe79\" }),\n id: commonValidations.id.openapi({ example: \"6bbF35cAB3C59dA969edAe79\" }),\n})\n\nexport const UserCreateReqSchema =\n z.object({\n username: z.string().min(1, 'UserSchema: the username name is empty').openapi({ example: \"johndoe@example.com\" }),\n firstName: z.string().min(1, 'UserSchema: the firstName name is empty').openapi({ example: \"John\" }),\n lastName: z.string().min(1, 'UserSchema: the lastName name is empty').openapi({ example: \"Doe\" }),\n role: z.enum(['admin', 'reviewer', 'user']),\n email: z.string().optional(),\n password: z.string(),\n })\n\nexport type UserCreateReq = z.infer<typeof UserCreateReqSchema>\n\nexport const UserCurrentRespSchema = z.object({\n _id: commonValidations.id.openapi({ example: \"6bbF35cAB3C59dA969edAe79\" }),\n id: commonValidations.id.openapi({ example: \"6bbF35cAB3C59dA969edAe79\" }),\n username: z.string().min(1, 'UserSchema: the username name is empty').openapi({ example: \"johndoe@example.com\" }),\n firstName: z.string().min(1, 'UserSchema: the firstName name is empty').openapi({ example: \"John\" }),\n lastName: z.string().min(1, 'UserSchema: the lastName name is empty').openapi({ example: \"Doe\" }),\n role: z.enum(['admin', 'reviewer', 'user']),\n})\n\nexport const UserGetRespSchema = UserCurrentRespSchema;\n\nexport const UserCreateRespSchema = z.object({\n username: z.string().min(1, 'UserSchema: the username name is empty').openapi({ example: \"johndoe@example.com\" }),\n firstName: z.string().min(1, 'UserSchema: the firstName name is empty').openapi({ example: \"John\" }),\n lastName: z.string().min(1, 'UserSchema: the lastName name is empty').openapi({ example: \"Doe\" }),\n role: z.enum(['admin', 'reviewer', 'user']),\n createdDate: z.date().optional().openapi({ example: \"2024-05-25T15:23:21.150Z\" }),\n updatedDate: z.date().optional().openapi({ example: \"2024-05-26T15:23:21.150Z\" }),\n _id: commonValidations.id.openapi({ example: \"6bbF35cAB3C59dA969edAe79\" }),\n id: commonValidations.id.openapi({ example: \"6bbF35cAB3C59dA969edAe79\" }),\n})\n\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as logsController from '@controllers/logs.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { LogGetSchema, LogCreateSchema, LogDistinctSchema, LogCreateRespSchema, LogDistinctResponseSchema } from '@schemas/Logs.schema';\nimport { createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { createRequestOpenApiBodySchema } from '@schemas/utils/createRequestOpenApiBodySchema';\nimport { createRequestBodySchema } from '@schemas/utils/createRequestBodySchema';\nimport StatusCodes from 'http-status';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/logs',\n summary: \"List of logs with pagination, and optional filtering and sorting.\",\n tags: ['Logs'],\n responses: createPaginatedApiResponse(LogGetSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/logs'),\n logsController.getLogs as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/logs/distinct',\n summary: \"Get distinct log fields\",\n tags: ['Logs'],\n request: { query: createRequestQuerySchema(LogDistinctSchema) },\n responses: createApiResponse(LogDistinctResponseSchema, 'Success'),\n});\n\nrouter.get(\n '/distinct',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(LogDistinctSchema), 'get, /v1/logs/distinct'),\n logsController.distinct as Midleware\n);\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/logs',\n summary: \"Create a new log entry\",\n tags: ['Logs'],\n request: { body: createRequestOpenApiBodySchema(LogCreateSchema) },\n responses: createApiResponse(LogCreateRespSchema, 'Success', StatusCodes.CREATED),\n});\n\nrouter.post(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestBodySchema(LogCreateSchema), 'post, /v1/logs'),\n logsController.createLog as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst LogGetSchema = z.object({\n _id: commonValidations.id,\n level: z.string().min(1).openapi({\n description: 'Log level',\n example: 'info'\n }),\n message: z.string().min(1).openapi({\n description: 'Log message',\n example: 'User logged in'\n }),\n timestamp: commonValidations.date.openapi({\n description: 'Timestamp of the log entry',\n example: '2024-05-26T10:49:19.896Z'\n }),\n meta: z.object({}).optional().openapi({\n description: 'Additional metadata for the log entry',\n example: { userId: '66519e582c2c701cc438ce59' }\n }),\n id: commonValidations.id,\n});\n\nconst LogCreateSchema = z.object({\n level: z.string().min(1).openapi({\n description: 'Log level',\n example: 'info'\n }).optional(),\n message: z.string().min(1).openapi({\n description: 'Log message',\n example: 'User logged in'\n }).optional(),\n meta: z.object({}).optional().openapi({\n description: 'Additional metadata for the log entry',\n example: { userId: '66519e582c2c701cc438ce59' }\n }),\n});\n\nconst LogCreateRespSchema = commonValidations.success;\n\nconst LogDistinctSchema = z.object({\n field: z.string().min(1).openapi({\n description: 'Field name for distinct query',\n example: 'level'\n }),\n});\n\nconst LogDistinctResponseSchema = z.array(z.string()).openapi({\n description: 'Array of distinct log levels',\n example: [\"debug\", \"error\", \"info\", \"warn\"]\n});\n\n\nexport {\n LogGetSchema,\n LogCreateSchema,\n LogDistinctSchema,\n LogDistinctResponseSchema,\n LogCreateRespSchema\n};\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as runController from '@controllers/runs.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { RunResponseSchema } from '@schemas/Runs.schema';\nimport { createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { commonValidations } from '@schemas/utils';\nimport { getByIdParamsSchema } from '@schemas/utils/createRequestParamsSchema';\nimport { ApiErrorSchema } from '@schemas/common/ApiError.schema';\nimport StatusCodes from 'http-status';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/runs',\n summary: \"List of runs with pagination, and optional filtering and sorting.\",\n tags: ['Runs'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(RunResponseSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/runs'),\n runController.get as Midleware\n);\n\nregistry.registerPath({\n method: 'delete',\n path: '/v1/runs/{id}',\n summary: \"Remove a run by ID\",\n description: \"Remove a run by ID\",\n tags: ['Runs'],\n request: commonValidations.paramsId,\n responses: {\n ...createApiResponse(RunResponseSchema, 'Success'),\n ...createApiResponse(ApiErrorSchema, 'ApiError', StatusCodes.NOT_FOUND),\n },\n});\n\nrouter.delete(\n '/:id',\n ensureLoggedIn(),\n validateRequest(getByIdParamsSchema(), 'delete, /v1/runs/{id}'),\n runController.remove as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst RunResponseSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the run',\n example: 'DEBUG (VIKTAR)'\n }),\n app: commonValidations.id.openapi({\n description: 'App identifier',\n example: '6651dd45b9c3e1e0b8c1ce26'\n }),\n ident: z.string().uuid().openapi({\n description: 'Identifier for the run',\n example: '7a930247-e422-4833-8ab6-b136c23d07e9'\n }),\n createdDate: z.string().datetime().openapi({\n description: 'Creation date of the run',\n example: '2024-05-25T13:15:26.592Z'\n }),\n parameters: z.array(z.unknown()).openapi({\n description: 'Parameters of the run',\n example: []\n }),\n updatedDate: z.string().datetime().openapi({\n description: 'Last update date of the run',\n example: '2024-05-25T13:15:30.969Z'\n }),\n id: commonValidations.id.openapi({\n description: 'Run identifier',\n example: '6651e46e85f83573a821d1f4'\n }),\n});\n\nconst RunGetSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the run',\n example: 'Sample Run'\n }),\n // additional fields here...\n});\n\nexport { RunGetSchema, RunResponseSchema };\n","import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';\nimport { z } from 'zod';\n\nextendZodWithOpenApi(z);\n\nexport const ApiErrorSchema = z.object({\n name: z.string().openapi({\n description: 'Name of the error type',\n example: 'Error'\n }),\n message: z.string().openapi({\n description: 'Detailed message describing the error',\n example: \"cannot remove run with id: '6651e46e85f83573a821d1f4', not found\"\n }),\n status: z.number().openapi({\n description: 'HTTP status code that corresponds to the error',\n example: 404\n }),\n stacktrace: z.string().openapi({\n description: 'Stack trace of the error for debugging purposes',\n example: \"Error: cannot remove run with id: '6651e46e85f83573a821d1f4', not found\\\\n at Object.remove2 (/Users/exadel/Projects/SYNGRISI/packages/syngrisi/src/server/services/run.service.ts:27:15)\\\\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\\\\n at /Users/exadel/Projects/SYNGRISI/packages/syngrisi/src/server/controllers/runs.controller.ts:25:20\"\n })\n });","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as snapshotsController from '@controllers/snapshots.controller';\nimport { Midleware } from '@types';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { validateRequest } from '@utils/validateRequest';\nimport { SnapshotsResponseSchema } from '@schemas/Snapshots.schema'\nimport { createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/snapshots',\n summary: \"List of snapshots with pagination, and optional filtering and sorting.\",\n tags: ['Snapshots'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(SnapshotsResponseSchema, 'Success'),\n\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/snapshots'),\n snapshotsController.get as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst SnapshotSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the snapshot',\n example: 'Login page'\n }),\n filename: z.string().min(1).openapi({\n description: 'Filename of the snapshot',\n example: '6651dd4f7c9186e315910b24.png'\n }),\n imghash: z.string().min(1).openapi({\n description: 'Image hash of the snapshot',\n example: '96e8359554f12142bc19e44288295aa67a59cd128e242b6756651bf8e3d9f34caa7f587367ca8e5cdcfbaaf180adfd8825250fc7485784c41de11a9c08c1f9ab'\n }),\n createdDate: z.string().datetime().openapi({\n description: 'Creation date of the snapshot',\n example: '2024-05-25T13:15:30.946Z'\n }),\n id: commonValidations.id.openapi({\n description: 'Snapshot identifier',\n example: '6651e47285f83573a821d20e'\n }),\n stabMethod: z.string().optional(),\n vOffset: z.number().optional(),\n})\nconst SnapshotsResponseSchema = z.array(\n SnapshotSchema\n);\n\n// const SnapshotUpdateSchema = SnapshotSchema.omit({\n// _id: true,\n// id: true\n// }).partial();\n\n// export type SnapshotUpdateType = z.infer<typeof SnapshotUpdateSchema>;\n\nexport type SnapshotType = z.infer<typeof SnapshotSchema>;\n\nexport { SnapshotsResponseSchema };\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as checkController from '@controllers/check.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { CheckGetSchema, CheckUpdateSchema, CheckAcceptSchema } from '@schemas/Check.schema';\nimport { createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { createRequestOpenApiBodySchema } from '@schemas/utils/createRequestOpenApiBodySchema';\nimport { createRequestBodySchema } from '@schemas/utils/createRequestBodySchema';\nimport { commonValidations } from '@schemas/utils';\nimport { getByIdParamsSchema } from '@schemas/utils/createRequestParamsSchema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/checks',\n summary: \"List of checks with pagination, and optional filtering and sorting.\",\n tags: ['Checks'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(CheckGetSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/checks'),\n checkController.get as Midleware\n);\n\nregistry.registerPath({\n method: 'delete',\n path: '/v1/checks/{id}',\n summary: \"Delete a check by ID\",\n tags: ['Checks'],\n request: commonValidations.paramsId,\n responses: createApiResponse(CheckGetSchema, 'Success'),\n});\n\nrouter.delete(\n '/:id',\n ensureLoggedIn(),\n validateRequest(getByIdParamsSchema(), 'delete, /v1/checks/{id}'),\n checkController.remove as Midleware\n);\n\nregistry.registerPath({\n method: 'put',\n path: '/v1/checks/{id}',\n summary: \"Update a check by ID\",\n tags: ['Checks'],\n request: { params: commonValidations.paramsId.params, body: createRequestOpenApiBodySchema(CheckUpdateSchema) },\n responses: createApiResponse(CheckGetSchema, 'Success'),\n});\n\nrouter.put(\n '/:id',\n ensureLoggedIn(),\n validateRequest(getByIdParamsSchema().merge(createRequestBodySchema(CheckUpdateSchema)), 'put, /v1/checks/{id}'),\n checkController.update as Midleware\n);\n\nregistry.registerPath({\n method: 'put',\n path: '/v1/checks/{id}/accept',\n summary: \"Accept a check by ID\",\n tags: ['Checks'],\n request: { params: commonValidations.paramsId.params, body: createRequestOpenApiBodySchema(CheckAcceptSchema) },\n responses: createApiResponse(CheckGetSchema, 'Success'),\n});\n\nrouter.put(\n '/:id/accept',\n ensureLoggedIn(),\n validateRequest(createRequestBodySchema(CheckAcceptSchema), 'put, /v1/checks/{id}/accept'),\n checkController.accept as Midleware\n);\n\n\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst CheckGetSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the check',\n example: 'Sample Check'\n }),\n test: commonValidations.id.openapi({\n description: 'Test identifier',\n example: '666acbe24fe1d2a67424ff60'\n }),\n suite: commonValidations.id.openapi({\n description: 'Suite identifier',\n example: '6651dd457c9186e315910b00'\n }),\n app: commonValidations.id.openapi({\n description: 'Application identifier',\n example: '6651dd45b9c3e1e0b8c1ce26'\n }),\n branch: z.string().min(1).openapi({\n description: 'Branch name',\n example: 'master'\n }),\n baselineId: commonValidations.id.openapi({\n description: 'Baseline identifier',\n example: '6656ee01bac26a33185c9488'\n }),\n actualSnapshotId: commonValidations.id.openapi({\n description: 'Actual snapshot identifier',\n example: '666acbf04fe1d2a67424ffa4'\n }),\n diffId: commonValidations.id.openapi({\n description: 'Difference identifier',\n example: '666acbf04fe1d2a67424ffa9'\n }),\n updatedDate: commonValidations.date.openapi({\n description: 'Last update date of the check',\n example: '2024-06-13T10:37:36.264Z'\n }),\n status: z.array(z.string().min(1)).openapi({\n description: 'Status of the check',\n example: ['failed']\n }),\n browserName: z.string().min(1).openapi({\n description: 'Browser name used for the check',\n example: 'chrome'\n }),\n browserVersion: z.string().min(1).openapi({\n description: 'Browser version used for the check',\n example: '125'\n }),\n browserFullVersion: z.string().min(1).openapi({\n description: 'Full browser version used for the check',\n example: '125.0.6422.142'\n }),\n viewport: z.string().min(1).openapi({\n description: 'Viewport size used for the check',\n example: '1366x768'\n }),\n os: z.string().min(1).openapi({\n description: 'Operating system used for the check',\n example: 'macOS'\n }),\n result: z.string().openapi({\n description: 'Result of the check',\n example: '{\\n\\t\"isSameDimensions\": false,\\n\\t\"dimensionDifference\": {\\n\\t\\t\"width\": 24,\\n\\t\\t\"height\": 8\\n\\t},\\n\\t\"rawMisMatchPercentage\": 67.38024135551241,\\n\\t\"misMatchPercentage\": \"67.38\",\\n\\t\"analysisTime\": 99,\\n\\t\"executionTotalTime\": \"0,398753687\",\\n\\t\"totalCheckHandleTime\": \"0,431217924\"\\n}'\n }),\n run: commonValidations.id.openapi({\n description: 'Run identifier',\n example: '666acbe24fe1d2a67424ff5d'\n }),\n markedAs: z.string().min(1).openapi({\n description: 'Status marked for the check',\n example: 'accepted'\n }),\n markedDate: commonValidations.date.openapi({\n description: 'Marked date of the check',\n example: '2024-06-13T07:19:32.246Z'\n }),\n markedByUsername: z.string().min(1).openapi({\n description: 'Username of the user who marked the check',\n example: 'Administrator'\n }),\n creatorId: commonValidations.id.openapi({\n description: 'Identifier of the user who created the check',\n example: '66519e582c2c701cc438ce59'\n }),\n creatorUsername: z.string().min(1).openapi({\n description: 'Username of the user who created the check',\n example: 'Guest'\n }),\n failReasons: z.array(z.string().min(1)).openapi({\n description: 'Reasons for the check failure',\n example: ['wrong_dimensions', 'different_images']\n }),\n createdDate: commonValidations.date.openapi({\n description: 'Creation date of the check',\n example: '2024-06-13T10:37:36.721Z'\n }),\n id: commonValidations.id,\n});\n\n\nconst CheckUpdateSchema = CheckGetSchema.omit({ id: true, _id: true }).partial();\n\n// export type CheckUpdateType = z.infer<typeof CheckUpdateSchema> & { files: { file: UploadedFile } } & { hashCode: string };\n\nconst CheckAcceptSchema = z.object({\n baselineId: commonValidations.id.openapi({\n description: 'Baseline identifier to accept the check',\n example: '6651ec20917e9ce26f7c0849'\n }),\n});\n\nexport { CheckGetSchema, CheckUpdateSchema, CheckAcceptSchema };\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as baselineController from '@controllers/baseline.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { BaselineGetSchema, BaselinePutSchema } from '@schemas/Baseline.schema';\nimport { createApiEmptyResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { createRequestOpenApiBodySchema } from '@schemas/utils/createRequestOpenApiBodySchema';\nimport { createRequestBodySchema } from '@schemas/utils/createRequestBodySchema';\nimport { commonValidations } from '@schemas/utils';\nimport { getByIdParamsSchema } from '@schemas/utils/createRequestParamsSchema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/baselines',\n summary: \"List of baselines with pagination, and optional filtering and sorting.\",\n tags: ['Baselines'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(BaselineGetSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/baselines'),\n\n baselineController.get as Midleware\n);\n\nregistry.registerPath({\n method: 'put',\n path: '/v1/baselines/{id}',\n summary: \"Only for testing purposes for now\",\n tags: ['Baselines'],\n request: { params: commonValidations.paramsId.params, body: createRequestOpenApiBodySchema(BaselinePutSchema) },\n responses: createApiEmptyResponse('Success'),\n});\n\nrouter.put(\n '/:id',\n ensureLoggedIn(),\n validateRequest(getByIdParamsSchema().merge(createRequestBodySchema(BaselinePutSchema)), 'put, /v1/baselines/{id}'),\n baselineController.put as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst BaselineGetSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the baseline',\n example: 'Green Button'\n }),\n app: commonValidations.id.openapi({\n description: 'Application identifier for the baseline',\n example: '6651dd45b9c3e1e0b8c1ce26'\n }),\n branch: z.string().min(1).openapi({\n description: 'Branch name for the baseline',\n example: 'master'\n }),\n browserName: z.string().min(1).openapi({\n description: 'Browser name used for the baseline',\n example: 'chrome'\n }),\n viewport: z.string().min(1).openapi({\n description: 'Viewport size used for the baseline',\n example: '1366x768'\n }),\n os: z.string().min(1).openapi({\n description: 'Operating system used for the baseline',\n example: 'macOS'\n }),\n createdDate: commonValidations.date.openapi({\n description: 'Creation date of the baseline',\n example: '2024-05-26T10:49:19.896Z'\n }),\n lastMarkedDate: commonValidations.date.openapi({\n description: 'Last marked date of the baseline',\n example: '2024-05-26T10:49:19.852Z'\n }),\n markedAs: z.string().min(1).openapi({\n description: 'Status marked for the baseline',\n example: 'accepted'\n }),\n\n markedById: commonValidations.id.openapi({\n description: 'Identifier of the user who marked the baseline',\n example: '66519e582c2c701cc438ce59'\n }),\n markedByUsername: z.string().min(1).openapi({\n description: 'Username of the user who marked the baseline',\n example: 'Guest'\n }),\n snapshootId: commonValidations.id.openapi({\n description: 'Snapshot identifier for the baseline',\n example: '6651ec20917e9ce26f7c0849'\n }),\n id: commonValidations.id,\n});\n\n// export type BaselineType = z.infer<typeof BaselineGetSchema>;\n\nconst BaselinePutSchema = z.object({\n name: z.string().min(1).openapi({\n description: 'Name of the baseline',\n example: 'Green Button'\n }).optional(),\n branch: z.string().min(1).openapi({\n description: 'Branch name for the baseline',\n example: 'master'\n }).optional(),\n browserName: z.string().min(1).openapi({\n description: 'Browser name used for the baseline',\n example: 'chrome'\n }).optional(),\n viewport: z.string().min(1).openapi({\n description: 'Viewport size used for the baseline',\n example: '1366x768'\n }).optional(),\n os: z.string().min(1).openapi({\n description: 'Operating system used for the baseline',\n example: 'macOS'\n }).optional(),\n createdDate: commonValidations.date.openapi({\n description: 'Creation date of the baseline',\n example: '2024-05-26T10:49:19.896Z'\n }).optional(),\n lastMarkedDate: commonValidations.date.openapi({\n description: 'Last marked date of the baseline',\n example: '2024-05-26T10:49:19.852Z'\n }).optional(),\n markedAs: z.string().min(1).openapi({\n description: 'Status marked for the baseline',\n example: 'accepted'\n }).optional(),\n markedById: commonValidations.id.openapi({\n description: 'Identifier of the user who marked the baseline',\n example: '66519e582c2c701cc438ce59'\n }).optional(),\n markedByUsername: z.string().min(1).openapi({\n description: 'Username of the user who marked the baseline',\n example: 'Guest'\n }).optional(),\n});\n\n\n\nexport { BaselineGetSchema, BaselinePutSchema };\n\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as suiteController from '@controllers/suite.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { SuiteGetSchema } from '@schemas/Suite.schema';\nimport { createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { commonValidations } from '@schemas/utils';\nimport { getByIdParamsSchema } from '@schemas/utils/createRequestParamsSchema';\nimport { SkipValid } from '@schemas/SkipValid.schema';\nimport { ApiErrorSchema } from '@schemas/common/ApiError.schema';\nimport StatusCodes from 'http-status';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/suites',\n summary: \"List of suites\",\n tags: ['Suites'],\n responses: createPaginatedApiResponse(SuiteGetSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n validateRequest(SkipValid, 'get, /v1/suites'),\n suiteController.get as Midleware\n);\n\nregistry.registerPath({\n method: 'delete',\n path: '/v1/suites/{id}',\n summary: \"Delete a suite by ID\",\n tags: ['Suites'],\n request: commonValidations.paramsId,\n responses: {\n ...createApiResponse(SuiteGetSchema, 'Success'),\n ...createApiResponse(ApiErrorSchema, 'ApiError', StatusCodes.NOT_FOUND),\n },\n});\n\nrouter.delete(\n '/:id',\n ensureLoggedIn(),\n validateRequest(getByIdParamsSchema(), 'delete, /v1/suites/{id}'),\n suiteController.remove as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst SuiteGetSchema = z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the suite',\n example: 'Smoke tests'\n }),\n tags: z.array(z.string()).openapi({\n description: 'Tags associated with the suite',\n example: []\n }),\n app: commonValidations.id.openapi({\n description: 'Application identifier',\n example: '666b3b82db17d34ecdbd06f6'\n }),\n createdDate: commonValidations.date.openapi({\n description: 'Creation date of the suite',\n example: '2024-06-13T18:33:38.617Z'\n }),\n updatedDate: commonValidations.date.openapi({\n description: 'Last update date of the suite',\n example: '2024-06-13T19:55:40.114Z'\n }),\n id: commonValidations.id.openapi({\n description: 'ID of the suite',\n example: '666b3b828833d0cf24a670d7'\n })\n});\n\n// export type SuiteType = z.infer<typeof SuiteGetSchema>;\n\nexport { SuiteGetSchema };\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as settingsController from '@controllers/settings.controller';\nimport { Midleware } from '@types';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { authorization } from '@middlewares/authorization';\nimport { validateRequest } from '@utils/validateRequest';\nimport { SettingsNameParamSchema, SettingsResponseSchema, SettingsUpdateSchema } from '@schemas/Settings.schema';\nimport { createApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { SkipValid } from '@schemas/SkipValid.schema';\nimport { createRequestOpenApiBodySchema } from '@schemas/utils/createRequestOpenApiBodySchema';\nimport { createRequestBodySchema } from '@schemas/utils/createRequestBodySchema';\nimport { createRequestParamsSchema } from '@schemas/utils/createRequestParamsSchema';\nimport { commonValidations } from '@schemas/utils';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/settings',\n summary: \"Get application settings\",\n tags: ['Settings'],\n responses: createApiResponse(SettingsResponseSchema, 'Success'),\n});\n\nrouter.get(\n '/',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(SkipValid, 'get, /v1/settings'),\n settingsController.getSettings as Midleware\n);\n\nregistry.registerPath({\n method: 'patch',\n path: '/v1/settings/{name}',\n summary: \"Update a setting by name\",\n tags: ['Settings'],\n request: { params: SettingsNameParamSchema, body: createRequestOpenApiBodySchema(SettingsUpdateSchema) },\n responses: createApiResponse(commonValidations.success, 'Success'),\n});\n\nconst validateSchema = createRequestParamsSchema(SettingsNameParamSchema)\n .merge(createRequestBodySchema(SettingsUpdateSchema));\nrouter.patch(\n '/:name',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(validateSchema, 'patch, /v1/settings/{name}'),\n settingsController.updateSetting as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst SettingsGetSchema = z.object({\n name: z.string().min(1).openapi({\n description: 'Name of the setting',\n example: 'example_setting'\n }),\n value: z.any().openapi({\n description: 'Value of the setting',\n example: 'example_value'\n }),\n description: z.string().optional().openapi({\n description: 'Description of the setting',\n example: 'This is an example setting.'\n }),\n});\n\nconst SettingsUpdateSchema = z.object({\n value: z.any().openapi({\n description: 'New value for the setting',\n example: 'new_example_value'\n }),\n enabled: z.boolean().optional().openapi({\n description: 'Enable or disable the setting',\n example: true\n }),\n});\n\nconst SettingsResponseSchema = z.array(\n z.object({\n _id: commonValidations.id,\n name: z.string().min(1).openapi({\n description: 'Name of the setting',\n example: 'first_run'\n }),\n label: z.string().min(1).openapi({\n description: 'Label of the setting',\n example: 'First Run'\n }),\n description: z.string().min(1).openapi({\n description: 'Description of the setting',\n example: 'Indicates if the application is running the first time'\n }),\n type: z.string().min(1).openapi({\n description: 'Type of the setting',\n example: 'Boolean'\n }),\n value: z.any().openapi({\n description: 'Value of the setting',\n example: false\n }),\n enabled: z.boolean().openapi({\n description: 'Indicates if the setting is enabled',\n example: true\n }),\n __v: z.number().openapi({\n description: 'Version key',\n example: 0\n }),\n })\n);\n\nconst SettingsNameParamSchema = z.object({\n name: z.string().min(1).openapi({\n description: 'Name of the setting to update',\n example: 'example_setting'\n }),\n});\n\nexport { SettingsGetSchema, SettingsUpdateSchema, SettingsNameParamSchema, SettingsResponseSchema };\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as testController from '@controllers/test.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { TestDistinctRequestParamsSchema, TestDistinctResponseSchema } from '@schemas/TestDistinct.schema';\nimport { createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { createRequestParamsSchema } from '@schemas/utils/createRequestParamsSchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/test-distinct/{id}',\n summary: \"[Obsolete use '/v1/test/distict' instead] List of certain unique fields across all tests\",\n tags: ['Tests'],\n request: { params: TestDistinctRequestParamsSchema, query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(TestDistinctResponseSchema, 'Success'),\n});\n\n// TODO: [Obsolete] use '/v1/test/distict' instead of this\nrouter.get(\n '/:id',\n ensureLoggedIn(),\n validateRequest(createRequestParamsSchema(TestDistinctRequestParamsSchema), 'get, /v1/test-distinct/{id}'),\n testController.distinct as Midleware\n);\n\nexport default router;\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as tasksController from '@controllers/tasks.controller';\nimport { Midleware } from '@types';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { authorization } from '@middlewares';\nimport { SkipValid } from '@schemas/SkipValid.schema';\nimport { validateRequest } from '@utils/validateRequest';\nimport { createApiResponse } from '@api-docs/openAPIResponseBuilders';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/task_test',\n summary: \"Test task endpoint\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/task_test',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(SkipValid, 'get, /v1/tasks/task_test'),\n tasksController.task_test as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/task_handle_old_checks',\n summary: \"Handle old checks task\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/task_handle_old_checks',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(SkipValid, 'get, /v1/tasks/task_handle_old_checks'),\n tasksController.task_handle_old_checks as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/task_handle_database_consistency',\n summary: \"Handle database consistency task\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/task_handle_database_consistency',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(SkipValid, 'get, /v1/tasks/task_handle_database_consistency'),\n tasksController.task_handle_database_consistency as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/task_remove_old_logs',\n summary: \"Remove old logs task\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/task_remove_old_logs',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n validateRequest(SkipValid, 'get, /v1/tasks/task_remove_old_logs'),\n tasksController.task_remove_old_logs as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/loadTestUser',\n summary: \"Load test user\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/loadTestUser',\n ensureLoggedIn() as Midleware,\n validateRequest(SkipValid, 'get, /v1/tasks/loadTestUser'),\n tasksController.loadTestUser as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/status',\n summary: \"Get status task, only for the test cases\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/status',\n validateRequest(SkipValid, 'get, /v1/tasks/status'),\n tasksController.status as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/tasks/screenshots',\n summary: \"Get screenshots task\",\n tags: ['Tasks'],\n responses: createApiResponse(SkipValid, 'Success'),\n});\n\nrouter.get(\n '/screenshots',\n validateRequest(SkipValid, 'get, /v1/tasks/screenshots'),\n tasksController.screenshots as Midleware\n);\n\nexport default router;\n","import express from 'express';\nimport { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport * as clientController from '@controllers/client.controller';\nimport { Midleware } from '@types';\nimport { validateRequest } from '@utils/validateRequest';\nimport { ClientStartSessionSchema, ClientCreateCheckSchema, ClientGetIdentSchema, ClientGetBaselinesSchema, ClientGetSnapshotsSchema, ClientStartSessionResponseSchema, ClientCreateCheckResponseSchema } from '@schemas/Client.schema';\nimport { createApiResponse, createPaginatedApiResponse } from '@api-docs/openAPIResponseBuilders';\nimport { ensureApiKey } from '@middlewares/ensureLogin';\nimport { createRequestQuerySchema } from '@schemas/utils/createRequestQuerySchema';\nimport { RequestPaginationSchema } from '@schemas/common/RequestPagination.schema';\nimport { createRequestOpenApiBodySchema } from '@schemas/utils/createRequestOpenApiBodySchema';\nimport { createRequestBodySchema } from '@schemas/utils/createRequestBodySchema';\nimport { commonValidations } from '@schemas/utils';\nimport { SkipValid } from '@schemas/SkipValid.schema';\nimport { getByIdParamsSchema } from '../../schemas/utils/createRequestParamsSchema';\nimport { IdentJSONStringSchema } from '../../schemas';\n\nexport const registry = new OpenAPIRegistry();\nconst router = express.Router();\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/client/startSession',\n summary: \"Start a client session\",\n tags: ['Client'],\n request: { body: createRequestOpenApiBodySchema(ClientStartSessionSchema) },\n responses: createApiResponse(ClientStartSessionResponseSchema, 'Success'),\n});\n\nrouter.post(\n '/startSession',\n ensureApiKey(),\n validateRequest(createRequestBodySchema(ClientStartSessionSchema), '/v1/client/startSession'),\n clientController.startSession as Midleware\n);\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/client/stopSession/{testid}',\n summary: \"Stop a client session by test ID\",\n tags: ['Client'],\n request: commonValidations.paramsTestId,\n responses: createApiResponse(ClientStartSessionResponseSchema, 'Success'),\n});\n\nrouter.post(\n '/stopSession/:testid',\n ensureApiKey(),\n // validateRequest(SkipValid, '/v1/client/stopSession/{testid}'),\n validateRequest(getByIdParamsSchema('testid'), '/v1/client/stopSession/{testid}'),\n clientController.endSession as Midleware\n);\n\nregistry.registerPath({\n method: 'post',\n path: '/v1/client/createCheck',\n summary: \"Create a client check\",\n tags: ['Client'],\n request: { body: createRequestOpenApiBodySchema(ClientCreateCheckSchema) },\n responses: createApiResponse(ClientCreateCheckResponseSchema, 'Success'),\n});\n\nrouter.post(\n '/createCheck',\n ensureApiKey(),\n validateRequest(createRequestBodySchema(ClientCreateCheckSchema), '/v1/client/createCheck'),\n clientController.createCheck as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/client/getIdent',\n summary: \"Set of fields that identify checks and baselines\",\n tags: ['Client'],\n responses: createApiResponse(ClientGetIdentSchema, 'Success'),\n});\n\nrouter.get(\n '/getIdent',\n ensureApiKey(),\n validateRequest(SkipValid, 'get, /v1/client/getIdent'),\n clientController.getIdent as Midleware\n);\n\nconst ExtRequestBaselineSchema = RequestPaginationSchema.extend(\n {\n filter: IdentJSONStringSchema,\n }\n);\nregistry.registerPath({\n method: 'get',\n path: '/v1/client/baselines',\n summary: \"Get client baselines\",\n tags: ['Client'],\n // request: { query: RequestPaginationSchema },\n request: { query: ExtRequestBaselineSchema },\n responses: createPaginatedApiResponse(ClientGetBaselinesSchema, 'Success'),\n});\n\nrouter.get(\n '/baselines',\n ensureApiKey(),\n validateRequest(createRequestQuerySchema(ExtRequestBaselineSchema), 'get, /v1/client/baselines'),\n clientController.getBaselines as Midleware\n);\n\nregistry.registerPath({\n method: 'get',\n path: '/v1/client/snapshots',\n summary: \"Get client snapshots\",\n tags: ['Client'],\n request: { query: RequestPaginationSchema },\n responses: createPaginatedApiResponse(ClientGetSnapshotsSchema, 'Success'),\n});\n\nrouter.get(\n '/snapshots',\n ensureApiKey(),\n validateRequest(createRequestQuerySchema(RequestPaginationSchema), 'get, /v1/client/snapshots'),\n clientController.getSnapshots as Midleware\n);\n\nexport default router;\n","import { z } from 'zod';\nimport { commonValidations } from './utils';\n\nconst ClientStartSessionSchema = z.object({\n name: z.string().min(1).openapi({\n description: 'Name of the session',\n example: 'Login test'\n }),\n app: z.string().min(1).openapi({\n description: 'Application name',\n example: 'My project'\n }),\n tags: z.string().openapi({\n description: 'Tags associated with the session',\n example: \"[\\\"@smoke\\\", \\\"@PJ-231\\\"]\"\n }).optional(),\n branch: z.string().min(1).openapi({\n description: 'Branch name',\n example: 'master'\n }),\n viewport: z.string().min(1).openapi({\n description: 'Viewport size',\n example: '1366x768'\n }),\n browser: z.string().min(1).openapi({\n description: 'Browser name',\n example: 'chrome'\n }),\n browserVersion: z.string().min(1).openapi({\n description: 'Browser version',\n example: '125'\n }),\n browserFullVersion: z.string().min(1).openapi({\n description: 'Browser full version',\n example: '125.12.56.001'\n }).optional(),\n os: z.string().min(1).openapi({\n description: 'Operating system',\n example: 'macOS'\n }),\n run: z.string().min(1).openapi({\n description: 'Run name',\n example: 'Build #123'\n }),\n runident: z.string().min(1).openapi({\n description: 'Run identifier',\n example: '978ee42c-78f8-40f4-8954-51ebc08d1718'\n }),\n suite: z.string().min(1).openapi({\n description: 'Suite name',\n example: 'Smoke tests'\n })\n});\n\nexport type ClientStartSessionType = z.infer<typeof ClientStartSessionSchema>\n\nconst ClientStartSessionResponseSchema = z.object({\n name: z.string().openapi({\n description: 'Name of the session',\n example: 'Login test'\n }),\n status: z.string().openapi({\n description: 'Status of the session',\n example: 'Running'\n }),\n browserName: z.string().openapi({\n description: 'Browser name',\n example: 'chrome'\n }),\n browserVersion: z.string().openapi({\n description: 'Browser version',\n example: '125'\n }),\n branch: z.string().openapi({\n description: 'Branch name',\n example: 'master'\n }),\n tags: z.array(z.string()).openapi({\n description: 'Tags associated with the session',\n example: ['@smoke', '@PJ-231']\n }),\n viewport: z.string().openapi({\n description: 'Viewport size',\n example: '1366x768'\n }),\n os: z.string().openapi({\n description: 'Operating system',\n example: 'macOS'\n }),\n app: z.string().openapi({\n description: 'Application identifier',\n example: '666b3b82db17d34ecdbd06f6'\n }),\n blinking: z.number().openapi({\n description: 'Blinking count',\n example: 0\n }),\n updatedDate: z.string().openapi({\n description: 'Last updated date',\n example: '2024-06-13T18:34:28.121Z'\n }),\n startDate: z.string().openapi({\n description: 'Start date of the session',\n example: '2024-06-13T18:34:28.121Z'\n }),\n checks: z.array(z.any()).openapi({\n description: 'Checks associated with the session',\n example: []\n }),\n suite: z.string().openapi({\n description: 'Suite identifier',\n example: '666b3b828833d0cf24a670d7'\n }),\n run: z.string().openapi({\n description: 'Run identifier',\n example: '666b244a70a6fb0a4368b59e'\n }),\n _id: commonValidations.id.openapi({\n description: 'Identifier of the session',\n example: '666b3bb49e0c25666d76e0c4'\n }),\n id: commonValidations.id.openapi({\n description: 'Identifier of the session',\n example: '666b3bb49e0c25666d76e0c4'\n })\n});\n\nconst ClientEndSessionSchema = z.object({\n testid: commonValidations.id\n});\n\nconst ClientCreateCheckSchema = z.object({\n testid: commonValidations.id.openapi({\n description: 'Test identifier',\n example: '666b2e1e93ca920ef5985b47'\n }),\n name: z.string().openapi({\n description: 'Name of the check',\n example: 'Login page'\n }),\n appName: z.string().openapi({\n description: 'Application name',\n example: 'My App'\n }),\n branch: z.string().openapi({\n description: 'Branch name',\n example: 'master'\n }),\n suitename: z.string().openapi({\n description: 'Suite name',\n example: 'Smoke tests'\n }),\n viewport: z.string().openapi({\n description: 'Viewport size',\n example: '1366x768'\n }),\n browserName: z.string().openapi({\n description: 'Browser name',\n example: 'chrome'\n }),\n browserVersion: z.string().openapi({\n description: 'Browser version',\n example: '125'\n }),\n browserFullVersion: z.string().openapi({\n description: 'Full browser version',\n example: '125.0.6422.142'\n }),\n os: z.string().openapi({\n description: 'Operating system',\n example: 'macOS'\n }),\n hashcode: z.string().openapi({\n description: 'Hash of the snapshot - In the first phase, only the hash is sent, in case the snapshot is already in the Syngrisi database',\n example: 'ef6ff7c6e6fd536de877c02cf61381e5a1111a24c9d21c1c2a0c0c06fdd2f01271da8880da80a1caa7c123ce3256068c40055753d70bd1dbc558d088f90cd398'\n })\n});\n\n// export type CreateCheckType = z.infer<typeof ClientCreateCheckSchema>;\n\nconst SnapshotSchema = z.object({\n name: z.string().openapi({\n description: 'Name of the snapshot',\n example: 'Login page'\n }),\n filename: z.string().openapi({\n description: 'Filename of the snapshot',\n example: '666b12d859ac872b495af4b0.png'\n }),\n imghash: z.string().openapi({\n description: 'Image hash of the snapshot',\n example: 'ef6ff7c6e6fd536de877c02cf61381e5a1111a24c9d21c1c2a0c0c06fdd2f01271da8880da80a1caa7c123ce3256068c40055753d70bd1dbc558d088f90cd398'\n }),\n _id: commonValidations.id.openapi({\n description: 'Identifier of the snapshot',\n example: '666b4ebc421977cbf466b478'\n }),\n createdDate: z.string().openapi({\n description: 'Creation date',\n example: '2024-06-13T19:55:40.068Z'\n }),\n id: commonValidations.id.openapi({\n description: 'Identifier of the snapshot',\n example: '666b4ebc421977cbf466b478'\n })\n});\n\nconst ClientCreateCheckResponseSchema = z.object({\n name: z.string().openapi({\n description: 'Name of the check',\n example: 'Login page'\n }),\n test: commonValidations.id.openapi({\n description: 'Test identifier',\n example: '666b4e74421977cbf466b446'\n }),\n suite: commonValidations.id.openapi({\n description: 'Suite identifier',\n example: '666b3b828833d0cf24a670d7'\n }),\n app: commonValidations.id.openapi({\n description: 'Application identifier',\n example: '6651dd45b9c3e1e0b8c1ce26'\n }),\n branch: z.string().openapi({\n description: 'Branch name',\n example: 'master'\n }),\n baselineId: commonValidations.id.openapi({\n description: 'Baseline identifier',\n example: '666b4ebc421977cbf466b478'\n }),\n actualSnapshotId: commonValidations.id.openapi({\n description: 'Actual snapshot identifier',\n example: '666b4ebc421977cbf466b478'\n }),\n updatedDate: z.string().openapi({\n description: 'Last updated date',\n example: '2024-06-13T19:55:40.061Z'\n }),\n status: z.array(z.string()).openapi({\n description: 'Status of the check',\n example: ['new']\n }),\n browserName: z.string().openapi({\n description: 'Browser name',\n example: 'chrome'\n }),\n browserVersion: z.string().openapi({\n description: 'Browser version',\n example: '125'\n }),\n browserFullVersion: z.string().openapi({\n description: 'Full browser version',\n example: '125.0.6422.142'\n }),\n viewport: z.string().openapi({\n description: 'Viewport size',\n example: '1366x768'\n }),\n os: z.string().openapi({\n description: 'Operating system',\n example: 'macOS'\n }),\n result: z.string().openapi({\n description: 'Result of the check',\n example: '{}'\n }),\n run: commonValidations.id.openapi({\n description: 'Run identifier',\n example: '666b4e74421977cbf466b443'\n }),\n creatorId: commonValidations.id.openapi({\n description: 'Creator identifier',\n example: '66519e582c2c701cc438ce59'\n }),\n creatorUsername: z.string().openapi({\n description: 'Creator username',\n example: 'Guest'\n }),\n failReasons: z.array(z.any()).openapi({\n description: 'Reasons for failure',\n example: []\n }),\n _id: commonValidations.id.openapi({\n description: 'Identifier of the check',\n example: '666b4ebc421977cbf466b47c'\n }),\n createdDate: z.string().openapi({\n description: 'Creation date',\n example: '2024-06-13T19:55:40.082Z'\n }),\n currentSnapshot: SnapshotSchema,\n expectedSnapshot: SnapshotSchema,\n lastSuccess: commonValidations.id.openapi({\n description: 'Identifier of the last successful check',\n example: '666b4ebc421977cbf466b47c'\n })\n});\n\nconst ClientGetIdentSchema = z.array(z.string()).openapi({\n description: \"Set of fields that identify checks and baselines\",\n example: ['name', 'viewport', 'browserName', 'os', 'app', 'branch']\n});\n\nconst ClientGetBaselinesSchema = z.object({\n baselines: z.array(z.object({\n id: commonValidations.id,\n name: z.string().openapi({\n description: 'Name of the baseline',\n example: 'A-A-A'\n }),\n app: commonValidations.id.openapi({\n description: 'Application identifier',\n example: '6651dd45b9c3e1e0b8c1ce26'\n }),\n branch: z.string().openapi({\n description: 'Branch name',\n example: 'master'\n }),\n browserName: z.string().openapi({\n description: 'Browser name',\n example: 'chrome'\n }),\n viewport: z.string().openapi({\n description: 'Viewport size',\n example: '1366x768'\n }),\n os: z.string().openapi({\n description: 'Operating system',\n example: 'macOS'\n }),\n createdDate: z.string().openapi({\n description: 'Creation date',\n example: '2024-06-13T15:59:44.479Z'\n }),\n lastMarkedDate: z.string().openapi({\n description: 'Last marked date',\n example: '2024-06-13T15:59:44.381Z'\n }),\n markedAs: z.string().openapi({\n description: 'Marked status',\n example: 'accepted'\n }),\n markedById: commonValidations.id.openapi({\n description: 'Identifier of the user who marked the baseline',\n example: '66519e1682764a892a1a0031'\n }),\n markedByUsername: z.string().openapi({\n description: 'Username of the user who marked the baseline',\n example: 'Administrator'\n }),\n snapshootId: commonValidations.id.openapi({\n description: 'Snapshot identifier',\n example: '666b12d859ac872b495af4b0'\n }),\n _id: commonValidations.id.openapi({\n description: 'Identifier of the baseline',\n example: '666b177059ac872b495af63d'\n })\n }))\n});\n\nconst ClientGetSnapshotsSchema = z.object({\n snapshots: z.array(z.object({\n id: commonValidations.id,\n name: z.string()\n }))\n});\n\nexport {\n ClientStartSessionSchema,\n ClientStartSessionResponseSchema,\n ClientEndSessionSchema,\n ClientCreateCheckSchema,\n ClientGetIdentSchema,\n ClientGetBaselinesSchema,\n ClientGetSnapshotsSchema,\n ClientCreateCheckResponseSchema\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport express, { Request, Response } from 'express';\nimport path from 'path';\nimport httpStatus from 'http-status';\n\nimport { catchAsync } from '@utils';\nimport { Midleware } from '@types';\n\nconst router = express.Router();\nconst rootDir = path.resolve(process.cwd());\n\n\nconst authController = catchAsync(async (req: Request, res: Response) => {\n res.status(httpStatus.OK)\n // .sendFile(path.normalize(path.join(`${__dirname}./../../../../mvc/views/react/auth/index.html`)));\n .sendFile(path.normalize(path.join(rootDir, `/mvc/views/react/auth/index.html`)));\n\n});\n\nrouter.get('*', authController as Midleware);\n\nexport default router;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport express, { Request, Response } from 'express';\nimport path from 'path';\nimport httpStatus from 'http-status';\n\nimport { catchAsync } from '@utils';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { authorization } from '@middlewares';\nimport { Midleware } from '../../../types/Midleware';\n\nconst router = express.Router();\nconst rootDir = path.resolve(process.cwd());\n\n\nconst adminController = catchAsync(async (req: Request, res: Response) => {\n res.status(httpStatus.OK)\n // .sendFile(path.normalize(path.join(`${__dirname}./../../../../mvc/views/react/admin/index.html`)));\n .sendFile(path.normalize(path.join(rootDir, `/mvc/views/react/admin/index.html`)));\n\n});\n\nrouter.get(\n '*',\n ensureLoggedIn(),\n authorization('admin') as Midleware,\n adminController as Midleware\n);\n\nexport default router;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport express, { Response } from 'express';\nimport path from 'path';\nimport httpStatus from 'http-status';\n\nimport { catchAsync } from '@utils';\nimport { ensureLoggedIn } from '@middlewares/ensureLogin';\nimport { ExtRequest } from '../../../types/ExtRequest';\nimport { Midleware } from '../../../types/Midleware';\n\nconst router = express.Router();\nconst rootDir = path.resolve(process.cwd());\n\nconst staticIndex = async (req: ExtRequest, res: Response) => {\n res.status(httpStatus.OK)\n .sendFile(path.normalize(path.join(rootDir, `/mvc/views/react/index2/index.html`)));\n}\n\nrouter.get(\n '',\n ensureLoggedIn(),\n catchAsync(staticIndex) as Midleware\n);\n\nexport default router;\n","import pinoLogger from 'pino-http';\nimport {config} from '@config';\nimport pino from 'pino';\n\nconst httpLogger = pinoLogger(\n {\n name: 'vrs',\n autoLogging: true,\n useLevel: 'info',\n },\n pino.destination(config.httpLoggerFilePath)\n);\n\nexport default httpLogger;\n","import { ErrorRequestHandler, RequestHandler } from 'express';\nimport httpStatus from 'http-status';\nimport { Request, Response } from \"express\";\nimport { env } from \"@env\";\nimport log from \"@logger\";\nimport { ApiError } from '../utils';\nimport StatusCodes from 'http-status';\n\n\nconst unexpectedRequest: RequestHandler = (req: Request, res: Response) => {\n res.status(httpStatus.NOT_FOUND).json({ error: `url: '${req.originalUrl}' not found` });\n};\n\nconst addErrorToRequestLog: ErrorRequestHandler = (err, _req, res, next) => {\n log.error(err);\n res.locals.err = err;\n if (env.NODE_ENV !== \"production\") {\n if (err instanceof ApiError) {\n return res.status(err.statusCode)\n .json({\n name: err.name,\n type: 'ApiError',\n message: err.message,\n status: err.statusCode,\n // sanitise stacktrace\n stacktrace: JSON.stringify(err.stack),\n });\n }\n else if(err instanceof Error) {\n return res.status(StatusCodes.INTERNAL_SERVER_ERROR)\n .json({\n name: err.name,\n type: 'Error',\n message: err.message,\n stacktrace: JSON.stringify(err.stack),\n });\n }\n }\n next(err);\n};\n\nexport default () => [unexpectedRequest, addErrorToRequestLog];\n","import express, { Request, Response, Router } from 'express';\nimport swaggerUi from 'swagger-ui-express';\nimport { generateOpenAPIDocument } from './openAPIDocumentGenerator';\n\nexport const openAPIRouter: Router = (() => {\n const router = express.Router();\n const openAPIDocument = generateOpenAPIDocument();\n\n // eslint-disable-next-line custom/validate-request-rule, custom/check-route-registration\n router.get('/json', (_req: Request, res: Response) => {\n res.setHeader('Content-Type', 'application/json');\n res.send(openAPIDocument);\n });\n\n router.use('/', swaggerUi.serve, swaggerUi.setup(openAPIDocument));\n\n return router;\n})();\n","import { OpenApiGeneratorV3, OpenAPIRegistry } from '@asteasolutions/zod-to-openapi';\nimport { registry as users } from '../routes/v1/users.route';\nimport { registry as app } from '../routes/v1/app.route';\n\nimport { registry as suites } from '../routes/v1/suites.route';\nimport { registry as auth } from '../routes/v1/auth.route';\nimport { registry as logs } from '../routes/v1/logs.route';\nimport { registry as tasks } from '../routes/v1/tasks.route';\nimport { registry as baselines } from '../routes/v1/baselines.route';\nimport { registry as runs } from '../routes/v1/runs.route';\nimport { registry as test } from '../routes/v1/tests.route';\nimport { registry as checks } from '../routes/v1/checks.route';\nimport { registry as settings } from '../routes/v1/settings.route';\nimport { registry as testDistinct } from '../routes/v1/test_distinct.route';\nimport { registry as client } from '../routes/v1/client.route';\nimport { registry as snapshots } from '../routes/v1/snapshots.route';\n\nexport function generateOpenAPIDocument() {\n const registry = new OpenAPIRegistry([\n users,\n app,\n auth,\n logs,\n suites,\n tasks,\n baselines,\n runs,\n test,\n checks,\n settings,\n testDistinct,\n client,\n snapshots\n ]);\n const generator = new OpenApiGeneratorV3(registry.definitions);\n\n return generator.generateDocument({\n openapi: '3.0.0',\n info: {\n version: '1.0.0',\n title: 'Swagger API',\n },\n externalDocs: {\n description: 'View the raw OpenAPI Specification in JSON format',\n url: '/swagger.json',\n },\n });\n}\n"],"mappings":"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","names":["import_express","import_compression","import_passport","import_path","import_dotenv","import_crypto","dotenv","path","crypto","dotenv","fs","crypto","import_path","current","path","import_bson","mongoose","import_mongoose","mongoose","import_mongoose","mongoose","import_mongoose","mongoose","import_mongoose","mongoose","import_mongoose","mongoose","import_mongoose","mongoose","import_mongoose","passportLocalMongoose","mongoose","import_mongoose","mongoose","import_mongoose","mongoose","calculateAcceptedStatus","path","winston","info","import_express","import_zod_to_openapi","AppSettings","uuidAPIKey","logOpts","hasha","passport","info","httpStatus","AppSettings","import_http_status","status","path","StatusCodes","import_zod_to_openapi","import_zod","import_zod","import_zod","num","import_http_status","import_zod","StatusCodes","import_zod","import_zod","express","import_express","import_zod_to_openapi","import_http_status","remove","id","logOpts","import_http_status","remove","id","logOpts","httpStatus","remove","import_http_status","remove","id","logOpts","httpStatus","import_mongoose","mongoose","id","logOpts","get","get","import_fs","st","fs","logOpts","fsp","errMsg","import_fs","import_hasha","import_mongoose","logOpts","mongoose","import_mongoose","logOpts","id","mongoose","import_mongoose","logOpts","mongoose","import_mongoose","logOpts","mongoose","errMsg","logOpts","logOpts","resemble","logOpts","import_http_status","id","update","logOpts","app","status","st","httpStatus","hasha","path","fsp","errMsg","fs","test","check","StatusCodes","createUser","import_http_status","createUser","httpStatus","logOpts","id","accept","remove","import_fs","logOpts","path","fs","remove","id","errMsg","logOpts","accept","id","logMeta","remove","get","put","id","httpStatus","import_http_status","get","update","id","httpStatus","accept","remove","import_http_status","import_zod","import_zod","import_zod_to_openapi","import_zod","registry","startSession","endSession","httpStatus","createCheck","logOpts","errMsg","app","getIdent","getBaselines","import_http_status","import_bson","distinct","httpStatus","import_bson","get","task_test","task_handle_old_checks","task_handle_database_consistency","task_remove_old_logs","status","screenshots","loadTestUser","import_http_status","httpStatus","distinct","remove","id","accept","get","remove","update","import_http_status","import_bson","logOpts","httpStatus","get","update","remove","get","import_http_status","httpStatus","get","AppSettings","import_bson","get","remove","id","import_bson","get","remove","id","import_zod_to_openapi","import_zod","import_zod_to_openapi","import_zod","import_zod","registry","router","express","import_express","import_zod_to_openapi","import_zod","logOpts","AppSettings","result","import_zod","id","import_zod","validIds","registry","router","express","remove","accept","import_express","import_http_status","import_zod_to_openapi","import_http_status","AppSettings","httpStatus","compression","import_zod_to_openapi","import_zod","UserSchema","registry","router","express","UserSchema","StatusCodes","import_express","import_zod_to_openapi","import_zod","import_http_status","registry","router","express","distinct","StatusCodes","import_express","import_zod_to_openapi","import_zod","import_zod_to_openapi","import_zod","import_http_status","registry","router","express","get","StatusCodes","remove","import_express","import_zod_to_openapi","import_zod","SnapshotSchema","registry","router","express","get","import_express","import_zod_to_openapi","import_zod","registry","router","express","get","remove","update","accept","import_express","import_zod_to_openapi","import_zod","registry","router","express","get","put","import_express","import_zod_to_openapi","import_zod","import_http_status","registry","router","express","get","StatusCodes","remove","import_express","import_zod_to_openapi","import_zod","registry","router","express","import_express","import_zod_to_openapi","registry","router","express","distinct","import_express","import_zod_to_openapi","registry","router","express","task_test","task_handle_old_checks","task_handle_database_consistency","task_remove_old_logs","loadTestUser","status","screenshots","import_express","import_zod_to_openapi","import_zod","SnapshotSchema","registry","router","express","startSession","endSession","createCheck","getIdent","getBaselines","router","express","import_express","import_path","import_http_status","router","express","path","httpStatus","import_express","import_path","import_http_status","router","express","rootDir","path","httpStatus","import_express","import_path","import_http_status","router","express","rootDir","path","httpStatus","pinoLogger","pino","import_http_status","import_http_status","httpStatus","StatusCodes","import_express","import_zod_to_openapi","registry","router","express","swaggerUi","express","helmet","compression","cookieParser","fileUpload","session","MongoStore","passport","LocalStrategy","path"]}