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