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