@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,2312 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/server/controllers/test.controller.ts
31
+ var test_controller_exports = {};
32
+ __export(test_controller_exports, {
33
+ accept: () => accept3,
34
+ distinct: () => distinct,
35
+ distinct_with_filter: () => distinct_with_filter,
36
+ getTest: () => getTest,
37
+ remove: () => remove4
38
+ });
39
+ module.exports = __toCommonJS(test_controller_exports);
40
+ var import_http_status6 = __toESM(require("http-status"));
41
+
42
+ // src/server/utils/pick.ts
43
+ var pick = (object, keys) => {
44
+ return keys.reduce((obj, key) => {
45
+ if (object && Object.prototype.hasOwnProperty.call(object, key)) {
46
+ if (object[key] !== void 0) obj[key] = object[key];
47
+ }
48
+ return obj;
49
+ }, {});
50
+ };
51
+ var pick_default = pick;
52
+
53
+ // src/server/utils/isJSON.ts
54
+ var isJSON = (text) => {
55
+ if (!text) return false;
56
+ const isValid = /^[\],:{}\s]*$/.test(
57
+ text.replace(/\\["\\\/bfnrtu]/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, "")
58
+ );
59
+ return isValid;
60
+ };
61
+ var isJSON_default = isJSON;
62
+
63
+ // src/server/utils/catchAsync.ts
64
+ var catchAsync = (fn) => (req, res, next) => {
65
+ Promise.resolve(fn(req, res, next)).catch((err) => {
66
+ return next(err);
67
+ });
68
+ };
69
+ var catchAsync_default = catchAsync;
70
+
71
+ // src/server/utils/ApiError.ts
72
+ var ApiError = class extends Error {
73
+ constructor(statusCode, message, isOperational = true, stack = "") {
74
+ super(message);
75
+ this.statusCode = statusCode;
76
+ this.isOperational = isOperational;
77
+ if (stack) {
78
+ this.stack = stack;
79
+ } else {
80
+ Error.captureStackTrace(this, this.constructor);
81
+ }
82
+ }
83
+ };
84
+ var ApiError_default = ApiError;
85
+
86
+ // src/server/utils/deserializeIfJSON.ts
87
+ var import_bson = require("bson");
88
+ var deserializeIfJSON = (text) => {
89
+ if (isJSON_default(text)) return import_bson.EJSON.parse(text) || void 0;
90
+ return text;
91
+ };
92
+ var deserializeIfJSON_default = deserializeIfJSON;
93
+
94
+ // src/server/utils/ident.ts
95
+ var ident = ["name", "viewport", "browserName", "os", "app", "branch"];
96
+
97
+ // src/server/utils/buildIdentObject.ts
98
+ var MissingIdentFieldError = class extends Error {
99
+ constructor(field) {
100
+ super(`Missing required ident field: ${field}`);
101
+ this.name = "MissingIdentFieldError";
102
+ }
103
+ };
104
+ var buildIdentObject = (params) => {
105
+ const result = {};
106
+ for (const key of ident) {
107
+ if (key in params && params[key] !== void 0) {
108
+ result[key] = params[key];
109
+ } else {
110
+ throw new MissingIdentFieldError(key);
111
+ }
112
+ }
113
+ return result;
114
+ };
115
+
116
+ // src/server/models/Check.model.ts
117
+ var import_mongoose = __toESM(require("mongoose"));
118
+
119
+ // src/server/models/plugins/paginate.plugin.ts
120
+ var paginate = (schema) => {
121
+ schema.statics.paginate = async function(filter, options) {
122
+ let sort;
123
+ if (options.sortBy) {
124
+ const sortingCriteria = [];
125
+ options.sortBy.split(",").forEach((sortOption) => {
126
+ const [key, order] = sortOption.split(":");
127
+ sortingCriteria.push((order === "desc" ? "-" : "") + key);
128
+ });
129
+ sort = sortingCriteria.join(" ");
130
+ } else {
131
+ sort = { _id: -1 };
132
+ }
133
+ const limit = options.limit && parseInt(options.limit.toString(), 10) >= 0 ? parseInt(options.limit.toString(), 10) : 10;
134
+ const page = options.page && parseInt(options.page.toString(), 10) > 0 ? parseInt(options.page.toString(), 10) : 1;
135
+ const skip = (page - 1) * limit;
136
+ const countPromise = this.countDocuments(filter).exec();
137
+ let docsPromise = this.find(filter).sort(sort).skip(skip).limit(limit);
138
+ if (options.populate) {
139
+ options.populate.split(",").forEach((populateOption) => {
140
+ docsPromise = docsPromise.populate(
141
+ populateOption.split(".").reverse().reduce((a, b) => ({ path: b, populate: a }))
142
+ );
143
+ });
144
+ }
145
+ docsPromise = docsPromise.exec();
146
+ return Promise.all([countPromise, docsPromise]).then((values) => {
147
+ const [totalResults, results] = values;
148
+ const totalPages = Math.ceil(totalResults / limit);
149
+ const result = {
150
+ results,
151
+ page,
152
+ limit,
153
+ totalPages,
154
+ totalResults,
155
+ timestamp: Number(Date.now() + String(process.hrtime()[1]).slice(3, 6))
156
+ };
157
+ return Promise.resolve(result);
158
+ });
159
+ };
160
+ };
161
+ var paginate_plugin_default = paginate;
162
+
163
+ // src/server/models/plugins/toJSON.plugin.ts
164
+ var deleteAtPath = (obj, path3, index) => {
165
+ if (index === path3.length - 1) {
166
+ delete obj[path3[index]];
167
+ return;
168
+ }
169
+ deleteAtPath(obj[path3[index]], path3, index + 1);
170
+ };
171
+ var toJSON = (schema) => {
172
+ let transform;
173
+ if (schema.options.toJSON && schema.options.toJSON.transform) {
174
+ transform = schema.options.toJSON.transform;
175
+ }
176
+ schema.options.toJSON = Object.assign(schema.options.toJSON || {}, {
177
+ transform(doc, ret, options) {
178
+ Object.keys(schema.paths).forEach((path3) => {
179
+ if (schema.paths[path3].options && schema.paths[path3].options.private) {
180
+ deleteAtPath(ret, path3.split("."), 0);
181
+ }
182
+ });
183
+ ret.id = ret._id.toString();
184
+ delete ret.__v;
185
+ delete ret.createdAt;
186
+ delete ret.updatedAt;
187
+ if (transform) {
188
+ return transform(doc, ret, options);
189
+ }
190
+ }
191
+ });
192
+ };
193
+ var toJSON_plugin_default = toJSON;
194
+
195
+ // src/server/models/plugins/paginateDistinct.plugin.ts
196
+ var import_bson2 = require("bson");
197
+ var paginateDistinct = (schema) => {
198
+ schema.statics.paginateDistinct = async function(filter, options) {
199
+ let sort;
200
+ if (options.sortBy) {
201
+ options.sortBy.split(",").forEach((sortOption) => {
202
+ const [key, order] = sortOption.split(":");
203
+ sort[key] = order === "desc" ? -1 : 1;
204
+ });
205
+ } else {
206
+ sort = { _id: -1 };
207
+ }
208
+ let limit = options.limit && parseInt(options.limit.toString(), 10) >= 0 ? parseInt(options.limit.toString(), 10) : 10;
209
+ limit = limit === 0 ? 9007199254740991 : limit;
210
+ const page = options.page && parseInt(options.page.toString(), 10) > 0 ? parseInt(options.page.toString(), 10) : 1;
211
+ const skip = (page - 1) * limit;
212
+ const groupAggregateObj = { $group: { _id: `$${options.field}` } };
213
+ const documentsCount = (await this.aggregate([groupAggregateObj]).exec()).length;
214
+ const aggregateArr = [
215
+ { $match: import_bson2.EJSON.parse(filter.filter || "{}") },
216
+ groupAggregateObj,
217
+ { $sort: sort },
218
+ { $skip: skip },
219
+ { $limit: limit }
220
+ ];
221
+ const aggregatedDocs = (await this.aggregate(aggregateArr)).filter((x) => x._id).map((x) => {
222
+ if (x[options.field]) {
223
+ return x[options.field][0];
224
+ }
225
+ return { name: x._id };
226
+ });
227
+ return Promise.all([documentsCount, aggregatedDocs]).then((values) => {
228
+ const [totalResults, results] = values;
229
+ const totalPages = Math.ceil(totalResults / limit);
230
+ const result = {
231
+ results,
232
+ page,
233
+ limit,
234
+ totalPages,
235
+ totalResults,
236
+ timestamp: (/* @__PURE__ */ new Date()).getTime()
237
+ };
238
+ return Promise.resolve(result);
239
+ });
240
+ };
241
+ };
242
+ var paginateDistinct_plugin_default = paginateDistinct;
243
+
244
+ // src/server/models/Check.model.ts
245
+ var CheckSchema = new import_mongoose.Schema({
246
+ name: {
247
+ type: String,
248
+ required: [true, 'CheckSchema: The "name" field must be required']
249
+ },
250
+ test: {
251
+ type: import_mongoose.Schema.Types.ObjectId,
252
+ ref: "VRSTest",
253
+ required: [true, 'CheckSchema: The "test" field must be required']
254
+ },
255
+ suite: {
256
+ type: import_mongoose.Schema.Types.ObjectId,
257
+ ref: "VRSSuite",
258
+ required: [true, 'CheckSchema: The "suite" field must be required']
259
+ },
260
+ app: {
261
+ type: import_mongoose.Schema.Types.ObjectId,
262
+ ref: "VRSApp",
263
+ required: [true, 'CheckSchema: The "app" field must be required']
264
+ },
265
+ branch: {
266
+ type: String
267
+ },
268
+ realBaselineId: {
269
+ type: import_mongoose.Schema.Types.ObjectId,
270
+ ref: "VRSBaseline"
271
+ },
272
+ baselineId: {
273
+ type: import_mongoose.Schema.Types.ObjectId,
274
+ ref: "VRSSnapshot"
275
+ },
276
+ actualSnapshotId: {
277
+ type: import_mongoose.Schema.Types.ObjectId,
278
+ ref: "VRSSnapshot"
279
+ },
280
+ diffId: {
281
+ type: import_mongoose.Schema.Types.ObjectId,
282
+ ref: "VRSSnapshot"
283
+ },
284
+ createdDate: {
285
+ type: Date,
286
+ required: true,
287
+ default: Date.now
288
+ },
289
+ updatedDate: {
290
+ type: Date
291
+ },
292
+ status: {
293
+ type: [{
294
+ type: String,
295
+ enum: {
296
+ values: ["new", "pending", "approved", "running", "passed", "failed", "aborted"],
297
+ message: "status is required"
298
+ }
299
+ }],
300
+ default: ["new"]
301
+ },
302
+ browserName: {
303
+ type: String
304
+ },
305
+ browserVersion: {
306
+ type: String
307
+ },
308
+ browserFullVersion: {
309
+ type: String
310
+ },
311
+ viewport: {
312
+ type: String
313
+ },
314
+ os: {
315
+ type: String
316
+ },
317
+ domDump: {
318
+ type: String
319
+ },
320
+ result: {
321
+ type: String,
322
+ default: "{}"
323
+ },
324
+ run: {
325
+ type: import_mongoose.Schema.Types.ObjectId
326
+ },
327
+ markedAs: {
328
+ type: String,
329
+ enum: ["bug", "accepted"]
330
+ },
331
+ markedDate: {
332
+ type: Date
333
+ },
334
+ markedById: {
335
+ type: import_mongoose.Schema.Types.ObjectId,
336
+ ref: "VRSUser"
337
+ },
338
+ markedByUsername: {
339
+ type: String
340
+ },
341
+ markedBugComment: {
342
+ type: String
343
+ },
344
+ creatorId: {
345
+ type: import_mongoose.Schema.Types.ObjectId,
346
+ ref: "VRSUser"
347
+ },
348
+ creatorUsername: {
349
+ type: String
350
+ },
351
+ failReasons: {
352
+ type: [String]
353
+ },
354
+ vOffset: {
355
+ type: String
356
+ },
357
+ topStablePixels: {
358
+ type: String
359
+ },
360
+ meta: {
361
+ type: Object
362
+ }
363
+ });
364
+ CheckSchema.plugin(toJSON_plugin_default);
365
+ CheckSchema.plugin(paginate_plugin_default);
366
+ var Check = import_mongoose.default.model("VRSCheck", CheckSchema);
367
+ var Check_model_default = Check;
368
+
369
+ // src/server/models/Log.model.ts
370
+ var import_mongoose2 = __toESM(require("mongoose"));
371
+ var LogSchema = new import_mongoose2.Schema({
372
+ timestamp: {
373
+ type: Date
374
+ },
375
+ level: {
376
+ type: String
377
+ },
378
+ message: {
379
+ type: String
380
+ },
381
+ meta: {
382
+ type: Object
383
+ },
384
+ hostname: {
385
+ type: Object
386
+ }
387
+ });
388
+ LogSchema.plugin(toJSON_plugin_default);
389
+ LogSchema.plugin(paginate_plugin_default);
390
+ var Log = import_mongoose2.default.model("VRSLog", LogSchema);
391
+
392
+ // src/server/models/App.model.ts
393
+ var import_mongoose3 = __toESM(require("mongoose"));
394
+ var AppSchema = new import_mongoose3.Schema({
395
+ name: {
396
+ type: String,
397
+ default: "Others",
398
+ unique: true,
399
+ required: [true, 'AppSchema: The "name" field must be required']
400
+ },
401
+ description: {
402
+ type: String
403
+ },
404
+ version: {
405
+ type: String
406
+ },
407
+ updatedDate: {
408
+ type: Date
409
+ },
410
+ createdDate: {
411
+ type: Date
412
+ },
413
+ meta: {
414
+ type: Object
415
+ }
416
+ });
417
+ AppSchema.plugin(paginate_plugin_default);
418
+ AppSchema.plugin(toJSON_plugin_default);
419
+ var App = import_mongoose3.default.model("VRSApp", AppSchema);
420
+
421
+ // src/server/models/Snapshot.model.ts
422
+ var import_mongoose4 = __toESM(require("mongoose"));
423
+ var SnapshotSchema = new import_mongoose4.Schema({
424
+ name: {
425
+ type: String,
426
+ required: [true, 'SnapshotSchema: The "name" field must be required']
427
+ },
428
+ path: {
429
+ type: String
430
+ },
431
+ filename: {
432
+ type: String
433
+ },
434
+ imghash: {
435
+ type: String,
436
+ required: [true, 'SnapshotSchema: The "imghash" field must be required']
437
+ },
438
+ createdDate: {
439
+ type: Date,
440
+ default: Date.now
441
+ },
442
+ vOffset: {
443
+ type: Number
444
+ },
445
+ hOffset: {
446
+ type: Number
447
+ }
448
+ });
449
+ SnapshotSchema.plugin(toJSON_plugin_default);
450
+ SnapshotSchema.plugin(paginate_plugin_default);
451
+ var Snapshot = import_mongoose4.default.model("VRSSnapshot", SnapshotSchema);
452
+ var Snapshot_model_default = Snapshot;
453
+
454
+ // src/server/models/AppSettings.model.ts
455
+ var import_mongoose5 = __toESM(require("mongoose"));
456
+ var AppSettingsSchema = new import_mongoose5.Schema({
457
+ name: {
458
+ type: String,
459
+ unique: true,
460
+ required: [true, 'AppSettingsSchema: The "name" field must be required']
461
+ },
462
+ label: {
463
+ type: String,
464
+ required: [true, 'AppSettingsSchema: The "label" field must be required']
465
+ },
466
+ description: {
467
+ type: String
468
+ },
469
+ type: {
470
+ type: String,
471
+ required: [true, 'AppSettingsSchema: The "type" field must be required']
472
+ },
473
+ value: {
474
+ type: import_mongoose5.Schema.Types.Mixed,
475
+ required: [true, 'AppSettingsSchema: The "value" field must be required']
476
+ },
477
+ env_variable: {
478
+ type: String
479
+ },
480
+ enabled: {
481
+ type: Boolean
482
+ }
483
+ });
484
+ AppSettingsSchema.plugin(toJSON_plugin_default);
485
+ var AppSettings = import_mongoose5.default.model("VRSAppSettings", AppSettingsSchema);
486
+
487
+ // src/server/models/Suite.model.ts
488
+ var import_mongoose6 = __toESM(require("mongoose"));
489
+ var SuiteSchema = new import_mongoose6.Schema({
490
+ name: {
491
+ type: String,
492
+ default: "Others",
493
+ unique: true,
494
+ required: [true, 'SuiteSchema: The "name" field must be required']
495
+ },
496
+ tags: {
497
+ type: [String]
498
+ },
499
+ app: {
500
+ type: import_mongoose6.Schema.Types.ObjectId,
501
+ ref: "VRSApp",
502
+ required: [true, 'SuiteSchema: The "app" field must be required']
503
+ },
504
+ description: {
505
+ type: String
506
+ },
507
+ updatedDate: {
508
+ type: Date,
509
+ default: Date.now
510
+ },
511
+ createdDate: {
512
+ type: Date
513
+ },
514
+ meta: {
515
+ type: Object
516
+ }
517
+ });
518
+ SuiteSchema.plugin(paginate_plugin_default);
519
+ SuiteSchema.plugin(toJSON_plugin_default);
520
+ var Suite = import_mongoose6.default.model("VRSSuite", SuiteSchema);
521
+ var Suite_model_default = Suite;
522
+
523
+ // src/server/models/Run.model.ts
524
+ var import_mongoose7 = __toESM(require("mongoose"));
525
+ var RunSchema = new import_mongoose7.Schema({
526
+ name: {
527
+ type: String,
528
+ required: [true, 'RunSchema: The "name" field must be required']
529
+ },
530
+ app: {
531
+ type: import_mongoose7.Schema.Types.ObjectId,
532
+ ref: "VRSApp",
533
+ required: [true, 'RunSchema: The "app" field must be required']
534
+ },
535
+ ident: {
536
+ type: String,
537
+ unique: true,
538
+ required: [true, 'RunSchema: The "ident" field must be required']
539
+ },
540
+ description: {
541
+ type: String
542
+ },
543
+ updatedDate: {
544
+ type: Date,
545
+ default: Date.now
546
+ },
547
+ createdDate: {
548
+ type: Date
549
+ },
550
+ parameters: {
551
+ type: [String]
552
+ },
553
+ meta: {
554
+ type: Object
555
+ }
556
+ });
557
+ RunSchema.plugin(paginate_plugin_default);
558
+ RunSchema.plugin(toJSON_plugin_default);
559
+ var Run = import_mongoose7.default.model("VRSRun", RunSchema);
560
+
561
+ // src/server/models/User.model.ts
562
+ var import_mongoose8 = __toESM(require("mongoose"));
563
+ var import_passport_local_mongoose = __toESM(require("passport-local-mongoose"));
564
+ var UserSchema = new import_mongoose8.Schema({
565
+ username: {
566
+ type: String,
567
+ unique: true,
568
+ required: [true, 'UserSchema: The "username" field must be required']
569
+ },
570
+ firstName: {
571
+ type: String,
572
+ required: [true, 'UserSchema: The "firstName" field must be required']
573
+ },
574
+ lastName: {
575
+ type: String,
576
+ required: [true, 'UserSchema: The "lastName" field must be required']
577
+ },
578
+ role: {
579
+ type: String,
580
+ enum: ["admin", "reviewer", "user"],
581
+ required: [true, 'UserSchema: The "role" field must be required']
582
+ },
583
+ password: {
584
+ type: String
585
+ },
586
+ token: {
587
+ type: String
588
+ },
589
+ apiKey: {
590
+ type: String
591
+ },
592
+ createdDate: {
593
+ type: Date
594
+ },
595
+ updatedDate: {
596
+ type: Date
597
+ },
598
+ expiration: {
599
+ type: Date
600
+ },
601
+ meta: {
602
+ type: Object
603
+ }
604
+ });
605
+ UserSchema.statics.isEmailTaken = async function(username, excludeUserId) {
606
+ const user = await this.findOne({ username, _id: { $ne: excludeUserId } });
607
+ return !!user;
608
+ };
609
+ UserSchema.plugin(toJSON_plugin_default);
610
+ UserSchema.plugin(paginate_plugin_default);
611
+ UserSchema.plugin(import_passport_local_mongoose.default, { hashField: "password" });
612
+ var User = import_mongoose8.default.model("VRSUser", UserSchema);
613
+
614
+ // src/server/models/Baseline.model.ts
615
+ var import_mongoose9 = __toESM(require("mongoose"));
616
+ var BaselineSchema = new import_mongoose9.Schema({
617
+ snapshootId: {
618
+ type: import_mongoose9.Schema.Types.ObjectId
619
+ },
620
+ name: {
621
+ type: String,
622
+ required: [true, 'VRSBaselineSchema: The "name" field must be required']
623
+ },
624
+ app: {
625
+ type: import_mongoose9.Schema.Types.ObjectId,
626
+ ref: "VRSApp",
627
+ required: [true, 'VRSBaselineSchema: The "app" field must be required']
628
+ },
629
+ branch: {
630
+ type: String
631
+ },
632
+ browserName: {
633
+ type: String
634
+ },
635
+ browserVersion: {
636
+ type: String
637
+ },
638
+ browserFullVersion: {
639
+ type: String
640
+ },
641
+ viewport: {
642
+ type: String
643
+ },
644
+ os: {
645
+ type: String
646
+ },
647
+ markedAs: {
648
+ type: String,
649
+ enum: ["bug", "accepted"]
650
+ },
651
+ lastMarkedDate: {
652
+ type: Date
653
+ },
654
+ createdDate: {
655
+ type: Date
656
+ },
657
+ updatedDate: {
658
+ type: Date
659
+ },
660
+ markedById: {
661
+ type: import_mongoose9.Schema.Types.ObjectId,
662
+ ref: "VRSUser"
663
+ },
664
+ markedByUsername: {
665
+ type: String
666
+ },
667
+ ignoreRegions: {
668
+ type: String
669
+ },
670
+ boundRegions: {
671
+ type: String
672
+ },
673
+ matchType: {
674
+ type: String,
675
+ enum: ["antialiasing", "nothing", "colors"]
676
+ },
677
+ meta: {
678
+ type: Object
679
+ }
680
+ });
681
+ BaselineSchema.plugin(toJSON_plugin_default);
682
+ BaselineSchema.plugin(paginate_plugin_default);
683
+ var Baseline = import_mongoose9.default.model("VRSBaseline", BaselineSchema);
684
+ var Baseline_model_default = Baseline;
685
+
686
+ // src/server/models/Test.model.ts
687
+ var import_mongoose10 = __toESM(require("mongoose"));
688
+ var TestSchema = new import_mongoose10.Schema(
689
+ {
690
+ name: {
691
+ type: String,
692
+ required: "TestSchema: the test name is empty"
693
+ },
694
+ description: {
695
+ type: String
696
+ },
697
+ status: {
698
+ type: String
699
+ },
700
+ browserName: {
701
+ type: String
702
+ },
703
+ browserVersion: {
704
+ type: String
705
+ },
706
+ branch: {
707
+ type: String
708
+ },
709
+ tags: {
710
+ type: [String]
711
+ },
712
+ viewport: {
713
+ type: String
714
+ },
715
+ calculatedViewport: {
716
+ type: String
717
+ },
718
+ os: {
719
+ type: String
720
+ },
721
+ app: {
722
+ type: import_mongoose10.Schema.Types.ObjectId,
723
+ ref: "VRSApp",
724
+ required: [true, 'TestSchema: The "app" field must be required']
725
+ },
726
+ blinking: {
727
+ type: Number,
728
+ default: 0
729
+ },
730
+ updatedDate: {
731
+ type: Date
732
+ },
733
+ startDate: {
734
+ type: Date
735
+ },
736
+ checks: [
737
+ {
738
+ type: import_mongoose10.default.Schema.Types.ObjectId,
739
+ ref: "VRSCheck"
740
+ }
741
+ ],
742
+ suite: {
743
+ type: import_mongoose10.Schema.Types.ObjectId,
744
+ ref: "VRSSuite"
745
+ },
746
+ run: {
747
+ type: import_mongoose10.Schema.Types.ObjectId,
748
+ ref: "VRSRun"
749
+ },
750
+ markedAs: {
751
+ type: String,
752
+ enum: ["Bug", "Accepted", "Unaccepted", "Partially"]
753
+ },
754
+ creatorId: {
755
+ type: import_mongoose10.Schema.Types.ObjectId,
756
+ ref: "VRSUser"
757
+ },
758
+ creatorUsername: {
759
+ type: String
760
+ },
761
+ meta: {
762
+ type: Object
763
+ }
764
+ },
765
+ { strictQuery: true }
766
+ );
767
+ TestSchema.plugin(toJSON_plugin_default);
768
+ TestSchema.plugin(paginate_plugin_default);
769
+ TestSchema.plugin(paginateDistinct_plugin_default);
770
+ var Test = import_mongoose10.default.model("VRSTest", TestSchema);
771
+ var Test_model_default = Test;
772
+
773
+ // src/server/utils/calculateAcceptedStatus.ts
774
+ var calculateAcceptedStatus = async function calculateAcceptedStatus2(testId) {
775
+ const checksInTest = await Check_model_default.find({ test: testId });
776
+ const statuses = checksInTest.map((x) => x.markedAs);
777
+ if (statuses.length < 1) {
778
+ return "Unaccepted";
779
+ }
780
+ let testCalculatedStatus = "Unaccepted";
781
+ if (statuses.some((x) => x === "accepted")) {
782
+ testCalculatedStatus = "Partially";
783
+ }
784
+ if (statuses.every((x) => x === "accepted")) {
785
+ testCalculatedStatus = "Accepted";
786
+ }
787
+ return testCalculatedStatus;
788
+ };
789
+
790
+ // src/server/lib/logger.ts
791
+ var import_winston = __toESM(require("winston"));
792
+ var import_winston_mongodb = require("winston-mongodb");
793
+ var import_chalk = require("chalk");
794
+
795
+ // src/server/utils/formatISOToDateTime.ts
796
+ function formatISOToDateTime(isoDateString) {
797
+ const date = new Date(isoDateString);
798
+ return `${date.toISOString().slice(0, 10)} ${date.toTimeString().slice(0, 8)}`;
799
+ }
800
+ var formatISOToDateTime_default = formatISOToDateTime;
801
+
802
+ // src/server/config.ts
803
+ var import_fs = __toESM(require("fs"));
804
+ var import_dotenv2 = __toESM(require("dotenv"));
805
+
806
+ // package.json
807
+ var version = "2.2.3";
808
+
809
+ // src/server/config.ts
810
+ var import_crypto2 = __toESM(require("crypto"));
811
+
812
+ // src/server/envConfig.ts
813
+ var import_envalid = require("envalid");
814
+ var import_crypto = __toESM(require("crypto"));
815
+ var import_path = __toESM(require("path"));
816
+ var import_dotenv = __toESM(require("dotenv"));
817
+ import_dotenv.default.config();
818
+ var env = (0, import_envalid.cleanEnv)(process.env, {
819
+ NODE_ENV: (0, import_envalid.str)({ choices: ["development", "production", "test"] }),
820
+ SYNGRISI_DB_URI: (0, import_envalid.str)({ devDefault: "mongodb://127.0.0.1:27017/SyngrisiDb" }),
821
+ SYNGRISI_APP_PORT: (0, import_envalid.port)({ devDefault: 3e3 }),
822
+ SYNGRISI_IMAGES_PATH: (0, import_envalid.str)({ devDefault: "./.snapshots-images/" }),
823
+ SYNGRISI_TMP_DIR: (0, import_envalid.str)({ default: import_path.default.join(process.cwd(), ".tmp") }),
824
+ SYNGRISI_HTTP_LOG: (0, import_envalid.bool)({ devDefault: false }),
825
+ SYNGRISI_COVERAGE: (0, import_envalid.bool)({ devDefault: false }),
826
+ SYNGRISI_HOSTNAME: (0, import_envalid.host)({ devDefault: "localhost" }),
827
+ SYNGRISI_AUTH: (0, import_envalid.bool)({ default: true }),
828
+ SYNGRISI_TEST_MODE: (0, import_envalid.bool)({ default: false }),
829
+ SYNGRISI_DISABLE_FIRST_RUN: (0, import_envalid.bool)({ default: false }),
830
+ MONGODB_ROOT_USERNAME: (0, import_envalid.str)({ default: "" }),
831
+ MONGODB_ROOT_PASSWORD: (0, import_envalid.str)({ default: "" }),
832
+ LOGLEVEL: (0, import_envalid.str)({ choices: ["error", "warn", "info", "verbose", "debug", "silly"], default: "debug" }),
833
+ SYNGRISI_PAGINATION_SIZE: (0, import_envalid.num)({ default: 50 }),
834
+ SYNGRISI_DISABLE_DEV_CORS: (0, import_envalid.bool)({ default: false, devDefault: true }),
835
+ SYNGRISI_SESSION_STORE_KEY: (0, import_envalid.str)({ default: import_crypto.default.randomBytes(64).toString("hex") }),
836
+ SYNGRISI_LOG_LEVEL: (0, import_envalid.str)({ default: "debug" }),
837
+ // trunk features
838
+ SYNGRISI_TRUNK_FEATURE_AI_SEVERITY: (0, import_envalid.bool)({ default: false }),
839
+ SYNGRISI_AI_KEY: (0, import_envalid.str)({ default: "" }),
840
+ OPENAI_API_BASE_URL: (0, import_envalid.str)({ default: "https://api.openai.com/v1" }),
841
+ OPENAI_API_KEY: (0, import_envalid.str)({ default: "" })
842
+ });
843
+
844
+ // src/server/data/devices.json
845
+ var devices_default = [
846
+ {
847
+ os: "ios",
848
+ os_version: "16",
849
+ device: "iPhone 14 Pro Max",
850
+ realMobile: true
851
+ },
852
+ {
853
+ os: "ios",
854
+ os_version: "16",
855
+ device: "iPhone 14 Pro",
856
+ realMobile: true
857
+ },
858
+ {
859
+ os: "ios",
860
+ os_version: "16",
861
+ device: "iPhone 14 Plus",
862
+ realMobile: true
863
+ },
864
+ {
865
+ os: "ios",
866
+ os_version: "16",
867
+ device: "iPhone 14",
868
+ realMobile: true
869
+ },
870
+ {
871
+ os: "ios",
872
+ os_version: "16",
873
+ device: "iPhone 12 Pro Max",
874
+ realMobile: true
875
+ },
876
+ {
877
+ os: "ios",
878
+ os_version: "16",
879
+ device: "iPhone 12 Pro",
880
+ realMobile: true
881
+ },
882
+ {
883
+ os: "ios",
884
+ os_version: "16",
885
+ device: "iPhone 12 Mini",
886
+ realMobile: true
887
+ },
888
+ {
889
+ os: "ios",
890
+ os_version: "16",
891
+ device: "iPhone 11 Pro Max",
892
+ realMobile: true
893
+ },
894
+ {
895
+ os: "ios",
896
+ os_version: "15",
897
+ device: "iPhone XS",
898
+ realMobile: true
899
+ },
900
+ {
901
+ os: "ios",
902
+ os_version: "15",
903
+ device: "iPhone 13 Pro Max",
904
+ realMobile: true
905
+ },
906
+ {
907
+ os: "ios",
908
+ os_version: "15",
909
+ device: "iPhone 13 Pro",
910
+ realMobile: true
911
+ },
912
+ {
913
+ os: "ios",
914
+ os_version: "15",
915
+ device: "iPhone 13 Mini",
916
+ realMobile: true
917
+ },
918
+ {
919
+ os: "ios",
920
+ os_version: "15",
921
+ device: "iPhone 13",
922
+ realMobile: true
923
+ },
924
+ {
925
+ os: "ios",
926
+ os_version: "15",
927
+ device: "iPhone 11 Pro",
928
+ realMobile: true
929
+ },
930
+ {
931
+ os: "ios",
932
+ os_version: "15",
933
+ device: "iPhone 11",
934
+ realMobile: true
935
+ },
936
+ {
937
+ os: "ios",
938
+ os_version: "14",
939
+ device: "iPhone XS",
940
+ realMobile: true
941
+ },
942
+ {
943
+ os: "ios",
944
+ os_version: "14",
945
+ device: "iPhone 12 Pro Max",
946
+ realMobile: true
947
+ },
948
+ {
949
+ os: "ios",
950
+ os_version: "14",
951
+ device: "iPhone 12 Pro",
952
+ realMobile: true
953
+ },
954
+ {
955
+ os: "ios",
956
+ os_version: "14",
957
+ device: "iPhone 12 Mini",
958
+ realMobile: true
959
+ },
960
+ {
961
+ os: "ios",
962
+ os_version: "14",
963
+ device: "iPhone 12",
964
+ realMobile: true
965
+ },
966
+ {
967
+ os: "ios",
968
+ os_version: "14",
969
+ device: "iPhone 11 Pro Max",
970
+ realMobile: true
971
+ },
972
+ {
973
+ os: "ios",
974
+ os_version: "14",
975
+ device: "iPhone 11",
976
+ realMobile: true
977
+ },
978
+ {
979
+ os: "ios",
980
+ os_version: "13",
981
+ device: "iPhone XS",
982
+ realMobile: true
983
+ },
984
+ {
985
+ os: "ios",
986
+ os_version: "13",
987
+ device: "iPhone 11 Pro Max",
988
+ realMobile: true
989
+ },
990
+ {
991
+ os: "ios",
992
+ os_version: "13",
993
+ device: "iPhone 11 Pro",
994
+ realMobile: true
995
+ },
996
+ {
997
+ os: "ios",
998
+ os_version: "13",
999
+ device: "iPhone 11",
1000
+ realMobile: true
1001
+ },
1002
+ {
1003
+ os: "ios",
1004
+ os_version: "12",
1005
+ device: "iPhone XS",
1006
+ realMobile: true
1007
+ },
1008
+ {
1009
+ os: "ios",
1010
+ os_version: "12",
1011
+ device: "iPhone XS Max",
1012
+ realMobile: true
1013
+ },
1014
+ {
1015
+ os: "ios",
1016
+ os_version: "15",
1017
+ device: "iPhone XR",
1018
+ realMobile: true
1019
+ },
1020
+ {
1021
+ os: "ios",
1022
+ os_version: "12",
1023
+ device: "iPhone XR",
1024
+ realMobile: true
1025
+ },
1026
+ {
1027
+ os: "ios",
1028
+ os_version: "11",
1029
+ device: "iPhone X",
1030
+ realMobile: true
1031
+ },
1032
+ {
1033
+ os: "ios",
1034
+ os_version: "15",
1035
+ device: "iPhone 8",
1036
+ realMobile: true
1037
+ },
1038
+ {
1039
+ os: "ios",
1040
+ os_version: "13",
1041
+ device: "iPhone 8",
1042
+ realMobile: true
1043
+ },
1044
+ {
1045
+ os: "ios",
1046
+ os_version: "12",
1047
+ device: "iPhone 8",
1048
+ realMobile: true
1049
+ },
1050
+ {
1051
+ os: "ios",
1052
+ os_version: "11",
1053
+ device: "iPhone 8",
1054
+ realMobile: true
1055
+ },
1056
+ {
1057
+ os: "ios",
1058
+ os_version: "12",
1059
+ device: "iPhone 8 Plus",
1060
+ realMobile: true
1061
+ },
1062
+ {
1063
+ os: "ios",
1064
+ os_version: "11",
1065
+ device: "iPhone 8 Plus",
1066
+ realMobile: true
1067
+ },
1068
+ {
1069
+ os: "ios",
1070
+ os_version: "12",
1071
+ device: "iPhone 7",
1072
+ realMobile: true
1073
+ },
1074
+ {
1075
+ os: "ios",
1076
+ os_version: "10",
1077
+ device: "iPhone 7",
1078
+ realMobile: true
1079
+ },
1080
+ {
1081
+ os: "ios",
1082
+ os_version: "12",
1083
+ device: "iPhone 6S",
1084
+ realMobile: true
1085
+ },
1086
+ {
1087
+ os: "ios",
1088
+ os_version: "11",
1089
+ device: "iPhone 6S",
1090
+ realMobile: true
1091
+ },
1092
+ {
1093
+ os: "ios",
1094
+ os_version: "11",
1095
+ device: "iPhone 6S Plus",
1096
+ realMobile: true
1097
+ },
1098
+ {
1099
+ os: "ios",
1100
+ os_version: "11",
1101
+ device: "iPhone 6",
1102
+ realMobile: true
1103
+ },
1104
+ {
1105
+ os: "ios",
1106
+ os_version: "15",
1107
+ device: "iPhone SE 2022",
1108
+ realMobile: true
1109
+ },
1110
+ {
1111
+ os: "ios",
1112
+ os_version: "13",
1113
+ device: "iPhone SE 2020",
1114
+ realMobile: true
1115
+ },
1116
+ {
1117
+ os: "ios",
1118
+ os_version: "11",
1119
+ device: "iPhone SE",
1120
+ realMobile: true
1121
+ },
1122
+ {
1123
+ os: "ios",
1124
+ os_version: "14",
1125
+ device: "iPad Air 4",
1126
+ realMobile: true
1127
+ },
1128
+ {
1129
+ os: "ios",
1130
+ os_version: "15",
1131
+ device: "iPad 9th",
1132
+ realMobile: true
1133
+ },
1134
+ {
1135
+ os: "ios",
1136
+ os_version: "16",
1137
+ device: "iPad Pro 12.9 2022",
1138
+ realMobile: true
1139
+ },
1140
+ {
1141
+ os: "ios",
1142
+ os_version: "16",
1143
+ device: "iPad Pro 12.9 2020",
1144
+ realMobile: true
1145
+ },
1146
+ {
1147
+ os: "ios",
1148
+ os_version: "16",
1149
+ device: "iPad Pro 11 2022",
1150
+ realMobile: true
1151
+ },
1152
+ {
1153
+ os: "ios",
1154
+ os_version: "16",
1155
+ device: "iPad 10th",
1156
+ realMobile: true
1157
+ },
1158
+ {
1159
+ os: "ios",
1160
+ os_version: "15",
1161
+ device: "iPad Air 5",
1162
+ realMobile: true
1163
+ },
1164
+ {
1165
+ os: "ios",
1166
+ os_version: "14",
1167
+ device: "iPad Pro 12.9 2021",
1168
+ realMobile: true
1169
+ },
1170
+ {
1171
+ os: "ios",
1172
+ os_version: "14",
1173
+ device: "iPad Pro 12.9 2020",
1174
+ realMobile: true
1175
+ },
1176
+ {
1177
+ os: "ios",
1178
+ os_version: "14",
1179
+ device: "iPad Pro 11 2021",
1180
+ realMobile: true
1181
+ },
1182
+ {
1183
+ os: "ios",
1184
+ os_version: "13",
1185
+ device: "iPad Pro 12.9 2020",
1186
+ realMobile: true
1187
+ },
1188
+ {
1189
+ os: "ios",
1190
+ os_version: "16",
1191
+ device: "iPad 8th",
1192
+ realMobile: true
1193
+ },
1194
+ {
1195
+ os: "ios",
1196
+ os_version: "15",
1197
+ device: "iPad Pro 12.9 2018",
1198
+ realMobile: true
1199
+ },
1200
+ {
1201
+ os: "ios",
1202
+ os_version: "15",
1203
+ device: "iPad Mini 2021",
1204
+ realMobile: true
1205
+ },
1206
+ {
1207
+ os: "ios",
1208
+ os_version: "14",
1209
+ device: "iPad 8th",
1210
+ realMobile: true
1211
+ },
1212
+ {
1213
+ os: "ios",
1214
+ os_version: "13",
1215
+ device: "iPad Pro 12.9 2018",
1216
+ realMobile: true
1217
+ },
1218
+ {
1219
+ os: "ios",
1220
+ os_version: "13",
1221
+ device: "iPad Pro 11 2020",
1222
+ realMobile: true
1223
+ },
1224
+ {
1225
+ os: "ios",
1226
+ os_version: "13",
1227
+ device: "iPad Mini 2019",
1228
+ realMobile: true
1229
+ },
1230
+ {
1231
+ os: "ios",
1232
+ os_version: "13",
1233
+ device: "iPad Air 2019",
1234
+ realMobile: true
1235
+ },
1236
+ {
1237
+ os: "ios",
1238
+ os_version: "13",
1239
+ device: "iPad 7th",
1240
+ realMobile: true
1241
+ },
1242
+ {
1243
+ os: "ios",
1244
+ os_version: "12",
1245
+ device: "iPad Pro 12.9 2018",
1246
+ realMobile: true
1247
+ },
1248
+ {
1249
+ os: "ios",
1250
+ os_version: "12",
1251
+ device: "iPad Pro 11 2018",
1252
+ realMobile: true
1253
+ },
1254
+ {
1255
+ os: "ios",
1256
+ os_version: "12",
1257
+ device: "iPad Mini 2019",
1258
+ realMobile: true
1259
+ },
1260
+ {
1261
+ os: "ios",
1262
+ os_version: "12",
1263
+ device: "iPad Air 2019",
1264
+ realMobile: true
1265
+ },
1266
+ {
1267
+ os: "ios",
1268
+ os_version: "11",
1269
+ device: "iPad Pro 9.7 2016",
1270
+ realMobile: true
1271
+ },
1272
+ {
1273
+ os: "ios",
1274
+ os_version: "11",
1275
+ device: "iPad Pro 12.9 2017",
1276
+ realMobile: true
1277
+ },
1278
+ {
1279
+ os: "ios",
1280
+ os_version: "11",
1281
+ device: "iPad Mini 4",
1282
+ realMobile: true
1283
+ },
1284
+ {
1285
+ os: "ios",
1286
+ os_version: "11",
1287
+ device: "iPad 6th",
1288
+ realMobile: true
1289
+ },
1290
+ {
1291
+ os: "ios",
1292
+ os_version: "11",
1293
+ device: "iPad 5th",
1294
+ realMobile: true
1295
+ },
1296
+ {
1297
+ os: "android",
1298
+ os_version: "12.0",
1299
+ device: "Samsung Galaxy S22 Ultra",
1300
+ realMobile: true
1301
+ },
1302
+ {
1303
+ os: "android",
1304
+ os_version: "12.0",
1305
+ device: "Samsung Galaxy S22 Plus",
1306
+ realMobile: true
1307
+ },
1308
+ {
1309
+ os: "android",
1310
+ os_version: "12.0",
1311
+ device: "Samsung Galaxy S22",
1312
+ realMobile: true
1313
+ },
1314
+ {
1315
+ os: "android",
1316
+ os_version: "12.0",
1317
+ device: "Samsung Galaxy S21",
1318
+ realMobile: true
1319
+ },
1320
+ {
1321
+ os: "android",
1322
+ os_version: "11.0",
1323
+ device: "Samsung Galaxy S21 Ultra",
1324
+ realMobile: true
1325
+ },
1326
+ {
1327
+ os: "android",
1328
+ os_version: "11.0",
1329
+ device: "Samsung Galaxy S21",
1330
+ realMobile: true
1331
+ },
1332
+ {
1333
+ os: "android",
1334
+ os_version: "11.0",
1335
+ device: "Samsung Galaxy S21 Plus",
1336
+ realMobile: true
1337
+ },
1338
+ {
1339
+ os: "android",
1340
+ os_version: "10.0",
1341
+ device: "Samsung Galaxy S20",
1342
+ realMobile: true
1343
+ },
1344
+ {
1345
+ os: "android",
1346
+ os_version: "10.0",
1347
+ device: "Samsung Galaxy S20 Plus",
1348
+ realMobile: true
1349
+ },
1350
+ {
1351
+ os: "android",
1352
+ os_version: "10.0",
1353
+ device: "Samsung Galaxy S20 Ultra",
1354
+ realMobile: true
1355
+ },
1356
+ {
1357
+ os: "android",
1358
+ os_version: "11.0",
1359
+ device: "Samsung Galaxy M52",
1360
+ realMobile: true
1361
+ },
1362
+ {
1363
+ os: "android",
1364
+ os_version: "11.0",
1365
+ device: "Samsung Galaxy M32",
1366
+ realMobile: true
1367
+ },
1368
+ {
1369
+ os: "android",
1370
+ os_version: "11.0",
1371
+ device: "Samsung Galaxy A52",
1372
+ realMobile: true
1373
+ },
1374
+ {
1375
+ os: "android",
1376
+ os_version: "10.0",
1377
+ device: "Samsung Galaxy Note 20 Ultra",
1378
+ realMobile: true
1379
+ },
1380
+ {
1381
+ os: "android",
1382
+ os_version: "10.0",
1383
+ device: "Samsung Galaxy Note 20",
1384
+ realMobile: true
1385
+ },
1386
+ {
1387
+ os: "android",
1388
+ os_version: "10.0",
1389
+ device: "Samsung Galaxy A51",
1390
+ realMobile: true
1391
+ },
1392
+ {
1393
+ os: "android",
1394
+ os_version: "10.0",
1395
+ device: "Samsung Galaxy A11",
1396
+ realMobile: true
1397
+ },
1398
+ {
1399
+ os: "android",
1400
+ os_version: "9.0",
1401
+ device: "Samsung Galaxy S9 Plus",
1402
+ realMobile: true
1403
+ },
1404
+ {
1405
+ os: "android",
1406
+ os_version: "9.0",
1407
+ device: "Samsung Galaxy S10e",
1408
+ realMobile: true
1409
+ },
1410
+ {
1411
+ os: "android",
1412
+ os_version: "9.0",
1413
+ device: "Samsung Galaxy S10 Plus",
1414
+ realMobile: true
1415
+ },
1416
+ {
1417
+ os: "android",
1418
+ os_version: "9.0",
1419
+ device: "Samsung Galaxy S10",
1420
+ realMobile: true
1421
+ },
1422
+ {
1423
+ os: "android",
1424
+ os_version: "9.0",
1425
+ device: "Samsung Galaxy Note 10 Plus",
1426
+ realMobile: true
1427
+ },
1428
+ {
1429
+ os: "android",
1430
+ os_version: "9.0",
1431
+ device: "Samsung Galaxy Note 10",
1432
+ realMobile: true
1433
+ },
1434
+ {
1435
+ os: "android",
1436
+ os_version: "9.0",
1437
+ device: "Samsung Galaxy A10",
1438
+ realMobile: true
1439
+ },
1440
+ {
1441
+ os: "android",
1442
+ os_version: "8.1",
1443
+ device: "Samsung Galaxy Note 9",
1444
+ realMobile: true
1445
+ },
1446
+ {
1447
+ os: "android",
1448
+ os_version: "8.1",
1449
+ device: "Samsung Galaxy J7 Prime",
1450
+ realMobile: true
1451
+ },
1452
+ {
1453
+ os: "android",
1454
+ os_version: "8.0",
1455
+ device: "Samsung Galaxy S9 Plus",
1456
+ realMobile: true
1457
+ },
1458
+ {
1459
+ os: "android",
1460
+ os_version: "8.0",
1461
+ device: "Samsung Galaxy S9",
1462
+ realMobile: true
1463
+ },
1464
+ {
1465
+ os: "android",
1466
+ os_version: "7.1",
1467
+ device: "Samsung Galaxy Note 8",
1468
+ realMobile: true
1469
+ },
1470
+ {
1471
+ os: "android",
1472
+ os_version: "7.1",
1473
+ device: "Samsung Galaxy A8",
1474
+ realMobile: true
1475
+ },
1476
+ {
1477
+ os: "android",
1478
+ os_version: "7.0",
1479
+ device: "Samsung Galaxy S8 Plus",
1480
+ realMobile: true
1481
+ },
1482
+ {
1483
+ os: "android",
1484
+ os_version: "7.0",
1485
+ device: "Samsung Galaxy S8",
1486
+ realMobile: true
1487
+ },
1488
+ {
1489
+ os: "android",
1490
+ os_version: "6.0",
1491
+ device: "Samsung Galaxy S7",
1492
+ realMobile: true
1493
+ },
1494
+ {
1495
+ os: "android",
1496
+ os_version: "5.0",
1497
+ device: "Samsung Galaxy S6",
1498
+ realMobile: true
1499
+ },
1500
+ {
1501
+ os: "android",
1502
+ os_version: "13.0",
1503
+ device: "Google Pixel 7 Pro",
1504
+ realMobile: true
1505
+ },
1506
+ {
1507
+ os: "android",
1508
+ os_version: "13.0",
1509
+ device: "Google Pixel 7",
1510
+ realMobile: true
1511
+ },
1512
+ {
1513
+ os: "android",
1514
+ os_version: "13.0",
1515
+ device: "Google Pixel 6 Pro",
1516
+ realMobile: true
1517
+ },
1518
+ {
1519
+ os: "android",
1520
+ os_version: "12.0",
1521
+ device: "Google Pixel 6 Pro",
1522
+ realMobile: true
1523
+ },
1524
+ {
1525
+ os: "android",
1526
+ os_version: "12.0",
1527
+ device: "Google Pixel 6",
1528
+ realMobile: true
1529
+ },
1530
+ {
1531
+ os: "android",
1532
+ os_version: "12.0",
1533
+ device: "Google Pixel 5",
1534
+ realMobile: true
1535
+ },
1536
+ {
1537
+ os: "android",
1538
+ os_version: "11.0",
1539
+ device: "Google Pixel 5",
1540
+ realMobile: true
1541
+ },
1542
+ {
1543
+ os: "android",
1544
+ os_version: "11.0",
1545
+ device: "Google Pixel 4",
1546
+ realMobile: true
1547
+ },
1548
+ {
1549
+ os: "android",
1550
+ os_version: "10.0",
1551
+ device: "Google Pixel 4 XL",
1552
+ realMobile: true
1553
+ },
1554
+ {
1555
+ os: "android",
1556
+ os_version: "10.0",
1557
+ device: "Google Pixel 4",
1558
+ realMobile: true
1559
+ },
1560
+ {
1561
+ os: "android",
1562
+ os_version: "10.0",
1563
+ device: "Google Pixel 3",
1564
+ realMobile: true
1565
+ },
1566
+ {
1567
+ os: "android",
1568
+ os_version: "9.0",
1569
+ device: "Google Pixel 3a XL",
1570
+ realMobile: true
1571
+ },
1572
+ {
1573
+ os: "android",
1574
+ os_version: "9.0",
1575
+ device: "Google Pixel 3a",
1576
+ realMobile: true
1577
+ },
1578
+ {
1579
+ os: "android",
1580
+ os_version: "9.0",
1581
+ device: "Google Pixel 3 XL",
1582
+ realMobile: true
1583
+ },
1584
+ {
1585
+ os: "android",
1586
+ os_version: "9.0",
1587
+ device: "Google Pixel 3",
1588
+ realMobile: true
1589
+ },
1590
+ {
1591
+ os: "android",
1592
+ os_version: "9.0",
1593
+ device: "Google Pixel 2",
1594
+ realMobile: true
1595
+ },
1596
+ {
1597
+ os: "android",
1598
+ os_version: "8.0",
1599
+ device: "Google Pixel 2",
1600
+ realMobile: true
1601
+ },
1602
+ {
1603
+ os: "android",
1604
+ os_version: "7.1",
1605
+ device: "Google Pixel",
1606
+ realMobile: true
1607
+ },
1608
+ {
1609
+ os: "android",
1610
+ os_version: "6.0",
1611
+ device: "Google Nexus 6",
1612
+ realMobile: true
1613
+ },
1614
+ {
1615
+ os: "android",
1616
+ os_version: "4.4",
1617
+ device: "Google Nexus 5",
1618
+ realMobile: true
1619
+ },
1620
+ {
1621
+ os: "android",
1622
+ os_version: "11.0",
1623
+ device: "OnePlus 9",
1624
+ realMobile: true
1625
+ },
1626
+ {
1627
+ os: "android",
1628
+ os_version: "10.0",
1629
+ device: "OnePlus 8",
1630
+ realMobile: true
1631
+ },
1632
+ {
1633
+ os: "android",
1634
+ os_version: "10.0",
1635
+ device: "OnePlus 7T",
1636
+ realMobile: true
1637
+ },
1638
+ {
1639
+ os: "android",
1640
+ os_version: "9.0",
1641
+ device: "OnePlus 7",
1642
+ realMobile: true
1643
+ },
1644
+ {
1645
+ os: "android",
1646
+ os_version: "9.0",
1647
+ device: "OnePlus 6T",
1648
+ realMobile: true
1649
+ },
1650
+ {
1651
+ os: "android",
1652
+ os_version: "11.0",
1653
+ device: "Xiaomi Redmi Note 11",
1654
+ realMobile: true
1655
+ },
1656
+ {
1657
+ os: "android",
1658
+ os_version: "10.0",
1659
+ device: "Xiaomi Redmi Note 9",
1660
+ realMobile: true
1661
+ },
1662
+ {
1663
+ os: "android",
1664
+ os_version: "9.0",
1665
+ device: "Xiaomi Redmi Note 8",
1666
+ realMobile: true
1667
+ },
1668
+ {
1669
+ os: "android",
1670
+ os_version: "9.0",
1671
+ device: "Xiaomi Redmi Note 7",
1672
+ realMobile: true
1673
+ },
1674
+ {
1675
+ os: "android",
1676
+ os_version: "11.0",
1677
+ device: "Vivo Y21",
1678
+ realMobile: true
1679
+ },
1680
+ {
1681
+ os: "android",
1682
+ os_version: "11.0",
1683
+ device: "Vivo V21",
1684
+ realMobile: true
1685
+ },
1686
+ {
1687
+ os: "android",
1688
+ os_version: "10.0",
1689
+ device: "Vivo Y50",
1690
+ realMobile: true
1691
+ },
1692
+ {
1693
+ os: "android",
1694
+ os_version: "11.0",
1695
+ device: "Oppo Reno 6",
1696
+ realMobile: true
1697
+ },
1698
+ {
1699
+ os: "android",
1700
+ os_version: "11.0",
1701
+ device: "Oppo A96",
1702
+ realMobile: true
1703
+ },
1704
+ {
1705
+ os: "android",
1706
+ os_version: "10.0",
1707
+ device: "Oppo Reno 3 Pro",
1708
+ realMobile: true
1709
+ },
1710
+ {
1711
+ os: "android",
1712
+ os_version: "11.0",
1713
+ device: "Motorola Moto G71 5G",
1714
+ realMobile: true
1715
+ },
1716
+ {
1717
+ os: "android",
1718
+ os_version: "10.0",
1719
+ device: "Motorola Moto G9 Play",
1720
+ realMobile: true
1721
+ },
1722
+ {
1723
+ os: "android",
1724
+ os_version: "9.0",
1725
+ device: "Motorola Moto G7 Play",
1726
+ realMobile: true
1727
+ },
1728
+ {
1729
+ os: "android",
1730
+ os_version: "9.0",
1731
+ device: "Huawei P30",
1732
+ realMobile: true
1733
+ },
1734
+ {
1735
+ os: "android",
1736
+ os_version: "12.0",
1737
+ device: "Samsung Galaxy Tab S8",
1738
+ realMobile: true
1739
+ },
1740
+ {
1741
+ os: "android",
1742
+ os_version: "11.0",
1743
+ device: "Samsung Galaxy Tab S7",
1744
+ realMobile: true
1745
+ },
1746
+ {
1747
+ os: "android",
1748
+ os_version: "10.0",
1749
+ device: "Samsung Galaxy Tab S7",
1750
+ realMobile: true
1751
+ },
1752
+ {
1753
+ os: "android",
1754
+ os_version: "9.0",
1755
+ device: "Samsung Galaxy Tab S6",
1756
+ realMobile: true
1757
+ },
1758
+ {
1759
+ os: "android",
1760
+ os_version: "9.0",
1761
+ device: "Samsung Galaxy Tab S5e",
1762
+ realMobile: true
1763
+ },
1764
+ {
1765
+ os: "android",
1766
+ os_version: "8.1",
1767
+ device: "Samsung Galaxy Tab S4",
1768
+ realMobile: true
1769
+ }
1770
+ ];
1771
+
1772
+ // src/server/config.ts
1773
+ var customDevicesPath = "./server/data/custom_devices.json";
1774
+ var logsFolder = "./logs";
1775
+ import_dotenv2.default.config();
1776
+ var config = {
1777
+ version,
1778
+ // this isn't used
1779
+ getDevices: async () => {
1780
+ if (import_fs.default.existsSync(customDevicesPath)) {
1781
+ return [...devices_default, ...(await import(customDevicesPath)).default];
1782
+ }
1783
+ return devices_default;
1784
+ },
1785
+ defaultImagesPath: env.SYNGRISI_IMAGES_PATH,
1786
+ connectionString: env.SYNGRISI_DB_URI || "mongodb://127.0.0.1:27017/SyngrisiDb",
1787
+ host: env.SYNGRISI_HOSTNAME,
1788
+ port: env.SYNGRISI_APP_PORT || 3e3,
1789
+ backupsFolder: "./backups",
1790
+ enableHttpLogger: env.SYNGRISI_HTTP_LOG,
1791
+ httpLoggerFilePath: `${logsFolder}/http.log`,
1792
+ storeSessionKey: env.SYNGRISI_SESSION_STORE_KEY || import_crypto2.default.randomBytes(64).toString("hex"),
1793
+ codeCoverage: env.SYNGRISI_COVERAGE,
1794
+ disableCors: env.SYNGRISI_DISABLE_DEV_CORS,
1795
+ fileUploadMaxSize: 50 * 1024 * 1024,
1796
+ testMode: env.SYNGRISI_TEST_MODE,
1797
+ jsonLimit: "50mb",
1798
+ tmpDir: env.SYNGRISI_TMP_DIR,
1799
+ helmet: {
1800
+ crossOriginEmbedderPolicy: !env.SYNGRISI_DISABLE_DEV_CORS,
1801
+ crossOriginResourcePolicy: !env.SYNGRISI_DISABLE_DEV_CORS,
1802
+ contentSecurityPolicy: {
1803
+ directives: {
1804
+ frameAncestors: ["'self'", "vscode-webview:", "vscode-resource:", "https:", "http:"],
1805
+ frameSrc: ["'self'", "vscode-webview:", "https:", "http:"],
1806
+ scriptSrc: ["'self'", "'unsafe-inline'"],
1807
+ styleSrc: ["'self'", "'unsafe-inline'"]
1808
+ }
1809
+ }
1810
+ }
1811
+ };
1812
+ if (!import_fs.default.existsSync(config.defaultImagesPath)) {
1813
+ import_fs.default.mkdirSync(config.defaultImagesPath, { recursive: true });
1814
+ }
1815
+ if (!import_fs.default.existsSync(logsFolder)) {
1816
+ import_fs.default.mkdirSync(logsFolder, { recursive: true });
1817
+ }
1818
+
1819
+ // src/server/lib/logger.ts
1820
+ var import_path2 = __toESM(require("path"));
1821
+ var logLevel = env.SYNGRISI_LOG_LEVEL;
1822
+ function getScriptLine() {
1823
+ const stack = new Error().stack;
1824
+ if (stack) {
1825
+ const stackLines = stack.split("\n");
1826
+ let loggerLineIndex = -1;
1827
+ for (let i = 0; i < stackLines.length; i++) {
1828
+ if (stackLines[i].includes("lib/logger")) {
1829
+ loggerLineIndex = i;
1830
+ }
1831
+ }
1832
+ const targetLineIndex = loggerLineIndex + 1;
1833
+ if (targetLineIndex >= 0 && targetLineIndex < stackLines.length) {
1834
+ const targetLine = stackLines[targetLineIndex];
1835
+ const match = targetLine.match(/at\s+(?:.+\s+\()?(.+):(\d+):(\d+)\)?/);
1836
+ if (match) {
1837
+ const scriptPath = match[1];
1838
+ const relativePath = import_path2.default.relative(process.cwd(), scriptPath);
1839
+ const lineNumber = match[2];
1840
+ return `${relativePath}:${lineNumber}`;
1841
+ }
1842
+ }
1843
+ }
1844
+ return "unknown";
1845
+ }
1846
+ function createWinstonLogger(opts) {
1847
+ return import_winston.default.createLogger({
1848
+ transports: [
1849
+ new import_winston.default.transports.Console({
1850
+ level: logLevel || "silly",
1851
+ format: import_winston.default.format.combine(
1852
+ import_winston.default.format.colorize(),
1853
+ import_winston.default.format.timestamp(),
1854
+ import_winston.default.format.ms(),
1855
+ import_winston.default.format.metadata(),
1856
+ import_winston.default.format.printf((info) => {
1857
+ const user = info.metadata.user ? (0, import_chalk.blue)(` <${info.metadata.user}>`) : "";
1858
+ const ref = info.metadata.ref ? (0, import_chalk.gray)(` ${info.metadata.ref}`) : "";
1859
+ const msgType = info.metadata.msgType ? ` ${info.metadata.msgType}` : "";
1860
+ const itemType = info.metadata.itemType ? (0, import_chalk.magenta)(` ${info.metadata.itemType}`) : "";
1861
+ const scope = info.metadata.scope ? (0, import_chalk.magenta)(` [${info.metadata.scope}] `) : (0, import_chalk.magenta)(` [${getScriptLine()}] `);
1862
+ const msg = typeof info.message === "object" ? `
1863
+ ${JSON.stringify(info.message, null, 2)}` : info.message;
1864
+ return `${info.level} ${scope}${formatISOToDateTime_default(info.metadata.timestamp)} ${info.metadata.ms}${user}${ref}${msgType}${itemType} '${msg}'`;
1865
+ }),
1866
+ import_winston.default.format.padLevels()
1867
+ )
1868
+ }),
1869
+ new import_winston.default.transports.MongoDB({
1870
+ level: logLevel || "debug",
1871
+ format: import_winston.default.format.combine(
1872
+ import_winston.default.format.timestamp(),
1873
+ import_winston.default.format.json(),
1874
+ import_winston.default.format.metadata()
1875
+ ),
1876
+ options: {
1877
+ useUnifiedTopology: true
1878
+ },
1879
+ db: opts.dbConnectionString,
1880
+ collection: "vrslogs"
1881
+ })
1882
+ ]
1883
+ });
1884
+ }
1885
+ var Logger = class _Logger {
1886
+ constructor(opts = { dbConnectionString: config.connectionString }) {
1887
+ this.winstonLogger = createWinstonLogger(opts);
1888
+ }
1889
+ static mergeMeta(objects) {
1890
+ return objects.reduce((acc, obj) => {
1891
+ return { ...acc, ...obj };
1892
+ }, {});
1893
+ }
1894
+ log(severity, msg, meta) {
1895
+ const mergedMeta = _Logger.mergeMeta(meta);
1896
+ if (!mergedMeta.scope) {
1897
+ mergedMeta.scope = getScriptLine();
1898
+ }
1899
+ const formattedMsg = typeof msg === "object" ? JSON.stringify(msg, null, 2) : msg;
1900
+ this.winstonLogger.log(severity, formattedMsg, mergedMeta);
1901
+ }
1902
+ error(msg, ...meta) {
1903
+ let message = String(msg);
1904
+ let code = 0;
1905
+ if (msg instanceof Object) {
1906
+ message = JSON.stringify(msg);
1907
+ }
1908
+ if (msg instanceof Error) {
1909
+ message = msg.stack;
1910
+ }
1911
+ if (msg instanceof ApiError_default) {
1912
+ code = msg.statusCode;
1913
+ }
1914
+ this.log("error", `${code !== 0 ? "[" + code + "]" : ""}${message}
1915
+ stacktrace: ${new Error().stack}`, meta);
1916
+ }
1917
+ warn(msg, ...meta) {
1918
+ this.log("warn", `${msg}
1919
+ stacktrace: ${new Error().stack}`, meta);
1920
+ }
1921
+ info(msg, ...meta) {
1922
+ this.log("info", msg, meta);
1923
+ }
1924
+ verbose(msg, ...meta) {
1925
+ this.log("verbose", msg, meta);
1926
+ }
1927
+ debug(msg, ...meta) {
1928
+ this.log("debug", msg, meta);
1929
+ }
1930
+ silly(msg, ...meta) {
1931
+ this.log("silly", msg, meta);
1932
+ }
1933
+ };
1934
+ var logger_default = new Logger();
1935
+
1936
+ // src/server/services/test.service.ts
1937
+ var test_service_exports = {};
1938
+ __export(test_service_exports, {
1939
+ accept: () => accept,
1940
+ queryTests: () => queryTests,
1941
+ queryTestsDistinct: () => queryTestsDistinct,
1942
+ remove: () => remove
1943
+ });
1944
+ var queryTests = async (filter, options) => {
1945
+ const tests = await Test_model_default.paginate(filter, options);
1946
+ return tests;
1947
+ };
1948
+ var queryTestsDistinct = async (filter, options) => {
1949
+ const tests = await Test_model_default.paginateDistinct({ filter: filter ? JSON.stringify(filter) : null }, options);
1950
+ return tests;
1951
+ };
1952
+ var remove = async (id, user) => {
1953
+ const logOpts3 = {
1954
+ scope: "removeTest",
1955
+ itemType: "test",
1956
+ ref: id,
1957
+ user: user?.username,
1958
+ msgType: "REMOVE"
1959
+ };
1960
+ logger_default.info(`remove test with, id: '${id}', user: '${user.username}'`, logOpts3);
1961
+ try {
1962
+ logger_default.debug(`try to delete all checks associated to test with ID: '${id}'`, logOpts3);
1963
+ const checks = await Check_model_default.find({ test: id });
1964
+ for (const check of checks) {
1965
+ await check_service_exports.remove(check._id, user);
1966
+ }
1967
+ return Test_model_default.findByIdAndDelete(id);
1968
+ } catch (e) {
1969
+ logger_default.error(`cannot remove test with id: ${id} error: ${e instanceof Error ? e.stack : String(e)}`, logOpts3);
1970
+ throw new Error();
1971
+ }
1972
+ };
1973
+ var accept = async (id, user) => {
1974
+ const logOpts3 = {
1975
+ scope: "acceptTest",
1976
+ itemType: "test",
1977
+ ref: id,
1978
+ user: user?.username,
1979
+ msgType: "ACCEPT"
1980
+ };
1981
+ logger_default.info(`accept test with, id: '${id}', user: '${user.username}'`, logOpts3);
1982
+ const checks = await Check_model_default.find({ test: id }).exec();
1983
+ for (const check of checks) {
1984
+ await check_service_exports.accept(check._id, String(check.actualSnapshotId), user);
1985
+ }
1986
+ return { message: "success" };
1987
+ };
1988
+
1989
+ // src/server/services/run.service.ts
1990
+ var import_http_status = __toESM(require("http-status"));
1991
+
1992
+ // src/server/services/suite.service.ts
1993
+ var import_http_status2 = __toESM(require("http-status"));
1994
+
1995
+ // src/server/services/generic.service.ts
1996
+ var import_mongoose11 = __toESM(require("mongoose"));
1997
+
1998
+ // src/server/services/tasks.service.ts
1999
+ var import_string_table = __toESM(require("string-table"));
2000
+
2001
+ // src/server/services/client.service.ts
2002
+ var import_hasha = __toESM(require("hasha"));
2003
+
2004
+ // src/server/lib/dbItems/updateItem.ts
2005
+ var import_mongoose12 = __toESM(require("mongoose"));
2006
+
2007
+ // src/server/lib/dbItems/updateItemDate.ts
2008
+ var import_mongoose13 = __toESM(require("mongoose"));
2009
+ var logOpts = {
2010
+ scope: "dbitems",
2011
+ msgType: "DB"
2012
+ };
2013
+ async function updateItemDate(mdClass, id) {
2014
+ logger_default.debug(`update date for the item: '${mdClass}' with id: '${id}'`, logOpts);
2015
+ const itemModel = await import_mongoose13.default.model(mdClass).findById(id);
2016
+ const updatedItem = await itemModel?.updateOne({ updatedDate: Date.now() });
2017
+ logger_default.debug(`'${mdClass}' date updated: '${JSON.stringify(itemModel)}'`, logOpts);
2018
+ return updatedItem;
2019
+ }
2020
+
2021
+ // src/server/lib/dbItems/createItemIfNotExist.ts
2022
+ var import_mongoose14 = __toESM(require("mongoose"));
2023
+
2024
+ // src/server/lib/dbItems/createItemProm.ts
2025
+ var import_mongoose15 = __toESM(require("mongoose"));
2026
+
2027
+ // src/server/lib/сomparison/compareImagesNode.ts
2028
+ var import_node_resemble = __toESM(require("@syngrisi/node-resemble.js"));
2029
+
2030
+ // src/server/services/client.service.ts
2031
+ var import_http_status3 = __toESM(require("http-status"));
2032
+ var import_http_status4 = __toESM(require("http-status"));
2033
+
2034
+ // src/server/services/user.service.ts
2035
+ var import_http_status5 = __toESM(require("http-status"));
2036
+
2037
+ // src/server/services/check.service.ts
2038
+ var check_service_exports = {};
2039
+ __export(check_service_exports, {
2040
+ accept: () => accept2,
2041
+ remove: () => remove3,
2042
+ update: () => update
2043
+ });
2044
+
2045
+ // src/server/services/snapshot.service.ts
2046
+ var import_fs2 = __toESM(require("fs"));
2047
+ var logOpts2 = {
2048
+ scope: "snapshot_helper",
2049
+ msgType: "API"
2050
+ };
2051
+ var removeSnapshotFile = async (snapshot) => {
2052
+ let relatedSnapshots;
2053
+ if (snapshot.filename) {
2054
+ relatedSnapshots = await Snapshot_model_default.find({ filename: snapshot.filename });
2055
+ logger_default.debug(`there are '${relatedSnapshots.length}' snapshots with filename: '${snapshot.filename}'`, logOpts2);
2056
+ }
2057
+ const isLastSnapshotFile = () => {
2058
+ if (!snapshot.filename) {
2059
+ return true;
2060
+ }
2061
+ return relatedSnapshots.length === 0;
2062
+ };
2063
+ logger_default.debug({ isLastSnapshotFile: isLastSnapshotFile() });
2064
+ if (isLastSnapshotFile()) {
2065
+ const path3 = `${config.defaultImagesPath}${snapshot.filename}`;
2066
+ logger_default.silly(`path: ${path3}`, logOpts2);
2067
+ if (import_fs2.default.existsSync(path3)) {
2068
+ logger_default.debug(`removing file: '${path3}'`, logOpts2, {
2069
+ msgType: "REMOVE",
2070
+ itemType: "file"
2071
+ });
2072
+ import_fs2.default.unlinkSync(path3);
2073
+ }
2074
+ }
2075
+ };
2076
+ var remove2 = async (id) => {
2077
+ const logOpts3 = {
2078
+ scope: "removeSnapshot",
2079
+ msgType: "REMOVE",
2080
+ itemType: "snapshot",
2081
+ ref: id
2082
+ };
2083
+ logger_default.silly(`deleting snapshot with id: '${id}'`, logOpts3);
2084
+ if (!id) {
2085
+ logger_default.warn("id is empty");
2086
+ return;
2087
+ }
2088
+ const snapshot = await Snapshot_model_default.findById(id).lean().exec();
2089
+ if (!snapshot) {
2090
+ logger_default.warn(`cannot find snapshot with id: '${id}'`);
2091
+ return;
2092
+ }
2093
+ const baseline = await Baseline_model_default.findOne({ snapshootId: id });
2094
+ if (baseline) {
2095
+ logger_default.debug(`snapshot: '${id}' is related to a baseline, skipping deletion`, logOpts3);
2096
+ return;
2097
+ }
2098
+ logger_default.debug(`snapshot: '${id}' is not related to a baseline, attempting to remove it`, logOpts3);
2099
+ await Snapshot_model_default.findByIdAndDelete(id);
2100
+ logger_default.debug(`snapshot: '${id}' was removed`, logOpts3);
2101
+ const path3 = `${config.defaultImagesPath}${snapshot.filename}`;
2102
+ logger_default.debug(`attempting to remove snapshot file, id: '${snapshot._id}', filename: '${path3}'`, logOpts3);
2103
+ await removeSnapshotFile(snapshot);
2104
+ };
2105
+
2106
+ // src/server/services/check.service.ts
2107
+ async function calculateTestStatus(testId) {
2108
+ const checksInTest = await Check_model_default.find({ test: testId });
2109
+ const statuses = checksInTest.map((x) => x.status[0]);
2110
+ let testCalculatedStatus = "Failed";
2111
+ if (statuses.every((x) => x === "new" || x === "passed")) {
2112
+ testCalculatedStatus = "Passed";
2113
+ }
2114
+ if (statuses.every((x) => x === "new")) {
2115
+ testCalculatedStatus = "New";
2116
+ }
2117
+ return testCalculatedStatus;
2118
+ }
2119
+ var validateBaselineParam = (params) => {
2120
+ const mandatoryParams = ["markedAs", "markedById", "markedByUsername", "markedDate"];
2121
+ for (const param of mandatoryParams) {
2122
+ if (!params[param]) {
2123
+ const errMsg2 = `invalid baseline parameters, '${param}' is empty, params: ${JSON.stringify(params)}`;
2124
+ logger_default.error(errMsg2);
2125
+ throw new Error(errMsg2);
2126
+ }
2127
+ }
2128
+ };
2129
+ async function createNewBaseline(params) {
2130
+ const logOpts3 = {
2131
+ scope: "createNewBaseline",
2132
+ msgType: "CREATE"
2133
+ };
2134
+ validateBaselineParam(params);
2135
+ const identFields = buildIdentObject(params);
2136
+ const lastBaseline = await Baseline_model_default.findOne(identFields).exec();
2137
+ const sameBaseline = await Baseline_model_default.findOne({ ...identFields, snapshootId: params.actualSnapshotId }).exec();
2138
+ const baselineParams = lastBaseline?.ignoreRegions ? { ...identFields, ignoreRegions: lastBaseline.ignoreRegions } : identFields;
2139
+ if (sameBaseline) {
2140
+ logger_default.debug(`the baseline with same ident and snapshot id: ${params.actualSnapshotId} already exist`, logOpts3);
2141
+ } else {
2142
+ logger_default.debug(`the baseline with same ident and snapshot id: ${params.actualSnapshotId} does not exist,
2143
+ create new one, baselineParams: ${JSON.stringify(baselineParams)}`, logOpts3);
2144
+ }
2145
+ logger_default.silly({ sameBaseline });
2146
+ const resultedBaseline = sameBaseline || await Baseline_model_default.create(baselineParams);
2147
+ resultedBaseline.markedAs = params.markedAs;
2148
+ resultedBaseline.markedById = params.markedById;
2149
+ resultedBaseline.markedByUsername = params.markedByUsername;
2150
+ resultedBaseline.lastMarkedDate = params.markedDate;
2151
+ resultedBaseline.createdDate = /* @__PURE__ */ new Date();
2152
+ resultedBaseline.snapshootId = params.actualSnapshotId;
2153
+ return resultedBaseline.save();
2154
+ }
2155
+ var accept2 = async (id, baselineId, user) => {
2156
+ const logOpts3 = {
2157
+ msgType: "ACCEPT",
2158
+ itemType: "check",
2159
+ ref: id,
2160
+ user: user?.username,
2161
+ scope: "accept"
2162
+ };
2163
+ logger_default.debug(`accept check: ${id}`, logOpts3);
2164
+ const check = await Check_model_default.findById(id).exec();
2165
+ if (!check) throw new Error(`cannot find check with id: ${id}`);
2166
+ const test = await Test_model_default.findById(check.test).exec();
2167
+ if (!test) throw new Error(`cannot find test with id: ${check.test}`);
2168
+ check.markedById = user._id;
2169
+ check.markedByUsername = user.username;
2170
+ check.markedDate = /* @__PURE__ */ new Date();
2171
+ check.markedAs = "accepted";
2172
+ check.status = check.status[0] === "new" ? ["new"] : ["passed"];
2173
+ check.updatedDate = /* @__PURE__ */ new Date();
2174
+ logger_default.debug(`update check with options: '${JSON.stringify(check.toObject())}'`, logOpts3);
2175
+ await createNewBaseline(check.toObject());
2176
+ await check.save();
2177
+ const testCalculatedStatus = await calculateTestStatus(String(check.test));
2178
+ const testCalculatedAcceptedStatus = await calculateAcceptedStatus(check.test);
2179
+ test.status = testCalculatedStatus;
2180
+ test.markedAs = testCalculatedAcceptedStatus;
2181
+ test.updatedDate = /* @__PURE__ */ new Date();
2182
+ await Suite_model_default.findByIdAndUpdate(check.suite, { updatedDate: Date.now() });
2183
+ logger_default.debug(`update test with status: '${testCalculatedStatus}', marked: '${testCalculatedAcceptedStatus}'`, logOpts3, {
2184
+ msgType: "UPDATE",
2185
+ itemType: "test",
2186
+ ref: test._id
2187
+ });
2188
+ await test.save();
2189
+ await check.save();
2190
+ logger_default.debug(`check with id: '${id}' was updated`, logOpts3);
2191
+ return check;
2192
+ };
2193
+ async function removeCheck(id, user) {
2194
+ const logMeta = {
2195
+ scope: "removeCheck",
2196
+ itemType: "check",
2197
+ ref: id,
2198
+ msgType: "REMOVE",
2199
+ user: user?.username
2200
+ };
2201
+ try {
2202
+ const check = await Check_model_default.findByIdAndDelete(id).exec();
2203
+ if (!check) throw new Error(`cannot find check with id: ${id}`);
2204
+ logger_default.debug(`check with id: '${id}' was removed, update test: ${check.test}`, logMeta);
2205
+ const test = await Test_model_default.findById(check.test).exec();
2206
+ if (!test) throw new Error(`cannot find test with id: ${check.test}`);
2207
+ const testCalculatedStatus = await calculateTestStatus(String(check.test));
2208
+ const testCalculatedAcceptedStatus = await calculateAcceptedStatus(check.test);
2209
+ test.status = testCalculatedStatus;
2210
+ test.markedAs = testCalculatedAcceptedStatus;
2211
+ test.updatedDate = /* @__PURE__ */ new Date();
2212
+ await updateItemDate("VRSSuite", check.suite);
2213
+ await test.save();
2214
+ if (check.baselineId && String(check.baselineId) !== "undefined") {
2215
+ logger_default.debug(`try to remove the snapshot, baseline: ${check.baselineId}`, logMeta);
2216
+ await remove2(check.baselineId.toString());
2217
+ }
2218
+ if (check.actualSnapshotId && String(check.baselineId) !== "undefined") {
2219
+ logger_default.debug(`try to remove the snapshot, actual: ${check.actualSnapshotId}`, logMeta);
2220
+ await remove2(check.actualSnapshotId.toString());
2221
+ }
2222
+ if (check.diffId && String(check.baselineId) !== "undefined") {
2223
+ logger_default.debug(`try to remove snapshot, diff: ${check.diffId}`, logMeta);
2224
+ await remove2(check.diffId.toString());
2225
+ }
2226
+ return check;
2227
+ } catch (e) {
2228
+ const errMsg2 = `cannot remove a check with id: '${id}', error: '${e instanceof Error ? e.stack : String(e)}'`;
2229
+ logger_default.error(errMsg2, logMeta);
2230
+ throw new Error(errMsg2);
2231
+ }
2232
+ }
2233
+ var remove3 = async (id, user) => {
2234
+ const logOpts3 = {
2235
+ scope: "removeCheck",
2236
+ itemType: "check",
2237
+ ref: id,
2238
+ user: user?.username,
2239
+ msgType: "REMOVE"
2240
+ };
2241
+ logger_default.info(`remove check with, id: '${id}', user: '${user.username}'`, logOpts3);
2242
+ return removeCheck(id, user);
2243
+ };
2244
+ var update = async (id, opts, user) => {
2245
+ const logMeta = {
2246
+ msgType: "UPDATE",
2247
+ itemType: "check",
2248
+ ref: id,
2249
+ user,
2250
+ scope: "updateCheck"
2251
+ };
2252
+ logger_default.debug(`update check with id '${id}' with params '${JSON.stringify(opts, null, 2)}'`, logMeta);
2253
+ const check = await Check_model_default.findOneAndUpdate({ _id: id }, opts, { new: true }).exec();
2254
+ if (!check) throw new Error(`cannot find check with id: ${id}`);
2255
+ const test = await Test_model_default.findOne({ _id: check.test }).exec();
2256
+ if (!test) throw new Error(`cannot find test with id: ${check.test}`);
2257
+ test.status = await calculateTestStatus(String(check.test));
2258
+ await updateItemDate("VRSCheck", check);
2259
+ await updateItemDate("VRSTest", test);
2260
+ await test.save();
2261
+ await check.save();
2262
+ return check;
2263
+ };
2264
+
2265
+ // src/server/controllers/test.controller.ts
2266
+ var getTest = catchAsync_default(async (req, res) => {
2267
+ const filter = {
2268
+ ...deserializeIfJSON_default(String(req.query.base_filter)),
2269
+ ...deserializeIfJSON_default(String(req.query.filter))
2270
+ };
2271
+ if (req.user?.role === "user") {
2272
+ filter.creatorUsername = req.user?.username;
2273
+ }
2274
+ const options = pick_default(req.query, ["sortBy", "limit", "page", "populate"]);
2275
+ const result = await test_service_exports.queryTests(filter, options);
2276
+ res.status(import_http_status6.default.OK).send(result);
2277
+ });
2278
+ var distinct_with_filter = catchAsync_default(async (req, res) => {
2279
+ const filter = req.query.filter ? deserializeIfJSON_default(String(req.query.filter)) : void 0;
2280
+ const options = { ...pick_default(req.query, ["sortBy", "limit", "page", "populate"]), field: req.params.field };
2281
+ const result = await test_service_exports.queryTestsDistinct(filter, options);
2282
+ res.status(import_http_status6.default.OK).send(result);
2283
+ });
2284
+ var distinct = catchAsync_default(async (req, res) => {
2285
+ const filter = {};
2286
+ const options = { ...pick_default(req.query, ["sortBy", "limit", "page", "populate"]), field: req.params.id };
2287
+ const result = await test_service_exports.queryTestsDistinct(filter, options);
2288
+ res.status(import_http_status6.default.OK).send(result);
2289
+ });
2290
+ var remove4 = catchAsync_default(async (req, res) => {
2291
+ const { id } = req.params;
2292
+ if (!id) throw new ApiError_default(import_http_status6.default.BAD_REQUEST, "Cannot remove the test - Id not found");
2293
+ if (!req.user) throw new ApiError_default(import_http_status6.default.BAD_REQUEST, "Cannot remove the test - req.user is empty");
2294
+ const result = await test_service_exports.remove(id, req?.user);
2295
+ res.send(result);
2296
+ });
2297
+ var accept3 = catchAsync_default(async (req, res) => {
2298
+ const { id } = req.params;
2299
+ if (!id) throw new ApiError_default(import_http_status6.default.BAD_REQUEST, "Cannot accept the check - Id not found");
2300
+ if (!req.user) throw new ApiError_default(import_http_status6.default.BAD_REQUEST, "Cannot accept the check - req.user is empty");
2301
+ const result = await test_service_exports.accept(id, req?.user);
2302
+ res.send(result);
2303
+ });
2304
+ // Annotate the CommonJS export names for ESM import in node:
2305
+ 0 && (module.exports = {
2306
+ accept,
2307
+ distinct,
2308
+ distinct_with_filter,
2309
+ getTest,
2310
+ remove
2311
+ });
2312
+ //# sourceMappingURL=test.controller.js.map