From 1abeec25e6be7396af42a49fd2bfe24fd96d75d1 Mon Sep 17 00:00:00 2001 From: "vladyslav.pavlenko" Date: Fri, 29 Mar 2024 15:34:24 +0200 Subject: [PATCH] [CYB-201] [UI][COMPONENT] Fixed Karma Unit tests. * Fixed eslint and remove tslint. --- .../parser-chains-client/.eslintrc.json | 133 +- .../parser-chains-client/package-lock.json | 2969 +++++++---------- .../parser-chains-client/package.json | 10 +- .../src/app/app.component.spec.ts | 2 +- .../src/app/app.module.ts | 2 +- .../chain-add-parser-page.component.spec.ts | 4 +- .../chain-add-parser-page.component.ts | 24 +- .../chain-add-parser-page.effects.spec.ts | 3 +- .../chain-add-parser-page.effects.ts | 19 +- .../chain-list-page.component.spec.ts | 18 +- .../chain-list-page.component.ts | 44 +- .../chain-list-page.effects.spec.ts | 16 +- .../chain-list-page.effects.ts | 40 +- .../app/chain-page/chain-page.component.ts | 71 +- .../app/chain-page/chain-page.effects.spec.ts | 10 +- .../src/app/chain-page/chain-page.effects.ts | 47 +- .../chain-page/chain-page.reducers.spec.ts | 4 +- .../chain-view/chain-view.component.spec.ts | 5 +- .../chain-view/chain-view.component.ts | 6 +- .../multi-input/multi-input.component.spec.ts | 10 +- .../multi-input/multi-input.component.ts | 44 +- .../custom-form/custom-form.component.spec.ts | 17 +- .../custom-form/custom-form.component.ts | 2 +- .../indexing-form/indexing-form.component.ts | 42 +- .../diff-popup/diff-popup.component.ts | 12 +- .../live-view-result.component.ts | 6 +- .../components/live-view/live-view.actions.ts | 2 +- .../live-view/live-view.component.spec.ts | 8 +- .../live-view/live-view.component.ts | 75 +- .../live-view/live-view.effects.spec.ts | 34 +- .../components/live-view/live-view.effects.ts | 44 +- .../live-view/models/live-view.model.ts | 6 +- .../parser-by-parser.component.html | 8 +- .../parser-by-parser.component.spec.ts | 4 +- .../parser-by-parser.component.ts | 87 +- .../sample-data-form.component.spec.ts | 4 +- .../sample-data-form.component.ts | 2 +- .../sample-data-text-folder-input.actions.ts | 3 +- ...mple-data-text-folder-input.component.html | 2 +- ...e-data-text-folder-input.component.spec.ts | 3 - ...sample-data-text-folder-input.component.ts | 302 +- .../sample-data-text-folder-input.effects.ts | 46 +- .../sample-data-text-folder-input.reducers.ts | 18 +- .../sample-edit-popup.component.spec.ts | 1 - .../sample-edit-popup.component.ts | 105 +- .../sample-data-text-input.component.spec.ts | 2 +- .../sample-data-text-input.component.ts | 8 +- .../services/live-view.service.spec.ts | 2 +- .../live-view/services/live-view.service.ts | 10 +- .../sample-data-text-folder-input.service.ts | 26 +- .../stack-trace/stack-trace.component.spec.ts | 6 +- .../text-diff-view.component.spec.ts | 1 - .../parser-composer.component.spec.ts | 30 +- .../parser-composer.component.ts | 14 +- .../advanced-editor.component.ts | 6 +- .../components/parser/parser.component.ts | 69 +- .../components/route/route.component.spec.ts | 14 +- .../components/route/route.component.ts | 14 +- .../json-editor-popup.component.spec.ts | 2 - .../json-editor-popup.component.ts | 2 +- .../src/app/misc/autofocus.directive.ts | 4 +- .../services/chain-add-parser-page.service.ts | 10 +- .../services/chain-list-page.service.spec.ts | 1 + .../app/services/chain-list-page.service.ts | 10 +- .../src/app/services/chain-page.service.ts | 33 +- .../services/monaco-editor.service.spec.ts | 6 +- .../src/app/services/monaco-editor.service.ts | 17 +- .../multibutton/multi-button.component.ts | 4 +- .../src/app/shared/utils.ts | 17 +- .../frontend/parser-chains-client/tslint.json | 1 - 70 files changed, 1983 insertions(+), 2640 deletions(-) diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/.eslintrc.json b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/.eslintrc.json index 9cbedd790..ec6a0b6b4 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/.eslintrc.json +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/.eslintrc.json @@ -3,11 +3,44 @@ "ignorePatterns": [ "projects/**/*" ], + "rules": { + "valid-jsdoc" : "off" + }, "overrides": [ + { + + "files": ["*.actions.ts"], + "parserOptions": { + "project": [ + "tsconfig.json", + "e2e/tsconfig.json" + ], + "createDefaultProgram": true + }, + "extends": [ + "plugin:@angular-eslint/ng-cli-compat", + "plugin:@angular-eslint/recommended", + "plugin:@angular-eslint/template/process-inline-templates" + ], + "rules": { + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "class", + "format": ["PascalCase"], + "custom": { + "regex": "Action$", + "match": true + } + } + ] + } + }, { "files": [ "*.ts" ], + "excludedFiles": ["*.actions.ts", "*.spec.ts"], "parserOptions": { "project": [ "tsconfig.json", @@ -16,10 +49,60 @@ "createDefaultProgram": true }, "extends": [ + "plugin:@angular-eslint/ng-cli-compat", "plugin:@angular-eslint/recommended", "plugin:@angular-eslint/template/process-inline-templates" ], "rules": { + "jsdoc/check-alignment": "off", + "jsdoc/check-param-names": "off", + "@typescript-eslint/adjacent-overload-signatures": "off", + "jsdoc/newline-after-description": "off", + "eslint-plugin/require-meta-fixable": "off", + "prefer-arrow/prefer-arrow-functions": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/prefer-enum-initializers": "off", + "indent": "off", + "simple-import-sort/imports": "off", + "array-bracket-spacing": "off", + "no-underscore-dangle": "off", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "enumMember", + "format": ["UPPER_CASE"] + }, + { + "selector": "classProperty", + "modifiers": ["static"], + "format": ["UPPER_CASE"] + }, + { + "selector": "variable", + "format": ["camelCase", "UPPER_CASE", "PascalCase"], + "leadingUnderscore": "allow", + "trailingUnderscore": "allow" + }, + { + "selector": "function", + "format": ["camelCase", "PascalCase"] + }, + { + "selector": "typeLike", + "format": ["PascalCase"] + }, + { + "selector": "memberLike", + "format": ["camelCase"], + "leadingUnderscore": "forbid" + }, + { + "selector": "memberLike", + "modifiers": ["private"], + "format": ["camelCase"], + "leadingUnderscore": "require" + } + ], "@angular-eslint/component-selector": [ "error", { @@ -36,7 +119,7 @@ "type": "attribute" } ], - "@angular-eslint/no-empty-lifecycle-method": "off" + "@angular-eslint/no-empty-lifecycle-method": "error" } }, { @@ -46,7 +129,53 @@ "extends": [ "plugin:@angular-eslint/template/recommended" ], - "rules": {} + "rules": { + "@angular-eslint/template/no-negated-async": "warn", + "@angular-eslint/template/eqeqeq": "off" + } + }, + { + "files": [ + "*.spec.ts" + ], + "parserOptions": { + "project": [ + "tsconfig.json", + "e2e/tsconfig.json" + ], + "createDefaultProgram": true + }, + "plugins": [ + "jasmine" + ], + "extends": [ + "plugin:jasmine/recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "simple-import-sort/imports": "off", + "jasmine/new-line-before-expect": "off", + "@typescript-eslint/naming-convention": "off", + "jasmine/no-unsafe-spy": "off", + "no-restricted-globals": [ + "error", + "event" + ], + "@typescript-eslint/no-shadow": "warn", + "no-underscore-dangle": "off", + "no-useless-escape": "off", + "@angular-eslint/prefer-on-push-component-change-detection": "off", + "jasmine/prefer-toHaveBeenCalledWith": "off", + "jasmine/no-spec-dupes": [ + "error", + "branch" + ], + "jasmine/no-suite-dupes": [ + "error", + "branch" + ], + "jasmine/no-global-setup": "off" + } } ] } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package-lock.json b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package-lock.json index bd1381687..d4a24bf8a 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package-lock.json +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package-lock.json @@ -27,7 +27,6 @@ "@ngrx/store-devtools": "^14.3.3", "@types/uuid": "^8.3.4", "compression": "^1.7.4", - "core-js": "^2.5.4", "csvtojson": "^2.0.10", "debounce": "^1.2.0", "express": "^4.17.1", @@ -40,7 +39,6 @@ "ngx-monaco-editor-v2": "^14.0.0", "rxjs": "~6.5.3", "tslib": "^1.9.0", - "uuid": "^3.4.0", "zone.js": "^0.11.8" }, "devDependencies": { @@ -60,6 +58,10 @@ "@typescript-eslint/parser": "5.27.1", "dotenv": "^8.2.0", "eslint": "^8.17.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-jasmine": "^4.1.3", + "eslint-plugin-jsdoc": "^40.3.0", + "eslint-plugin-prefer-arrow": "^1.2.3", "husky": "^2.3.0", "jasmine-core": "^4.3.0", "jasmine-spec-reporter": "^7.0.0", @@ -70,10 +72,8 @@ "karma-jasmine-html-reporter": "^2.0.0", "karma-spec-reporter": "^0.0.36", "ng-mocks": "^14.12.1", - "protractor": "^7.0.0", "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~4.8.2" + "typescript": "~4.7.4" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -530,15 +530,6 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@angular/common": { "version": "14.3.0", "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.3.0.tgz", @@ -2929,6 +2920,20 @@ "node": ">=10.0.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.37.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz", + "integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==", + "dev": true, + "dependencies": { + "comment-parser": "1.3.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20" + } + }, "node_modules/@esbuild/linux-loong64": { "version": "0.15.5", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", @@ -3248,9 +3253,9 @@ } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@ngrx/data": { @@ -3693,6 +3698,12 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/mime": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", @@ -3728,16 +3739,10 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, - "node_modules/@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", - "dev": true - }, "node_modules/@types/qs": { - "version": "6.9.13", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.13.tgz", - "integrity": "sha512-iLR+1vTTJ3p0QaOUq6ACbY1mzKTODFDT/XedZI8BksOotFmL4ForwDfRQ/DZeuTHR7/2i4lI1D203gdfxuqTlA==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", "dev": true }, "node_modules/@types/range-parser": { @@ -3752,12 +3757,6 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/selenium-webdriver": { - "version": "3.0.26", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.26.tgz", - "integrity": "sha512-dyIGFKXfUFiwkMfNGn1+F6b80ZjR3uSYv1j6xVJSDlft5waZ2cwkHW4e7zNzvq7hiEackcgvBpmnXZrI1GltPg==", - "dev": true - }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -4481,15 +4480,6 @@ "node": ">=8.9.0" } }, - "node_modules/adm-zip": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.12.tgz", - "integrity": "sha512-6TVU49mK6KZb4qG6xWaaM4C7sA/sgUMLy/JYMOzkcp3BvVLpW0fXDFQiIzAuxFCt/2+xD7fNIiPFAoLZPhVNLQ==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -4706,6 +4696,26 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -4715,52 +4725,88 @@ "node": ">=8" } }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { - "safer-buffer": "~2.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, "engines": { - "node": ">=0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -4778,7 +4824,7 @@ ], "dependencies": { "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -4809,21 +4855,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, "node_modules/axobject-query": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", @@ -4971,15 +5002,6 @@ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5012,21 +5034,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/blocking-proxy": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", - "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "blocking-proxy": "built/lib/bin.js" - }, - "engines": { - "node": ">=6.9.x" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -5144,49 +5151,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserstack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", - "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^2.2.1" - } - }, - "node_modules/browserstack/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/browserstack/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/browserstack/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/buffer": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", @@ -5217,15 +5181,6 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/builtins": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", @@ -5351,9 +5306,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001599", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", - "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true, "funding": [ { @@ -5370,12 +5325,6 @@ } ] }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5559,24 +5508,21 @@ "node": ">=0.1.90" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/comment-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", + "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "dev": true, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -5759,9 +5705,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -5878,13 +5824,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/core-js": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", - "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", - "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", - "hasInstallScript": true - }, "node_modules/core-js-compat": { "version": "3.36.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", @@ -5899,9 +5838,9 @@ } }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "node_modules/cors": { @@ -6213,16 +6152,55 @@ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", "dev": true }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/date-fns": { @@ -6287,15 +6265,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -6464,146 +6433,36 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", - "dev": true, - "dependencies": { - "globby": "^5.0.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/del/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 0.6.0" } }, - "node_modules/del/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/del/node_modules/globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/del/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detect-node": { @@ -6739,31 +6598,15 @@ "node": ">=10" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ecc-jsbn/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.711", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", - "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==", + "version": "1.4.721", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.721.tgz", + "integrity": "sha512-k1x2r6foI8iJOp+1qTxbbrrWMsOiHkzGBYwYigaq+apO1FSqtn44KTo3Sy69qt7CRr7149zTcsDvH7MUKsOuIQ==", "dev": true }, "node_modules/emoji-regex": { @@ -6925,6 +6768,66 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.2.tgz", + "integrity": "sha512-60s3Xv2T2p1ICykc7c+DNDPLDMm9t4QxCOUU0K9JxiLjM3C1zB9YVdN7tjxrFd4+AkZ8CdX1ovUga4P2+1e+/w==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -6970,19 +6873,56 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "dependencies": { - "es6-promise": "^4.0.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/esbuild": { @@ -7432,99 +7372,101 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "ms": "^2.1.1" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/eslint/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "ms": "^2.1.1" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=8" + "node": ">=4" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, - "node_modules/eslint/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/eslint/node_modules/brace-expansion": { + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", @@ -7534,36 +7476,232 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=7.0.0" + "node": "*" } }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jasmine": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.3.tgz", + "integrity": "sha512-q8j8KnLH/4uwmPELFZvEyfEcuCuGxXScJaRdqHjOjz064GcfX6aoFbzy5VohZ5QYk2+WvoqMoqDSb9nRLf89GQ==", + "dev": true, + "engines": { + "node": ">=8", + "npm": ">=6" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "40.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-40.3.0.tgz", + "integrity": "sha512-EhCqpzRkxoT2DUB4AnrU0ggBYvTh3bWrLZzQTupq6vSVE6XzNwJVKsOHa41GCoevnsWMBNmoDVjXWGqckjuG1g==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "~0.37.0", + "comment-parser": "1.3.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "semver": "^7.3.8", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": "^14 || ^16 || ^17 || ^18 || ^19" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-prefer-arrow": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz", + "integrity": "sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ==", + "dev": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true @@ -7916,15 +8054,6 @@ "which": "bin/which" } }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -7932,16 +8061,16 @@ "dev": true }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -8036,15 +8165,6 @@ "node": ">=0.6.0" } }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -8251,29 +8371,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -8363,6 +8460,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", @@ -8463,13 +8578,21 @@ "node": ">=6" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "assert-plus": "^1.0.0" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/glob": { @@ -8518,6 +8641,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8567,99 +8705,33 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { @@ -8893,21 +8965,6 @@ "node": ">=8.0.0" } }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -9087,12 +9144,6 @@ "node": ">=0.10.0" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, "node_modules/immer": { "version": "9.0.21", "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", @@ -9447,6 +9498,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -9541,6 +9607,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9564,39 +9642,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-in-cwd/node_modules/is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -9711,11 +9756,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -9746,6 +9800,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakset": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", @@ -9813,12 +9879,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", @@ -10035,20 +10095,6 @@ "node": ">=8" } }, - "node_modules/jasmine": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", - "integrity": "sha512-KbdGQTf5jbZgltoHs31XGiChAPumMSY64OZMWLNYnEnMfG5uwGBhffePwuskexjT+/Jea/gU3qAU8344hNohSw==", - "dev": true, - "dependencies": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.8.0" - }, - "bin": { - "jasmine": "bin/jasmine.js" - } - }, "node_modules/jasmine-core": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", @@ -10064,63 +10110,6 @@ "colors": "1.4.0" } }, - "node_modules/jasmine/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jasmine/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jasmine/node_modules/jasmine-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", - "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", - "dev": true - }, - "node_modules/jasmine/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jasminewd2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", - "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", - "dev": true, - "engines": { - "node": ">= 6.9.x" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -10184,6 +10173,15 @@ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", "dev": true }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "dev": true, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -10214,12 +10212,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -10232,12 +10224,6 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10274,63 +10260,6 @@ "node >= 0.2.0" ] }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dev": true, - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/karma": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", @@ -10731,15 +10660,6 @@ } } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -11769,15 +11689,6 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -11838,13 +11749,62 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true - }, - "node_modules/on-finished": { + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", @@ -12258,12 +12218,6 @@ "node": ">=0.10.0" } }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -12293,12 +12247,6 @@ "node": ">=8" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -12325,27 +12273,6 @@ "node": ">=0.10.0" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/piscina": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", @@ -13156,479 +13083,176 @@ "node": ">=10" } }, - "node_modules/protractor": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", - "integrity": "sha512-UqkFjivi4GcvUQYzqGYNe0mLzfn5jiLmO8w9nMhQoJRLhy2grJonpga2IWhI6yJO30LibWXJJtA4MOIZD2GgZw==", - "deprecated": "We have news to share - Protractor is deprecated and will reach end-of-life by Summer 2023. To learn more and find out about other options please refer to this post on the Angular blog. Thank you for using and contributing to Protractor. https://goo.gle/state-of-e2e-in-angular", - "dev": true, - "dependencies": { - "@types/q": "^0.0.32", - "@types/selenium-webdriver": "^3.0.0", - "blocking-proxy": "^1.0.0", - "browserstack": "^1.5.1", - "chalk": "^1.1.3", - "glob": "^7.0.3", - "jasmine": "2.8.0", - "jasminewd2": "^2.1.0", - "q": "1.4.1", - "saucelabs": "^1.5.0", - "selenium-webdriver": "3.6.0", - "source-map-support": "~0.4.0", - "webdriver-js-extender": "2.1.0", - "webdriver-manager": "^12.1.7", - "yargs": "^15.3.1" - }, - "bin": { - "protractor": "bin/protractor", - "webdriver-manager": "bin/webdriver-manager" + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10.13.x" - } - }, - "node_modules/protractor/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": ">= 0.10" } }, - "node_modules/protractor/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "optional": true }, - "node_modules/protractor/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "node_modules/protractor/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/protractor/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "node": ">=6" } }, - "node_modules/protractor/node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=0.9" } }, - "node_modules/protractor/node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "ansi-regex": "^5.0.1" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/protractor/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "safe-buffer": "^5.1.0" } }, - "node_modules/protractor/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/protractor/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.8" } }, - "node_modules/protractor/node_modules/minimatch": { + "node_modules/raw-body/node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": "*" + "node": ">= 0.8" } }, - "node_modules/protractor/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", "dev": true, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "pify": "^2.3.0" } }, - "node_modules/protractor/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "node_modules/read-package-json": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", "dev": true, "dependencies": { - "source-map": "^0.5.6" + "glob": "^8.0.1", + "json-parse-even-better-errors": "^2.3.1", + "normalize-package-data": "^4.0.0", + "npm-normalize-package-bin": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/protractor/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "dependencies": { - "ansi-regex": "^2.0.0" + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/protractor/node_modules/supports-color": { + "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/protractor/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/protractor/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/protractor/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/protractor/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", - "dev": true, - "optional": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", - "dev": true, - "engines": { - "node": ">=0.9" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", - "dev": true, - "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "dependencies": { "@types/normalize-package-data": "^2.4.0", @@ -13833,47 +13457,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -13892,12 +13475,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -14118,11 +13695,46 @@ "npm": ">=2.0.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -14183,57 +13795,12 @@ } } }, - "node_modules/saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^2.2.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/saucelabs/node_modules/agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "dev": true, - "dependencies": { - "es6-promisify": "^5.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/saucelabs/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/saucelabs/node_modules/https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "dev": true, - "dependencies": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/sax": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", - "dev": true + "dev": true, + "optional": true }, "node_modules/schema-utils": { "version": "2.7.1", @@ -14290,87 +13857,6 @@ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, - "node_modules/selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, - "dependencies": { - "jszip": "^3.1.3", - "rimraf": "^2.5.4", - "tmp": "0.0.30", - "xml2js": "^0.4.17" - }, - "engines": { - "node": ">= 6.9.0" - } - }, - "node_modules/selenium-webdriver/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/selenium-webdriver/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/selenium-webdriver/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/selenium-webdriver/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/selenium-webdriver/node_modules/tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/selfsigned": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", @@ -14613,12 +14099,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -14751,15 +14231,6 @@ "websocket-driver": "^0.7.4" } }, - "node_modules/sockjs/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/socks": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", @@ -14933,37 +14404,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, "node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", @@ -15053,6 +14493,55 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -15241,9 +14730,9 @@ } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -15374,9 +14863,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.29.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", - "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.0.tgz", + "integrity": "sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -15505,19 +14994,6 @@ "node": ">=0.6" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -15534,131 +15010,58 @@ "dev": true, "dependencies": { "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - }, - "bin": { - "ts-node": "dist/bin.js" - }, - "engines": { - "node": ">=4.2.0" - }, - "peerDependencies": { - "typescript": ">=2.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", - "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^4.0.1", - "glob": "^7.1.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.3", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.13.0", - "tsutils": "^2.29.0" - }, - "bin": { - "tslint": "bin/tslint" - }, - "engines": { - "node": ">=4.8.0" - }, - "peerDependencies": { - "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev" - } - }, - "node_modules/tslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/tslint/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "bin": { + "ts-node": "dist/bin.js" }, "engines": { - "node": "*" + "node": ">=4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "typescript": ">=2.0" } }, - "node_modules/tslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { - "minimist": "^1.2.6" + "minimist": "^1.2.0" }, "bin": { - "mkdirp": "bin/cmd.js" + "json5": "lib/cli.js" } }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=4" } }, - "node_modules/tslint/node_modules/tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "peerDependencies": { - "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev" - } + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -15675,24 +15078,6 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -15729,6 +15114,79 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-assert": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", @@ -15736,9 +15194,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -15771,6 +15229,21 @@ "node": "*" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -15905,12 +15378,12 @@ } }, "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, "bin": { - "uuid": "bin/uuid" + "uuid": "dist/bin/uuid" } }, "node_modules/validate-npm-package-license": { @@ -15943,20 +15416,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -15997,168 +15456,6 @@ "defaults": "^1.0.3" } }, - "node_modules/webdriver-js-extender": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", - "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", - "dev": true, - "dependencies": { - "@types/selenium-webdriver": "^3.0.0", - "selenium-webdriver": "^3.0.1" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager": { - "version": "12.1.9", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", - "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", - "dev": true, - "dependencies": { - "adm-zip": "^0.5.2", - "chalk": "^1.1.1", - "del": "^2.2.0", - "glob": "^7.0.3", - "ini": "^1.3.4", - "minimist": "^1.2.0", - "q": "^1.4.1", - "request": "^2.87.0", - "rimraf": "^2.5.2", - "semver": "^5.3.0", - "xml2js": "^0.4.17" - }, - "bin": { - "webdriver-manager": "bin/webdriver-manager" - }, - "engines": { - "node": ">=6.9.x" - } - }, - "node_modules/webdriver-manager/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/webdriver-manager/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/webdriver-manager/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/webdriver-manager/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/webdriver-manager/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/webdriver-manager/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/webdriver-manager/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webdriver-manager/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/webpack": { "version": "5.76.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", @@ -16541,12 +15838,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, "node_modules/which-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", @@ -16658,28 +15949,6 @@ } } }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package.json b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package.json index 6ec0a876d..9f98b8a49 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package.json +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/package.json @@ -35,7 +35,6 @@ "@ngrx/store-devtools": "^14.3.3", "@types/uuid": "^8.3.4", "compression": "^1.7.4", - "core-js": "^2.5.4", "csvtojson": "^2.0.10", "debounce": "^1.2.0", "express": "^4.17.1", @@ -48,7 +47,6 @@ "ngx-monaco-editor-v2": "^14.0.0", "rxjs": "~6.5.3", "tslib": "^1.9.0", - "uuid": "^3.4.0", "zone.js": "^0.11.8" }, "devDependencies": { @@ -68,6 +66,10 @@ "@typescript-eslint/parser": "5.27.1", "dotenv": "^8.2.0", "eslint": "^8.17.0", + "eslint-plugin-jasmine": "^4.1.3", + "eslint-plugin-jsdoc": "^40.3.0", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-prefer-arrow": "^1.2.3", "husky": "^2.3.0", "jasmine-core": "^4.3.0", "jasmine-spec-reporter": "^7.0.0", @@ -78,10 +80,8 @@ "karma-jasmine-html-reporter": "^2.0.0", "karma-spec-reporter": "^0.0.36", "ng-mocks": "^14.12.1", - "protractor": "^7.0.0", "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~4.8.2" + "typescript": "~4.7.4" }, "husky": { "hooks": { diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.component.spec.ts index 8f58d1652..81e027eb8 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.component.spec.ts @@ -10,7 +10,7 @@ * limitations governing your use of the file. */ -import {async, TestBed, waitForAsync} from '@angular/core/testing'; +import {TestBed, waitForAsync} from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; import { NzModalModule } from 'ng-zorro-antd/modal'; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.module.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.module.ts index 9f6e4349f..5fa06bd64 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.module.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/app.module.ts @@ -47,7 +47,7 @@ import {MonacoEditorModule} from "ngx-monaco-editor-v2"; registerLocaleData(en); -export const metaReducers: MetaReducer<{}>[] = !environment.production +export const metaReducers: MetaReducer[] = !environment.production ? [storeFreeze] : []; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.spec.ts index 3b2f08c7e..a475c2f90 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.spec.ts @@ -21,14 +21,14 @@ import {NzModalModule} from 'ng-zorro-antd/modal'; import {of} from 'rxjs'; import {ChainAddParserPageComponent} from './chain-add-parser-page.component'; -import {AddParserPageState, getParserTypes, initialState} from './chain-add-parser-page.reducers'; +import {AddParserPageState, getParserTypes} from './chain-add-parser-page.reducers'; import {NzCardModule} from "ng-zorro-antd/card"; import {NzFormModule} from "ng-zorro-antd/form"; import {CommonModule} from "@angular/common"; import {NzSelectModule} from "ng-zorro-antd/select"; import {getChain} from "../chain-page/chain-page.reducers"; import * as fromActions from "./chain-add-parser-page.actions"; -import {setFieldValue} from "../shared/test/test-helper"; +import {setFieldValue} from "src/app/shared/test/test-helper"; import {NzIconTestModule} from "ng-zorro-antd/icon/testing"; import {By} from "@angular/platform-browser"; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.ts index 88667693d..866c4ac3e 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.component.ts @@ -39,10 +39,10 @@ export class ChainAddParserPageComponent implements OnInit, OnDestroy { getParserTypesSubscription: Subscription; constructor( - private fb: UntypedFormBuilder, - private store: Store, - private activatedRoute: ActivatedRoute, - private router: Router + private _fb: UntypedFormBuilder, + private _store: Store, + private _activatedRoute: ActivatedRoute, + private _router: Router ) {} get name() { @@ -64,36 +64,36 @@ export class ChainAddParserPageComponent implements OnInit, OnDestroy { if (this.addParserForm.value.type === 'Router') { parser.routing = {}; } - this.store.dispatch(new fromActions.AddParserAction({ + this._store.dispatch(new fromActions.AddParserAction({ chainId: this.subchainId || this.chainId, parser })); - this.router.navigateByUrl(`/parserconfig/chains/${this.chainId}`); + this._router.navigateByUrl(`/parserconfig/chains/${this.chainId}`); } ngOnInit() { - this.addParserForm = this.fb.group({ + this.addParserForm = this._fb.group({ name: new UntypedFormControl('', [Validators.required, Validators.minLength(3)]), type: new UntypedFormControl(null) }); - this.activatedRoute.params.subscribe((params) => { + this._activatedRoute.params.subscribe((params) => { this.chainId = params.id; this.subchainId = params.subchain; }); - this.getChainSubscription = this.store.pipe(select(getChain({ id: this.chainId }))).subscribe((chain: ParserChainModel) => { + this.getChainSubscription = this._store.pipe(select(getChain({ id: this.chainId }))).subscribe((chain: ParserChainModel) => { if (!chain) { - this.store.dispatch(new fromParserPageAction.LoadChainDetailsAction({ + this._store.dispatch(new fromParserPageAction.LoadChainDetailsAction({ id: this.chainId })); } }); - this.store.dispatch(new fromActions.GetParserTypesAction()); + this._store.dispatch(new fromActions.GetParserTypesAction()); - this.getParserTypesSubscription = this.store.pipe(select(getParserTypes)).subscribe((parserTypes) => { + this.getParserTypesSubscription = this._store.pipe(select(getParserTypes)).subscribe((parserTypes) => { if (parserTypes !== undefined) { this.typesList = [...parserTypes]; this.typesList.sort((a, b) => a.name.toUpperCase() < b.name.toUpperCase() ? -1 : 1); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.spec.ts index 85ee24b8a..e6d1b29f9 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.spec.ts @@ -22,10 +22,11 @@ import * as fromActions from './chain-add-parser-page.actions'; import {AddParserEffects} from './chain-add-parser-page.effects'; import {NzMessageService} from "ng-zorro-antd/message"; import {GetParserTypesFailAction} from "./chain-add-parser-page.actions"; +import {Action} from "@ngrx/store"; describe('chain add parser page: effects', () => { let effects: AddParserEffects; - let actions: ReplaySubject; + let actions: ReplaySubject; let service: jasmine.SpyObj; let messageService: jasmine.SpyObj; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.ts index 3542e257e..986ccc6e6 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-add-parser-page/chain-add-parser-page.effects.ts @@ -23,26 +23,25 @@ import * as fromActions from './chain-add-parser-page.actions'; @Injectable() export class AddParserEffects { - constructor( - private actions$: Actions, - private messageService: NzMessageService, - private addParserService: AddParserPageService, - ) { - } - - getParserTypes$: Observable = createEffect(() => this.actions$.pipe( + getParserTypes$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.GET_PARSER_TYPES), switchMap(() => { - return this.addParserService.getParserTypes() + return this._addParserService.getParserTypes() .pipe( map((parserTypes: { id: string, name: string }[]) => { return new fromActions.GetParserTypesSuccessAction(parserTypes); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.GetParserTypesFailAction({message: error.message})); }) ); }) )); + constructor( + private _actions$: Actions, + private _messageService: NzMessageService, + private _addParserService: AddParserPageService, + ) { + } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.spec.ts index 2cbe8d953..a535833eb 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.spec.ts @@ -17,7 +17,7 @@ import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {RouterTestingModule} from '@angular/router/testing'; import {IconDefinition} from '@ant-design/icons-angular'; import {DeleteFill, PlusOutline, RightSquareFill} from '@ant-design/icons-angular/icons'; -import {Store} from '@ngrx/store'; +import {Action, Store} from '@ngrx/store'; import {MockStore, provideMockStore} from '@ngrx/store/testing'; import {NzModalModule} from 'ng-zorro-antd/modal'; import {NzIconModule} from 'ng-zorro-antd/icon' @@ -66,7 +66,7 @@ class FakeChainListPageService { describe('ChainListPageComponent', () => { let component: ChainListPageComponent; let fixture: ComponentFixture; - let actions: ReplaySubject; + let actions: ReplaySubject; let store: MockStore<{ 'chain-list-page': { loading: boolean; @@ -119,7 +119,7 @@ describe('ChainListPageComponent', () => { providers: [ provideMockActions(() => actions), provideMockStore({ - initialState: initialState, + initialState, selectors: [ {selector: getDeleteModalVisible, value: false}, {selector: getDeleteChain, value: null}, @@ -136,7 +136,15 @@ describe('ChainListPageComponent', () => { })); beforeEach(() => { - store = TestBed.inject(Store) as MockStore; + store = TestBed.inject(Store) as MockStore<{ + 'chain-list-page': { + loading: boolean; + error: string; + items: ChainModel[]; + createModalVisible: boolean; + deleteModalVisible: boolean; + } + }>; fixture = TestBed.createComponent(ChainListPageComponent); component = fixture.componentInstance; fixture.detectChanges(); @@ -211,7 +219,7 @@ describe('ChainListPageComponent', () => { store.refreshState(); fixture.detectChanges(); - let modalWindow = document.querySelector('.ant-modal'); + const modalWindow = document.querySelector('.ant-modal'); expect(modalWindow).toBeNull(); expect(isVisible).toBe(false); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.ts index 2c5226792..d2f601453 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.component.ts @@ -12,7 +12,6 @@ import {Component, OnInit} from '@angular/core'; import {UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators} from '@angular/forms'; -import {ActivatedRoute} from '@angular/router'; import {select, Store} from '@ngrx/store'; import {BehaviorSubject, combineLatest, Observable, of} from 'rxjs'; import {switchMap, take} from 'rxjs/operators'; @@ -22,7 +21,8 @@ import {LoadChainsAction} from './chain-list-page.actions'; import { ChainListPageState, getChains, - getCreateModalVisible, getDeleteChain, + getCreateModalVisible, + getDeleteChain, getDeleteModalVisible, getLoading, } from './chain-list-page.reducers'; @@ -40,23 +40,21 @@ export class ChainListPageComponent implements OnInit { chains$: Observable; isChainDeleteModalVisible$: Observable; deleteChainItem$: Observable; - totalRecords = 200; chainDataSorted$: Observable; sortDescription$: BehaviorSubject<{ key: string, value: string }> = new BehaviorSubject({key: 'name', value: ''}); newChainForm: UntypedFormGroup; constructor( - private store: Store, - private fb: UntypedFormBuilder, - private route: ActivatedRoute, - private messageService: NzMessageService, + private _store: Store, + private _fb: UntypedFormBuilder, + private _messageService: NzMessageService, ) { - store.dispatch(new LoadChainsAction()); - this.chains$ = store.pipe(select(getChains)); - this.isOkLoading$ = store.pipe(select(getLoading)); - this.isChainCreateModalVisible$ = store.pipe(select(getCreateModalVisible)); - this.isChainDeleteModalVisible$ = store.pipe(select(getDeleteModalVisible)); - this.deleteChainItem$ = this.store.pipe(select(getDeleteChain)); + _store.dispatch(new LoadChainsAction()); + this.chains$ = _store.pipe(select(getChains)); + this.isOkLoading$ = _store.pipe(select(getLoading)); + this.isChainCreateModalVisible$ = _store.pipe(select(getCreateModalVisible)); + this.isChainDeleteModalVisible$ = _store.pipe(select(getDeleteModalVisible)); + this.deleteChainItem$ = this._store.pipe(select(getDeleteChain)); this.chainDataSorted$ = combineLatest([ this.chains$, @@ -71,39 +69,39 @@ export class ChainListPageComponent implements OnInit { } showAddChainModal(): void { - this.store.dispatch(new fromActions.ShowCreateModalAction()); + this._store.dispatch(new fromActions.ShowCreateModalAction()); } showDeleteModal(id): void { - this.store.dispatch(new fromActions.SelectDeleteChainAction(id)); + this._store.dispatch(new fromActions.SelectDeleteChainAction(id)); } pushChain(): void { - let chainName = this.chainName.value; + const chainName = this.chainName.value; this.chains$.pipe(take(1)).subscribe(chainArr => { const duplicate = chainArr.some(value => { - return value.name == chainName; + return value.name === chainName; }); if (!duplicate) { const chainData: ChainOperationalModel = {name: chainName}; this.newChainForm.reset(); - this.store.dispatch(new fromActions.CreateChainAction(chainData)); + this._store.dispatch(new fromActions.CreateChainAction(chainData)); } else { - this.messageService.create('Error', "Duplicate chain names aren't allowed!"); + this._messageService.create('Error', "Duplicate chain names aren't allowed!"); } }) } deleteChain(chainId: string, chainName): void { - this.store.dispatch(new fromActions.DeleteChainAction(chainId, chainName)); + this._store.dispatch(new fromActions.DeleteChainAction(chainId, chainName)); } handleCancelChainModal(): void { - this.store.dispatch(new fromActions.HideCreateModalAction()); + this._store.dispatch(new fromActions.HideCreateModalAction()); } handleCancelDeleteModal(): void { - this.store.dispatch(new fromActions.HideDeleteModalAction()); + this._store.dispatch(new fromActions.HideDeleteModalAction()); } sortTable(data: ChainModel[], sortDescription: any): Observable { @@ -123,7 +121,7 @@ export class ChainListPageComponent implements OnInit { } ngOnInit() { - this.newChainForm = this.fb.group({ + this.newChainForm = this._fb.group({ chainName: new UntypedFormControl('', [Validators.required, Validators.minLength(3)]), }); } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.spec.ts index 67911aaf2..0672b4748 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.spec.ts @@ -13,8 +13,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import {TestBed, waitForAsync} from '@angular/core/testing'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { IconDefinition } from '@ant-design/icons-angular'; -import { PlusCircleOutline } from '@ant-design/icons-angular/icons'; import { provideMockActions } from '@ngrx/effects/testing'; import { NzModalModule, } from 'ng-zorro-antd/modal'; import { NzMessageService } from 'ng-zorro-antd/message'; @@ -24,19 +22,11 @@ import { ChainListPageService } from '../services/chain-list-page.service'; import * as fromActions from './chain-list-page.actions'; import { ChainListEffects } from './chain-list-page.effects'; import { ChainModel } from './chain.model'; -export class MockChainListPageService { - deleteChain(id: string) { - return of({}); - } - createChain(name: string) { - return of({}); - } -} -const icons: IconDefinition[] = [PlusCircleOutline]; +import {Action} from "@ngrx/store"; describe('ChainListPage: effects', () => { let effects: ChainListEffects; - let actions: ReplaySubject; + let actions: ReplaySubject; let service: ChainListPageService; let msgService: NzMessageService; @@ -50,7 +40,7 @@ describe('ChainListPage: effects', () => { providers: [ ChainListEffects, provideMockActions(() => actions), - { provide: ChainListPageService, useClass: MockChainListPageService }, + { provide: ChainListPageService, useValue: jasmine.createSpyObj('ChainListPageService', ["createChain", "deleteChain", "getChains"]) }, NzMessageService ] }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.ts index f1d2e8b54..0022a5421 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-list-page/chain-list-page.effects.ts @@ -23,54 +23,48 @@ import {ChainModel} from './chain.model'; @Injectable() export class ChainListEffects { - constructor( - private actions$: Actions, - private messageService: NzMessageService, - private chainListService: ChainListPageService - ) { - } - loadChains$: Observable = createEffect(() => this.actions$.pipe( + loadChains$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.LOAD_CHAINS), switchMap((action: fromActions.LoadChainsAction) => { - return this.chainListService.getChains() + return this._chainListService.getChains() .pipe( map((chains: ChainModel[]) => { return new fromActions.LoadChainsSuccessAction(chains); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.LoadChainsFailAction(error)); }) ); }) )); - createChain$: Observable = createEffect(() => this.actions$.pipe( + createChain$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.CREATE_CHAIN), switchMap((action: fromActions.CreateChainAction) => { - return this.chainListService.createChain(action.newChain) + return this._chainListService.createChain(action.newChain) .pipe( map((chain: ChainModel) => { - this.messageService.create('success', 'Chain ' + action.newChain.name + ' has been created'); + this._messageService.create('success', 'Chain ' + action.newChain.name + ' has been created'); return new fromActions.CreateChainSuccessAction(chain); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.CreateChainFailAction(error)); }) ); }) )); - hideCreateModal$: Observable = createEffect(() => this.actions$.pipe( + hideCreateModal$: Observable = createEffect(() => this._actions$.pipe( ofType( fromActions.CREATE_CHAIN_SUCCESS, fromActions.CREATE_CHAIN_FAIL ), map(() => new fromActions.HideCreateModalAction()) )) - hideDeleteModal$: Observable = createEffect(() => this.actions$.pipe( + hideDeleteModal$: Observable = createEffect(() => this._actions$.pipe( ofType( fromActions.DELETE_CHAIN_SUCCESS, fromActions.DELETE_CHAIN_FAIL @@ -78,26 +72,32 @@ export class ChainListEffects { map(() => new fromActions.HideDeleteModalAction()) )) - showDeleteModal$: Observable = createEffect(() => this.actions$.pipe( + showDeleteModal$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.DELETE_CHAIN_SELECT), map(() => new fromActions.ShowDeleteModalAction()) ), ) - deleteChain$: Observable = createEffect(() => this.actions$.pipe( + deleteChain$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.DELETE_CHAIN), switchMap((action: fromActions.DeleteChainAction) => { - return this.chainListService.deleteChain(action.chainId) + return this._chainListService.deleteChain(action.chainId) .pipe( map(() => { - this.messageService.create('success', 'Chain "' + action.chainName + '" deleted Successfully'); + this._messageService.create('success', 'Chain "' + action.chainName + '" deleted Successfully'); return new fromActions.DeleteChainSuccessAction(action.chainId); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.DeleteChainFailAction(error)); }) ); }) )); + constructor( + private _actions$: Actions, + private _messageService: NzMessageService, + private _chainListService: ChainListPageService + ) { + } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.component.ts index 33a99c434..54be58659 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.component.ts @@ -10,7 +10,7 @@ * limitations governing your use of the file. */ -import {Component, NgZone, OnDestroy, OnInit} from '@angular/core'; +import {Component, OnDestroy, OnInit} from '@angular/core'; import {UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators} from '@angular/forms'; import {ActivatedRoute, NavigationStart, Router} from '@angular/router'; import {select, Store} from '@ngrx/store'; @@ -57,12 +57,11 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente indexingFieldMap: Map>; constructor( - private store: Store, - private activatedRoute: ActivatedRoute, - private modal: NzModalService, - private router: Router, - private fb: UntypedFormBuilder, - private zone: NgZone + private _store: Store, + private _activatedRoute: ActivatedRoute, + private _modal: NzModalService, + private _router: Router, + private _fb: UntypedFormBuilder, ) { } get dirty() { @@ -82,20 +81,16 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente } ngOnInit() { - this.activatedRoute.params.subscribe((params) => { - this.zone.run(() => { + this._activatedRoute.params.subscribe((params) => { this.chainId = params.id; - }); }); - this.getChainsSubscription = this.store.pipe(select(getPathWithChains)).subscribe((path) => { - this.zone.run(() => { + this.getChainsSubscription = this._store.pipe(select(getPathWithChains)).subscribe((path) => { this.breadcrumbs = path; - }); }); - this.getChainSubscription = this.store.pipe(select(getChain({ id: this.chainId }))).subscribe((chain: ParserChainModel) => { + this.getChainSubscription = this._store.pipe(select(getChain({ id: this.chainId }))).subscribe((chain: ParserChainModel) => { if (!chain) { - this.store.dispatch(new fromActions.LoadChainDetailsAction({ + this._store.dispatch(new fromActions.LoadChainDetailsAction({ id: this.chainId })); } else { @@ -103,20 +98,16 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente } }); - this.store.pipe(select(getDirtyStatus)).subscribe((status) => { - this.zone.run(() => { + this._store.pipe(select(getDirtyStatus)).subscribe((status) => { this.dirtyParsers = status.dirtyParsers; this.dirtyChains = status.dirtyChains; - }); }); - this.chainConfig$ = this.store.pipe(select(getChainDetails({ chainId: this.chainId }))); - this.store.pipe(select(getParserToBeInvestigated)).subscribe((id: string) => { - this.zone.run(() => { + this.chainConfig$ = this._store.pipe(select(getChainDetails({ chainId: this.chainId }))); + this._store.pipe(select(getParserToBeInvestigated)).subscribe((id: string) => { this.parserToBeInvestigated = id === '' ? [] : [id]; - }); }); - this.router.events.subscribe((event) => { + this._router.events.subscribe((event) => { if (event instanceof NavigationStart) { const regex = new RegExp('^\/parserconfig\/chains\/' + this.chainId + '\/new', 'gi'); if (event.url && event.url.match(regex)) { @@ -125,32 +116,32 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente } }); - this.editChainNameForm = this.fb.group({ + this.editChainNameForm = this._fb.group({ name: new UntypedFormControl(null, [Validators.required, Validators.minLength(3)]) }); - this.store.dispatch(new fromActions.GetFormConfigsAction()); + this._store.dispatch(new fromActions.GetFormConfigsAction()); - this.failedParser$ = this.store.pipe(select(getFailedParser)); + this.failedParser$ = this._store.pipe(select(getFailedParser)); } exitFailedParserEditView() { - this.store.dispatch(new fromActions.InvestigateParserAction({ id: '' })); + this._store.dispatch(new fromActions.InvestigateParserAction({ id: '' })); } removeParser(id: string) { const chainId = this.breadcrumbs.length > 0 ? this.breadcrumbs[this.breadcrumbs.length - 1].id : this.chainId; - this.store.dispatch(new fromActions.RemoveParserAction({ + this._store.dispatch(new fromActions.RemoveParserAction({ id, chainId })); } onChainLevelChange(chainId: string) { - this.store.pipe(select(getChain({ id: chainId }))).pipe(take(1)).subscribe((chain: ParserChainModel) => { - this.store.dispatch( + this._store.pipe(select(getChain({ id: chainId }))).pipe(take(1)).subscribe((chain: ParserChainModel) => { + this._store.dispatch( new fromActions.AddToPathAction({ chainId }) ); }); @@ -161,7 +152,7 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente const index = this.breadcrumbs.findIndex((breadcrumb: ParserChainModel) => breadcrumb.id === chain.id); const removeFromPathList = this.breadcrumbs.slice(index + 1).map(ch => ch.id); if (removeFromPathList.length) { - this.store.dispatch( + this._store.dispatch( new fromActions.RemoveFromPathAction({ chainId: removeFromPathList }) ); } @@ -176,7 +167,7 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente this.popOverVisible = false; const value = (this.editChainNameForm.get('name').value || '').trim(); if (value !== chain.name) { - this.store.dispatch(new fromActions.UpdateChainAction({ + this._store.dispatch(new fromActions.UpdateChainAction({ chain: { id: chain.id, name: value @@ -195,7 +186,7 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente return new Observable((observer: Observer) => { if (this.dirty && !this.forceDeactivate) { - this.modal.confirm({ + this._modal.confirm({ nzTitle: 'You have unsaved changes', nzContent: 'Are you sure you want to leave this page?', nzOkText: 'Leave', @@ -212,31 +203,31 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente } onResetChanges() { - this.modal.confirm({ + this._modal.confirm({ nzTitle: 'Your changes will be lost', nzContent: 'Are you sure you want to reset?', nzOkText: 'Reset', nzOkType: 'default', nzCancelText: 'Cancel', nzOnOk: () => { - this.store.dispatch(new fromActions.LoadChainDetailsAction({ + this._store.dispatch(new fromActions.LoadChainDetailsAction({ id: this.chainId })); - this.store.dispatch(new fromActions.InvestigateParserAction({ id: '' })); + this._store.dispatch(new fromActions.InvestigateParserAction({ id: '' })); } }); } onSaveChanges() { - this.modal.confirm({ + this._modal.confirm({ nzTitle: 'You are about the save your changes', nzContent: 'Are you sure you want to save?', nzOkText: 'Save', nzOkType: 'primary', nzCancelText: 'Cancel', nzOnOk: () => { - this.store.dispatch(new fromActions.SaveParserConfigAction({ chainId: this.chainId })); - this.store.dispatch(new fromActions.InvestigateParserAction({ id: '' })); + this._store.dispatch(new fromActions.SaveParserConfigAction({ chainId: this.chainId })); + this._store.dispatch(new fromActions.InvestigateParserAction({ id: '' })); } }); } @@ -246,7 +237,7 @@ export class ChainPageComponent implements OnInit, OnDestroy, DeactivatePrevente const routeParams = this.breadcrumbs.length > 1 ? { subchain: this.breadcrumbs[this.breadcrumbs.length - 1].id } : {}; - this.router.navigate([`/parserconfig/chains/${this.chainId}/new`, routeParams]); + this._router.navigate([`/parserconfig/chains/${this.chainId}/new`, routeParams]); } ngOnDestroy() { diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.spec.ts index 27d72980d..9ec9834c2 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.spec.ts @@ -23,11 +23,11 @@ import {ChainPageService} from '../services/chain-page.service'; import * as fromActions from './chain-page.actions'; import {ChainPageEffects} from './chain-page.effects'; import {NzMessageService} from "ng-zorro-antd/message"; -import {CustomFormConfig} from "./components/custom-form/custom-form.component"; import {ParserDescriptor} from "./chain-page.reducers"; +import {Action} from "@ngrx/store"; describe('chain parser page: effects', () => { - let actions: ReplaySubject; + let actions: ReplaySubject; let effects: ChainPageEffects; let service: jasmine.SpyObj; @@ -81,7 +81,7 @@ describe('chain parser page: effects', () => { ChainPageEffects, provideMockActions(() => actions), provideMockStore({ - initialState: initialState, + initialState, selectors: [] }), {provide: ChainPageService, useValue: jasmine.createSpyObj('ChainPageService', ['getChain', 'saveParserConfig', 'getFormConfig', 'getFormConfigs', 'getIndexMappings'])}, @@ -222,7 +222,7 @@ describe('chain parser page: effects', () => { }] } }; - service.getFormConfig.and.returnValue(of(descriptor['foo'])); + service.getFormConfig.and.returnValue(of(descriptor.foo)); actions = new ReplaySubject(1); actions.next(new fromActions.GetFormConfigAction({ @@ -232,7 +232,7 @@ describe('chain parser page: effects', () => { effects.getFormConfig$.subscribe(result => { expect(result).toEqual(new fromActions.GetFormConfigSuccessAction({ parserType: 'foo', - formConfig: descriptor['foo'] + formConfig: descriptor.foo })); done(); }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.ts index 2d08c5d33..29c941869 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.effects.ts @@ -26,18 +26,12 @@ import {CustomFormConfig} from './components/custom-form/custom-form.component'; @Injectable() export class ChainPageEffects { - constructor( - private actions$: Actions, - private store$: Store, - private messageService: NzMessageService, - private chainPageService: ChainPageService - ) { - } - loadChainDetails$: Observable = createEffect(() => this.actions$.pipe( + + loadChainDetails$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.LOAD_CHAIN_DETAILS), switchMap((action: fromActions.LoadChainDetailsAction) => { - return this.chainPageService.getChain(action.payload.id).pipe( + return this._chainPageService.getChain(action.payload.id).pipe( map((chain: ChainDetailsModel) => { const normalizedParserConfig = normalizeParserConfig(chain); return new fromActions.LoadChainDetailsSuccessAction( @@ -48,7 +42,7 @@ export class ChainPageEffects { ); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.LoadChainDetailsFailAction(error)); }) ); @@ -56,28 +50,28 @@ export class ChainPageEffects { )); - saveParserConfig$: Observable = createEffect(() => this.actions$.pipe( + saveParserConfig$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.SAVE_PARSER_CONFIG), - withLatestFrom(this.store$.select(getChainPageState)), + withLatestFrom(this._store$.select(getChainPageState)), switchMap(([action, state]) => { const chainId = (action as fromActions.SaveParserConfigAction).payload.chainId; const config = denormalizeParserConfig(state.chains[chainId], state); - return this.chainPageService.saveParserConfig(chainId, config).pipe( + return this._chainPageService.saveParserConfig(chainId, config).pipe( map(() => { return new fromActions.SaveParserConfigSuccessAction(); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.SaveParserConfigFailAction(error)); }) ); }) )); - getFormConfig$: Observable = createEffect(() => this.actions$.pipe( + getFormConfig$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.GET_FORM_CONFIG), switchMap((action: fromActions.GetFormConfigAction) => { - return this.chainPageService.getFormConfig(action.payload.type).pipe( + return this._chainPageService.getFormConfig(action.payload.type).pipe( map((descriptor: ParserDescriptor) => { return new fromActions.GetFormConfigSuccessAction({ parserType: action.payload.type, @@ -85,34 +79,34 @@ export class ChainPageEffects { }); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.GetFormConfigFailAction(error)); }) ); }) )); - getFormConfigs$: Observable = createEffect(() => this.actions$.pipe( + getFormConfigs$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.GET_FORM_CONFIGS), switchMap((action: fromActions.GetFormConfigsAction) => { - return this.chainPageService.getFormConfigs().pipe( + return this._chainPageService.getFormConfigs().pipe( map((formConfigs: { [key: string]: ParserDescriptor }) => { return new fromActions.GetFormConfigsSuccessAction({ formConfigs }); }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.GetFormConfigsFailAction(error)); }) ); }) )); - getIndexMappings$: Observable = createEffect(() => this.actions$.pipe( + getIndexMappings$: Observable = createEffect(() => this._actions$.pipe( ofType(fromActions.GET_INDEX_MAPPINGS), switchMap((action: fromActions.GetIndexMappingsAction) => { - return this.chainPageService.getIndexMappings(action.payload).pipe( + return this._chainPageService.getIndexMappings(action.payload).pipe( map((response: { path: string, result: Map }) => { if (response) { return new fromActions.GetIndexMappingsSuccessAction({ @@ -125,10 +119,17 @@ export class ChainPageEffects { } }), catchError((error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(new fromActions.GetIndexMappingsFailAction(error)); }) ); }) )); + constructor( + private _actions$: Actions, + private _store$: Store, + private _messageService: NzMessageService, + private _chainPageService: ChainPageService + ) { + } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.reducers.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.reducers.spec.ts index 216aaad0d..bcf9efb1a 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.reducers.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/chain-page.reducers.spec.ts @@ -150,7 +150,7 @@ describe('chain-page: reducers', () => { const state = { chains: null, parsers: { - 456: { + '456': { id: '456', type: 'grok', name: 'some parser', @@ -187,7 +187,7 @@ describe('chain-page: reducers', () => { const state = { parsers: null, chains: { - 456: { + '456': { id: '456', name: 'old', parsers: [] diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.spec.ts index 1bffb7918..ec0b0ff57 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.spec.ts @@ -11,8 +11,7 @@ */ import {HttpClientTestingModule} from '@angular/common/http/testing'; -import {Component, Input} from '@angular/core'; -import {async, ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {FormsModule, NgControl, ReactiveFormsModule} from '@angular/forms'; import {NoopAnimationsModule} from '@angular/platform-browser/animations'; import {NzMessageService, NzMessageServiceModule} from 'ng-zorro-antd/message'; @@ -29,7 +28,6 @@ import {MockComponent} from "ng-mocks"; describe('ChainViewComponent', () => { let component: ChainViewComponent; let fixture: ComponentFixture; - let chainPageService: ChainPageService; const parsers: ParserModel[] = [ { id: '123', @@ -74,7 +72,6 @@ describe('ChainViewComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(ChainViewComponent); component = fixture.componentInstance; - chainPageService = TestBed.inject(ChainPageService); component.parsers = parsers; fixture.detectChanges(); }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.ts index 22a2d212b..5d938c33e 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/chain-view/chain-view.component.ts @@ -23,9 +23,6 @@ import {Observable} from "rxjs"; styleUrls: ['./chain-view.component.scss'] }) export class ChainViewComponent implements OnInit { - - private readonly _selectedSourceKey = "selectedIndexingSource"; - @Input() parsers: any []; @Input() dirtyParsers: string[]; @Input() chainId: string; @@ -37,6 +34,7 @@ export class ChainViewComponent implements OnInit { collapseAll: boolean; parserCollapseStateArray: boolean[]; selectedSource: string; + private readonly _selectedSourceKey = "selectedIndexingSource"; constructor(public chainPageService: ChainPageService) { } @@ -66,7 +64,7 @@ export class ChainViewComponent implements OnInit { } trackByFn(index: number, parser: any): string { - return (parser).id !== undefined ? parser.id : parser; + return (parser as ParserModel).id !== undefined ? parser.id : parser; } collapseExpandAllParsers() { diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.spec.ts index 9aefc439a..258848940 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.spec.ts @@ -10,12 +10,12 @@ * limitations governing your use of the file. */ -import {async, ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import {FormControl, FormsModule, UntypedFormControl, ReactiveFormsModule} from '@angular/forms'; -import { MinusCircleFill, PlusCircleFill } from '@ant-design/icons-angular/icons'; -import { NzModalModule } from 'ng-zorro-antd/modal'; +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import {FormsModule, ReactiveFormsModule, UntypedFormControl} from '@angular/forms'; +import {MinusCircleFill, PlusCircleFill} from '@ant-design/icons-angular/icons'; +import {NzModalModule} from 'ng-zorro-antd/modal'; import {NzIconModule} from 'ng-zorro-antd/icon'; -import { MultiInputComponent } from './multi-input.component'; +import {MultiInputComponent} from './multi-input.component'; import {NzToolTipModule} from "ng-zorro-antd/tooltip"; import {NzMessageService} from "ng-zorro-antd/message"; import {NzPopconfirmModule} from "ng-zorro-antd/popconfirm"; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.ts index 59bdb3013..09084a69e 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/components/multi-input/multi-input.component.ts @@ -47,31 +47,12 @@ export class MultiInputComponent implements OnInit, OnChanges { ngOnChanges(changes: SimpleChanges) { if (changes.indexingFieldMap || changes.selectedSource) { - this.updateDropdownLists(); + this._updateDropdownLists(); } } - private updateDropdownLists() { - // clear the existing lists - this.ignoreColumns = []; - this.mappingColumns = []; - - // split the items into two lists based on the boolean value - if (this.indexingFieldMap && this.selectedSource) { - this.indexingFieldMap.get(this.selectedSource).forEach((value, key) => { - if (value) { - this.ignoreColumns.push(key); - } else { - this.mappingColumns.push(key); - } - }); - } - this.ignoreColumns.sort() - this.mappingColumns.sort() - } - onAddClick() { - if (this.config.multipleValues==true) { + if (this.config.multipleValues) { this.controls.push( new UntypedFormControl('') ); @@ -87,7 +68,7 @@ export class MultiInputComponent implements OnInit, OnChanges { this.changeValue.emit(value); } - updateValue(selectedValue: String, control: UntypedFormControl, config: CustomFormConfig) { + updateValue(selectedValue: string, control: UntypedFormControl, config: CustomFormConfig) { control.setValue(selectedValue) this.onChange(config) } @@ -107,4 +88,23 @@ export class MultiInputComponent implements OnInit, OnChanges { selectSearch($event: string) { this.selectSearchValue=$event; } + + private _updateDropdownLists() { + // clear the existing lists + this.ignoreColumns = []; + this.mappingColumns = []; + + // split the items into two lists based on the boolean value + if (this.indexingFieldMap && this.selectedSource) { + this.indexingFieldMap.get(this.selectedSource).forEach((value, key) => { + if (value) { + this.ignoreColumns.push(key); + } else { + this.mappingColumns.push(key); + } + }); + } + this.ignoreColumns.sort() + this.mappingColumns.sort() + } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.spec.ts index ea2219cf0..8c1ed1f1b 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.spec.ts @@ -10,20 +10,13 @@ * limitations governing your use of the file. */ -import { Component, Input } from '@angular/core'; -import {async, ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { CustomFormComponent } from './custom-form.component'; import {NzFormModule} from "ng-zorro-antd/form"; +import {MockComponent} from "ng-mocks"; +import {MultiInputComponent} from "./components/multi-input/multi-input.component"; -@Component({ - selector: 'app-multi-input', - template: '', -}) -export class MockMultiInputComponent { - @Input() config = []; - @Input() value; -} describe('CustomFormComponent', () => { let component: CustomFormComponent; @@ -36,8 +29,8 @@ describe('CustomFormComponent', () => { NzFormModule ], declarations: [ - MockMultiInputComponent, - CustomFormComponent + CustomFormComponent, + MockComponent(MultiInputComponent) ] }) .compileComponents(); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.ts index a685cc446..52e8e89ef 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/custom-form/custom-form.component.ts @@ -22,7 +22,7 @@ export interface CustomFormConfig { value?: string | any[]; label?: string; options?: { id: string, name: string }[]; - onChange?: (config: any) => {}; + onChange?: (config: any) => unknown; required?: boolean; multipleValues?: boolean; outputName?: boolean; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/indexing-form/indexing-form.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/indexing-form/indexing-form.component.ts index b9a6d4c68..564dfee87 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/indexing-form/indexing-form.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/indexing-form/indexing-form.component.ts @@ -6,6 +6,7 @@ import {ChainPageState, getIndexMappings} from "../../chain-page.reducers"; import {GetIndexMappingsAction} from "../../chain-page.actions"; import {takeUntil} from "rxjs/operators"; import {Observable, Subject} from "rxjs"; +import {getObjProp} from "../../../shared/utils"; @Component({ selector: 'app-indexing-form', @@ -13,47 +14,46 @@ import {Observable, Subject} from "rxjs"; styleUrls: ['./indexing-form.component.scss'] }) export class IndexingFormComponent implements OnInit, OnDestroy { - - form!: UntypedFormGroup; @Output() fieldSetUpdated = new EventEmitter>>(); + form!: UntypedFormGroup; mappingJson: any; unSubscribe$ = new Subject(); - private indexMappings$: Observable<{ path: string; result: object }>; + private _indexMappings$: Observable<{ path: string; result: object }>; - constructor(private fb: UntypedFormBuilder, - private store: Store) { - this.indexMappings$ = this.store.pipe(select(getIndexMappings), takeUntil(this.unSubscribe$)); + constructor(private _fb: UntypedFormBuilder, + private _store: Store) { + this._indexMappings$ = this._store.pipe(select(getIndexMappings), takeUntil(this.unSubscribe$)); } ngOnInit(): void { - this.form = this.fb.group({filePath: ''}); - this.indexMappings$.subscribe(indexMappings => { - this.store.dispatch(new GetIndexMappingsAction({filePath: indexMappings.path})); + this.form = this._fb.group({filePath: ''}); + this._indexMappings$.subscribe(indexMappings => { + this._store.dispatch(new GetIndexMappingsAction({filePath: indexMappings.path})); this.form.patchValue({filePath: indexMappings.path}); this.onAdvancedEditorChanged({value: indexMappings.result}); }); } onAdvancedEditorChanged(e: ConfigChangedEvent) { - let result = new Map>(); + const result = new Map>(); + this.mappingJson = e.value; + Object.keys(this.mappingJson).forEach(key => { + const sourceMap = new Map(); + result.set(key, sourceMap); + const prop = getObjProp(this.mappingJson, key); + this.findValues(prop, 'ignore_fields').forEach(ignoreList => + ignoreList.forEach(value => sourceMap.set(value, true))); - this.mappingJson = e['value']; - for (let s in this.mappingJson) { - let sourceMap = new Map(); - result.set(s, sourceMap); - this.findValues(this.mappingJson[s], 'ignore_fields').forEach(ignore_list => - ignore_list.forEach(value => sourceMap.set(value, true))); - - this.findValues(this.mappingJson[s], 'column_mapping').forEach(mapping => + this.findValues(prop, 'column_mapping').forEach(mapping => this.findValues(mapping, 'name').forEach(value => sourceMap.set(value, false))); - } + }); this.fieldSetUpdated.emit(result); } findValues(obj, key) { let values = []; - for (let prop in obj) { + for (const prop in obj) { if (prop === key) { values.push(obj[prop]); } else if (typeof obj[prop] === 'object') { @@ -64,7 +64,7 @@ export class IndexingFormComponent implements OnInit, OnDestroy { } submitForm() { - this.store.dispatch(new GetIndexMappingsAction(this.form.value)); + this._store.dispatch(new GetIndexMappingsAction(this.form.value)); } ngOnDestroy() { diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/diff-popup/diff-popup.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/diff-popup/diff-popup.component.ts index 1ced74a2a..601fe7024 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/diff-popup/diff-popup.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/diff-popup/diff-popup.component.ts @@ -15,17 +15,17 @@ export class DiffPopupComponent { previousDiffValue$: Observable; newDiffValue$: Observable; - constructor(private store: Store) { - this.diffModalVisible$ = store.pipe(select(getDiffModalVisible)); - this.previousDiffValue$ = store.pipe(select(getPreviousDiffValue)); - this.newDiffValue$ = store.pipe(select(getNewDiffValue)); + constructor(private _store: Store) { + this.diffModalVisible$ = _store.pipe(select(getDiffModalVisible)); + this.previousDiffValue$ = _store.pipe(select(getPreviousDiffValue)); + this.newDiffValue$ = _store.pipe(select(getNewDiffValue)); } handleOkModal() { - this.store.dispatch(HideDiffModalAction()); + this._store.dispatch(HideDiffModalAction()); } handleCancelModal() { - this.store.dispatch(HideDiffModalAction()); + this._store.dispatch(HideDiffModalAction()); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view-result/live-view-result.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view-result/live-view-result.component.ts index 1d169a5a2..5dac4dcb0 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view-result/live-view-result.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view-result/live-view-result.component.ts @@ -27,7 +27,7 @@ export class LiveViewResultComponent { parserByParserViewId = null; - constructor(private clipboard: Clipboard) { + constructor(private _clipboard: Clipboard) { } onInvestigateParserClicked(failedParser) { @@ -48,7 +48,7 @@ export class LiveViewResultComponent { } copyOutput() { - let output = JSON.stringify(this.results[this.results.length-1].output); - this.clipboard.copy(output); + const output = JSON.stringify(this.results[this.results.length-1].output); + this._clipboard.copy(output); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.actions.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.actions.ts index 2946b4efe..bc8f82d5e 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.actions.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.actions.ts @@ -21,7 +21,7 @@ export const liveViewInitialized = createAction( export const executionTriggered = createAction( '[LiveView] Sample Data Parsing Triggered', - props<{ sampleData: SampleDataModel, chainConfig: {} }>() + props<{ sampleData: SampleDataModel, chainConfig: unknown }>() ); export const liveViewRefreshedSuccessfully = createAction( diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.spec.ts index 6a04be494..dfd9edcf4 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.spec.ts @@ -87,7 +87,7 @@ describe('LiveViewComponent', () => { fixture = TestBed.createComponent(LiveViewComponent); component = fixture.componentInstance; - component.chainConfig$ = new Subject<{}>(); + component.chainConfig$ = new Subject(); fixture.detectChanges(); }); @@ -118,7 +118,7 @@ describe('LiveViewComponent', () => { }); fixture.detectChanges(); - (component.chainConfig$ as Subject<{}>).next({}); + (component.chainConfig$ as Subject).next({}); tick(LiveViewConsts.LIVE_VIEW_DEBOUNCE_RATE); const action = executionTriggered({sampleData: testSampleData, chainConfig: {}}); @@ -127,7 +127,7 @@ describe('LiveViewComponent', () => { })); it('should filter out events without sample data input', fakeAsync(() => { - (component.chainConfig$ as Subject<{}>).next({}); + (component.chainConfig$ as Subject).next({}); tick(LiveViewConsts.LIVE_VIEW_DEBOUNCE_RATE); const action = executionTriggered({sampleData: testSampleData, chainConfig: {}}); @@ -142,7 +142,7 @@ describe('LiveViewComponent', () => { } }); - (component.chainConfig$ as Subject<{}>).next({}); + (component.chainConfig$ as Subject).next({}); tick(LiveViewConsts.LIVE_VIEW_DEBOUNCE_RATE / 2); const action = executionTriggered({sampleData: testSampleData, chainConfig: {}}); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.ts index d253a9bc9..33d6962f3 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.component.ts @@ -36,6 +36,7 @@ import {SampleDataInternalModel, SampleDataModel} from './models/sample-data.mod import { ExecutionListTriggeredAction } from "./sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.actions"; +import {ChainDetailsModel} from "../../chain-page.models"; @Component({ selector: 'app-live-view', @@ -43,44 +44,49 @@ import { styleUrls: ['./live-view.component.scss'] }) export class LiveViewComponent implements OnInit, AfterViewInit, OnDestroy { - @Input() chainConfig$: Observable<{}>; + @Input() chainConfig$: Observable; @Output() failedParser = new EventEmitter(); @Output() parserToBeInvestigated = new EventEmitter(); - - private unsubscribe$: Subject = new Subject(); - isLiveViewOn$: Observable; isExecuting$: Observable; results$: Observable; sampleData$: Observable; - sampleDataChange$ = new Subject(); sampleDataForceChange$ = new Subject(); featureToggleChange$ = new Subject(); - selectedTabIndex = 0; + private _unsubscribe$: Subject = new Subject(); - constructor(private store: Store) { - this.isExecuting$ = this.store.pipe(select(getExecutionStatus)); - this.results$ = this.store.pipe(select(getResults)); - this.sampleData$ = this.store.pipe(select(getSampleData)); - this.isLiveViewOn$ = this.store.pipe(select(getIsLiveViewOn)); + constructor(private _store: Store) { + this.isExecuting$ = this._store.pipe(select(getExecutionStatus)); + this.results$ = this._store.pipe(select(getResults)); + this.sampleData$ = this._store.pipe(select(getSampleData)); + this.isLiveViewOn$ = this._store.pipe(select(getIsLiveViewOn)); } ngOnInit() { - this.store.dispatch(liveViewInitialized()); - this.selectedTabIndex = this.restoreSelectedTab(); + this._store.dispatch(liveViewInitialized()); + this.selectedTabIndex = this._restoreSelectedTab(); } ngAfterViewInit() { - this.subscribeToRelevantChanges(); + this._subscribeToRelevantChanges(); } onInvestigateParserAction(parserId) { - this.store.dispatch(new InvestigateParserAction({ id: parserId })); + this._store.dispatch(new InvestigateParserAction({ id: parserId })); + } + + onSelectedTabChange(index: number) { + this._persistSelectedTab(index); + } + + ngOnDestroy(): void { + this._unsubscribe$.next(); + this._unsubscribe$.complete(); } - private subscribeToRelevantChanges() { + private _subscribeToRelevantChanges() { combineLatest([ this.sampleData$, this.chainConfig$, @@ -88,49 +94,40 @@ export class LiveViewComponent implements OnInit, AfterViewInit, OnDestroy { ]).pipe( debounceTime(LiveViewConsts.LIVE_VIEW_DEBOUNCE_RATE), filter(([ sampleData, chainConfig, isLiveViewOn ]) => isLiveViewOn && !!sampleData.source), - takeUntil(this.unsubscribe$) + takeUntil(this._unsubscribe$) ).subscribe(([ sampleData, chainConfig ]) => { - this.store.dispatch(executionTriggered({ sampleData, chainConfig })); + this._store.dispatch(executionTriggered({ sampleData, chainConfig })); }); this.featureToggleChange$.pipe( - takeUntil(this.unsubscribe$), - filter(value => value !== null), - ).subscribe(value => { - this.store.dispatch(onOffToggleChanged({ value })); + takeUntil(this._unsubscribe$), + filter(value => value !== null), + ).subscribe(value => { + this._store.dispatch(onOffToggleChanged({ value })); }); this.sampleDataChange$.pipe( - takeUntil(this.unsubscribe$), + takeUntil(this._unsubscribe$), filter(sampleData => sampleData !== null), ).subscribe(sampleData => { - this.store.dispatch(sampleDataInputChanged({ sampleData })); + this._store.dispatch(sampleDataInputChanged({ sampleData })); }); combineLatest([ - this.sampleDataForceChange$, + this.sampleDataForceChange$, this.chainConfig$]).pipe( - takeUntil(this.unsubscribe$), - filter((sampleData, chainConfig) => sampleData !== null), + takeUntil(this._unsubscribe$), + filter((sampleData, chainConfig) => sampleData !== null), ).subscribe(([sampleData, chainConfig]) => { - this.store.dispatch(ExecutionListTriggeredAction({ sampleData, chainConfig })); + this._store.dispatch(ExecutionListTriggeredAction({ sampleData, chainConfig })); }); } - onSelectedTabChange(index: number) { - this.persistSelectedTab(index); - } - - private persistSelectedTab(index: number) { + private _persistSelectedTab(index: number) { localStorage.setItem('liveViewSelectedTabIndex', JSON.stringify(index)); } - private restoreSelectedTab() { + private _restoreSelectedTab() { return parseInt(localStorage.getItem('liveViewSelectedTabIndex'), 10); } - - ngOnDestroy(): void { - this.unsubscribe$.next(); - this.unsubscribe$.complete(); - } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.spec.ts index 00d61ed63..bf78abff8 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.spec.ts @@ -10,11 +10,11 @@ * limitations governing your use of the file. */ -import { TestBed } from '@angular/core/testing'; -import { provideMockActions } from '@ngrx/effects/testing'; -import { Action } from '@ngrx/store'; -import { NzMessageService } from 'ng-zorro-antd/message'; -import { of, Subject, throwError } from 'rxjs'; +import {TestBed} from '@angular/core/testing'; +import {provideMockActions} from '@ngrx/effects/testing'; +import {Action} from '@ngrx/store'; +import {NzMessageService} from 'ng-zorro-antd/message'; +import {of, Subject, throwError} from 'rxjs'; import { executionTriggered, @@ -26,24 +26,12 @@ import { sampleDataInputChanged, sampleDataRestored } from './live-view.actions'; -import { LiveViewConsts } from './live-view.consts'; -import { LiveViewEffects } from './live-view.effects'; -import { SampleDataModel, SampleDataType } from './models/sample-data.model'; -import { LiveViewService } from './services/live-view.service'; +import {LiveViewConsts} from './live-view.consts'; +import {LiveViewEffects} from './live-view.effects'; +import {SampleDataType} from './models/sample-data.model'; +import {LiveViewService} from './services/live-view.service'; import {EntryParsingResultModel} from "./models/live-view.model"; - - -class MockLiveViewService { - execute(sampleData: SampleDataModel, chainConfig: {}) { - return new Subject(); - } -} - -class MockMessageService { - create(type: string, message: string) {} -} - describe('live-view.effects', () => { const testPayload = { @@ -75,8 +63,8 @@ describe('live-view.effects', () => { TestBed.configureTestingModule({ providers: [ LiveViewEffects, - { provide: LiveViewService, useClass: MockLiveViewService }, - { provide: NzMessageService, useClass: MockMessageService }, + { provide: LiveViewService, useValue: jasmine.createSpyObj('LiveViewService', ['execute']) }, + { provide: NzMessageService, useValue: jasmine.createSpyObj('NzMessageService', ['create']) }, provideMockActions(() => actions$)], }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.ts index 5ea1f6c3b..f6802a923 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/live-view.effects.ts @@ -11,7 +11,7 @@ */ import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; +import {Actions, createEffect, Effect, ofType} from '@ngrx/effects'; import { Action } from '@ngrx/store'; import { NzMessageService } from 'ng-zorro-antd/message'; import { Observable, of } from 'rxjs'; @@ -30,53 +30,46 @@ import { } from './live-view.actions'; import { LiveViewConsts } from './live-view.consts'; import { LiveViewService } from './services/live-view.service'; +import {editor} from "monaco-editor"; +import create = editor.create; @Injectable() export class LiveViewEffects { - constructor( - private actions$: Actions, - private liveViewService: LiveViewService, - private messageService: NzMessageService, - ) {} - @Effect() - execute$: Observable = this.actions$.pipe( + execute$: Observable = createEffect( () =>this._actions$.pipe( ofType( executionTriggered.type, ), switchMap(({ sampleData, chainConfig }) => { - return this.liveViewService.execute(sampleData, chainConfig).pipe( + return this._liveViewService.execute(sampleData, chainConfig).pipe( map(liveViewResult => liveViewRefreshedSuccessfully({ liveViewResult })), catchError(( error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(liveViewRefreshFailed({ error })); }) ); }) - ); + )); - @Effect({ dispatch: false}) - persistingSampleData$ = this.actions$.pipe( + persistingSampleData$ = createEffect(() => this._actions$.pipe( ofType( sampleDataInputChanged.type, ), tap(({ sampleData }) => { localStorage.setItem(LiveViewConsts.SAMPLE_DATA_STORAGE_KEY, JSON.stringify(sampleData)); }) - ); + )); - @Effect({ dispatch: false}) - persistingOnOffToggle$ = this.actions$.pipe( + persistingOnOffToggle$ = createEffect( () => this._actions$.pipe( ofType( onOffToggleChanged.type, ), tap(({ value }) => { localStorage.setItem(LiveViewConsts.FEATURE_TOGGLE_STORAGE_KEY, JSON.stringify(value)); }) - ); + )); - @Effect() - restoreSampleDataFromLocalStore: Observable = this.actions$.pipe( + restoreSampleDataFromLocalStore: Observable = createEffect( () => this._actions$.pipe( ofType( liveViewInitialized.type, ), @@ -84,10 +77,9 @@ export class LiveViewEffects { const sampleData = JSON.parse(localStorage.getItem(LiveViewConsts.SAMPLE_DATA_STORAGE_KEY)); return of(sampleDataRestored({ sampleData })); }) - ); + )); - @Effect() - restoreToggleFromLocalStore: Observable = this.actions$.pipe( + restoreToggleFromLocalStore: Observable = createEffect( () => this._actions$.pipe( ofType( liveViewInitialized.type, ), @@ -95,5 +87,11 @@ export class LiveViewEffects { const value = JSON.parse(localStorage.getItem(LiveViewConsts.FEATURE_TOGGLE_STORAGE_KEY)); return of(onOffToggleRestored({ value })); }) - ); + )); + + constructor( + private _actions$: Actions, + private _liveViewService: LiveViewService, + private _messageService: NzMessageService, + ) {} } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/models/live-view.model.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/models/live-view.model.ts index 840b6b485..fdea2fd36 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/models/live-view.model.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/models/live-view.model.ts @@ -13,7 +13,7 @@ import { SampleDataRequestModel } from './sample-data.model'; export interface EntryParsingResultModel { - output: {}; + output: unknown; log: { type: string; message: string; @@ -31,7 +31,7 @@ export enum ParserFieldStatus { } export interface ParserResultsModel { - output: {}; + output: any; log: { type: string; message: string; @@ -43,5 +43,5 @@ export interface ParserResultsModel { export interface LiveViewRequestModel { sampleData: SampleDataRequestModel; - chainConfig: {}; + chainConfig: unknown; } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.html b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.html index 396fc1cbe..2828e673f 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.html +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.html @@ -34,16 +34,16 @@

{{ item.key }}:
{{ diffOnly ? item.value.currentValue : item.value }}
+ *ngIf="diffOnly && item.value.status === parserFieldStatus.DIFF">Show diff
diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.spec.ts index 3b534f2e4..b29796f95 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.spec.ts @@ -103,12 +103,12 @@ describe('ParserByParserComponent', () => { const emptyMessage = fixture.debugElement.query(By.css('.ant-result-title')); const logMessage = fixture.debugElement.query(By.css('[data-qe-id="logMessage"')); - expect(emptyMessage.nativeElement.textContent).toContain(component.compileErrorDescription); + expect(emptyMessage.nativeElement.textContent).toContain(component.ERROR_DESCRIPTOR); component.parserResults = []; fixture.detectChanges(); - expect(emptyMessage.nativeElement.textContent).toContain(component.compileErrorDescription); + expect(emptyMessage.nativeElement.textContent).toContain(component.ERROR_DESCRIPTOR); expect(logMessage.nativeElement.textContent).toContain(component.logMessage); }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.ts index fe9cd152c..68764e38c 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/parser-by-parser/parser-by-parser.component.ts @@ -16,6 +16,7 @@ import {ParserFieldStatus, ParserResultsModel} from '../models/live-view.model'; import {Store} from "@ngrx/store"; import {DiffPopupState} from "../diff-popup/diff-popup.reducers"; import {ShowDiffModalAction} from "../diff-popup/diff-popup.actions"; +import {getObjProp} from "../../../../shared/utils"; @Component({ selector: 'app-parser-by-parser', @@ -23,81 +24,78 @@ import {ShowDiffModalAction} from "../diff-popup/diff-popup.actions"; styleUrls: ['./parser-by-parser.component.scss'] }) export class ParserByParserComponent implements OnInit { - @Input() logMessage: string; - @Output() investigateParser = new EventEmitter(); - compileErrorDescription = + static readonly ERROR_DESCRIPTOR = 'There was an error that prevented your parser chain from being constructed. Please review your configuration settings.'; - private _diffOnly: boolean = false; + @Output() investigateParser = new EventEmitter(); + @Input() logMessage: string; + + + protected readonly parserFieldStatus = ParserFieldStatus; + protected readonly console = console; + private _diffOnly = false; private _parserResults: ParserResultsModel[]; private _calculatedParserResults: ParserResultsModel[]; - constructor(private store: Store) { + constructor(private _store: Store) { } - - ngOnInit() { - this.updateParserResults() - } - - @Input() - set parserResults(value: ParserResultsModel[]) { - this._parserResults = value; - this.updateParserResults(); + get diffOnly(): boolean { + return this._diffOnly; } - get parserResults(): ParserResultsModel[] { return this._calculatedParserResults; } - - get diffOnly(): boolean { - return this._diffOnly; + @Input() + set parserResults(value: ParserResultsModel[]) { + this._parserResults = value; + this._updateParserResults(); } - set diffOnly(value: boolean) { this._diffOnly = value; - this.updateParserResults(); + this._updateParserResults(); } - private updateParserResults() { - if (this.diffOnly){ - this._calculatedParserResults = this.calculateParsersDiff(); - } else { - this._calculatedParserResults = this._parserResults - } + + ngOnInit() { + this._updateParserResults() } + showDiff(oldValue: string, newValue: string) { - this.store.dispatch(ShowDiffModalAction({previousDiffValue: oldValue, newDiffValue: newValue})); + this._store.dispatch(ShowDiffModalAction({previousDiffValue: oldValue, newDiffValue: newValue})); } enableInvestigateParser(parserId) { this.investigateParser.emit(parserId); } - private calculateParsersDiff() { - let parserDiffs: ParserResultsModel[] = [] + + + private _calculateParsersDiff() { + const parserDiffs: ParserResultsModel[] = [] let previous: ParserResultsModel = null for (const res of this._parserResults) { - let diff = {} - let prevOutput = previous ? previous['output'] : {}; - let currOutput = res['output']; + const diff = {} + const prevOutput = previous ? previous.output : {}; + const currOutput = res.output; - for (const outputKey in currOutput) { + Object.keys(currOutput).forEach((outputKey) => { let status: ParserFieldStatus - let prevValue = prevOutput[outputKey]; - let currValue = currOutput[outputKey]; + + const prevValue = getObjProp(prevOutput, outputKey); + const currValue = getObjProp(currOutput, outputKey); if (prevValue){ status = ParserFieldStatus.DIFF } else { status = ParserFieldStatus.NEW } - if (prevValue != currValue){ - diff[outputKey] = {currentValue: currValue, previousValue: prevValue, status: status} + if (prevValue !== currValue){ + diff[outputKey] = {currentValue: currValue, previousValue: prevValue, status} } - } + }); if (prevOutput){ for (const outputKey in prevOutput) { - if (!currOutput[outputKey]) { + if (!getObjProp(currOutput, outputKey)) { diff[outputKey] = {currentValue: prevOutput[outputKey], status: ParserFieldStatus.REMOVED} } } @@ -111,8 +109,11 @@ export class ParserByParserComponent implements OnInit { } return parserDiffs } - - protected readonly ParserFieldStatus = ParserFieldStatus; - - protected readonly console = console; + private _updateParserResults() { + if (this.diffOnly){ + this._calculatedParserResults = this._calculateParsersDiff(); + } else { + this._calculatedParserResults = this._parserResults + } + } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.spec.ts index aca26ad9f..9ee293477 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.spec.ts @@ -10,7 +10,7 @@ * limitations governing your use of the file. */ -import {async, ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import { ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { By } from '@angular/platform-browser'; import { NzButtonModule } from 'ng-zorro-antd/button'; @@ -27,7 +27,6 @@ import {SampleDataTextInputComponent} from "./sample-data-text-input/sample-data import { SampleDataTextFolderInputComponent } from "./sample-data-text-folder-input/sample-data-text-folder-input.component"; -import {findEl} from "../../../../shared/test/test-helper"; describe('SampleDataFormComponent', () => { @@ -76,6 +75,7 @@ describe('SampleDataFormComponent', () => { const sampleDataTextInput: SampleDataTextInputComponent = fixture.debugElement.query(By.directive(SampleDataTextInputComponent)).componentInstance; sampleDataTextInput.sampleDataChange.emit(expected); }); + it('should dispatch change action from SampleDataFolder', (done) => { fixture.debugElement.queryAll(By.css('.ant-tabs-tab-btn'))[1].nativeElement.click(); fixture.detectChanges(); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.ts index 13005512f..6bbff55e3 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-form.component.ts @@ -23,7 +23,7 @@ import {EntryParsingResultModel} from "../models/live-view.model"; }) export class SampleDataFormComponent { @Input() sampleData: SampleDataModel; - @Input() chainConfig: {}; + @Input() chainConfig: unknown; @Output() sampleDataChange = new EventEmitter(); @Output() sampleDataForceChange = new EventEmitter(); } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.actions.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.actions.ts index a127678dc..5159f9b5d 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.actions.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.actions.ts @@ -13,6 +13,7 @@ import {createAction, props, union} from '@ngrx/store'; import {SampleDataInternalModel} from "../../models/sample-data.model"; import {EntryParsingResultModel} from "../../models/live-view.model"; +import {ChainDetailsModel} from "../../../../chain-page.models"; export const SampleFolderViewInitializedAction = createAction( '[SampleFolder] Sample Folder View Initialized' @@ -25,7 +26,7 @@ export const SampleFolderPathRestoredAction = createAction( export const ExecutionListTriggeredAction = createAction( '[SampleFolder] Sample Data List Parsing Triggered', - props<{ sampleData: SampleDataInternalModel[], chainConfig: {} }>() + props<{ sampleData: SampleDataInternalModel[], chainConfig: ChainDetailsModel }>() ); export const ExecutionListSuccessfulAction = createAction( diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.html b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.html index 3bf037a84..9faa91891 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.html +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.html @@ -98,7 +98,7 @@

{{(runResults$ | async).get(data.id)?.result}}

+ *ngIf="(getStatus(data.id) | async) === sampleTestStatus.FAIL"> diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.spec.ts index e27f2021c..20ddeb26a 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.spec.ts @@ -2,7 +2,6 @@ import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {SampleDataTextFolderInputComponent} from './sample-data-text-folder-input.component'; import {provideMockStore} from "@ngrx/store/testing"; -import {Store} from "@ngrx/store"; import {FormsModule, ReactiveFormsModule} from "@angular/forms"; import {NzFormModule} from "ng-zorro-antd/form"; import {NzTableModule} from "ng-zorro-antd/table"; @@ -23,7 +22,6 @@ import {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA} from "@angular/core"; describe('SampleDataTextFolderInputComponent', () => { let component: SampleDataTextFolderInputComponent; let fixture: ComponentFixture; - let store: Store; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -63,7 +61,6 @@ describe('SampleDataTextFolderInputComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(SampleDataTextFolderInputComponent); component = fixture.componentInstance; - store = TestBed.inject(Store); fixture.detectChanges(); }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.ts index 823a00ffb..244f1e50e 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.component.ts @@ -1,4 +1,4 @@ -import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; +import {Component, EventEmitter, Input, OnDestroy, OnInit, Output} from '@angular/core'; import { SampleDataInternalModel, SampleDataModel, @@ -26,177 +26,175 @@ import {UntypedFormBuilder, UntypedFormGroup} from "@angular/forms"; import {map, takeUntil} from "rxjs/operators"; @Component({ - selector: 'app-sample-data-text-folder-input', - templateUrl: './sample-data-text-folder-input.component.html', - styleUrls: ['./sample-data-text-folder-input.component.scss'] + selector: 'app-sample-data-text-folder-input', + templateUrl: './sample-data-text-folder-input.component.html', + styleUrls: ['./sample-data-text-folder-input.component.scss'] }) -export class SampleDataTextFolderInputComponent implements OnInit { - - @Input() chainConfig: {}; - @Output() sampleDataChange = new EventEmitter(); - @Output() sampleDataForceChange = new EventEmitter(); - - isExecuting$: Observable; - runResults$: Observable>; - sampleData$: Observable; - sampleFolderPath$: Observable; - editSampleModalVisible$: Observable; - expandSet = new Set(); - folderForm!: UntypedFormGroup; - currentSampleData: SampleDataInternalModel[]; - selectedSample: [number, SampleDataInternalModel] = [null, null]; - private unsubscribe$: Subject = new Subject(); - - - constructor(private store: Store, - private fb: UntypedFormBuilder) { - this.isExecuting$ = this.store.pipe(select(getExecutionStatus)); - this.runResults$ = this.store.pipe(select(getRunResults)); - this.sampleData$ = this.store.pipe(select(getSampleData)); - this.sampleFolderPath$ = this.store.pipe(select(getSampleFolderPath)); - this.editSampleModalVisible$ = store.pipe(select(getEditModalVisible)); - this.sampleData$.pipe(takeUntil(this.unsubscribe$)).subscribe(value => this.currentSampleData = value) - } +export class SampleDataTextFolderInputComponent implements OnInit, OnDestroy { + @Input() chainConfig: any; + @Output() sampleDataChange = new EventEmitter(); + @Output() sampleDataForceChange = new EventEmitter(); + + isExecuting$: Observable; + runResults$: Observable>; + sampleData$: Observable; + sampleFolderPath$: Observable; + editSampleModalVisible$: Observable; + expandSet = new Set(); + folderForm!: UntypedFormGroup; + currentSampleData: SampleDataInternalModel[]; + selectedSample: [number, SampleDataInternalModel] = [null, null]; + protected readonly sampleTestStatus = SampleTestStatus; + private _unsubscribe$: Subject = new Subject(); + + + constructor(private _store: Store, + private _fb: UntypedFormBuilder) { + this.isExecuting$ = this._store.pipe(select(getExecutionStatus)); + this.runResults$ = this._store.pipe(select(getRunResults)); + this.sampleData$ = this._store.pipe(select(getSampleData)); + this.sampleFolderPath$ = this._store.pipe(select(getSampleFolderPath)); + this.editSampleModalVisible$ = _store.pipe(select(getEditModalVisible)); + this.sampleData$.pipe(takeUntil(this._unsubscribe$)).subscribe(value => this.currentSampleData = value) + } - get folderPath() { - return this.folderForm.get("folderPath") - } + get folderPath() { + return this.folderForm.get("folderPath") + } - ngOnInit(): void { - this.store.dispatch(SampleFolderViewInitializedAction()); - this.folderForm = this.fb.group({folderPath: ""}); - this.sampleFolderPath$.pipe(takeUntil(this.unsubscribe$)).subscribe(value => { - this.folderForm.patchValue({folderPath: value}); - this.fetchSamples() - }) - } + ngOnInit(): void { + this._store.dispatch(SampleFolderViewInitializedAction()); + this.folderForm = this._fb.group({folderPath: ""}); + this.sampleFolderPath$.pipe(takeUntil(this._unsubscribe$)).subscribe(value => { + this.folderForm.patchValue({folderPath: value}); + this.fetchSamples() + }) + } - onExpandChange(id: number, checked: boolean): void { - if (checked) { - this.expandSet.add(id); - } else { - this.expandSet.delete(id); - } + onExpandChange(id: number, checked: boolean): void { + if (checked) { + this.expandSet.add(id); + } else { + this.expandSet.delete(id); } + } - fetchSamples() { - this.store.dispatch(FetchSampleListTriggeredAction({ - folderPath: this.folderPath.value, - chainId: this.chainConfig['id'] - })) - } + fetchSamples() { + this._store.dispatch(FetchSampleListTriggeredAction({ + folderPath: this.folderPath.value, + chainId: this.chainConfig.id + })) + } - protected readonly SampleTestStatus = SampleTestStatus; + applySample($event: MouseEvent, sample: SampleDataInternalModel) { + this.sampleDataChange.emit({ + source: sample.source, + type: SampleDataType.MANUAL + }); + } - applySample($event: MouseEvent, sample: SampleDataInternalModel) { - this.sampleDataChange.emit({ - source: sample.source, - type: SampleDataType.MANUAL - }); - } + runSamples() { + this.sampleDataForceChange.emit(this.currentSampleData) + } - runSamples() { - this.sampleDataForceChange.emit(this.currentSampleData) - } + editSample($event: MouseEvent, data: SampleDataInternalModel, i: number) { + this.selectedSample = [i, data] + this._store.dispatch(ShowEditModalAction()) + } - editSample($event: MouseEvent, data: SampleDataInternalModel, i: number) { - this.selectedSample = [i, data] - this.store.dispatch(ShowEditModalAction()) + updateSample($event: SampleDataInternalModel) { + const newSampleList = this.currentSampleData + ? [...this.currentSampleData] + : [] + + if (this.selectedSample[0] == null) { + //new sample + newSampleList.push($event) + } else { + //existing sample + newSampleList[this.selectedSample[0]] = $event } - updateSample($event: SampleDataInternalModel) { - let newSampleList = this.currentSampleData - ? [...this.currentSampleData] - : [] - - if (this.selectedSample[0] == null){ - //new sample - newSampleList.push($event) - } else { - //existing sample - newSampleList[this.selectedSample[0]] = $event - } - - this.store.dispatch(SaveSampleListTriggeredAction({ - folderPath: this.folderPath.value, - chainId: this.chainConfig['id'], - sampleList: newSampleList - })) - } + this._store.dispatch(SaveSampleListTriggeredAction({ + folderPath: this.folderPath.value, + chainId: this.chainConfig.id, + sampleList: newSampleList + })) + } - deleteSample($event: MouseEvent, data: SampleDataInternalModel, i: number) { - if (!this.currentSampleData){ - return - } - let newSampleList = [...this.currentSampleData] - newSampleList.splice(i, 1); + deleteSample($event: MouseEvent, data: SampleDataInternalModel, i: number) { + if (!this.currentSampleData) { + return + } + const newSampleList = [...this.currentSampleData] + newSampleList.splice(i, 1); - this.store.dispatch(SaveSampleListTriggeredAction({ - folderPath: this.folderPath.value, - chainId: this.chainConfig['id'], - sampleList: newSampleList - })) + this._store.dispatch(SaveSampleListTriggeredAction({ + folderPath: this.folderPath.value, + chainId: this.chainConfig.id, + sampleList: newSampleList + })) - } + } - addSample() { - let maxId: number = this.currentSampleData - ? Math.max(...this.currentSampleData.map(v => v.id)) - : 0; - this.selectedSample = [null, { - id: maxId+1, - source: "", - name: "", - description: "", - expectedFailure: false, - expectedResult: "" - }] - this.store.dispatch(ShowEditModalAction()) - } + addSample() { + const maxId: number = this.currentSampleData + ? Math.max(...this.currentSampleData.map(v => v.id)) + : 0; + this.selectedSample = [null, { + id: maxId + 1, + source: "", + name: "", + description: "", + expectedFailure: false, + expectedResult: "" + }] + this._store.dispatch(ShowEditModalAction()) + } - getIconType(id: number) { - return this.getStatus(id).pipe(map(dataStatus => { - switch (dataStatus) { - case SampleTestStatus.SUCCESS: - return "check-circle" - case SampleTestStatus.FAIL: - return "close-circle" - case SampleTestStatus.UNKNOWN: - return "clock-circle" - } - })) - } + getIconType(id: number) { + return this.getStatus(id).pipe(map(dataStatus => { + switch (dataStatus) { + case SampleTestStatus.SUCCESS: + return "check-circle" + case SampleTestStatus.FAIL: + return "close-circle" + case SampleTestStatus.UNKNOWN: + return "clock-circle" + } + })) + } - getIconColor(id: number) { - return this.getStatus(id).pipe(map(dataStatus => { - switch (dataStatus) { - case SampleTestStatus.SUCCESS: - return "#52c41a" - case SampleTestStatus.FAIL: - return "#d41f1f" - case SampleTestStatus.UNKNOWN: - return "#bbbbbb" - } - })) - } + getIconColor(id: number) { + return this.getStatus(id).pipe(map(dataStatus => { + switch (dataStatus) { + case SampleTestStatus.SUCCESS: + return "#52c41a" + case SampleTestStatus.FAIL: + return "#d41f1f" + case SampleTestStatus.UNKNOWN: + return "#bbbbbb" + } + })) + } - getStatus(id: number){ - return this.runResults$.pipe(map(value => { - let dataById = value.get(id); - return dataById === undefined - ? SampleTestStatus.UNKNOWN - : dataById.status; - })); - } + getStatus(id: number) { + return this.runResults$.pipe(map(value => { + const dataById = value.get(id); + return dataById === undefined + ? SampleTestStatus.UNKNOWN + : dataById.status; + })); + } ngOnDestroy(): void { - this.unsubscribe$.next(); - this.unsubscribe$.complete(); + this._unsubscribe$.next(); + this._unsubscribe$.complete(); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.effects.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.effects.ts index 5696cfb79..03b060a96 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.effects.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.effects.ts @@ -11,7 +11,7 @@ */ import { Injectable } from '@angular/core'; -import { Actions, Effect, ofType } from '@ngrx/effects'; +import {Actions, createEffect, Effect, ofType} from '@ngrx/effects'; import { Action } from '@ngrx/store'; import { NzMessageService } from 'ng-zorro-antd/message'; import { Observable, of } from 'rxjs'; @@ -35,14 +35,9 @@ import {LiveViewConsts} from "../../live-view.consts"; @Injectable() export class SampleDataTextFolderInputEffects { - constructor( - private actions$: Actions, - private sampleFolderService: SampleDataTextFolderInputService, - private messageService: NzMessageService, - ) {} - @Effect() - init$: Observable = this.actions$.pipe( + + init$: Observable = createEffect( () => this._actions$.pipe( ofType( SampleFolderViewInitializedAction.type, ), @@ -50,56 +45,59 @@ export class SampleDataTextFolderInputEffects { const sampleFolderPath = localStorage.getItem(SampleFolderConsts.SAMPLE_FOLDER_PATH_STORAGE_KEY); return of(SampleFolderPathRestoredAction({ sampleFolderPath })); }) - ); + )); - @Effect() - runTests$: Observable = this.actions$.pipe( + runTests$: Observable = createEffect( () =>this._actions$.pipe( ofType( ExecutionListTriggeredAction.type, ), switchMap(({ sampleData, chainConfig }) => { - return this.sampleFolderService.runTests(sampleData, chainConfig).pipe( + return this._sampleFolderService.runTests(sampleData, chainConfig).pipe( map(sampleFolderResults => ExecutionListSuccessfulAction({ sampleFolderResults })), catchError(( error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(ExecutionListFailedAction({ error })); }) ); }) - ); + )); - @Effect() - fetchSamples$: Observable = this.actions$.pipe( + fetchSamples$: Observable = createEffect( () => this._actions$.pipe( ofType( FetchSampleListTriggeredAction.type, ), switchMap(({ folderPath, chainId }) => { localStorage.setItem(SampleFolderConsts.SAMPLE_FOLDER_PATH_STORAGE_KEY, folderPath); - return this.sampleFolderService.fetchSamples(folderPath, chainId).pipe( + return this._sampleFolderService.fetchSamples(folderPath, chainId).pipe( map(fetchResult => FetchSampleListSuccessfulAction({ fetchResult })), catchError(( error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(FetchSampleListFailedAction({ error })); }) ); }) - ); + )); - @Effect() - saveSamples$: Observable = this.actions$.pipe( + saveSamples$: Observable = createEffect( () => this._actions$.pipe( ofType( SaveSampleListTriggeredAction.type, ), switchMap(({ folderPath, chainId, sampleList }) => { - return this.sampleFolderService.saveSamples(folderPath, chainId, sampleList).pipe( + return this._sampleFolderService.saveSamples(folderPath, chainId, sampleList).pipe( map(saveResults => SaveSampleListSuccessfulAction({ saveResults })), catchError(( error: { message: string }) => { - this.messageService.create('error', error.message); + this._messageService.create('error', error.message); return of(SaveSampleListFailedAction({ error })); }) ); }) - ); + )); + + constructor( + private _actions$: Actions, + private _sampleFolderService: SampleDataTextFolderInputService, + private _messageService: NzMessageService, + ) {} } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.reducers.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.reducers.ts index cb204a9df..a63ec57e5 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.reducers.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-folder-input/sample-data-text-folder-input.reducers.ts @@ -70,7 +70,7 @@ export function reducer( return { ...state, sampleData: action.sampleData, - chainId: action.chainConfig['id'], + chainId: action.chainConfig.id, isTestExecuting: true, }; } @@ -152,7 +152,7 @@ function prepareResult(rawResult: Map { - let resultMap = new Map(); rawResult.forEach((value, key) => { - let sample = value[0]; - let result = value[1]; + const sample = value[0]; + const result = value[1]; - let failedParser = result.find((result) => result.log.type === 'error'); + const failedParser = result.find((res) => res.log.type === 'error'); let status: SampleTestStatus; let output: string; @@ -180,8 +180,8 @@ function prepareResult(rawResult: Map(); + editSampleForm: UntypedFormGroup; + isOkLoading = false; + constructor(private _store: Store, + private _fb: UntypedFormBuilder) { + } - @Output() sampleDataChange = new EventEmitter(); + get source() { + return this.editSampleForm.get('source') + } - editSampleForm: UntypedFormGroup; - isOkLoading = false; + get name() { + return this.editSampleForm.get('name') + } + get description() { + return this.editSampleForm.get('description') + } - constructor(private store: Store, - private fb: UntypedFormBuilder) { + get expectedFailure() { + return this.editSampleForm.get('expectedFailure') + } + get expectedResult() { + return this.editSampleForm.get('expectedResult') + } + ngOnChanges(changes: SimpleChanges): void { + if (changes.sample !== undefined && !changes.sample.isFirstChange()) { + this.editSampleForm = this._fb.group({ + source: new UntypedFormControl(this.sample.source), + name: new UntypedFormControl(this.sample.name, [Validators.required, Validators.minLength(3)]), + description: new UntypedFormControl(this.sample.description), + expectedFailure: new UntypedFormControl(this.sample.expectedFailure, Validators.required), + expectedResult: new UntypedFormControl(this.sample.expectedResult) + }); } + } - ngOnChanges(changes: SimpleChanges): void { - if (changes.sample !== undefined && !changes.sample.isFirstChange()){ - this.editSampleForm = this.fb.group({ - source: new UntypedFormControl(this.sample.source), - name: new UntypedFormControl(this.sample.name, [Validators.required, Validators.minLength(3)]), - description: new UntypedFormControl(this.sample.description), - expectedFailure: new UntypedFormControl(this.sample.expectedFailure, Validators.required), - expectedResult: new UntypedFormControl(this.sample.expectedResult) - }); - } - } - - get source() { - return this.editSampleForm.get('source') - } - get name() { - return this.editSampleForm.get('name') - } + pushChain() { + this.sampleDataChange.emit({ + ...this.sample, + source: this.source.value, + name: this.name.value, + description: this.description.value, + expectedFailure: this.expectedFailure.value, + expectedResult: this.expectedResult.value + }) + this._store.dispatch(HideEditModalAction()) + } - get description() { - return this.editSampleForm.get('description') - } - - get expectedFailure() { - return this.editSampleForm.get('expectedFailure') - } - - get expectedResult() { - return this.editSampleForm.get('expectedResult') - } - - pushChain() { - this.sampleDataChange.emit({ - ...this.sample, - source: this.source.value, - name: this.name.value, - description: this.description.value, - expectedFailure: this.expectedFailure.value, - expectedResult: this.expectedResult.value - }) - this.store.dispatch(HideEditModalAction()) - } - - handleCancelChainModal() { - this.store.dispatch(HideEditModalAction()) - } + handleCancelChainModal() { + this._store.dispatch(HideEditModalAction()) + } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.spec.ts index 0d255f05f..a431c1252 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.spec.ts @@ -7,7 +7,7 @@ import {NzFormModule} from "ng-zorro-antd/form"; import {SampleDataType} from "../../models/sample-data.model"; import {NzInputModule} from "ng-zorro-antd/input"; import {NoopAnimationsModule} from "@angular/platform-browser/animations"; -import {findEl} from "../../../../../shared/test/test-helper"; +import {findEl} from "src/app/shared/test/test-helper"; describe('SampleDataTextInputComponent', () => { let component: SampleDataTextInputComponent; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.ts index 5b135b9eb..8dba934b5 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/sample-data-form/sample-data-text-input/sample-data-text-input.component.ts @@ -13,7 +13,7 @@ export class SampleDataTextInputComponent { @Input() sampleData: SampleDataModel; @Output() sampleDataChange = new EventEmitter(); - constructor(private messageService: NzMessageService) {} + constructor(private _messageService: NzMessageService) {} onApply(event: Event) { const source = (event.target as HTMLInputElement).value; @@ -28,7 +28,7 @@ export class SampleDataTextInputComponent { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = () => { - const fileTypeError = this.checkFileType(file); + const fileTypeError = this._checkFileType(file); if (fileTypeError) { return; } @@ -38,7 +38,7 @@ export class SampleDataTextInputComponent { reader.readAsText(file); } - private checkFileType(file: File) { + private _checkFileType(file: File) { if (!file) { return false; } @@ -47,7 +47,7 @@ export class SampleDataTextInputComponent { const fileTypes = ['text/plain', 'text/csv']; if (!fileExt.find(ext => ext === extension.toLowerCase()) || !fileTypes.find(type => file.type === type)) { - this.messageService.create('error', 'The file must be a .txt or .csv'); + this._messageService.create('error', 'The file must be a .txt or .csv'); return true; } return false; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.spec.ts index 859a0c67f..06de2de6a 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.spec.ts @@ -12,7 +12,7 @@ import { HttpClient } from '@angular/common/http'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import {TestBed, waitForAsync} from '@angular/core/testing'; +import {TestBed} from '@angular/core/testing'; import { SampleDataType } from '../models/sample-data.model'; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.ts index b0c09e247..5b31e5f80 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/live-view.service.ts @@ -22,19 +22,19 @@ import { SampleDataModel, SampleDataRequestModel } from '../models/sample-data.m }) export class LiveViewService { - readonly SAMPLE_PARSER_URL = '/api/v1/parserconfig/tests'; + static readonly SAMPLE_PARSER_URL = '/api/v1/parserconfig/tests'; constructor( - private http: HttpClient, + private _http: HttpClient, ) { } - execute(sampleData: SampleDataModel, chainConfig: {}): Observable<{ results: EntryParsingResultModel[]}> { + execute(sampleData: SampleDataModel, chainConfig: unknown): Observable<{ results: EntryParsingResultModel[]}> { const sampleDataRequest: SampleDataRequestModel = { ...sampleData, source: sampleData.source.trimEnd().split('\n') }; - return this.http.post<{ results: EntryParsingResultModel[]}>( - this.SAMPLE_PARSER_URL, + return this._http.post<{ results: EntryParsingResultModel[]}>( + LiveViewService.SAMPLE_PARSER_URL, { sampleData: sampleDataRequest, chainConfig } as LiveViewRequestModel); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/sample-data-text-folder-input.service.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/sample-data-text-folder-input.service.ts index ab2091651..b5d7f34aa 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/sample-data-text-folder-input.service.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/services/sample-data-text-folder-input.service.ts @@ -24,27 +24,27 @@ import {concatAll, map, reduce} from "rxjs/operators"; }) export class SampleDataTextFolderInputService { - readonly SAMPLE_FOLDER_PARSER_URL = '/api/v1/parserconfig/tests/samples/'; + static readonly SAMPLE_FOLDER_PARSER_URL = '/api/v1/parserconfig/tests/samples/'; constructor( - private http: HttpClient, - private liveViewService: LiveViewService, + private _http: HttpClient, + private _liveViewService: LiveViewService, ) { } - runTests(sampleDataList: SampleDataInternalModel[], chainConfig: {}): Observable> { - let resultList: Observable<{ + runTests(sampleDataList: SampleDataInternalModel[], chainConfig: unknown): Observable> { + const resultList: Observable<{ id: number, sample: SampleDataInternalModel, results: EntryParsingResultModel[] }>[] = [] sampleDataList.forEach(value => { - let sample: SampleDataModel = { + const sample: SampleDataModel = { source: value.source, type: SampleDataType.MANUAL } - let postObservable = this.liveViewService.execute(sample, chainConfig) + const postObservable = this._liveViewService.execute(sample, chainConfig) .pipe(map(res => { return { id: value.id, @@ -60,15 +60,15 @@ export class SampleDataTextFolderInputService { } fetchSamples(folderPath: string, chainId: string): Observable { - return this.http.post( - this.SAMPLE_FOLDER_PARSER_URL + chainId, - {folderPath: folderPath}); + return this._http.post( + SampleDataTextFolderInputService.SAMPLE_FOLDER_PARSER_URL + chainId, + {folderPath}); } saveSamples(folderPath: string, chainId: string, sampleList: SampleDataInternalModel[]): Observable { - return this.http.put( - this.SAMPLE_FOLDER_PARSER_URL + chainId, - {folderPath: folderPath, sampleList: sampleList} + return this._http.put( + SampleDataTextFolderInputService.SAMPLE_FOLDER_PARSER_URL + chainId, + {folderPath, sampleList} ) } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/stack-trace/stack-trace.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/stack-trace/stack-trace.component.spec.ts index 9959eb558..512c0cbc9 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/stack-trace/stack-trace.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/stack-trace/stack-trace.component.spec.ts @@ -10,10 +10,10 @@ * limitations governing your use of the file. */ -import {async, ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import { NzPopoverModule } from 'ng-zorro-antd/popover'; +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import {NzPopoverModule} from 'ng-zorro-antd/popover'; -import { StackTraceComponent } from './stack-trace.component'; +import {StackTraceComponent} from './stack-trace.component'; describe('StackTraceComponent', () => { let component: StackTraceComponent; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/text-diff-view/text-diff-view.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/text-diff-view/text-diff-view.component.spec.ts index 5df1ab20d..bf956a824 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/text-diff-view/text-diff-view.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/live-view/text-diff-view/text-diff-view.component.spec.ts @@ -2,7 +2,6 @@ import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import { TextDiffViewComponent } from './text-diff-view.component'; import {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA} from "@angular/core"; -import {MonacoEditorModule} from "ngx-monaco-editor-v2"; describe('TextDiffViewComponent', () => { let component: TextDiffViewComponent; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.spec.ts index dd335777d..1fe57f053 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.spec.ts @@ -10,39 +10,23 @@ * limitations governing your use of the file. */ -import { Component, Input } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import { StoreModule } from '@ngrx/store'; import * as fromReducers from '../../chain-page.reducers'; import { ParserComposerComponent } from './parser-composer.component'; +import {MockComponent} from "ng-mocks"; +import {ParserComponent} from "../parser/parser.component"; +import {RouterComponent} from "../router/router.component"; -@Component({ - selector: 'app-parser', - template: '' -}) -class MockParserComponent { - @Input() dirty = false; - @Input() parser : any; - @Input() configForm : any; - @Input() isolatedParserView : any; - @Input() parserType : any; - @Input() failedParser : any; - @Input() collapsed : any; -} -@Component({ - selector: 'app-router', - template: '' -}) -class MockRouterComponent extends MockParserComponent {} describe('ParserComposerComponent', () => { let component: ParserComposerComponent; let fixture: ComponentFixture; - beforeEach(async(() => { + beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ imports: [ StoreModule.forRoot({ @@ -51,8 +35,8 @@ describe('ParserComposerComponent', () => { ], declarations: [ ParserComposerComponent, - MockParserComponent, - MockRouterComponent + MockComponent(ParserComponent), + MockComponent(RouterComponent) ] }) .compileComponents(); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.ts index 75a335f70..642313653 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser-composer/parser-composer.component.ts @@ -50,17 +50,17 @@ export class ParserComposerComponent implements OnInit { isolatedParserView = false; constructor( - private store: Store + private _store: Store ) { } ngOnInit() { - this.store.pipe(select(getParser({ + this._store.pipe(select(getParser({ id: this.parserId }))).subscribe((parser) => { this.parser = parser; if (parser) { - this.store.pipe(select(getFormConfigByType({type: parser.type}))) + this._store.pipe(select(getFormConfigByType({type: parser.type}))) .subscribe((descriptor: ParserDescriptor) => { if (descriptor) { this.configForm = descriptor.schemaItems; @@ -70,7 +70,7 @@ export class ParserComposerComponent implements OnInit { } }); - this.store + this._store .pipe(select(getParserToBeInvestigated)) .subscribe(id => this.isolatedParserView = !!id); } @@ -80,7 +80,7 @@ export class ParserComposerComponent implements OnInit { } onParserChange(partialParser) { - this.store.dispatch( + this._store.dispatch( new fromActions.UpdateParserAction({ chainId: this.chainId, parser: partialParser @@ -96,7 +96,7 @@ export class ParserComposerComponent implements OnInit { onRouteAdd(parser: ParserModel) { const chainId = uuidv1(); const routeId = uuidv1(); - this.store.dispatch( + this._store.dispatch( new fromActions.AddChainAction({ chain: { id: chainId, @@ -104,7 +104,7 @@ export class ParserComposerComponent implements OnInit { } }) ); - this.store.dispatch( + this._store.dispatch( new fromActions.AddRouteAction({ chainId, parserId: parser.id, diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/advanced-editor/advanced-editor.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/advanced-editor/advanced-editor.component.ts index 6cbb4f7f8..f3c1f57db 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/advanced-editor/advanced-editor.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/advanced-editor/advanced-editor.component.ts @@ -14,7 +14,7 @@ import {Component, EventEmitter, Input, OnChanges, Output, SimpleChanges} from ' import {isEqual} from 'lodash'; export interface ConfigChangedEvent { - value: {}; + value: unknown; } @Component({ @@ -25,7 +25,7 @@ export interface ConfigChangedEvent { export class AdvancedEditorComponent implements OnChanges { @Input() config = {}; - @Input() isReadOnly: boolean = false; + @Input() isReadOnly = false; @Output() configChanged = new EventEmitter(); monacoOptions = { @@ -45,7 +45,7 @@ export class AdvancedEditorComponent implements OnChanges { ngOnChanges(changes: SimpleChanges): void { if (changes.isReadOnly !== undefined){ - this.monacoOptions["readOnly"]= this.isReadOnly; + this.monacoOptions.readOnly= this.isReadOnly; } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/parser.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/parser.component.ts index 150a4e317..220d03d5e 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/parser.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/parser/parser.component.ts @@ -127,20 +127,48 @@ export class ParserComponent implements OnInit, OnChanges { }); } - private updateRegularParserWithFormData(parser: ParserModel, formFieldData: CustomFormConfig) { + + onCustomFormChange(parser: ParserModel, formFieldData: CustomFormConfig) { + let partialParser; + if (formFieldData.multiple) { + partialParser = this._updateMultiValueParserWithFormData(parser, formFieldData); + } else { + partialParser = this._updateRegularParserWithFormData(parser, formFieldData); + } + + this.dirty = true; + this.parserChange.emit(partialParser); + } + + onRemoveParser(parserId: string) { + this.removeParser.emit(parserId); + } + + onAdvancedEditorChanged(event: ConfigChangedEvent) { + this.parserChange.emit({ id: this.parser.id, config: event.value }); + } + + onParserNameChange(name: string) { + this.parserChange.emit({ id: this.parser.id, name }); + } + + preventCollapse(event: Event) { + event.stopPropagation(); + } + private _updateRegularParserWithFormData(parser: ParserModel, formFieldData: CustomFormConfig) { return formFieldData.path ? produce(parser, (draftParser) => { - set({ - ...draftParser - }, [formFieldData.path, formFieldData.name].join('.'), formFieldData.value); - }) + set({ + ...draftParser + }, [formFieldData.path, formFieldData.name].join('.'), formFieldData.value); + }) : { id: parser.id, [formFieldData.name]: formFieldData.value }; } - private updateMultiValueParserWithFormData(parser: ParserModel, formFieldData: CustomFormConfig) { + private _updateMultiValueParserWithFormData(parser: ParserModel, formFieldData: CustomFormConfig) { let current; if (formFieldData.path) { current = get(parser, formFieldData.path); @@ -193,33 +221,4 @@ export class ParserComponent implements OnInit, OnChanges { }); } } - - onCustomFormChange(parser: ParserModel, formFieldData: CustomFormConfig) { - let partialParser; - if (formFieldData.multiple) { - partialParser = this.updateMultiValueParserWithFormData(parser, formFieldData); - } else { - partialParser = this.updateRegularParserWithFormData(parser, formFieldData); - } - - this.dirty = true; - this.parserChange.emit(partialParser); - } - - onRemoveParser(parserId: string) { - this.removeParser.emit(parserId); - } - - onAdvancedEditorChanged(event: ConfigChangedEvent) { - this.parserChange.emit({ id: this.parser.id, config: event.value }); - } - - onParserNameChange(name: string) { - this.parserChange.emit({ id: this.parser.id, name }); - } - - preventCollapse(event: Event) { - event.stopPropagation(); - } - } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.spec.ts index a0fa22b88..dd7269167 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.spec.ts @@ -10,17 +10,17 @@ * limitations governing your use of the file. */ -import {async, ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; -import { DeleteFill, EditFill } from '@ant-design/icons-angular/icons'; -import { Store, StoreModule } from '@ngrx/store'; -import { provideMockStore } from '@ngrx/store/testing'; -import { NzModalModule } from 'ng-zorro-antd/modal'; -import { NZ_ICONS } from 'ng-zorro-antd/icon' +import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; +import {DeleteFill, EditFill} from '@ant-design/icons-angular/icons'; +import {Store, StoreModule} from '@ngrx/store'; +import {provideMockStore} from '@ngrx/store/testing'; +import {NzModalModule} from 'ng-zorro-antd/modal'; +import {NZ_ICONS} from 'ng-zorro-antd/icon'; import * as fromActions from '../../chain-page.actions'; import * as fromReducers from '../../chain-page.reducers'; -import { RouteComponent } from './route.component'; +import {RouteComponent} from './route.component'; import {NzFormModule} from "ng-zorro-antd/form"; describe('RouteComponent', () => { diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.ts index 7fa709ba9..5c31f9927 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/chain-page/components/route/route.component.ts @@ -35,18 +35,18 @@ export class RouteComponent implements OnInit, OnDestroy { getChainSub: Subscription; constructor( - private store: Store, + private _store: Store, ) { } ngOnInit() { - this.getRouteSub = this.store.pipe(select(getRoute({ + this.getRouteSub = this._store.pipe(select(getRoute({ id: this.routeId }))).subscribe((route) => { this.route = route; if (route && route.subchain) { const id = typeof route.subchain === 'string' ? route.subchain : route.subchain.id; - this.getChainSub = this.store.pipe(select(getChain({id}))) + this.getChainSub = this._store.pipe(select(getChain({id}))) .subscribe((subchain) => { this.subchain = subchain; }); @@ -61,7 +61,7 @@ export class RouteComponent implements OnInit, OnDestroy { onMatchingValueBlur(event: Event, route: RouteModel) { const matchingValue = ((event.target as HTMLInputElement).value || '').trim(); if (matchingValue !== route.matchingValue) { - this.store.dispatch( + this._store.dispatch( new fromActions.UpdateChainAction({ chain: { id: this.subchain.id, @@ -69,7 +69,7 @@ export class RouteComponent implements OnInit, OnDestroy { } }) ); - this.store.dispatch( + this._store.dispatch( new fromActions.UpdateRouteAction({ chainId: this.subchain.id, parserId: this.parser.id, @@ -83,7 +83,7 @@ export class RouteComponent implements OnInit, OnDestroy { } onRouteRemoveConfirmed(event: Event, route: RouteModel) { - this.store.dispatch( + this._store.dispatch( new fromActions.RemoveRouteAction({ chainId: this.subchain.id, parserId: this.parser.id, @@ -93,7 +93,7 @@ export class RouteComponent implements OnInit, OnDestroy { } onDefaultCheckboxChange(event: Event, route: RouteModel) { - this.store.dispatch( + this._store.dispatch( new fromActions.SetRouteAsDefaultAction({ chainId: this.subchain.id, parserId: this.parser.id, diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.spec.ts index ee2265578..b0259ddac 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.spec.ts @@ -8,7 +8,6 @@ import {AdvancedEditorComponent} from "../../../chain-page/components/parser/adv describe('JsonEditorPopupComponent', () => { let component: JsonEditorPopupComponent; let fixture: ComponentFixture; - let dialogRef: MatDialogRef; beforeEach(waitForAsync(() => { TestBed.configureTestingModule({ @@ -33,7 +32,6 @@ describe('JsonEditorPopupComponent', () => { beforeEach(() => { fixture = TestBed.createComponent(JsonEditorPopupComponent); component = fixture.componentInstance; - dialogRef = TestBed.inject(MatDialogRef); fixture.detectChanges(); }); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.ts index 6f4313443..422c60ea8 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/components/popup/json-editor-popup/json-editor-popup.component.ts @@ -9,7 +9,7 @@ import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; export class JsonEditorPopupComponent { constructor(public dialogRef: MatDialogRef, - @Inject(MAT_DIALOG_DATA) public json: {}) { } + @Inject(MAT_DIALOG_DATA) public json: unknown) { } closeDialog() { this.dialogRef.close(); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/misc/autofocus.directive.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/misc/autofocus.directive.ts index 6e5d9117f..f28d2ad55 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/misc/autofocus.directive.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/misc/autofocus.directive.ts @@ -17,9 +17,9 @@ import {AfterViewInit, Directive, ElementRef} from '@angular/core'; }) export class AutofocusDirective implements AfterViewInit { - constructor(private el: ElementRef) {} + constructor(private _el: ElementRef) {} ngAfterViewInit() { - this.el.nativeElement.focus(); + this._el.nativeElement.focus(); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-add-parser-page.service.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-add-parser-page.service.ts index 205f2a64a..efb9d9be5 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-add-parser-page.service.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-add-parser-page.service.ts @@ -21,22 +21,22 @@ import { ParserModel } from '../chain-page/chain-page.models'; }) export class AddParserPageService { - private readonly BASE_URL = '/api/v1/parserconfig/'; + static readonly BASE_URL = '/api/v1/parserconfig/'; constructor( - private http: HttpClient + private _http: HttpClient ) {} public add(chainId: string, parser: ParserModel) { - return this.http.post(this.BASE_URL + `chains/${chainId}/parsers`, parser); + return this._http.post(AddParserPageService.BASE_URL + `chains/${chainId}/parsers`, parser); } public getParserTypes() { - return this.http.get<{ id: string, name: string }[]>(this.BASE_URL + `parser-types`); + return this._http.get<{ id: string, name: string }[]>(AddParserPageService.BASE_URL + `parser-types`); } public getParsers(chainId: string){ - return this.http.get(this.BASE_URL + `chains/${chainId}/parsers`) + return this._http.get(AddParserPageService.BASE_URL + `chains/${chainId}/parsers`) .pipe( map((parsers: ParserModel[]) => { return parsers; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.spec.ts index 47e420a7f..893a91bdf 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.spec.ts @@ -57,6 +57,7 @@ describe('ChainListPageService', () => { const service: ChainListPageService = TestBed.get(ChainListPageService); expect(service).toBeTruthy(); }); + describe('getChainList()', () => { it('should return an Observable', () => { const responseMock: ChainModel[] = chainListMockResponse; diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.ts index 66cfcc7aa..ba2d12fe0 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-list-page.service.ts @@ -20,22 +20,22 @@ import {ChainModel, ChainOperationalModel} from '../chain-list-page/chain.model' }) export class ChainListPageService { - private readonly BASE_URL = '/api/v1/parserconfig/'; + static readonly BASE_URL = '/api/v1/parserconfig/'; constructor( - private http: HttpClient + private _http: HttpClient ) {} public createChain(chain: ChainOperationalModel) { - return this.http.post('/api/v1/parserconfig/chains', chain); + return this._http.post('/api/v1/parserconfig/chains', chain); } public getChains(params = null) { - return this.http.get(this.BASE_URL + 'chains'); + return this._http.get(ChainListPageService.BASE_URL + 'chains'); } public deleteChain(chainId: string) { - return this.http.delete(this.BASE_URL + 'chains/' + chainId); + return this._http.delete(ChainListPageService.BASE_URL + 'chains/' + chainId); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-page.service.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-page.service.ts index 0590744c9..bcbfd5c97 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-page.service.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/chain-page.service.ts @@ -21,49 +21,50 @@ import {ParserDescriptor} from "../chain-page/chain-page.reducers"; providedIn: 'root' }) export class ChainPageService { - private parserChainCollapseState: BehaviorSubject; - private parserChainSize: number; - private readonly BASE_URL = '/api/v1/parserconfig/'; - public collapseAll = new BehaviorSubject(false); + static readonly BASE_URL = '/api/v1/parserconfig/'; + public collapseAll = new BehaviorSubject(false); + private _parserChainCollapseState: BehaviorSubject; + private _parserChainSize: number; + constructor( - private http: HttpClient + private _http: HttpClient ) {} public getChain(id: string) { - return this.http.get(this.BASE_URL + `chains/${id}`); + return this._http.get(ChainPageService.BASE_URL + `chains/${id}`); } public getParsers(id: string) { - return this.http.get(this.BASE_URL + `chains/${id}/parsers`); + return this._http.get(ChainPageService.BASE_URL + `chains/${id}/parsers`); } public saveParserConfig(chainId: string, config: ChainDetailsModel) { - return this.http.put(this.BASE_URL + `chains/${chainId}`, config); + return this._http.put(ChainPageService.BASE_URL + `chains/${chainId}`, config); } public getFormConfig(type: string) { - return this.http.get(this.BASE_URL + `parser-form-configuration/${type}`); + return this._http.get(ChainPageService.BASE_URL + `parser-form-configuration/${type}`); } public getFormConfigs() { - return this.http.get<{[key: string] : ParserDescriptor}>(this.BASE_URL + `parser-form-configuration`); + return this._http.get<{[key: string] : ParserDescriptor}>(ChainPageService.BASE_URL + `parser-form-configuration`); } public getIndexMappings(payload?: { filePath: string} ) { - let finalPayload = payload ? payload : {} - return this.http.post(this.BASE_URL + `indexing`, finalPayload); + const finalPayload = payload ? payload : {} + return this._http.post(ChainPageService.BASE_URL + `indexing`, finalPayload); } public createChainCollapseArray(size: number) { - this.parserChainSize = size; - this.parserChainCollapseState = new BehaviorSubject(new Array(this.parserChainSize).fill(false)); + this._parserChainSize = size; + this._parserChainCollapseState = new BehaviorSubject(new Array(this._parserChainSize).fill(false)); } public getCollapseExpandState() { - return this.parserChainCollapseState; + return this._parserChainCollapseState; } public collapseExpandAllParsers() { this.collapseAll.next(!this.collapseAll.value); - this.parserChainCollapseState.next(new Array(this.parserChainSize).fill(this.collapseAll.value)); + this._parserChainCollapseState.next(new Array(this._parserChainSize).fill(this.collapseAll.value)); } } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.spec.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.spec.ts index 8cf538808..1d0e43df1 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.spec.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.spec.ts @@ -12,7 +12,7 @@ import { TestBed } from '@angular/core/testing'; -import { MonacoEditorService } from './monaco-editor.service'; +import {MonacoEditorService, MonacoWindow} from './monaco-editor.service'; describe('MonacoEditorService', () => { let service: MonacoEditorService; @@ -21,13 +21,13 @@ describe('MonacoEditorService', () => { TestBed.configureTestingModule({ providers: [ MonacoEditorService ] }); - service = TestBed.get(MonacoEditorService); + service = TestBed.inject(MonacoEditorService); }); it('should register a model once with the given schema', () => { // mocking the monaco object in the global namespace (window) const modelToCreate = {}; - (window as any).monaco = { + (window as MonacoWindow).monaco = { languages: { json: { jsonDefaults: { diagnosticsOptions: { schemas: [] } } } }, Uri: { parse: (val) => val }, editor: { createModel: () => modelToCreate } diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.ts index 118822004..32fcc00ba 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/services/monaco-editor.service.ts @@ -11,11 +11,12 @@ */ import { Injectable } from '@angular/core'; +export type MonacoWindow = Window & typeof globalThis & { monaco: any }; @Injectable() export class MonacoEditorService { - private registeredSchemas = {}; + private _registeredSchemas = {}; /** * Creates a model with the given schema and store it. Returns with @@ -25,25 +26,25 @@ export class MonacoEditorService { public registerSchema(uri: string, schema: any, options: { value?: string } = {}) { - if (!this.registeredSchemas[uri]) { - const { monaco } = window as any; + if (!this._registeredSchemas[uri]) { + const { monaco } = window as MonacoWindow; monaco.languages.json.jsonDefaults.diagnosticsOptions.schemas.push(schema); - const model = this.createModel(monaco, uri, options); - this.registeredSchemas[uri] = model; + const model = this._createModel(monaco, uri, options); + this._registeredSchemas[uri] = model; return model; } - return this.registeredSchemas[uri]; + return this._registeredSchemas[uri]; } public getModel(uri: string) { - return this.registeredSchemas[uri] || null; + return this._registeredSchemas[uri] || null; } /** * Internal function to generate a model using the appropriate helper * function in the monaco object. */ - private createModel(monaco, uri, options: { + private _createModel(monaco, uri, options: { value?: string } = {}) { const modelUri = monaco.Uri.parse(uri); diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/components/multibutton/multi-button.component.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/components/multibutton/multi-button.component.ts index ddfe604ab..217d2d0c4 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/components/multibutton/multi-button.component.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/components/multibutton/multi-button.component.ts @@ -1,7 +1,7 @@ import {Component, EventEmitter, Input, Output, ViewChild} from '@angular/core'; import {MatButtonToggleGroup} from "@angular/material/button-toggle"; -type button = { +type MultiButton = { label: string, value: string, } @@ -14,7 +14,7 @@ type button = { ] }) export class MultiButtonComponent { - @Input() buttons: button[] = [ + @Input() buttons: MultiButton[] = [ {label: 'Archive', value: 'Archive'}, {label: 'Git', value: 'Git'}, {label: 'Manual', value: 'Manual'}, diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/utils.ts b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/utils.ts index 0addffd3c..080f3debe 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/utils.ts +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/src/app/shared/utils.ts @@ -13,10 +13,25 @@ export const convertToString = (value: string | ArrayBuffer | null): string => { } else if (value instanceof ArrayBuffer) { // Convert ArrayBuffer to string // Assuming the ArrayBuffer contains text data encoded in UTF-8 - let decoder = new TextDecoder('utf-8'); + const decoder = new TextDecoder('utf-8'); return decoder.decode(new Uint8Array(value)); } else { // It's already a string, return as is return value; } } + +/** + * Get a property from an object. + * If the object has the property, return the property value. + * Otherwise, return null. + * + * @param obj + * @param key + */ +export const getObjProp= (obj: any, key: string): any => { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + return obj[key]; + } + return null; +} diff --git a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/tslint.json b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/tslint.json index e8584fac3..fc8d0fc65 100644 --- a/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/tslint.json +++ b/flink-cyber/metron-parser-chain/parser-chains-config-service/frontend/parser-chains-client/tslint.json @@ -44,7 +44,6 @@ "ignore-params" ], "no-non-null-assertion": true, - "no-redundant-jsdoc": true, "no-switch-case-fall-through": true, "no-use-before-declare": true, "no-var-requires": false,