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