@syngrisi/syngrisi 2.2.1

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 (387) hide show
  1. package/.nvmrc +1 -0
  2. package/LICENSE.md +9 -0
  3. package/README.md +139 -0
  4. package/config.js +17 -0
  5. package/dist/config.js +16 -0
  6. package/dist/src/server/models/index.js +508 -0
  7. package/dist/src/server/models/plugins/index.js +4 -0
  8. package/dist/src/server/models/plugins/paginate.plugin.js +76 -0
  9. package/dist/src/server/models/plugins/paginateDistinct.plugin.js +76 -0
  10. package/dist/src/server/models/plugins/toJSON.plugin.js +39 -0
  11. package/dist/src/server/schemas/createCheck.shema.js +17 -0
  12. package/dist/src/server/schemas/getBaseline.shema.js +12 -0
  13. package/dist/src/server/utils/paramsGuard.js +18 -0
  14. package/dist/src/tasks/backup.js +68 -0
  15. package/dist/src/tasks/lib/common.js +14 -0
  16. package/dist/src/tasks/lib/utils.js +14 -0
  17. package/dist/src/tasks/migrations/2.0.migration.js +86 -0
  18. package/dist/src/tasks/migrations/2.0.migration_mql.js +57 -0
  19. package/dist/src/tasks/reindex.js +28 -0
  20. package/dist/src/tasks/restore.js +86 -0
  21. package/dist/tsconfig.tsbuildinfo +1 -0
  22. package/docker-compose.yml +70 -0
  23. package/mvc/views/react/admin/index.html +22 -0
  24. package/mvc/views/react/assets/LogicalGroup.95929360.js +15993 -0
  25. package/mvc/views/react/assets/PasswordInput.8a73fdd2.js +299 -0
  26. package/mvc/views/react/assets/admin.94703bdc.js +14448 -0
  27. package/mvc/views/react/assets/auth.748478ef.js +673 -0
  28. package/mvc/views/react/assets/bg_2_0_dark_L2.3a31edc0.png +0 -0
  29. package/mvc/views/react/assets/favicon.bf5828d5.svg +7 -0
  30. package/mvc/views/react/assets/index.a5606313.css +23 -0
  31. package/mvc/views/react/assets/roboto-v30-latin-100.0f303f31.woff2 +0 -0
  32. package/mvc/views/react/assets/roboto-v30-latin-100.34e9582c.woff +0 -0
  33. package/mvc/views/react/assets/roboto-v30-latin-500.9ce7f3ac.woff +0 -0
  34. package/mvc/views/react/assets/roboto-v30-latin-500.b0195382.woff2 +0 -0
  35. package/mvc/views/react/assets/roboto-v30-latin-700.e0fd57c0.woff +0 -0
  36. package/mvc/views/react/assets/roboto-v30-latin-700.f5aebdfe.woff2 +0 -0
  37. package/mvc/views/react/assets/roboto-v30-latin-regular.f2abf7fb.woff +0 -0
  38. package/mvc/views/react/assets/roboto-v30-latin-regular.f6734f81.woff2 +0 -0
  39. package/mvc/views/react/assets/root.136e0ea3.js +25451 -0
  40. package/mvc/views/react/assets/use-form.57ebe175.js +24472 -0
  41. package/mvc/views/react/assets/use-form.ecb4391b.css +36 -0
  42. package/mvc/views/react/auth/index.html +22 -0
  43. package/mvc/views/react/index.html +19 -0
  44. package/mvc/views/react/index2/index.html +21 -0
  45. package/package.json +144 -0
  46. package/server.js +166 -0
  47. package/src/server/controllers/app.controller.js +21 -0
  48. package/src/server/controllers/auth.controller.js +156 -0
  49. package/src/server/controllers/baseline.controller.js +24 -0
  50. package/src/server/controllers/check.controller.js +56 -0
  51. package/src/server/controllers/client.controller.js +173 -0
  52. package/src/server/controllers/index.js +12 -0
  53. package/src/server/controllers/logs.controller.js +30 -0
  54. package/src/server/controllers/runs.controller.js +25 -0
  55. package/src/server/controllers/settings.controller.js +23 -0
  56. package/src/server/controllers/snapshots.controller.js +17 -0
  57. package/src/server/controllers/suite.controller.js +24 -0
  58. package/src/server/controllers/tasks.controller.js +47 -0
  59. package/src/server/controllers/test.controller.js +70 -0
  60. package/src/server/controllers/users.controller.js +79 -0
  61. package/src/server/data/custom_devices.json +8 -0
  62. package/src/server/data/devices.json +773 -0
  63. package/src/server/data/get_devices.sh +2 -0
  64. package/src/server/lib/AppSettings.js +56 -0
  65. package/src/server/lib/admin.json +9 -0
  66. package/src/server/lib/comparator.js +147 -0
  67. package/src/server/lib/compareImagesNode.js +60 -0
  68. package/src/server/lib/dbItems.js +215 -0
  69. package/src/server/lib/ensureLogin/ensureLoggedIn.js +223 -0
  70. package/src/server/lib/ensureLogin/ensureLoggedOut.js +44 -0
  71. package/src/server/lib/getElementsByPixPositionsFromDump.js +72 -0
  72. package/src/server/lib/guest.json +9 -0
  73. package/src/server/lib/initialAppSettings.json +18 -0
  74. package/src/server/lib/logger.js +95 -0
  75. package/src/server/lib/onStart.js +53 -0
  76. package/src/server/lib/parseDiff.js.bak +72 -0
  77. package/src/server/lib/testAdmin.json +9 -0
  78. package/src/server/lib/testUsers.json +41 -0
  79. package/src/server/middlewares/authorization.js +50 -0
  80. package/src/server/middlewares/disableCors.js +19 -0
  81. package/src/server/models/index.js +534 -0
  82. package/src/server/models/plugins/index.js +3 -0
  83. package/src/server/models/plugins/paginate.plugin.js +83 -0
  84. package/src/server/models/plugins/paginateDistinct.plugin.js +80 -0
  85. package/src/server/models/plugins/toJSON.plugin.js +44 -0
  86. package/src/server/routes/ui/admin.js +20 -0
  87. package/src/server/routes/ui/auth.js +15 -0
  88. package/src/server/routes/ui/index.js +19 -0
  89. package/src/server/routes/v1/app.route.js +9 -0
  90. package/src/server/routes/v1/auth.route.js +12 -0
  91. package/src/server/routes/v1/baselines.route.js +14 -0
  92. package/src/server/routes/v1/checks.route.js +25 -0
  93. package/src/server/routes/v1/client.route.js +39 -0
  94. package/src/server/routes/v1/index.js +82 -0
  95. package/src/server/routes/v1/logs.route.js +16 -0
  96. package/src/server/routes/v1/runs.route.js +15 -0
  97. package/src/server/routes/v1/settings.route.js +23 -0
  98. package/src/server/routes/v1/snapshots.route.js +11 -0
  99. package/src/server/routes/v1/suites.route.js +15 -0
  100. package/src/server/routes/v1/tasks.route.js +59 -0
  101. package/src/server/routes/v1/test.route.js +20 -0
  102. package/src/server/routes/v1/test_distinct.route.js +14 -0
  103. package/src/server/routes/v1/users.route.js +36 -0
  104. package/src/server/schemas/createCheck.shema.ts +17 -0
  105. package/src/server/schemas/getBaseline.shema.ts +12 -0
  106. package/src/server/services/app.service.js +23 -0
  107. package/src/server/services/check.service.js +178 -0
  108. package/src/server/services/client.service.js +648 -0
  109. package/src/server/services/generic.service.js +51 -0
  110. package/src/server/services/index.js +12 -0
  111. package/src/server/services/logs.service.js +38 -0
  112. package/src/server/services/run.service.js +40 -0
  113. package/src/server/services/suite.service.js +39 -0
  114. package/src/server/services/tasks.service.js +536 -0
  115. package/src/server/services/test.service.js +72 -0
  116. package/src/server/services/user.service.js +128 -0
  117. package/src/server/utils/ApiError.js +14 -0
  118. package/src/server/utils/catchAsync.js +8 -0
  119. package/src/server/utils/check.js +58 -0
  120. package/src/server/utils/dateToISO8601.js +2 -0
  121. package/src/server/utils/deserializeIfJSON.js +9 -0
  122. package/src/server/utils/formatISOToDateTime.js +6 -0
  123. package/src/server/utils/index.js +10 -0
  124. package/src/server/utils/isJSON.js +6 -0
  125. package/src/server/utils/paramsGuard.ts +15 -0
  126. package/src/server/utils/pick.js +15 -0
  127. package/src/server/utils/prettyCheckParams.js +13 -0
  128. package/src/server/utils/snapshots.js +73 -0
  129. package/src/server/utils/subDays.js +7 -0
  130. package/src/server/utils/tests.js +36 -0
  131. package/src/server/utils/utils.js +146 -0
  132. package/src/tasks/backup.js.bak +84 -0
  133. package/src/tasks/backup.ts +53 -0
  134. package/src/tasks/lib/common.js +24 -0
  135. package/src/tasks/lib/utils.js +15 -0
  136. package/src/tasks/migrations/2.0.migration.js +86 -0
  137. package/src/tasks/migrations/2.0.migration.ts +95 -0
  138. package/src/tasks/migrations/2.0.migration_mql.js +63 -0
  139. package/src/tasks/reindex.js +36 -0
  140. package/src/tasks/restore.js.bak +100 -0
  141. package/src/tasks/restore.ts +75 -0
  142. package/src/ui-app/.eslintrc.json +119 -0
  143. package/src/ui-app/README.md +15 -0
  144. package/src/ui-app/admin/AdminLayout.tsx +38 -0
  145. package/src/ui-app/admin/App.tsx +108 -0
  146. package/src/ui-app/admin/AppContext.ts +3 -0
  147. package/src/ui-app/admin/components/Header/AdminHeader.tsx +148 -0
  148. package/src/ui-app/admin/components/Logs/AdminLogs.tsx +142 -0
  149. package/src/ui-app/admin/components/Logs/RefreshActionIcon.tsx +60 -0
  150. package/src/ui-app/admin/components/Logs/Table/AdminLogsTable.tsx +81 -0
  151. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableFilter.tsx +170 -0
  152. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableHeads.tsx +50 -0
  153. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableRows.tsx +207 -0
  154. package/src/ui-app/admin/components/Logs/Table/AdminLogsTableSettings.tsx +95 -0
  155. package/src/ui-app/admin/components/Logs/Table/InfinityScrollSkeleton.tsx +77 -0
  156. package/src/ui-app/admin/components/Logs/Table/InfinityScrollSkeletonFIller.tsx +57 -0
  157. package/src/ui-app/admin/components/Logs/Table/PagesCountAffix.tsx +61 -0
  158. package/src/ui-app/admin/components/Logs/Table/adminLogsCreateStyle.tsx +36 -0
  159. package/src/ui-app/admin/components/Logs/Table/adminLogsTableColumns.ts +52 -0
  160. package/src/ui-app/admin/components/Logs/UnfoldActionIcon.tsx +39 -0
  161. package/src/ui-app/admin/components/Navbar/AdminNavbar.tsx +50 -0
  162. package/src/ui-app/admin/components/Navbar/NavbarLinksGroup.tsx +104 -0
  163. package/src/ui-app/admin/components/Settings/AdminSettings.tsx +51 -0
  164. package/src/ui-app/admin/components/Settings/Forms/Boolean.tsx +59 -0
  165. package/src/ui-app/admin/components/Settings/Forms/FormWrapper.tsx +45 -0
  166. package/src/ui-app/admin/components/Settings/Forms/index.tsx +5 -0
  167. package/src/ui-app/admin/components/Settings/Forms/interfaces.tsx +17 -0
  168. package/src/ui-app/admin/components/Tasks/Task.tsx +138 -0
  169. package/src/ui-app/admin/components/Tasks/TaskWrapper.tsx +11 -0
  170. package/src/ui-app/admin/components/Tasks/tasksList.ts +59 -0
  171. package/src/ui-app/admin/components/Users/AdminUsers.tsx +182 -0
  172. package/src/ui-app/admin/components/Users/UserAddForm.tsx +137 -0
  173. package/src/ui-app/admin/components/Users/UserForm.tsx +196 -0
  174. package/src/ui-app/admin/hooks/useParams.tsx +18 -0
  175. package/src/ui-app/admin/index.html +17 -0
  176. package/src/ui-app/admin/main.tsx +24 -0
  177. package/src/ui-app/asserts/css/auth/index.css +23 -0
  178. package/src/ui-app/asserts/css/styles.css +36 -0
  179. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.eot +0 -0
  180. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.svg +313 -0
  181. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.ttf +0 -0
  182. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.woff +0 -0
  183. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-100.woff2 +0 -0
  184. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.eot +0 -0
  185. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.svg +305 -0
  186. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.ttf +0 -0
  187. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.woff +0 -0
  188. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-500.woff2 +0 -0
  189. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.eot +0 -0
  190. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.svg +309 -0
  191. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.ttf +0 -0
  192. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.woff +0 -0
  193. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-700.woff2 +0 -0
  194. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.eot +0 -0
  195. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.svg +308 -0
  196. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.ttf +0 -0
  197. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.woff +0 -0
  198. package/src/ui-app/asserts/fonts/roboto/roboto-v30-latin-regular.woff2 +0 -0
  199. package/src/ui-app/asserts/images/background.jpg +0 -0
  200. package/src/ui-app/asserts/images/bg_2_0_dark_L2.png +0 -0
  201. package/src/ui-app/asserts/images/favicon.svg +7 -0
  202. package/src/ui-app/auth/App.tsx +82 -0
  203. package/src/ui-app/auth/commonStyles.tsx +26 -0
  204. package/src/ui-app/auth/components/AuthFooter.tsx +51 -0
  205. package/src/ui-app/auth/components/AuthLogo.tsx +58 -0
  206. package/src/ui-app/auth/components/ChangePasswordForm.tsx +216 -0
  207. package/src/ui-app/auth/components/ChangePasswordSuccessForm.tsx +38 -0
  208. package/src/ui-app/auth/components/LoginForm.tsx +148 -0
  209. package/src/ui-app/auth/components/LogoutForm.tsx +89 -0
  210. package/src/ui-app/auth/components/ToggleThemeButton.tsx +41 -0
  211. package/src/ui-app/auth/components/change-password/Bars.tsx +45 -0
  212. package/src/ui-app/auth/components/change-password/PasswordRequirement.tsx +14 -0
  213. package/src/ui-app/auth/components/change-password/requirements.tsx +6 -0
  214. package/src/ui-app/auth/index.html +17 -0
  215. package/src/ui-app/auth/main.tsx +12 -0
  216. package/src/ui-app/auth/routes.tsx +26 -0
  217. package/src/ui-app/config.ts +15 -0
  218. package/src/ui-app/index.html +12 -0
  219. package/src/ui-app/index2/App.tsx +162 -0
  220. package/src/ui-app/index2/AppContext.ts +3 -0
  221. package/src/ui-app/index2/IndexLayout.tsx +34 -0
  222. package/src/ui-app/index2/components/Header/HeaderIndex.tsx +248 -0
  223. package/src/ui-app/index2/components/Header/QuickFilter.tsx +312 -0
  224. package/src/ui-app/index2/components/Navbar/Items/AcceptStatusItem.tsx +42 -0
  225. package/src/ui-app/index2/components/Navbar/Items/BaseItemWrapper.tsx +94 -0
  226. package/src/ui-app/index2/components/Navbar/Items/BrowserItem.tsx +42 -0
  227. package/src/ui-app/index2/components/Navbar/Items/PlatformItem.tsx +42 -0
  228. package/src/ui-app/index2/components/Navbar/Items/RemoveItemModalAsk.tsx +71 -0
  229. package/src/ui-app/index2/components/Navbar/Items/RemoveItemPopover.tsx +58 -0
  230. package/src/ui-app/index2/components/Navbar/Items/RemoveSuiteModalAsk.tsx +61 -0
  231. package/src/ui-app/index2/components/Navbar/Items/RunItem.tsx +149 -0
  232. package/src/ui-app/index2/components/Navbar/Items/StatusItem.tsx +42 -0
  233. package/src/ui-app/index2/components/Navbar/Items/SuiteItem.tsx +109 -0
  234. package/src/ui-app/index2/components/Navbar/Items/index.tsx +6 -0
  235. package/src/ui-app/index2/components/Navbar/NavbarFilter.tsx +93 -0
  236. package/src/ui-app/index2/components/Navbar/NavbarGroupBySelect.tsx +83 -0
  237. package/src/ui-app/index2/components/Navbar/NavbarIndex.tsx +247 -0
  238. package/src/ui-app/index2/components/Navbar/NavbarItems.tsx +38 -0
  239. package/src/ui-app/index2/components/Navbar/NavbarSort.tsx +105 -0
  240. package/src/ui-app/index2/components/Navbar/Skeletons/RunsDummySkeleton.tsx +27 -0
  241. package/src/ui-app/index2/components/Navbar/Skeletons/SimpleDummySkeleton.tsx +23 -0
  242. package/src/ui-app/index2/components/Navbar/Skeletons/SkeletonWrapper.tsx +45 -0
  243. package/src/ui-app/index2/components/Navbar/Skeletons/SuitesDummySkeleton.tsx +27 -0
  244. package/src/ui-app/index2/components/Tests/Table/AcceptTestModalAsk.tsx +68 -0
  245. package/src/ui-app/index2/components/Tests/Table/AcceptTestsButton.tsx +44 -0
  246. package/src/ui-app/index2/components/Tests/Table/Cells/Branch.tsx +35 -0
  247. package/src/ui-app/index2/components/Tests/Table/Cells/BrowserName.tsx +33 -0
  248. package/src/ui-app/index2/components/Tests/Table/Cells/BrowserVersion.tsx +31 -0
  249. package/src/ui-app/index2/components/Tests/Table/Cells/CellWrapper.tsx +49 -0
  250. package/src/ui-app/index2/components/Tests/Table/Cells/Os.tsx +32 -0
  251. package/src/ui-app/index2/components/Tests/Table/Cells/StartDate.tsx +34 -0
  252. package/src/ui-app/index2/components/Tests/Table/Cells/Status.tsx +50 -0
  253. package/src/ui-app/index2/components/Tests/Table/Cells/ViewPort.tsx +46 -0
  254. package/src/ui-app/index2/components/Tests/Table/Checks/AcceptButton.tsx +142 -0
  255. package/src/ui-app/index2/components/Tests/Table/Checks/Check.tsx +281 -0
  256. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/Canvas.tsx +36 -0
  257. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/helpers.ts +72 -0
  258. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/mainView.ts +495 -0
  259. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/sideToSideView.ts +398 -0
  260. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Canvas/simpleView.ts +21 -0
  261. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/CheckDetails.tsx +237 -0
  262. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Header.tsx +221 -0
  263. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedCheckItem.tsx +167 -0
  264. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedCheckSort.tsx +81 -0
  265. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecks.tsx +197 -0
  266. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecksItems.tsx +31 -0
  267. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/RelatedChecks/RelatedChecksSkeleton.tsx +37 -0
  268. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/HighlightButton.tsx +56 -0
  269. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/RegionsToolbar.tsx +150 -0
  270. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ScreenshotDetails.tsx +137 -0
  271. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/Toolbar.tsx +101 -0
  272. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ViewSegmentedControl.tsx +159 -0
  273. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/ZoomToolbar.tsx +326 -0
  274. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/Toolbar/highlightDiff.ts +167 -0
  275. package/src/ui-app/index2/components/Tests/Table/Checks/CheckDetails/hooks/useRelatedChecks.tsx +43 -0
  276. package/src/ui-app/index2/components/Tests/Table/Checks/CheckModal.tsx +119 -0
  277. package/src/ui-app/index2/components/Tests/Table/Checks/Checks.tsx +91 -0
  278. package/src/ui-app/index2/components/Tests/Table/Checks/ChecksSkeleton.tsx +21 -0
  279. package/src/ui-app/index2/components/Tests/Table/Checks/PreviewCheckTooltipLabel.tsx +121 -0
  280. package/src/ui-app/index2/components/Tests/Table/Checks/RemoveButton.tsx +63 -0
  281. package/src/ui-app/index2/components/Tests/Table/Checks/ViewPortLabel.tsx +94 -0
  282. package/src/ui-app/index2/components/Tests/Table/Checks/checkSizes.ts +27 -0
  283. package/src/ui-app/index2/components/Tests/Table/Filter.tsx +179 -0
  284. package/src/ui-app/index2/components/Tests/Table/Heads.tsx +54 -0
  285. package/src/ui-app/index2/components/Tests/Table/InfinityScrollSkeleton.tsx +71 -0
  286. package/src/ui-app/index2/components/Tests/Table/PagesCountAffix.tsx +61 -0
  287. package/src/ui-app/index2/components/Tests/Table/RefreshActionIcon.tsx +65 -0
  288. package/src/ui-app/index2/components/Tests/Table/RemoveTestModalAsk.tsx +66 -0
  289. package/src/ui-app/index2/components/Tests/Table/RemoveTestsButton.tsx +43 -0
  290. package/src/ui-app/index2/components/Tests/Table/Row.tsx +128 -0
  291. package/src/ui-app/index2/components/Tests/Table/Rows.tsx +87 -0
  292. package/src/ui-app/index2/components/Tests/Table/Settings.tsx +121 -0
  293. package/src/ui-app/index2/components/Tests/Table/TestsTable.tsx +140 -0
  294. package/src/ui-app/index2/components/Tests/Table/UnfoldActionIcon.tsx +39 -0
  295. package/src/ui-app/index2/components/Tests/Table/tableColumns.ts +80 -0
  296. package/src/ui-app/index2/components/Tests/Table/testsCreateStyle.tsx +35 -0
  297. package/src/ui-app/index2/components/Tests/Tests.tsx +157 -0
  298. package/src/ui-app/index2/hooks/useIndexSubpageEffect.tsx +14 -0
  299. package/src/ui-app/index2/hooks/useNavbarActiveItems.tsx +66 -0
  300. package/src/ui-app/index2/hooks/useParams.tsx +25 -0
  301. package/src/ui-app/index2/index.html +17 -0
  302. package/src/ui-app/index2/main.tsx +33 -0
  303. package/src/ui-app/package-lock.json +6150 -0
  304. package/src/ui-app/package.json +58 -0
  305. package/src/ui-app/shared/components/ActionPopoverIcon.tsx +116 -0
  306. package/src/ui-app/shared/components/Check/AcceptedStatusIcon.tsx +51 -0
  307. package/src/ui-app/shared/components/Check/BrowserIcon.tsx +50 -0
  308. package/src/ui-app/shared/components/Check/OsIcon.tsx +73 -0
  309. package/src/ui-app/shared/components/Check/Status.tsx +37 -0
  310. package/src/ui-app/shared/components/Check/StatusIcon.tsx +66 -0
  311. package/src/ui-app/shared/components/Email.tsx +83 -0
  312. package/src/ui-app/shared/components/Header/ApiKeyModalAsk.tsx +31 -0
  313. package/src/ui-app/shared/components/Header/ApiKeyModalResult.tsx +89 -0
  314. package/src/ui-app/shared/components/Header/HeaderLogo.tsx +82 -0
  315. package/src/ui-app/shared/components/Header/UserInfoModal.tsx +92 -0
  316. package/src/ui-app/shared/components/Header/UserMenu.tsx +151 -0
  317. package/src/ui-app/shared/components/Password.tsx +95 -0
  318. package/src/ui-app/shared/components/RelativeDrawer.tsx +43 -0
  319. package/src/ui-app/shared/components/SafeSelect.tsx +95 -0
  320. package/src/ui-app/shared/components/Tests/StatusesRing.tsx +66 -0
  321. package/src/ui-app/shared/components/ToggleThemeButton.tsx +33 -0
  322. package/src/ui-app/shared/components/Users/LabelUser.tsx +60 -0
  323. package/src/ui-app/shared/components/errors/ErrorFallback.tsx +66 -0
  324. package/src/ui-app/shared/components/filter/AcceptedFilter.tsx +20 -0
  325. package/src/ui-app/shared/components/filter/BrowserNameFilter.tsx +20 -0
  326. package/src/ui-app/shared/components/filter/CommonDistinctFilter.tsx +104 -0
  327. package/src/ui-app/shared/components/filter/DateFilter.tsx +54 -0
  328. package/src/ui-app/shared/components/filter/FilterWrapper.tsx +80 -0
  329. package/src/ui-app/shared/components/filter/IdFilter.tsx +60 -0
  330. package/src/ui-app/shared/components/filter/LogLevelFilter.tsx +77 -0
  331. package/src/ui-app/shared/components/filter/LogicalGroup.tsx +179 -0
  332. package/src/ui-app/shared/components/filter/OsFilter.tsx +20 -0
  333. package/src/ui-app/shared/components/filter/StatusFilter.tsx +20 -0
  334. package/src/ui-app/shared/components/filter/StringFilter.tsx +55 -0
  335. package/src/ui-app/shared/components/filter/index.ts +19 -0
  336. package/src/ui-app/shared/components/heaserLinks.tsx +4 -0
  337. package/src/ui-app/shared/hooks/index.ts +3 -0
  338. package/src/ui-app/shared/hooks/useColorSheme.ts +22 -0
  339. package/src/ui-app/shared/hooks/useDistinctLogQuery.tsx +33 -0
  340. package/src/ui-app/shared/hooks/useDistinctQuery.tsx +37 -0
  341. package/src/ui-app/shared/hooks/useInfinityScroll.tsx +163 -0
  342. package/src/ui-app/shared/hooks/useInfinityScrollRelatedChecks.tsx +60 -0
  343. package/src/ui-app/shared/hooks/useNavProgressFetchEffect.tsx +17 -0
  344. package/src/ui-app/shared/hooks/useSubpageEffect.tsx +28 -0
  345. package/src/ui-app/shared/hooks/user.hooks.ts +49 -0
  346. package/src/ui-app/shared/interfaces/ILog.tsx +13 -0
  347. package/src/ui-app/shared/interfaces/IUser.tsx +13 -0
  348. package/src/ui-app/shared/interfaces/logQueries.tsx +31 -0
  349. package/src/ui-app/shared/navigation/interfaces.tsx +7 -0
  350. package/src/ui-app/shared/navigation/navigationData.tsx +191 -0
  351. package/src/ui-app/shared/services/checks.service.ts +39 -0
  352. package/src/ui-app/shared/services/generic.service.ts +115 -0
  353. package/src/ui-app/shared/services/index.ts +6 -0
  354. package/src/ui-app/shared/services/runs.service.ts +20 -0
  355. package/src/ui-app/shared/services/suites.service.ts +20 -0
  356. package/src/ui-app/shared/services/tests.service.ts +39 -0
  357. package/src/ui-app/shared/services/users.service.ts +29 -0
  358. package/src/ui-app/shared/utils/Logger.ts +12 -0
  359. package/src/ui-app/shared/utils/SearchParams.ts +17 -0
  360. package/src/ui-app/shared/utils/filters.tsx +14 -0
  361. package/src/ui-app/shared/utils/index.ts +5 -0
  362. package/src/ui-app/shared/utils/utils.tsx +70 -0
  363. package/src/ui-app/stub.html +12 -0
  364. package/src/ui-app/stub.tsx +58 -0
  365. package/src/ui-app/stubDemoColors.tsx +47 -0
  366. package/src/ui-app/stubDemoNav.tsx +41 -0
  367. package/src/ui-app/tsconfig.json +21 -0
  368. package/src/ui-app/tsconfig.node.json +12 -0
  369. package/static/A.png +0 -0
  370. package/static/B.png +0 -0
  371. package/static/affected.html +39 -0
  372. package/static/affected_2.html +40 -0
  373. package/static/data/custom_devices.json +14 -0
  374. package/static/grids/desktop-higher.html +72 -0
  375. package/static/grids/desktop-wider.html +72 -0
  376. package/static/grids/desktop.html +61 -0
  377. package/static/grids/fit-in-view.html +62 -0
  378. package/static/js/canvasjs.min.js.bak +957 -0
  379. package/static/js/chart.js.bak +92 -0
  380. package/static/js/jquery-3.3.1.slim.js.bak +8269 -0
  381. package/static/js/jquery-3.3.1.slim.min.js.bak +2 -0
  382. package/static/js/moment.min.js.bak +2 -0
  383. package/static/low_diff_0.png +0 -0
  384. package/static/low_diff_1.png +0 -0
  385. package/static/vShift.png +0 -0
  386. package/static/vShift_bottom.png +0 -0
  387. package/static/vShift_top.png +0 -0
@@ -0,0 +1,2 @@
1
+ curl -u "$BROWSERSTACK_USER:$BROWSERSTACK_PASSWORD" \
2
+ -X GET "https://api-cloud.browserstack.com/app-automate/devices.json" > devices.json
@@ -0,0 +1,56 @@
1
+ /* eslint-disable dot-notation */
2
+ class AppSettings {
3
+ constructor() {
4
+ this.model = require('../models').AppSettings;
5
+ (async () => {
6
+ this.cache = await this.model.find()
7
+ .lean()
8
+ .exec();
9
+ })();
10
+ }
11
+
12
+ count() {
13
+ return this.model.countDocuments().exec();
14
+ }
15
+
16
+ async loadInitialFromFile() {
17
+ const settings = require('./initialAppSettings.json');
18
+ // console.log({ settings });
19
+ await this.model.insertMany(settings);
20
+ this.cache = settings;
21
+ }
22
+
23
+ async get(name) {
24
+ return this.cache?.find((x) => x.name === name)
25
+ || (this.model.findOne({ name })
26
+ .exec());
27
+ }
28
+
29
+ async set(name, value) {
30
+ const item = await this.model.findOneAndUpdate({ name }, { value });
31
+ await item.save();
32
+ this.cache.find((x) => x.name === name)['value'] = value;
33
+ }
34
+
35
+ async enable(name) {
36
+ const item = await this.model.findOneAndUpdate({ name }, { enabled: true });
37
+ await item.save();
38
+ this.cache.find((x) => x.name === name)['enabled'] = true;
39
+ }
40
+
41
+ async disable(name) {
42
+ const item = await this.model.findOneAndUpdate({ name }, { enabled: false });
43
+ await item.save();
44
+ this.cache.find((x) => x.name === name)['enabled'] = false;
45
+ }
46
+
47
+ async isAuthEnabled() {
48
+ return process.env.SYNGRISI_AUTH === '1' || (await this.get('authentication'))?.value === 'true';
49
+ }
50
+
51
+ async isFirstRun() {
52
+ return (await this.get('first_run'))?.value === 'true';
53
+ }
54
+ }
55
+
56
+ exports.AppSettings = AppSettings;
@@ -0,0 +1,9 @@
1
+ {
2
+ "username": "Administrator",
3
+ "role": "admin",
4
+ "firstName": "Syngrisi",
5
+ "lastName": "Admin",
6
+ "salt": "861d0193d9a4cd27597d672dd73100b1218cc7629c59bf18f9faef4480d1f58a",
7
+ "password": "cdd8541c318008fe0eee35d311b428c666d7ddf78722735e40b21b0b9e734eabe1b60f6db6deb8f3f101ed559a7365a497bfa73156ba3fadcbb14c5cae441edfe301568a47320abcda308920fecc482b1082468fd2197893561f5d174ecafdfb930bdc8e070fbed07353231d255616d3072e899a4ae1e6ff71f171edc34ba871d091b657a3207b571d2db0f3fce1fb2bc48942657d35aac7fa1fc2ebcbacdc00e46b184e1e5e4988171bcd843f7bb4adb2920df06c4f6b830154234350f9d65cc6e10d445a242c2149a3ce24458bd741035629bb73bdf29e0db4dcd3e37d85332d58d58674ca56b632294135a3354705b3281ea7564b962d544cfcee7069f3065c394098e11999385b077755f9c7e3d42f55b23ecb3366187d3a8ce2475615fbd06d707020274d7f50fe6c824e589955a667210fa031828f832e3cc050d1c0c5360647bfd88d411d3f76e8c6d9c610e2bc5a22da498888d2c94ad25b6448ca2eb9606210b2018136116fda6fdd87b24bcdfe86daefcdaa97d1f9e3a102188a4314a5a4018599cc70dab82157f5d88f7ada008a1f8e0d6e8abf51ed87ebdab982c01645f4f907414d1bb13b1fac410648cc2e94554ecbe0f472aee26623888878139bd44e109d5ce673ecfbe71269d22bea55a03ad4409fc8578de6001f5601fab4cf800be1d420f76586ed9c31214f30c632de99260256c9d2ce45476c135d32",
8
+ "apikey": "c6e10d445a242c2149a3ce24458bd741035629bb73bdf29e0db4dcd3e37d85332d58d58674ca56b632294135a3354705b3281ea7564b962d544cfcee7069f3065c394098e11999385b077755f9c7e3d42f55b23ecb336618"
9
+ }
@@ -0,0 +1,147 @@
1
+ const $this = this;
2
+ $this.logMeta = {
3
+ scope: 'comparator',
4
+ msgType: 'COMPARE',
5
+ };
6
+
7
+ // const {
8
+ // rect,
9
+ // PngImage,
10
+ // } = require('node-libpng');
11
+
12
+ const compareImages = require('./compareImagesNode');
13
+
14
+ // if (process.env['COMPARE_METHOD'] === '2') {
15
+ // compareImages = require('resemblejs/compareImages');
16
+ // } else {
17
+ // compareImages = require('./compareImagesNode');
18
+ // }
19
+
20
+ const DEFAULT_OPTIONS = {
21
+ output: {
22
+ // errorType: 'movement', //flat | movement | flatDifferenceIntensity | movementDifferenceIntensity | diffOnly):
23
+ largeImageThreshold: 0,
24
+ outputDiff: true,
25
+ errorType: 'flat',
26
+ transparency: 0,
27
+ },
28
+ // scaleToSameSize: true,
29
+ // isSameDimensions: false,
30
+ // useOriginalSize: true,
31
+ ignore: 'nothing', // nothing,less, antialiasing, colors, alpha
32
+ };
33
+
34
+ async function makeDiff(imgData1, imgData2, options = {}) {
35
+ const opts = Object.assign(DEFAULT_OPTIONS, options);
36
+ // The parameters can be Node Buffers
37
+ // data is the same as usual with an additional getBuffer() function
38
+ opts.ignoreRectangles = options.ignoredBoxes;
39
+ // noinspection UnnecessaryLocalVariableJS
40
+ const compareData = await compareImages(
41
+ imgData1,
42
+ imgData2,
43
+ opts
44
+ );
45
+ return compareData;
46
+ }
47
+
48
+ // async function compareWithVerticalShiftingStabilization(baselineOrigin, actualOrigin, method, opts) {
49
+ // const logOpts = {
50
+ // scope: 'compareWithVerticalShiftingStabilization',
51
+ // itemType: 'image',
52
+ // msgType: 'GET_DIFF',
53
+ // };
54
+ // try {
55
+ // const image1 = new PngImage(baselineOrigin);
56
+ // const image2 = new PngImage(actualOrigin);
57
+ // const diff = [];
58
+ // const vShifting = parseInt(opts.vShifting, 10);
59
+ // for (let i = 1; i <= vShifting; i += 1) {
60
+ // if (method === 'downup') {
61
+ // image1.crop(rect(0, 0, image1.width, (image1.height - i)));
62
+ // image2.crop(rect(0, i, image2.width, (image2.height - i)));
63
+ // }
64
+ // if (method === 'updown') {
65
+ // image1.crop(rect(0, i, image1.width, (image1.height - i)));
66
+ // image2.crop(rect(0, 0, image2.width, (image2.height - i)));
67
+ // }
68
+ //
69
+ // // eslint-disable-next-line no-await-in-loop
70
+ // const result = await makeDiff(image1.encode(), image2.encode(), opts);
71
+ //
72
+ // result.stabMethod = method;
73
+ // result.vOffset = i;
74
+ // result.topStablePixels = vShifting;
75
+ // diff.push(result);
76
+ // }
77
+ // return diff;
78
+ // } catch (e) {
79
+ // const errMsg = `error in compareWithVerticalShiftingStabilization ${e}\n ${e?.stack || e.toString()}`;
80
+ // log.error(errMsg, $this, logOpts);
81
+ // throw new Error(errMsg);
82
+ // }
83
+ // }
84
+
85
+ async function getDiff(baselineOrigin, actualOrigin, opts = {}) {
86
+ const logOpts = {
87
+ scope: 'getDiff',
88
+ itemType: 'image',
89
+ msgType: 'GET_DIFF',
90
+ };
91
+ try {
92
+ const executionTimer = process.hrtime();
93
+ // direct comparison
94
+ log.debug(`SAMPLE #1: ${process.hrtime(executionTimer)
95
+ .toString()}`, $this, logOpts);
96
+
97
+ const directDiff = await makeDiff(baselineOrigin, actualOrigin, opts);
98
+ log.debug(`SAMPLE #2: ${process.hrtime(executionTimer)
99
+ .toString()}`, $this, logOpts);
100
+
101
+ directDiff.executionTotalTime = process.hrtime(executionTimer)
102
+ .toString();
103
+
104
+ log.debug(`SAMPLE #3: ${process.hrtime(executionTimer)
105
+ .toString()}`, $this, logOpts);
106
+ log.debug(`the diff is: ${JSON.stringify(directDiff, null, 4)}`, $this, logOpts);
107
+
108
+ return directDiff;
109
+
110
+ // if (directDiff.rawMisMatchPercentage.toString() === '0'
111
+ // || !opts.vShifting
112
+ // || (opts.vShifting && parseInt(opts.vShifting, 10) < 1)) {
113
+ // return directDiff;
114
+ // }
115
+ //
116
+ // // compare/analyse with vertical shifting
117
+ // let diffs = [directDiff];
118
+ // /**
119
+ // * up/down shifting:
120
+ // * e.g.: baseline (right) image has top-margin: 0 and actual(wrong) - 1
121
+ // * down/up shifting
122
+ // * e.g.: baseline (right) image has top-margin: 1 and actual(wrong) - 2
123
+ // */
124
+ // diffs = [...diffs,
125
+ // ...(await compareWithVerticalShiftingStabilization(baselineOrigin, actualOrigin, 'updown', opts))];
126
+ // diffs = [...diffs,
127
+ // ...(await compareWithVerticalShiftingStabilization(baselineOrigin, actualOrigin, 'downup', opts))];
128
+ // log.debug(`SAMPLE #4 (vShifting): ${process.hrtime(executionTimer)
129
+ // .toString()}`, $this, logOpts);
130
+ // const values = await Promise.all(diffs);
131
+ // console.table(values, ['stabMethod', 'vOffset', 'topStablePixels', 'rawMisMatchPercentage', 'analysisTime']);
132
+ //
133
+ // // search result with lowest misMatchPercentage
134
+ // const moreFittingResult = values.reduce(
135
+ // (prev, current) => ((prev.misMatchPercentage < current.misMatchPercentage) ? prev : current)
136
+ // );
137
+ // moreFittingResult.executionTotalTime = process.hrtime(executionTimer)
138
+ // .toString();
139
+ // log.silly(`${JSON.stringify(moreFittingResult, null, ' ')}`, $this, logOpts);
140
+ // return moreFittingResult;
141
+ } catch (e) {
142
+ log.error(e.stack || e.toString(), $this, logOpts);
143
+ throw new Error(e);
144
+ }
145
+ }
146
+
147
+ exports.getDiff = getDiff;
@@ -0,0 +1,60 @@
1
+ const resemble = require('@syngrisi/node-resemble.js');
2
+
3
+ async function streamToBuffer(stream) {
4
+ return new Promise((resolve, reject) => {
5
+ const data = [];
6
+
7
+ stream.on('data', (chunk) => {
8
+ data.push(chunk);
9
+ });
10
+
11
+ stream.on('end', () => {
12
+ resolve(Buffer.concat(data));
13
+ });
14
+
15
+ stream.on('error', (err) => {
16
+ reject(err);
17
+ });
18
+ });
19
+ }
20
+
21
+ module.exports = function compareImages(image1, image2, options) {
22
+ return new Promise(
23
+ (resolve, reject) => {
24
+ try {
25
+ const ignoreTransform = {
26
+ antialiasing: 'ignoreAntialiasing',
27
+ colors: 'ignoreColors',
28
+ nothing: 'ignoreNothing',
29
+ };
30
+ const ignoreMethod = ignoreTransform[options.ignore] ? ignoreTransform[options.ignore] : 'ignoreAntialiasing';
31
+ const outputOpts = options.output;
32
+ resemble.outputSettings(
33
+ outputOpts
34
+ );
35
+ let ignoredRect;
36
+ if (options.ignoreRectangles) {
37
+ ignoredRect = options.ignoreRectangles.map((it) => {
38
+ delete it.name;
39
+ return [it.left, it.top, it.right - it.left, it.bottom - it.top];
40
+ });
41
+ }
42
+
43
+ resemble(image1)
44
+ .compareTo(image2)[ignoreMethod]()
45
+ .ignoreRectangles(ignoredRect)
46
+ .onComplete(async (data) => {
47
+ console.log(data);
48
+ const stream = await data.getDiffImage();
49
+ const buffer = await streamToBuffer(stream.pack());
50
+ data.getBuffer = function () {
51
+ return buffer;
52
+ };
53
+ return resolve(data);
54
+ });
55
+ } catch (e) {
56
+ return reject(e);
57
+ }
58
+ }
59
+ );
60
+ };
@@ -0,0 +1,215 @@
1
+ /* eslint-disable no-underscore-dangle,func-names */
2
+ /* global log */
3
+ const mongoose = require('mongoose');
4
+
5
+ const {
6
+ Suite,
7
+ Run,
8
+ App
9
+ } = require('../models');
10
+
11
+ const $this = this;
12
+ $this.logMeta = {
13
+ scope: 'dbitems',
14
+ msgType: 'DB',
15
+ };
16
+
17
+ // COMMON
18
+ async function updateItem(itemType, filter, params) {
19
+ const logOpts = {
20
+ scope: 'updateItem',
21
+ msgType: 'UPDATE',
22
+ itemType,
23
+ };
24
+ log.debug(`update item type: '${itemType}', filter: '${JSON.stringify(filter)}', params: '${JSON.stringify(params)}'`, $this, logOpts);
25
+ const itemModel = await mongoose.model(itemType)
26
+ .findOne(filter);
27
+ const updatedItem = await itemModel.updateOne(params);
28
+ log.debug(`'${itemType}' was updated: '${JSON.stringify(updatedItem)}'`, $this, { ...logOpts, ...{ ref: itemModel._id } });
29
+ return updatedItem;
30
+ }
31
+
32
+ exports.updateItem = updateItem;
33
+
34
+ async function updateItemDate(mdClass, id) {
35
+ log.debug(`update date for the item: '${mdClass}' with id: '${id}'`, $this);
36
+ const itemModel = await mongoose.model(mdClass)
37
+ .findById(id);
38
+ const updatedItem = await itemModel.updateOne({ updatedDate: Date.now() });
39
+ log.debug(`'${mdClass}' date updated: '${JSON.stringify(itemModel)}'`, $this);
40
+ return updatedItem;
41
+ }
42
+
43
+ exports.updateItemDate = updateItemDate;
44
+
45
+ const createItemIfNotExist = async function (modelName, params, logsMeta = {}) {
46
+ const logOpts = {
47
+ scope: 'createItemIfNotExist',
48
+ msgType: 'CREATE',
49
+ itemType: modelName,
50
+ };
51
+ try {
52
+ const itemModel = mongoose.model(modelName);
53
+ const options = {
54
+ upsert: true,
55
+ new: true,
56
+ setDefaultsOnInsert: true
57
+ };
58
+
59
+ await itemModel.init();
60
+ const item = await itemModel
61
+ .findOneAndUpdate(
62
+ params,
63
+ params,
64
+ options
65
+ );
66
+
67
+ log.info(`ORM item '${modelName}' was created: '${JSON.stringify(item)}'`, $this, { ...logOpts, ...{ ref: item._id }, ...logsMeta });
68
+ return item;
69
+ } catch (e) {
70
+ log.debug(`cannot create '${modelName}' ORM item, error: '${e.stack || e}'`, $this, { ...logOpts, ...logsMeta });
71
+ }
72
+ return null;
73
+ };
74
+
75
+ exports.createItemIfNotExistAsync = createItemIfNotExist;
76
+ exports.createItemIfNotExist = createItemIfNotExist;
77
+
78
+ async function createItemProm(modelName, params) {
79
+ try {
80
+ const itemModel = mongoose.model(modelName);
81
+ log.debug(`start to create ORM item via promise: '${modelName}', params: '${JSON.stringify(params)}'`, $this);
82
+ const item = await itemModel.create(params);
83
+ return item;
84
+ } catch (e) {
85
+ const errMsg = `cannot create '${modelName}', error: '${e.stack || e}'`;
86
+ log.error(errMsg, $this);
87
+ throw new Error(errMsg);
88
+ }
89
+ }
90
+
91
+ // SPECIFIC
92
+ exports.createTest = async function createTest(params) {
93
+ return createItemProm('VRSTest', params);
94
+ };
95
+
96
+ exports.createUser = async function createUser(params) {
97
+ return createItemProm('VRSUser', params)
98
+ .catch((e) => Promise.reject(e));
99
+ };
100
+
101
+ exports.createAppIfNotExist = async function createAppIfNotExist(params) {
102
+ const logOpts = {
103
+ scope: 'createAppIfNotExist',
104
+ msgType: 'CREATE',
105
+ itemType: 'VRSApp',
106
+ };
107
+ if (!params.name) return {};
108
+ // throw new Error(`Cannot create app, wrong params: '${JSON.stringify(params)}'`);
109
+
110
+ log.debug(`try to create app if exist, params: '${JSON.stringify(params)}'`,
111
+ $this, logOpts);
112
+
113
+ let app = await App.findOne({ name: params.name })
114
+ .exec();
115
+
116
+ if (app) {
117
+ log.debug(`app already exist: '${JSON.stringify(params)}'`,
118
+ $this, logOpts);
119
+ return app;
120
+ }
121
+
122
+ app = await App.create(params);
123
+ log.debug(`app with name: '${params.name}' was created`,
124
+ $this, logOpts);
125
+ return app;
126
+ };
127
+
128
+ const createSuiteIfNotExist = async function (params, logsMeta = {}) {
129
+ const logOpts = {
130
+ scope: 'createSuiteIfNotExist',
131
+ msgType: 'CREATE',
132
+ itemType: 'VRSSuite',
133
+ };
134
+ if (!params.name || !params.app) throw new Error(`Cannot create suite, wrong params: '${JSON.stringify(params)}'`);
135
+
136
+ log.debug(`try to create suite if exist, params: '${JSON.stringify(params)}'`,
137
+ $this,
138
+ { ...logOpts, ...logsMeta });
139
+
140
+ let suite = await Suite.findOne({ name: params.name })
141
+ .exec();
142
+
143
+ if (suite) {
144
+ log.debug(`suite already exist: '${JSON.stringify(params)}'`,
145
+ $this,
146
+ { ...logOpts, ...logsMeta });
147
+ return suite;
148
+ }
149
+
150
+ suite = await Suite.create(params);
151
+
152
+ log.debug(`suite with name: '${params.name}' was created`,
153
+ $this,
154
+ { ...logOpts, ...logsMeta });
155
+ return suite;
156
+ };
157
+
158
+ exports.createSuiteIfNotExist = createSuiteIfNotExist;
159
+
160
+ const createRunIfNotExist = async function (params, logsMeta = {}) {
161
+ const logOpts = {
162
+ scope: 'createRunIfNotExist',
163
+ msgType: 'CREATE',
164
+ itemType: 'VRSRun',
165
+ };
166
+ let run;
167
+ try {
168
+ if (!params.name || !params.app || !params.ident) {
169
+ throw new Error(`Cannot create run, wrong params: '${JSON.stringify(params)}'`);
170
+ }
171
+
172
+ log.debug(`try to create run if exist, params: '${JSON.stringify(params)}'`,
173
+ $this,
174
+ { ...logOpts, ...logsMeta });
175
+
176
+ let run = await Run.findOne({ ident: params.ident })
177
+ .exec();
178
+
179
+ if (run) {
180
+ log.debug(`run already exist: '${JSON.stringify(params)}'`,
181
+ $this,
182
+ { ...logOpts, ...logsMeta });
183
+ return run;
184
+ }
185
+
186
+ run = await Run.create({
187
+ ...params,
188
+ createdDate: params.createdDate || new Date()
189
+ });
190
+
191
+ log.debug(`run with name: '${params.name}' was created: ${run}`,
192
+ $this,
193
+ { ...logOpts, ...logsMeta });
194
+ return run;
195
+ } catch (e) {
196
+ // e ==== {"ok":0,"code":11000,"codeName":"DuplicateKey","keyPattern":{"ident":1},"keyValue":{"ident":"cd933acc-6ecb-472c-8dd1-03ec00260bec"}}
197
+ if (e.code === 11000) {
198
+ log.warn(`run key duplication collision: '${JSON.stringify(params)}', error: '${e.stack || e}'`,
199
+ $this,
200
+ { ...logOpts, ...logsMeta });
201
+ run = await Run.findOne({
202
+ name: params.name,
203
+ ident: params.ident
204
+ });
205
+ log.warn(`run key duplication collision, found: '${JSON.stringify(run)}'`, $this, { ...logOpts, ...logsMeta });
206
+ if (run) return run;
207
+ }
208
+ log.error(`cannot create run, params: '${JSON.stringify(params)}', error: '${e.stack || e}', obj: ${JSON.stringify(e)}`,
209
+ $this,
210
+ { ...logOpts, ...logsMeta });
211
+ throw e;
212
+ }
213
+ };
214
+
215
+ exports.createRunIfNotExist = createRunIfNotExist;