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