@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,223 @@
1
+ /**
2
+ * Ensure that a user is logged in before proceeding to next route middleware.
3
+ *
4
+ * This middleware ensures that a user is logged in. If a request is received
5
+ * that is unauthenticated, the request will be redirected to a login page (by
6
+ * default to `/login`).
7
+ *
8
+ * Additionally, `returnTo` will be be set in the session to the URL of the
9
+ * current request. After authentication, this value can be used to redirect
10
+ * the user to the page that was originally requested.
11
+ *
12
+ * Options:
13
+ * - `redirectTo` URL to redirect to for login, defaults to _/login_
14
+ * - `setReturnTo` set redirectTo in session, defaults to _true_
15
+ *
16
+ * Examples:
17
+ *
18
+ * app.get('/profile',
19
+ * ensureLoggedIn(),
20
+ * function(req, res) { ... });
21
+ *
22
+ * app.get('/profile',
23
+ * ensureLoggedIn('/signin'),
24
+ * function(req, res) { ... });
25
+ *
26
+ * app.get('/profile',
27
+ * ensureLoggedIn({ redirectTo: '/session/new', setReturnTo: false }),
28
+ * function(req, res) { ... });
29
+ *
30
+ * @param {Object} options
31
+ * @return {Function}
32
+ * @api public
33
+ */
34
+ const { User } = require('../../models');
35
+
36
+ const $this = this;
37
+ $this.logMeta = {
38
+ scope: 'Authentication',
39
+ msgType: 'LOGIN',
40
+ };
41
+
42
+ // eslint-disable-next-line consistent-return
43
+ const handleBasicAuth = async (req) => {
44
+ const logOpts = {
45
+ scope: 'handleBasicAuth',
46
+ msgType: 'AUTH_API',
47
+ };
48
+
49
+ if (req.isAuthenticated()) {
50
+ return { type: 'success', status: 200 };
51
+ }
52
+ if (!(await global.AppSettings.isAuthEnabled())) {
53
+ const guest = await User.findOne({ username: 'Guest' });
54
+ // noinspection UnnecessaryLocalVariableJS
55
+ const result = new Promise((resolve) => {
56
+ req.logIn(guest, (err) => {
57
+ if (err) {
58
+ log.error(`cannot find quest user: '${err}'`, $this, logOpts);
59
+ resolve({
60
+ type: 'redirect',
61
+ status: 301,
62
+ value: `/auth?=Error: cannot find quest user: ${err}`,
63
+ user: null,
64
+ });
65
+ } else {
66
+ resolve({
67
+ type: 'success',
68
+ status: 200,
69
+ value: '',
70
+ user: guest,
71
+ });
72
+ }
73
+ });
74
+ });
75
+ return result;
76
+ }
77
+
78
+ const result = {
79
+ type: 'error',
80
+ status: 400,
81
+ value: '',
82
+ user: null,
83
+ };
84
+
85
+ if ((await global.AppSettings.isAuthEnabled())
86
+ && ((await global.AppSettings.isFirstRun()))
87
+ && process.env.SYNGRISI_DISABLE_FIRST_RUN !== '1'
88
+ ) {
89
+ log.info('first run, set admin password', $this, logOpts);
90
+ result.type = 'redirect';
91
+ result.status = 301;
92
+ result.value = '/auth/change?first_run=true';
93
+ return result;
94
+ }
95
+
96
+ if (await global.AppSettings.isAuthEnabled()) {
97
+ log.info(`user is not authenticated - ${req.originalUrl}`, $this, logOpts);
98
+
99
+ result.type = 'redirect';
100
+ result.status = 301;
101
+
102
+ if (req?.originalUrl !== '/') {
103
+ result.value = `/auth?origin=${encodeURIComponent(req.originalUrl)}`;
104
+ return result;
105
+ }
106
+
107
+ result.value = '/auth';
108
+ return result;
109
+ }
110
+ };
111
+
112
+ exports.ensureLoggedIn = function ensureLoggedIn() {
113
+ // eslint-disable-next-line consistent-return
114
+ return async (req, res, next) => {
115
+ const result = await handleBasicAuth(req);
116
+ // log.silly(result, {
117
+ // scope: 'ensureLoggedIn',
118
+ // msgType: 'AUTH_API',
119
+ // }, $this);
120
+ req.user = result.user || req.user;
121
+ if (result.type === 'success') {
122
+ return next();
123
+ }
124
+ res.status(result.status)
125
+ .redirect(result.value);
126
+ return next('redirect');
127
+ };
128
+ };
129
+
130
+ const handleAPIAuth = async (hashedApiKey) => {
131
+ const logOpts = {
132
+ scope: 'handleAPIAuth',
133
+ msgType: 'AUTH_API',
134
+ };
135
+
136
+ const result = {
137
+ status: 400,
138
+ type: 'error',
139
+ value: '',
140
+ user: null,
141
+ };
142
+
143
+ if (!(await global.AppSettings.isAuthEnabled())) {
144
+ const guest = await User.findOne({ username: 'Guest' });
145
+
146
+ if (!guest) {
147
+ log.error('cannot find Guest user');
148
+ result.type = 'error';
149
+ result.value = 'cannot find Guest user';
150
+ return result;
151
+ }
152
+ log.debug('authentication disabled', logOpts, { user: 'Guest' });
153
+ result.type = 'success';
154
+ result.user = guest;
155
+ result.status = 200;
156
+ return result;
157
+ }
158
+
159
+ if (!hashedApiKey) {
160
+ log.debug('API key missing', logOpts);
161
+ result.type = 'error';
162
+ result.status = 401;
163
+ result.value = 'API key missing';
164
+ return result;
165
+ }
166
+
167
+ const user = await User.findOne({ apiKey: hashedApiKey });
168
+ if (!user) {
169
+ log.error(`wrong API key: ${hashedApiKey}`, logOpts);
170
+ result.type = 'error';
171
+ result.status = 401;
172
+ result.value = 'wrong API key';
173
+ return result;
174
+ }
175
+ log.debug('authenticated', $this, { ...logOpts, ...{ user: user?.username } });
176
+ result.type = 'success';
177
+ result.status = 200;
178
+ result.user = user;
179
+ return result;
180
+ };
181
+
182
+ exports.ensureApiKey = function ensureApiKey() {
183
+ const logOpts = {
184
+ scope: 'ensureApiKey',
185
+ msgType: 'AUTH_API',
186
+ };
187
+ // eslint-disable-next-line consistent-return
188
+ return async (req, res, next) => {
189
+ log.silly(`headers: ${JSON.stringify(req.headers, null, '..')}`, logOpts);
190
+ log.silly(`SYNGRISI_AUTH: '${process.env.SYNGRISI_AUTH}'`);
191
+ const hashedApiKey = req.headers.apikey || req.query.apikey;
192
+ const result = await handleAPIAuth(hashedApiKey);
193
+ req.user = req.user || result.user;
194
+ req.headers.apikey = result?.user?.apiKey || req?.headers?.apikey;
195
+ if (result.type !== 'success') {
196
+ log.info(`${result.value} - ${req.originalUrl}`, $this, logOpts);
197
+ res.status(result.status)
198
+ .json({ error: result.value });
199
+ return next(new Error(result.value));
200
+ }
201
+ return next();
202
+ };
203
+ };
204
+
205
+ exports.ensureLoggedInOrApiKey = () => async (req, res, next) => {
206
+ const basicAuthResult = await handleBasicAuth(req);
207
+
208
+ const hashedApiKey = req.headers.apikey || req.query.apikey;
209
+ const apiKeyResult = await handleAPIAuth(hashedApiKey);
210
+ req.user = req.user || apiKeyResult.user;
211
+
212
+ if (
213
+ (basicAuthResult.type !== 'success')
214
+ && (apiKeyResult.type !== 'success')
215
+ ) {
216
+ log.info(`Unauthorized - ${req.originalUrl}`);
217
+ // res.status(401).json({ error: `${`${apiKeyResult.value} ${basicAuthResult.value}`} - ${req.originalUrl}` });
218
+ res.status(401)
219
+ .json({ error: `Unauthorized - ${req.originalUrl}` });
220
+ return next(new Error(`Unauthorized - ${req.originalUrl}`));
221
+ }
222
+ return next();
223
+ };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Ensure that no user is logged in before proceeding to next route middleware.
3
+ *
4
+ * This middleware ensures that no user is logged in. If a request is received
5
+ * that is authenticated, the request will be redirected to another page (by
6
+ * default to `/`).
7
+ *
8
+ * Options:
9
+ * - `redirectTo` URL to redirect to in logged in, defaults to _/_
10
+ *
11
+ * Examples:
12
+ *
13
+ * app.get('/login',
14
+ * ensureLoggedOut(),
15
+ * function(req, res) { ... });
16
+ *
17
+ * app.get('/login',
18
+ * ensureLoggedOut('/home'),
19
+ * function(req, res) { ... });
20
+ *
21
+ * app.get('/login',
22
+ * ensureLoggedOut({ redirectTo: '/home' }),
23
+ * function(req, res) { ... });
24
+ *
25
+ * @param {Object} options
26
+ * @return {Function}
27
+ * @api public
28
+ */
29
+ module.exports = function ensureLoggedOut(options) {
30
+ let opts;
31
+ if (typeof options === 'string') {
32
+ opts = { redirectTo: options };
33
+ }
34
+ opts = options || {};
35
+
36
+ const url = opts.redirectTo || '/';
37
+
38
+ return function (req, res, next) {
39
+ if (req.isAuthenticated && req.isAuthenticated()) {
40
+ return res.redirect(url);
41
+ }
42
+ return next();
43
+ };
44
+ };
@@ -0,0 +1,72 @@
1
+ const getElementsByPositionFromDump = function getElementsByPositionFromDump(x, y, dump, offset = 1) {
2
+ return new Promise(function (resolve, reject) {
3
+ try {
4
+ // check if position is gets into dumped elements rects boundaries
5
+ let data = dump
6
+ .filter(function (item) {
7
+ return (x >= item.left) &&
8
+ (x <= item.right) &&
9
+ (y >= item.top) &&
10
+ (y <= item.bottom);
11
+ })
12
+ .sort((a, b) => (a.domPath.length) < (b.domPath.length) ? 1 : -1);
13
+ if (data.length < 1) {
14
+ return resolve(null);
15
+ }
16
+ const pos = data[0];
17
+ return resolve({
18
+ tag: pos.tag,
19
+ id: pos.id,
20
+ x: pos.x,
21
+ y: pos.y,
22
+ width: pos.width,
23
+ height: pos.height,
24
+ domPath: pos.domPath,
25
+ request: `${x}, ${y}`
26
+ });
27
+ } catch (e) {
28
+ return reject(e);
29
+ }
30
+ });
31
+ };
32
+ const getAllElementsByPositionFromDump = function getAllElementsByPositionFromDump(dump, positions) {
33
+ return new Promise(function (resolve, reject) {
34
+ try {
35
+ let executionTimer = process.hrtime();
36
+ console.log(`Start parse elements from dump based on diff`);
37
+ let promResults = [];
38
+ for (const position of positions) {
39
+ const el = getElementsByPositionFromDump(position.x, position.y, dump);
40
+ promResults.push(el);
41
+
42
+ }
43
+ console.log(`Promises formed, time: ${process.hrtime(executionTimer)
44
+ .toString()}`);
45
+
46
+ let dumpResults = {};
47
+ Promise.all(promResults)
48
+ .then((values) => {
49
+ console.log(`Promises resolved, time: ${process.hrtime(executionTimer)
50
+ .toString()}`);
51
+ for (el of values) {
52
+ // to make dump unique
53
+ if (el !== null) {
54
+ const key = `${el.tag}_${el.id}_${el.x}_${el.y}_${el.width}_${el.height}_${el.domPath.toString()}`;
55
+ dumpResults[key] = el;
56
+ }
57
+ }
58
+ console.log(`End parse elements from dump based on diff, time: '${process.hrtime(executionTimer)
59
+ .toString()}'`);
60
+ return resolve(Object.values(dumpResults)
61
+ .map(x => x));
62
+ });
63
+ } catch (e) {
64
+ reject(e);
65
+ }
66
+ });
67
+ };
68
+
69
+ module.exports = {
70
+ getElementsByPositionFromDump: getElementsByPositionFromDump,
71
+ getAllElementsByPositionFromDump: getAllElementsByPositionFromDump,
72
+ };
@@ -0,0 +1,9 @@
1
+ {
2
+ "username": "Guest",
3
+ "role": "user",
4
+ "firstName": "Syngrisi",
5
+ "lastName": "Guest",
6
+ "salt": "861d0193d9a4cd27597d672dd73100b1218cc7629c59bf18f9faef4480d1f58a",
7
+ "password": "cdd8541c318008fe0eee35d311b428c666d7ddf78722735e40b21b0b9e734eabe1b60f6db6deb8f3f101ed559a7365a497bfa73156ba3fadcbb14c5cae441edfe301568a47320abcda308920fecc482b1082468fd2197893561f5d174ecafdfb930bdc8e070fbed07353231d255616d3072e899a4ae1e6ff71f171edc34ba871d091b657a3207b571d2db0f3fce1fb2bc48942657d35aac7fa1fc2ebcbacdc00e46b184e1e5e4988171bcd843f7bb4adb2920df06c4f6b830154234350f9d65cc6e10d445a242c2149a3ce24458bd741035629bb73bdf29e0db4dcd3e37d85332d58d58674ca56b632294135a3354705b3281ea7564b962d544cfcee7069f3065c394098e11999385b077755f9c7e3d42f55b23ecb3366187d3a8ce2475615fbd06d707020274d7f50fe6c824e589955a667210fa031828f832e3cc050d1c0c5360647bfd88d411d3f76e8c6d9c610e2bc5a22da498888d2c94ad25b6448ca2eb9606210b2018136116fda6fdd87b24bcdfe86daefcdaa97d1f9e3a102188a4314a5a4018599cc70dab82157f5d88f7ada008a1f8e0d6e8abf51ed87ebdab982c01645f4f907414d1bb13b1fac410648cc2e94554ecbe0f472aee26623888878139bd44e109d5ce673ecfbe71269d22bea55a03ad4409fc8578de6001f5601fab4cf800be1d420f76586ed9c31214f30c632de99260256c9d2ce45476c135d32",
8
+ "apiKey": "4ba2659e94f48ce771a78ee479dc3ab12c2cc6d2484c967b4c564f0a1718a8a254f6aaec3169eb7b29e7d2542d73d378339e311cf912e46fe67eac4eef44636c"
9
+ }
@@ -0,0 +1,18 @@
1
+ [
2
+ {
3
+ "name": "first_run",
4
+ "label": "First Run",
5
+ "description": "Indicates if the application is running the first time",
6
+ "type": "Boolean",
7
+ "value": "true",
8
+ "enabled": true
9
+ },
10
+ {
11
+ "name": "authentication",
12
+ "label": "Authentication",
13
+ "description": "Enable application authentication",
14
+ "type": "Boolean",
15
+ "value": "false",
16
+ "enabled": true
17
+ }
18
+ ]
@@ -0,0 +1,95 @@
1
+ const winston = require('winston');
2
+ require('winston-mongodb');
3
+ const {
4
+ blue,
5
+ gray,
6
+ magenta,
7
+ } = require('chalk');
8
+ const { formatISOToDateTime } = require('../utils');
9
+
10
+ const logLevel = process.env.SYNGRISI_LOG_LEVEL ? process.env.SYNGRISI_LOG_LEVEL : '';
11
+
12
+ module.exports.Logger = class Logger {
13
+ constructor(opts) {
14
+ this.connectionString = opts.connectionString;
15
+ this.winstonLogger = winston.createLogger({
16
+ transports: [
17
+ new winston.transports.Console({
18
+ level: logLevel || 'silly',
19
+ format: winston.format.combine(
20
+ winston.format.colorize(),
21
+ winston.format.timestamp(),
22
+ winston.format.ms(),
23
+ winston.format.metadata(),
24
+ winston.format.printf((info) => {
25
+ const user = info.metadata.user ? blue(` <${info.metadata.user}>`) : '';
26
+ const ref = info.metadata.ref ? gray(` ${info.metadata.ref}`) : '';
27
+ const msgType = info.metadata.msgType ? ` ${info.metadata.msgType}` : '';
28
+ const itemType = info.metadata.itemType ? magenta(` ${info.metadata.itemType}`) : '';
29
+ const scope = info.metadata.scope ? magenta(` [${info.metadata.scope}] `) : '';
30
+ const msg = typeof info.message === 'object'
31
+ ? `\n${JSON.stringify(info.message, null, 2)}`
32
+ : info.message;
33
+
34
+ // return `${info.level} ${scope}${formatISO9075(parseISO(info.metadata.timestamp))} `
35
+ return `${info.level} ${scope}${formatISOToDateTime(info.metadata.timestamp)} `
36
+ + `${info.metadata.ms}${user}${ref}${msgType}${itemType} '${msg}'`;
37
+ }),
38
+ winston.format.padLevels(),
39
+ ),
40
+ }),
41
+ new winston.transports.MongoDB({
42
+ level: logLevel || 'debug',
43
+ format: winston.format.combine(
44
+ winston.format.timestamp(),
45
+ winston.format.json(),
46
+ winston.format.metadata(),
47
+ ),
48
+ options: {
49
+ useUnifiedTopology: true,
50
+ },
51
+ db: opts.dbConnectionString,
52
+ collection: 'vrslogs',
53
+ storeHost: true,
54
+ meta: true,
55
+ }),
56
+ ],
57
+ });
58
+ }
59
+
60
+ static merge(meta, context) {
61
+ if ((meta?.ref) && (typeof meta?.ref) !== 'string') {
62
+ // eslint-disable-next-line no-param-reassign
63
+ meta.ref = meta.ref.toString();
64
+ }
65
+ if (context?.logMeta) {
66
+ // return Object.assign(context.logMeta, meta);
67
+ return { ...context.logMeta, ...meta };
68
+ }
69
+ return meta;
70
+ }
71
+
72
+ error(msg, context, meta) {
73
+ this.winstonLogger.error(`${msg}\n stacktrace: ${new Error().stack}`, Logger.merge(meta, context));
74
+ }
75
+
76
+ warn(msg, context, meta) {
77
+ this.winstonLogger.warn(`${msg}\n stacktrace: ${new Error().stack}`, Logger.merge(meta, context));
78
+ }
79
+
80
+ info(msg, context, meta) {
81
+ this.winstonLogger.info(msg, Logger.merge(meta, context));
82
+ }
83
+
84
+ verbose(msg, context, meta) {
85
+ this.winstonLogger.verbose(msg, Logger.merge(meta, context));
86
+ }
87
+
88
+ debug(msg, context, meta) {
89
+ this.winstonLogger.debug(msg, Logger.merge(meta, context));
90
+ }
91
+
92
+ silly(msg, meta, context) {
93
+ this.winstonLogger.silly(msg, Logger.merge(meta, context));
94
+ }
95
+ };
@@ -0,0 +1,53 @@
1
+ /* eslint-disable no-underscore-dangle */
2
+ // this code should run only once at server start
3
+ const fs = require('fs');
4
+ // eslint-disable-next-line no-unused-vars
5
+ const testUsers = require('./testUsers.json');
6
+ const { User } = require('../models');
7
+
8
+ const $this = this;
9
+ $this.logMeta = {
10
+ scope: 'on_start',
11
+ msgType: 'SETUP',
12
+ };
13
+
14
+ exports.createTempDir = function createTempDir() {
15
+ const dir = '.tmp';
16
+ if (!fs.existsSync(dir)) {
17
+ fs.mkdirSync(dir);
18
+ }
19
+ };
20
+
21
+ exports.createInitialSettings = async function createInitialSettings() {
22
+ if ((await global.AppSettings.count()) < 1) {
23
+ await global.AppSettings.loadInitialFromFile();
24
+ }
25
+ };
26
+
27
+ exports.createBasicUsers = async function createBasicUsers() {
28
+ const defAdmin = await User.findOne({ username: 'Administrator' }).exec();
29
+ const defGuest = await User.findOne({ username: 'Guest' }).exec();
30
+ if (!defAdmin) {
31
+ log.info('create the default Administrator', $this);
32
+ const adminData = JSON.parse(fs.readFileSync(`${__dirname}/admin.json`));
33
+
34
+ const admin = await User.create(adminData);
35
+ log.info(`administrator with id: '${admin._id}' was created`, $this);
36
+ }
37
+ if (!defGuest) {
38
+ log.info('create the default Guest', $this);
39
+ const guestData = JSON.parse(fs.readFileSync(`${__dirname}/guest.json`));
40
+ const guest = await User.create(guestData);
41
+ log.info(`guest with id: '${guest._id}' was created`, $this);
42
+ }
43
+ };
44
+
45
+ exports.createTestsUsers = async function createTestsUsers() {
46
+ const users = require('./testUsers.json');
47
+ log.debug('creating tests users', $this);
48
+ try {
49
+ await User.insertMany(users);
50
+ } catch (e) {
51
+ console.warn(e);
52
+ }
53
+ };
@@ -0,0 +1,72 @@
1
+ const Canvas = require('canvas');
2
+
3
+ const loop = function loop(w, h, callback) {
4
+ let x;
5
+ let y;
6
+
7
+ for (x = 0; x < w; x++) {
8
+ for (y = 0; y < h; y++) {
9
+ callback(x, y);
10
+ }
11
+ }
12
+ };
13
+
14
+ const parseDiff = function (dataDiff) {
15
+ console.log('Start parse diff - prepare data');
16
+ Img = Canvas.Image;
17
+ let image = new Img();
18
+ image.src = dataDiff;
19
+ const width = image.width;
20
+ const height = image.height;
21
+
22
+ const canvas = Canvas.createCanvas(width, height);
23
+ const ctx = canvas.getContext('2d');
24
+ ctx.drawImage(image, 0, 0);
25
+
26
+ const sourceImageData = ctx.getImageData(0, 0, width, height).data;
27
+
28
+ let diffPixCount = 0;
29
+ let allPixCount = 0;
30
+ let positions = [];
31
+ let s = {};
32
+ console.log('Start collect diff pixel positions');
33
+ loop(width, height, async function (horizontalPos, verticalPos) {
34
+ let offset = (verticalPos * width + horizontalPos) * 4;
35
+ let red = sourceImageData[offset];
36
+ let green = sourceImageData[offset + 1];
37
+ let blue = sourceImageData[offset + 2];
38
+ let alpha = sourceImageData[offset + 3];
39
+ if (!s[`${red}, ${green}, ${blue}, ${alpha}`]) {
40
+ s[`${red}, ${green}, ${blue}, ${alpha}`] = 1;
41
+ }
42
+
43
+ s[`${red}, ${green}, ${blue}, ${alpha}`] = s[`${red}, ${green}, ${blue}, ${alpha}`] + 1;
44
+
45
+ if
46
+ (
47
+ ((red === 252) && (green === 0) && (blue === 236)) ||
48
+ ((red === 196) && (green === 0) && (blue === 132)) ||
49
+ ((red === 255) && (green === 0) && (blue === 255))
50
+ ) {
51
+
52
+ diffPixCount++;
53
+ positions.push({
54
+ x: horizontalPos,
55
+ y: verticalPos
56
+ });
57
+ }
58
+
59
+ allPixCount++;
60
+ });
61
+ console.log(s);
62
+ console.log(`'${diffPixCount}' diff pixels positions of '${allPixCount}' was collected`);
63
+ console.log('Start sorting pixel positions by "y"');
64
+ const out = positions.sort((a, b) => (a.y > b.y) ? 1 : -1);
65
+ console.log('End of sorting');
66
+ return out;
67
+ };
68
+
69
+ module.exports = {
70
+ parseDiff,
71
+ loop,
72
+ };
@@ -0,0 +1,9 @@
1
+ {
2
+ "username": "Test",
3
+ "firstName": "Test",
4
+ "lastName": "Admin",
5
+ "role": "admin",
6
+ "password": "7c68c97c24f19fd760234b20fea21a9db0ef982f50d24ae356379193ecb649e1b819810f7d3640c20002b7cabe357be7723cc30be8197a5cad6ecb2712badd07938a3010637dc5c64e91b58adc4b2a20a58ab4c3d67c8a028e19829bdc88b4d6d98a393b75272f5b6d4ab5a4e5a9770957f963f6b53d52b428d8e2de06b6bc51eea4b6a415780f68184dabaf288492200587e78ab7f3769f7073ef1ba047c8038207bce2a5cc9dd69a59805becd3c9dda7a95d7defa3a745fffc3d7a3efa25d2ddb90e85722c91237b5333fe98c3bf106d85516947a3655d05fa0f83da07c6eb0c9b69d27f48f2bf25475c02ab94a777e4850c7c40883f1a7a471c6a928a3bfbf8eba560bf9750e6f270f3001480cc54090ec8685c6dbf6d73cc6ad157646698feb494c275fca2c71dc1f30f3d2c38837491dc327cb0fcceb98d8cb1cba9c509bf49e9c7ad65f5ac0aa515ca96e722ee6ba1da8a610f7c013b330b8ba9fee21942b7827d623eafbf22e5de2505dd72c7e69cc1c3bed8015ae1fe3ea1e7fc65104f0875b78d3bb57d50a267f29933c1fa00424a7e1f9d5f1b913aab317adf488a32d7098fd54825c5c90e813094fbc7bca89c86d72301a22dbfeada0cd98a30cba8f98f56bcb5d8089bd3e93e558179bd7e1f535012e732144a68803d38f1f52a86ade86b1434c4b94b1bb7daffc3fb4b9937b9b3d63cb660cd4332ca91a37a86",
7
+ "apiKey": "12345",
8
+ "salt": "7410d0bd960fba56427745742d1a5cb64cd1ce769f611ed9efec7bca13b56f6b"
9
+ }
@@ -0,0 +1,41 @@
1
+ [
2
+ {
3
+ "PASSWORD_": "Test-123",
4
+ "API_KEY_": "GV640BD-9CG4RDB-NY8WH76-NJB5599",
5
+ "username": "testreviewer@test.com",
6
+ "firstName": "Test",
7
+ "lastName": "Reviewer",
8
+ "role": "reviewer",
9
+ "password": "152046e9cd34cdcd6cea5e66a9ec3fd262f61056b51e4a82d4fe8d6dacaa71fa8419e4b16bc11dfad9d2d90a8b8f4eb79b8e0dc93bededa7d8524521b122392dde0b4e9ca3bccb23b9bade5eb991d78d98246c009e983af42274f9d701c313ef8c47f23fea7701063a19be77f7d31c7cd537ee8f3bc31e861a81cc88bb2f47424e2903d06c99cf053e3be21d191075c92eaee48e1f964ace6357d7f5fea5412e56b26331f9e67354e3f0e0937f826011ddb0058a6c59021c9b7880b5c0ecdbaef1f8491e78288a00ff5ab5fa3e58528794f1bd84f097e8dccc8a8c3a15f760389d9b57f5313c63f68688ad44b53727d1c6e2078824e3c042ccfc6351772737807f46b7e24e30d8c48c1a1a55a3eb0d465d657004e17060afe4b354a4f3946b3dce8c105a2d521cd2c63161af0c039d41c212165c6133fe3b24d8ccdc82045450ce8e189d03ec7bb948bd0ad22140089d6f63352833b56232d7cad498efb65fb609077b6de73beb8e946fe54d7b417cefef0a07e26cbf33a7c58323f414aeaa4b83118e19bffdb3eb6d4f5150f1901b340c16e71c2683d7c6faede630396c4c92ba12485c6c8e00ecb3be785604ce41fdf42315cf02ad7f96eff2b018b415b1550f50756ace62965cadd4080a3e4bd8e3d70042bb3a5f0ba8ab357bfad9290af6a93236f294b3e7547295227b8d5b33cca35393d4b76e750805249b81b2a186aa",
10
+ "apiKey": "9aa20a336f91ea6c9657c3391934227059d4c28d2c7924813176ac4f6633d9c65baee77ca6f34c0d13e574ec285b54fd23c10b26abefec7df981e2884f91a84c",
11
+ "createdDate": "2022-09-19T15:23:09.360+04:00",
12
+ "updatedDate": null,
13
+ "salt": "09067fc22c1b821db81bc83c33f217cd8a54cb8f370d1da4a12d8be867a66b93"
14
+ },
15
+ {
16
+ "PASSWORD_": "Test-123",
17
+ "API_KEY_": "NTSAEXR-CZ1MFWD-KY0Q3MG-HY6SKD1",
18
+ "username": "testuser@test.com",
19
+ "firstName": "Test",
20
+ "lastName": "User",
21
+ "role": "user",
22
+ "password": "60271a5363308e14af295c0ce34818ce32781296d10908f941d8c9589dced5b193f6e1a1962c4e5e718c00974497baa5a3fd6a797bf2cc91e7f76018711c1a7a35809c04fa92b256987f0835601b789609311c862f4c91220741fc30bd79aff25c0b0565834ca16cd313e45fc1b5846f25cabab695680edd739a85b479fbf51c2f860fd427003b10e5bec0b7bf776bfed7b6dbe33a3ca666e69995f4160ddc54e00075b1844807529f0fd8bf650eab71bf6732fd91018cfaedf950d94fd75cfe2b758c3610fb5ab1b863e119073637b33aeaf781e33ed1c73a050f8b8e540761f205d5b19347039599d647a25f1ba7d1422bf3029f9a35b8eb8633db09afd807d18a6ff22d55862e7aa401538eb705fca451fee132324bc05aff3eab10d6031a5e21ff4c6e3a6cb03c32730e1e8b550ebab0ca39942277782b32f9399a14c2876a2a01acecd70f819cce77407b1fee231d5674dd6dc8d9c56a38e9f50e4271e2d9725d830b6f187009726179cb6d1d67c614461bb294003b23f7979f16dbcc71ad9ab9285d7aa4a5550d15915d34ac50dee6fa7f2b90113a3cbf83a92811df0dee1f97c92328273cb8556136219569286666a1bc49c86c9e0e8175cf564168ada14e9f14c174f45789cc68667cecfda6f5d343f79d12ac4c0934f189dab0c8b6c29d01488a8dd0f37dcbba34ec45a9be8c52230189804beecf52603ce22ec95d",
23
+ "apiKey": "c45d0a87c4eea0f6ace90f1f780761f3e4daa9f11b5bc3732cb9014ad269a4bafa73c7ae6af891dd0fcc3e7ecaee40ca6236948ede1a3eb9c84757cd18c06bc3",
24
+ "createdDate": "2022-09-19T15:22:23.631+04:00",
25
+ "updatedDate": null,
26
+ "salt": "c23b0eafe172a9d1fad3651f02ae256a2f6932faac09fd1f4385c1f406c8c83f"
27
+ },
28
+ {
29
+ "PASSWORD_": "Test-123",
30
+ "API_KEY_": "3APH5SM-X9G4T6G-H3ZZNQ2-55G4REB",
31
+ "username": "testadmin@test.com",
32
+ "firstName": "Test",
33
+ "lastName": "Admin",
34
+ "role": "admin",
35
+ "password": "5046e8420581be0c726c1cade6b6e15fe7cb0c34dad070d3a3030ed12d79d7a56b1217916522cd8813f578d8b24571dab848f22e774abb1db70f4fb725249694afa25c3733decd78fa4d5ab875ec0de43cbbe511ea6b059482f721f96d437622374f715ea316e2f03dc40d7217b1951f6022bdff89b17357b24706306ad38115db2aab3f8a609d172f734cabd7ca5eddcaa772d4cca8b6338c86edd639b91e9fdac3b17be22b3c010eac7c9cac128b675b87ec39fa5b8fea0593137df01eca1678d197d4ed536eb209b83c477a7cd62e9e8e06b8459ebefcd267fc38d7705313303d3b038e31996b66e54415494db34544c617f03740feecc3427f7a92ebcc50e10f45f38a01c6ccbc182bf5b5c48b7eb33432f86d14d6972afcdafa5aab2d82a1b49a559c63a5a719e4fbdaa8eaad0c80cb3bec83f16854b4280b13f1976b24b7ca52d18118eec3546038b8e682aa3005f091927f64905122e41f95e9b729afbd833771e1b802dd962bbda3d5ccd0c8966da7cd902db6a3283d1a631195cdc2efa032ddfb69d924ccb3a4808b21b424dee46abc7f07edfbe2c9e9092d1d6f0da828ca98734909ed8d40802f5403d5e9070c356c594b4758759400b263601237192c6de2fd321fa9e480f2261cac7b3cd3ac2b41289a79f90efa17b890d7ff3f391654e62a7bbc557b9dc03824acdbcdb760e8209c74d29d827fc3c75de5468c",
36
+ "apiKey": "db6e323f7f559a62aa8cd3838b1cdd3c95acc0b064bfd21f6810b2aa6c147ae8e45ebbc49f7e720d31f0bd18d71ab05eaeedd343d1f345c35d18fbf685db91cb",
37
+ "createdDate": "2022-09-19T15:19:19.825+04:00",
38
+ "updatedDate": null,
39
+ "salt": "a7e22101f6886dbdf07fc01d92e633d8b323f5d868a6d1214c7f9a12f266a2b2"
40
+ }
41
+ ]