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