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