diff --git a/.gitignore b/.gitignore index 3b36f2b40e9fa..0d98d16b079ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.eslintcache .cache scalastyle-output.xml .classpath diff --git a/flink-runtime-web/pom.xml b/flink-runtime-web/pom.xml index 57b9510bd09f0..ac8dc37bf6dec 100644 --- a/flink-runtime-web/pom.xml +++ b/flink-runtime-web/pom.xml @@ -17,7 +17,7 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> - 4.0.0 @@ -260,7 +260,7 @@ under the License. com.github.eirslett frontend-maven-plugin - 1.6 + 1.9.1 install node and npm @@ -269,6 +269,7 @@ under the License. v12.14.1 + 6.13.4 @@ -284,12 +285,12 @@ under the License. - npm run build + npm run ci-check npm - run build + run ci-check diff --git a/flink-runtime-web/src/main/resources/META-INF/NOTICE b/flink-runtime-web/src/main/resources/META-INF/NOTICE index 1f433fbdd0ec9..5ebd2008cf271 100644 --- a/flink-runtime-web/src/main/resources/META-INF/NOTICE +++ b/flink-runtime-web/src/main/resources/META-INF/NOTICE @@ -1632,4 +1632,3 @@ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to http://unlicense.org/ - diff --git a/flink-runtime-web/web-dashboard/.eslintignore b/flink-runtime-web/web-dashboard/.eslintignore new file mode 100644 index 0000000000000..8a6dedf35589c --- /dev/null +++ b/flink-runtime-web/web-dashboard/.eslintignore @@ -0,0 +1,28 @@ +.idea +gen +web +tsc-out +dist + +# Logs +logs +*.log +npm-debug.log* + +# Dependency directories +node_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# dotenv environment variables file +.env +.env.test + +.cache diff --git a/flink-runtime-web/web-dashboard/.eslintrc.js b/flink-runtime-web/web-dashboard/.eslintrc.js new file mode 100644 index 0000000000000..49bf8b6026220 --- /dev/null +++ b/flink-runtime-web/web-dashboard/.eslintrc.js @@ -0,0 +1,145 @@ +module.exports = { + root: true, + overrides: [ + { + files: ['*.ts'], + parser: '@typescript-eslint/parser', + parserOptions: { + ecmaVersion: 2021, + sourceType: 'module', + tsconfigRootDir: __dirname, + project: ['tsconfig.json'], + createDefaultProgram: true + }, + plugins: ['@typescript-eslint', 'jsdoc', 'import', 'unused-imports'], + extends: [ + 'plugin:@angular-eslint/recommended', + 'plugin:@angular-eslint/template/process-inline-templates', + 'plugin:prettier/recommended' + ], + rules: { + 'jsdoc/newline-after-description': 1, + '@angular-eslint/no-host-metadata-property': 'off', + '@typescript-eslint/no-explicit-any': 'error', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/array-type': [ + 'error', + { + default: 'array-simple' + } + ], + '@typescript-eslint/ban-types': [ + 'error', + { + types: { + Object: { + message: 'Use {} instead.' + }, + String: { + message: 'Use string instead.' + }, + Number: { + message: 'Use number instead.' + }, + Boolean: { + message: 'Use boolean instead.' + }, + Function: { + message: 'Use specific callable interface instead.' + } + } + } + ], + '@typescript-eslint/consistent-type-definitions': 'error', + '@typescript-eslint/explicit-member-accessibility': [ + 'off', + { + accessibility: 'explicit' + } + ], + '@typescript-eslint/no-floating-promises': 'off', + '@typescript-eslint/no-for-in-array': 'error', + '@typescript-eslint/no-inferrable-types': [ + 'error', + { + ignoreParameters: true, + ignoreProperties: true + } + ], + '@typescript-eslint/no-this-alias': 'error', + '@typescript-eslint/naming-convention': 'off', + '@typescript-eslint/no-unused-expressions': 'off', + '@typescript-eslint/explicit-function-return-type': [ + 'error', + { + allowExpressions: true, + allowConciseArrowFunctionExpressionsStartingWithVoid: true + } + ], + 'prefer-arrow/prefer-arrow-functions': 'off', + 'unused-imports/no-unused-imports': 'error', + 'import/no-duplicates': 'error', + 'import/no-unused-modules': 'error', + 'import/no-unassigned-import': ['error', { allow: ['@angular/localize/init', 'zone.js', 'zone.js/**'] }], + 'import/order': [ + 'error', + { + alphabetize: { + order: 'asc', + caseInsensitive: false + }, + 'newlines-between': 'always', + groups: ['external', 'builtin', 'internal', ['parent', 'sibling', 'index']], + pathGroups: [ + { + pattern: '{@angular/**,rxjs,rxjs/operators}', + group: 'external', + position: 'before' + }, + { + pattern: '{services,interfaces,utils,config}', + group: 'internal', + position: 'before' + } + ], + pathGroupsExcludedImportTypes: [] + } + ], + 'no-empty-function': 'off', + 'no-unused-expressions': 'error', + 'no-use-before-define': 'off', + 'no-bitwise': 'off', + 'no-duplicate-imports': 'error', + 'no-invalid-this': 'off', + 'no-irregular-whitespace': 'error', + 'no-magic-numbers': 'off', + 'no-multiple-empty-lines': 'error', + 'no-redeclare': 'off', + 'no-underscore-dangle': 'off', + 'no-sparse-arrays': 'error', + 'no-template-curly-in-string': 'off', + 'prefer-object-spread': 'error', + 'prefer-template': 'error', + yoda: 'error' + } + }, + { + files: ['*.html'], + extends: ['plugin:@angular-eslint/template/recommended'], + rules: {} + }, + { + files: ['*.html'], + excludedFiles: ['*inline-template-*.component.html'], + extends: ['plugin:prettier/recommended'], + rules: { + 'prettier/prettier': [ + 'error', + { + parser: 'angular' + } + ] + } + } + ] +}; diff --git a/flink-runtime-web/web-dashboard/.prettierignore b/flink-runtime-web/web-dashboard/.prettierignore index 48e6f6b353023..ed9bcfd39ccfb 100644 --- a/flink-runtime-web/web-dashboard/.prettierignore +++ b/flink-runtime-web/web-dashboard/.prettierignore @@ -1,6 +1,5 @@ -**/*.md **/*.svg -**/*.html **/test.ts -**/*.less package.json +web/ +node_modules/ diff --git a/flink-runtime-web/web-dashboard/.prettierrc b/flink-runtime-web/web-dashboard/.prettierrc index 76e058ebaaf3b..bf61f4b7b7af8 100644 --- a/flink-runtime-web/web-dashboard/.prettierrc +++ b/flink-runtime-web/web-dashboard/.prettierrc @@ -1,14 +1,26 @@ { "singleQuote": true, + "useTabs": false, "printWidth": 120, "tabWidth": 2, - "useTabs": false, + "semi": true, + "htmlWhitespaceSensitivity": "ignore", + "arrowParens": "avoid", + "bracketSpacing": true, + "proseWrap": "preserve", + "trailingComma": "none", "overrides": [ { "files": ".prettierrc", "options": { "parser": "json" } + }, + { + "files": "*.html", + "options": { + "printWidth": 100 + } } ] } diff --git a/flink-runtime-web/web-dashboard/.stylelintignore b/flink-runtime-web/web-dashboard/.stylelintignore new file mode 100644 index 0000000000000..ed9bcfd39ccfb --- /dev/null +++ b/flink-runtime-web/web-dashboard/.stylelintignore @@ -0,0 +1,5 @@ +**/*.svg +**/test.ts +package.json +web/ +node_modules/ diff --git a/flink-runtime-web/web-dashboard/.stylelintrc.js b/flink-runtime-web/web-dashboard/.stylelintrc.js new file mode 100644 index 0000000000000..7928cf9d165f9 --- /dev/null +++ b/flink-runtime-web/web-dashboard/.stylelintrc.js @@ -0,0 +1,23 @@ +module.exports = { + plugins: ['stylelint-order'], + extends: ['stylelint-config-standard', 'stylelint-config-hudochenkov/order', 'stylelint-prettier/recommended'], + rules: { + 'prettier/prettier': [ + true, + { + singleQuote: false + } + ], + 'no-empty-source': null, + 'no-descending-specificity': null, + 'no-invalid-position-at-import-rule': null, + 'function-calc-no-invalid': null, + 'font-family-no-missing-generic-family-keyword': null, + 'selector-pseudo-element-no-unknown': [ + true, + { + ignorePseudoElements: ['ng-deep'] + } + ] + } +}; diff --git a/flink-runtime-web/web-dashboard/angular.json b/flink-runtime-web/web-dashboard/angular.json index 1bebc628bae98..8784e25d9b61c 100644 --- a/flink-runtime-web/web-dashboard/angular.json +++ b/flink-runtime-web/web-dashboard/angular.json @@ -35,7 +35,9 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "allowedCommonJsDependencies": ["dagre"], + "allowedCommonJsDependencies": [ + "dagre" + ], "outputPath": "web", "index": "src/index.html", "main": "src/main.ts", @@ -49,9 +51,13 @@ "output": "libs/vs" } ], - "styles": ["src/styles/index.less"], + "styles": [ + "src/styles/index.less" + ], "stylePreprocessorOptions": { - "includePaths": ["src/styles"] + "includePaths": [ + "src/styles" + ] }, "scripts": [], "vendorChunk": true, @@ -115,20 +121,31 @@ "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.spec.json", "karmaConfig": "src/karma.conf.js", - "styles": ["src/styles/index.less"], + "styles": [ + "src/styles/index.less" + ], "scripts": [], - "assets": ["src/favicon.ico", "src/assets"] + "assets": [ + "src/favicon.ico", + "src/assets" + ] } }, "lint": { - "builder": "@angular-devkit/build-angular:tslint", + "builder": "@angular-eslint/builder:lint", "options": { - "tsConfig": ["src/tsconfig.app.json", "src/tsconfig.spec.json"], - "exclude": ["**/node_modules/**"] + "fix": true, + "lintFilePatterns": [ + "src/**/*.ts", + "src/**/*.html" + ] } } } } }, - "defaultProject": "flink" + "defaultProject": "flink", + "cli": { + "defaultCollection": "@angular-eslint/schematics" + } } diff --git a/flink-runtime-web/web-dashboard/package-lock.json b/flink-runtime-web/web-dashboard/package-lock.json index dfa60615e22f4..9c2844257b739 100644 --- a/flink-runtime-web/web-dashboard/package-lock.json +++ b/flink-runtime-web/web-dashboard/package-lock.json @@ -30,6 +30,11 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~12.1.3", + "@angular-eslint/builder": "12.3.1", + "@angular-eslint/eslint-plugin": "12.3.1", + "@angular-eslint/eslint-plugin-template": "12.3.1", + "@angular-eslint/schematics": "12.3.1", + "@angular-eslint/template-parser": "12.3.1", "@angular/cli": "~12.1.3", "@angular/compiler-cli": "~12.1.3", "@angular/language-service": "~12.1.3", @@ -38,7 +43,15 @@ "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", - "codelyzer": "^6.0.0", + "@typescript-eslint/eslint-plugin": "4.28.2", + "@typescript-eslint/parser": "4.28.2", + "eslint": "^7.26.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "latest", + "eslint-plugin-jsdoc": "latest", + "eslint-plugin-prefer-arrow": "latest", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-unused-imports": "^1.1.4", "husky": "^1.3.1", "jasmine-core": "~3.8.0", "jasmine-spec-reporter": "~5.0.0", @@ -47,11 +60,16 @@ "karma-coverage": "~2.0.3", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "lint-staged": "^8.1.5", + "lint-staged": "^11.1.2", "prettier": "^1.16.4", "protractor": "~7.0.0", + "stylelint": "^13.13.1", + "stylelint-config-hudochenkov": "^5.0.0", + "stylelint-config-prettier": "^8.0.2", + "stylelint-config-standard": "^22.0.0", + "stylelint-order": "^4.1.0", + "stylelint-prettier": "^1.2.0", "ts-node": "~7.0.0", - "tslint": "~6.1.0", "typescript": "~4.3.5" } }, @@ -291,6 +309,111 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-eslint/builder": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-12.3.1.tgz", + "integrity": "sha512-Py7Y9n0evIWGgEIrnMaLvalE1+Nw9HoY+fcYLYd9POfY0cug8j7hbkoPQ6rM7GzNHVcVsqEi/8C4DoF7RXXNRg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": ">= 12.0.0 < 13.0.0" + }, + "peerDependencies": { + "@angular/cli": ">= 12.0.0 < 13.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.3.1.tgz", + "integrity": "sha512-KBm27onYggRcusA/BxuSkDGpVnIs8yG4ARio8ZAhe0H2XIRJTzJZ7oIBBjugDau03AGX3VMG6wAXailjJvsywg==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.28.2" + }, + "peerDependencies": { + "@angular/compiler": ">= 12.0.0 < 13.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.3.1.tgz", + "integrity": "sha512-pz+nO64ma/9Sp2aeRnQ+Vktt7Fo1Lay/J+CG//3TIc3lYsoCTj4h42P6yCcxxJ9b4N7SUxMAnchA8eE5mJS4Ug==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.28.2", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" + }, + "peerDependencies": { + "@angular/compiler": ">= 12.0.0 < 13.0.0", + "eslint": "*", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + }, + "node_modules/@angular-eslint/schematics": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-12.3.1.tgz", + "integrity": "sha512-r1yZaqyO0oJhKDIWio3gH9TWpWEN8bUpiftgkkR6Yyc4hKBbiR5N4RQo5aZ5bnGytdW8QP8zq2k1yYBWjhEX7A==", + "dev": true, + "dependencies": { + "@angular-eslint/eslint-plugin": "12.3.1", + "@angular-eslint/eslint-plugin-template": "12.3.1", + "ignore": "5.1.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "peerDependencies": { + "@angular/cli": ">= 12.0.0 < 13.0.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-12.3.1.tgz", + "integrity": "sha512-6DkXqTaVEHZdcN3isHQ2CDoTsKLuJ5C1SYEOuFzOU1Zp85SvjxO92v6gPkFPKk0iQNVRmQS2XcKef6weehUUGA==", + "dev": true, + "dependencies": { + "eslint-scope": "^5.1.0" + }, + "peerDependencies": { + "@angular/compiler": ">= 12.0.0 < 13.0.0", + "eslint": "*", + "typescript": "*" + } + }, "node_modules/@angular/animations": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.1.3.tgz", @@ -2210,6 +2333,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz", + "integrity": "sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", @@ -2306,6 +2442,143 @@ "node": ">=10.0.0" } }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.7.tgz", + "integrity": "sha512-aNKZEoMESDzOBjKxCWrFuG50mcpMeKVBnBNko4+IZZ5t9zXYs8GT1KB0ZaOq1YUsKumDRc6YII/TQm309MJ0KQ==", + "dev": true, + "dependencies": { + "comment-parser": "1.2.3", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.1.1" + }, + "engines": { + "node": "^12.20 || ^14.14.0 || ^16" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/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/eslintrc/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2470,24 +2743,196 @@ "read-package-json-fast": "^2.0.1" } }, - "node_modules/@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "node_modules/@nrwl/devkit": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-12.7.2.tgz", + "integrity": "sha512-Uk0DOkQ35sAMSMQPWNo+n4muDAueX651Seb66GSVbeHrFGNGPOM4X1iElYqocXevnMta1Q3xwragudXSdAnHkw==", "dev": true, "dependencies": { - "any-observable": "^0.3.0" + "@nrwl/tao": "12.7.2", + "ejs": "^3.1.5", + "ignore": "^5.0.4", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tslib": "^2.0.0" + } + }, + "node_modules/@nrwl/devkit/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6" + "node": ">=10" + } + }, + "node_modules/@nrwl/tao": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-12.7.2.tgz", + "integrity": "sha512-LnylUSOznJ+EDmJWu7vvQTnAERPTjKRHznShTe6eMoaJUH0ds3WSGMBxLUulzN2P5dWqO9u26GWMZpInYWwkfA==", + "dev": true, + "dependencies": { + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "fs-extra": "^9.1.0", + "jsonc-parser": "3.0.0", + "rxjs": "^6.5.4", + "rxjs-for-await": "0.0.2", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.0.0", + "yargs-parser": "20.0.0" }, - "peerDependenciesMeta": { - "rxjs": { - "optional": true - }, - "zen-observable": { - "optional": true - } + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nrwl/tao/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/@nrwl/tao/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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/@nrwl/tao/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/@nrwl/tao/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/@nrwl/tao/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/tao/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nrwl/tao/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/tao/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/tao/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@nrwl/tao/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@nrwl/tao/node_modules/yargs-parser": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", + "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==", + "dev": true, + "engines": { + "node": ">=10" } }, "node_modules/@schematics/angular": { @@ -2506,6 +2951,33 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==", + "dev": true, + "dependencies": { + "@babel/core": ">=7.9.0" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "dev": true, + "dependencies": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -2871,18 +3343,45 @@ "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", "dev": true }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/mdast": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz", + "integrity": "sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "node_modules/@types/node": { "version": "12.20.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.17.tgz", "integrity": "sha512-so8EHl4S6MmatPS0f9sE1ND94/ocbcEshW5OpyYthRqeRpiYyW2uXYTo/84kmfdfeNrDycARkvuiXl6nO40NGg==", "dev": true }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -2907,6 +3406,12 @@ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, "node_modules/@types/webpack-sources": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", @@ -2927,6 +3432,204 @@ "node": ">=0.10.0" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.2.tgz", + "integrity": "sha512-PGqpLLzHSxq956rzNGasO3GsAPf2lY9lDUBXhS++SKonglUmJypaUtcKzRtUte8CV7nruwnDxtLUKpVxs0wQBw==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.28.2", + "@typescript-eslint/scope-manager": "4.28.2", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "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/@typescript-eslint/experimental-utils": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", + "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.2.tgz", + "integrity": "sha512-Q0gSCN51eikAgFGY+gnd5p9bhhCUAl0ERMiDKrTzpSoMYRubdB8MJrTTR/BBii8z+iFwz8oihxd0RAdP4l8w8w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", + "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", + "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", + "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "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/@typescript-eslint/visitor-keys": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.28.2", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -3128,6 +3831,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -3335,15 +4047,6 @@ "node": ">=4" } }, - "node_modules/any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -3357,15 +4060,6 @@ "node": ">= 8" } }, - "node_modules/app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -3421,16 +4115,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -3464,6 +4148,25 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "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", @@ -3491,6 +4194,23 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "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", @@ -3527,11 +4247,14 @@ "node": ">=0.10.0" } }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/async": { "version": "2.6.3", @@ -3560,6 +4283,15 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -3648,15 +4380,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "node_modules/axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7" - } - }, "node_modules/babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -3759,6 +4482,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4080,15 +4813,6 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "node_modules/builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -4206,6 +4930,23 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -4266,6 +5007,36 @@ "node": ">=4" } }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -4461,63 +5232,19 @@ } }, "node_modules/cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", - "dev": true, - "dependencies": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cli-width": { @@ -4540,56 +5267,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/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/cliui/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/cliui/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/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -4613,63 +5290,36 @@ "node": ">=6" } }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "node_modules/clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", "dev": true, + "dependencies": { + "is-regexp": "^2.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/codelyzer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", - "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", - "dev": true, - "dependencies": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" - }, - "peerDependencies": { - "@angular/compiler": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", - "@angular/core": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", - "tslint": "^5.0.0 || ^6.0.0" + "node_modules/clone-regexp/node_modules/is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/codelyzer/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/codelyzer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/codelyzer/node_modules/zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -4736,6 +5386,15 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/comment-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.3.tgz", + "integrity": "sha512-vnqDwBSXSsdAkGS5NjwMIPelE47q+UkEgWKHvCDNhVIIaQSUFY6sNnEYGzdoPGMdpV+7KR3ZkRd7oyWIjtuvJg==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.14.0 || ^16" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -5036,6 +5695,17 @@ "semver": "bin/semver.js" } }, + "node_modules/core-js-pure": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.2.tgz", + "integrity": "sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -5629,16 +6299,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -5682,15 +6342,6 @@ "node": ">=0.10.0" } }, - "node_modules/cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "dependencies": { - "through": "X.X.X" - } - }, "node_modules/cssdb": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", @@ -6151,12 +6802,6 @@ "lodash": "^4.17.15" } }, - "node_modules/damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", - "dev": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6169,12 +6814,6 @@ "node": ">=0.10" } }, - "node_modules/date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, "node_modules/date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -6209,6 +6848,28 @@ "node": ">=0.10.0" } }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -6218,12 +6879,6 @@ "node": ">=0.10" } }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, "node_modules/deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -6240,6 +6895,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "node_modules/default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -6300,81 +6961,6 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, - "node_modules/del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "dependencies": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "engines": { - "node": ">=4" - } - }, - "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": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "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/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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", @@ -6477,6 +7063,18 @@ "buffer-indexof": "^1.0.0" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -6571,21 +7169,27 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.3.789", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.789.tgz", "integrity": "sha512-lK4xn6C6ZF1kgLaC/EhOtC1MSKENExj3rMwGVnBTfHW81Z/Hb1Rge5YaWawN/YOXy3xCaESuE4KWSD50kOZ9rQ==", "dev": true }, - "node_modules/elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -6685,6 +7289,18 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -6825,6 +7441,412 @@ "node": ">=0.8.0" } }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "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": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "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": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "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": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-import/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "36.0.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.0.7.tgz", + "integrity": "sha512-x73l/WCRQ1qCjLq46Ca7csuGd5o3y3vbJIa3cktg11tdf3UZleBdIXKN9Cf0xjs3tXYPEy2SoNXowT8ydnjNDQ==", + "dev": true, + "dependencies": { + "@es-joy/jsdoccomment": "0.10.7", + "comment-parser": "1.2.3", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.1.1", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": "^12.20 || ^14.14.0 || ^16" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=5.0.0", + "prettier": ">=1.13.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-1.1.4.tgz", + "integrity": "sha512-6M9iqqZbnsLdcpYm8ZAyjHHxw1Gmv/pK8yK9Za/cfrKKkOyxaXmiw5/EtBXPcp/JJ6Ge9ur+OROSAcYho45smA==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.14.2", + "eslint": "^7.19.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -6838,6 +7860,325 @@ "node": ">=8.0.0" } }, + "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-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/node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "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/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 + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/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/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -6851,6 +8192,27 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -6944,6 +8306,18 @@ "node": ">=6" } }, + "node_modules/execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "dependencies": { + "clone-regexp": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -7261,6 +8635,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -7283,10 +8663,16 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, "node_modules/fastq": { @@ -7330,6 +8716,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -7337,6 +8735,15 @@ "dev": true, "optional": true }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7411,6 +8818,25 @@ "node": ">=6" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, "node_modules/flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", @@ -7421,6 +8847,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "deprecated": "flatten is deprecated in favor of utility frameworks such as lodash.", "dev": true }, "node_modules/fmin": { @@ -7435,15 +8862,6 @@ "uglify-js": "^2.6.2" } }, - "node_modules/fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/follow-redirects": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", @@ -7590,19 +9008,11 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "node_modules/g-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", - "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "matcher": "^1.0.0", - "simple-git": "^1.85.0" - }, - "engines": { - "node": ">=6" - } + "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", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "node_modules/gauge": { "version": "2.7.4", @@ -7780,6 +9190,38 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/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/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7809,6 +9251,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -7874,6 +9337,15 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -8079,6 +9551,91 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, "node_modules/http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -8320,6 +9877,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -8468,6 +10034,15 @@ "node": ">=4" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -8505,15 +10080,6 @@ "node": ">=0.8.19" } }, - "node_modules/indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -8707,6 +10273,30 @@ "node": ">=0.10.0" } }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arguments": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", @@ -8846,6 +10436,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -8926,6 +10526,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -8981,27 +10591,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "dependencies": { - "symbol-observable": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-observable/node_modules/symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -9035,6 +10624,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -9047,12 +10645,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, "node_modules/is-regex": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", @@ -9305,6 +10897,30 @@ "node": ">=8" } }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + }, "node_modules/jasmine": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", @@ -9412,6 +11028,15 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", + "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", @@ -9448,6 +11073,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "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", @@ -9722,6 +11353,12 @@ "node": ">= 8" } }, + "node_modules/known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, "node_modules/lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -9839,6 +11476,19 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/license-webpack-plugin": { "version": "2.3.20", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", @@ -9879,401 +11529,325 @@ "dev": true }, "node_modules/lint-staged": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz", - "integrity": "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz", + "integrity": "sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w==", "dev": true, "dependencies": { - "chalk": "^2.3.1", - "commander": "^2.14.1", - "cosmiconfig": "^5.2.0", - "debug": "^3.1.0", - "dedent": "^0.7.0", - "del": "^3.0.0", - "execa": "^1.0.0", - "g-status": "^2.0.2", - "is-glob": "^4.0.0", - "is-windows": "^1.0.2", - "listr": "^0.14.2", - "listr-update-renderer": "^0.5.0", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "micromatch": "^3.1.8", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "please-upgrade-node": "^3.0.2", - "staged-git-files": "1.1.2", - "string-argv": "^0.0.2", - "stringify-object": "^3.2.2", - "yup": "^0.27.0" + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" }, "bin": { - "lint-staged": "index.js" - } - }, - "node_modules/lint-staged/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "lint-staged": "bin/lint-staged.js" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/braces/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "node_modules/lint-staged/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": { - "is-extendable": "^0.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lint-staged/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": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/lint-staged/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "node_modules/lint-staged/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": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/lint-staged/node_modules/fill-range/node_modules/extend-shallow": { + "node_modules/lint-staged/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "is-extendable": "^0.1.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=0.10.0" + "node": ">=7.0.0" } }, - "node_modules/lint-staged/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/lint-staged/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/lint-staged/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "node_modules/lint-staged/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/lint-staged/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "node_modules/lint-staged/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "dependencies": { - "is-buffer": "^1.1.5" + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/lint-staged/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/lint-staged/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lint-staged/node_modules/p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/lint-staged/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "node_modules/lint-staged/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "node_modules/lint-staged/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "dependencies": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "node_modules/lint-staged/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "node_modules/lint-staged/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, - "peerDependencies": { - "listr": "^0.14.2" - } - }, - "node_modules/listr-update-renderer/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr-update-renderer/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "node_modules/lint-staged/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/listr-update-renderer/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "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" + "node": ">=8" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr-update-renderer/node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/listr-update-renderer/node_modules/log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "node_modules/lint-staged/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { - "chalk": "^1.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/listr-update-renderer/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "node_modules/lint-staged/node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/listr-update-renderer/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "node_modules/lint-staged/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=4" } }, - "node_modules/listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "node_modules/lint-staged/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/listr-verbose-renderer/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "node_modules/lint-staged/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "restore-cursor": "^2.0.0" - }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/listr-verbose-renderer/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "node_modules/lint-staged/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/listr-verbose-renderer/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/lint-staged/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=4" + "node": ">= 8" } }, - "node_modules/listr-verbose-renderer/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "node_modules/listr2": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz", + "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==", "dev": true, "dependencies": { - "mimic-fn": "^1.0.0" + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" } }, - "node_modules/listr-verbose-renderer/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "engines": { "node": ">=4" } }, - "node_modules/listr/node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -10315,6 +11889,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -10327,6 +11907,18 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -10334,84 +11926,171 @@ "dev": true }, "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "dependencies": { - "chalk": "^2.0.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "node_modules/log-symbols/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": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "node_modules/log-symbols/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": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "node_modules/log-symbols/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": { - "restore-cursor": "^2.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/log-update/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/log-symbols/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/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/log-update/node_modules/onetime": { + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/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/log-update/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "mimic-fn": "^1.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "node_modules/log-update/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/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/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/log4js": { @@ -10451,6 +12130,16 @@ "node": ">=0.10.0" } }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10550,6 +12239,18 @@ "node": ">=0.10.0" } }, + "node_modules/map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -10562,16 +12263,59 @@ "node": ">=0.10.0" } }, - "node_modules/matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.4" + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, "node_modules/mdn-data": { @@ -10660,6 +12404,215 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/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", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10708,6 +12661,26 @@ "node": ">= 0.6" } }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, "node_modules/micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -10763,6 +12736,15 @@ "node": ">=6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", @@ -10855,6 +12837,29 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -11057,6 +13062,12 @@ "node": ">=0.10.0" } }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "node_modules/needle": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz", @@ -11251,6 +13262,12 @@ "node": ">=0.10.0" } }, + "node_modules/normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -11322,21 +13339,6 @@ "node": ">=10" } }, - "node_modules/npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "dependencies": { - "which": "^1.2.10" - }, - "bin": { - "npm-path": "bin/npm-path" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/npm-pick-manifest": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", @@ -11378,23 +13380,6 @@ "node": ">=4" } }, - "node_modules/npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "dev": true, - "dependencies": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - }, - "bin": { - "npm-which": "bin/npm-which.js" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -11609,6 +13594,23 @@ "node": ">=0.10.0" } }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "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", @@ -11697,6 +13699,23 @@ "node": ">=4" } }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -11778,22 +13797,6 @@ "node": ">=8" } }, - "node_modules/ora/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ora/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -11980,6 +13983,24 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -12233,6 +14254,76 @@ "node": ">=8" } }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -13273,6 +15364,19 @@ "node": ">=6" } }, + "node_modules/postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.10.0" + }, + "peerDependencies": { + "postcss": ">=5.0.0", + "postcss-syntax": ">=0.36.0" + } + }, "node_modules/postcss-image-set-function": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", @@ -13443,6 +15547,57 @@ "node": ">=6" } }, + "node_modules/postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss-less/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-less/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-less/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/postcss-loader": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.0.tgz", @@ -13626,6 +15781,12 @@ "node": ">=6" } }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, "node_modules/postcss-merge-longhand": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", @@ -14389,6 +16550,163 @@ "node": ">=6" } }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-safe-parser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-safe-parser/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + } + }, + "node_modules/postcss-sass/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sass/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-sass/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-scss/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-scss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-scss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/postcss-selector-matches": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", @@ -14500,6 +16818,58 @@ "node": ">=4" } }, + "node_modules/postcss-sorting": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz", + "integrity": "sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14", + "postcss": "^7.0.17" + }, + "engines": { + "node": ">=8.7.0" + } + }, + "node_modules/postcss-sorting/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sorting/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-sorting/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/postcss-svgo": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", @@ -14516,6 +16886,15 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true, + "peerDependencies": { + "postcss": ">=5.0.0" + } + }, "node_modules/postcss-unique-selectors": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", @@ -14553,6 +16932,15 @@ "node": ">=6.14.4" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", @@ -14565,6 +16953,18 @@ "node": ">=4" } }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -14583,6 +16983,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -14602,12 +17011,6 @@ "node": ">=10" } }, - "node_modules/property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", - "dev": true - }, "node_modules/protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -15021,6 +17424,15 @@ } ] }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -15168,6 +17580,103 @@ "node": ">=6" } }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -15194,6 +17703,28 @@ "node": ">=8.10.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -15267,6 +17798,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", @@ -15284,6 +17827,15 @@ "node": ">=4" } }, + "node_modules/regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", + "dev": true, + "engines": { + "node": ">=0.1.14" + } + }, "node_modules/regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -15311,6 +17863,47 @@ "jsesc": "bin/jsesc" } }, + "node_modules/remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "dependencies": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -15757,6 +18350,15 @@ "npm": ">=2.0.0" } }, + "node_modules/rxjs-for-await": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz", + "integrity": "sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==", + "dev": true, + "peerDependencies": { + "rxjs": "^6.0.0" + } + }, "node_modules/rxjs/node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -16007,24 +18609,6 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "node_modules/semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "dependencies": { - "semver": "^5.3.0" - } - }, - "node_modules/semver-dsl/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -16262,15 +18846,6 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "node_modules/simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", - "dev": true, - "dependencies": { - "debug": "^4.0.1" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -16281,14 +18856,52 @@ } }, "node_modules/slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, + "node_modules/slice-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/slice-ansi/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/slice-ansi/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/smart-buffer": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", @@ -16781,6 +19394,15 @@ "wbuf": "^1.7.3" } }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true, + "bin": { + "specificity": "bin/specificity" + } + }, "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -16793,12 +19415,6 @@ "node": ">=0.10.0" } }, - "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, "node_modules/sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -16842,15 +19458,6 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, - "node_modules/staged-git-files": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", - "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", - "dev": true, - "bin": { - "sgf": "bin/cli.js" - } - }, "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -17009,9 +19616,9 @@ ] }, "node_modules/string-argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", - "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true, "engines": { "node": ">=0.6.19" @@ -17097,6 +19704,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -17106,6 +19722,39 @@ "node": ">=0.10.0" } }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/style-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", @@ -17175,6 +19824,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, "node_modules/stylehacks": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", @@ -17191,6 +19846,445 @@ "postcss": "^8.2.15" } }, + "node_modules/stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", + "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "dev": true, + "dependencies": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-hudochenkov": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-hudochenkov/-/stylelint-config-hudochenkov-5.0.0.tgz", + "integrity": "sha512-XudW7b/NEmoGo5g0Dy6ipnOSMknl6he+FgLS4QxL/QsV7gAAWwoIfriqke1+rZgrmLE89OY/DM3IQVuR7stubw==", + "dev": true, + "peerDependencies": { + "stylelint": "^13.3.2" + } + }, + "node_modules/stylelint-config-prettier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz", + "integrity": "sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==", + "dev": true, + "bin": { + "stylelint-config-prettier": "bin/check.js", + "stylelint-config-prettier-check": "bin/check.js" + }, + "engines": { + "node": ">= 10", + "npm": ">= 5" + }, + "peerDependencies": { + "stylelint": ">=11.0.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz", + "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==", + "dev": true, + "peerDependencies": { + "stylelint": "^13.13.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-22.0.0.tgz", + "integrity": "sha512-uQVNi87SHjqTm8+4NIP5NMAyY/arXrBgimaaT7skvRfE9u3JKXRK9KBkbr4pVmeciuCcs64kAdjlxfq6Rur7Hw==", + "dev": true, + "dependencies": { + "stylelint-config-recommended": "^5.0.0" + }, + "peerDependencies": { + "stylelint": "^13.13.0" + } + }, + "node_modules/stylelint-order": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz", + "integrity": "sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15", + "postcss": "^7.0.31", + "postcss-sorting": "^5.0.1" + }, + "peerDependencies": { + "stylelint": "^10.0.1 || ^11.0.0 || ^12.0.0 || ^13.0.0" + } + }, + "node_modules/stylelint-order/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylelint-order/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint-order/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint-prettier": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-1.2.0.tgz", + "integrity": "sha512-/MYz6W2CNgKHblPzPtk7cybu8H5dGG3c2GevL64RButERj1uJg4SdBIIat1hMfDOmN6QQpldc6tCc//ZAWh9WQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "prettier": ">= 0.11.0", + "stylelint": ">= 9.2.1" + } + }, + "node_modules/stylelint/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/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/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/stylelint/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/stylelint/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/stylelint/node_modules/cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/stylelint/node_modules/postcss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/postcss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stylus": { "version": "0.54.8", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", @@ -17259,6 +20353,54 @@ "semver": "bin/semver.js" } }, + "node_modules/sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/sugarss/node_modules/postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/sugarss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sugarss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -17271,6 +20413,12 @@ "node": ">=4" } }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, "node_modules/svgo": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", @@ -17380,12 +20528,73 @@ "node": ">=0.10" } }, - "node_modules/synchronous-promise": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.15.tgz", - "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==", + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/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/table/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/table/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/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/tapable": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", @@ -17421,9 +20630,9 @@ } }, "node_modules/tar": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.2.tgz", - "integrity": "sha512-EwKEgqJ7nJoS+s8QfLYVGMDmAsj+StbI2AM/RTHeUSsOw6Z8bwNBRv5z3CY0m7laC5qUAqruLX5AhMuc5deY3Q==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -17640,12 +20849,6 @@ "node": ">=0.6" } }, - "node_modules/toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", - "dev": true - }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -17668,6 +20871,25 @@ "tree-kill": "cli.js" } }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", @@ -17702,95 +20924,34 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, - "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.", + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "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/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" } }, - "node_modules/tslint/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.0" }, "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/tslint/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/tslint/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "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" + "json5": "lib/cli.js" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -17810,6 +20971,18 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -17835,6 +21008,15 @@ "node": ">= 0.6" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", @@ -17982,6 +21164,47 @@ "node": ">=4" } }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "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" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -18036,6 +21259,42 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -18187,6 +21446,12 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -18249,6 +21514,59 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "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" + } + ], + "engines": { + "node": ">=4" + } + }, "node_modules/void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -19593,6 +22911,15 @@ "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz", "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE=" }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", @@ -19602,66 +22929,72 @@ } }, "node_modules/wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "dependencies": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "node_modules/wrap-ansi/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": { - "ansi-regex": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, + "node_modules/wrap-ansi/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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", @@ -19777,20 +23110,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.11", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", - "toposort": "^2.0.2" - } - }, "node_modules/zone.js": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", @@ -19798,6 +23117,16 @@ "dependencies": { "tslib": "^2.0.0" } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } }, "dependencies": { @@ -19950,6 +23279,86 @@ "rxjs": "6.6.7" } }, + "@angular-eslint/builder": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-12.3.1.tgz", + "integrity": "sha512-Py7Y9n0evIWGgEIrnMaLvalE1+Nw9HoY+fcYLYd9POfY0cug8j7hbkoPQ6rM7GzNHVcVsqEi/8C4DoF7RXXNRg==", + "dev": true, + "requires": { + "@nrwl/devkit": ">= 12.0.0 < 13.0.0" + } + }, + "@angular-eslint/eslint-plugin": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-12.3.1.tgz", + "integrity": "sha512-KBm27onYggRcusA/BxuSkDGpVnIs8yG4ARio8ZAhe0H2XIRJTzJZ7oIBBjugDau03AGX3VMG6wAXailjJvsywg==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.2" + } + }, + "@angular-eslint/eslint-plugin-template": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-12.3.1.tgz", + "integrity": "sha512-pz+nO64ma/9Sp2aeRnQ+Vktt7Fo1Lay/J+CG//3TIc3lYsoCTj4h42P6yCcxxJ9b4N7SUxMAnchA8eE5mJS4Ug==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.2", + "aria-query": "^4.2.2", + "axobject-query": "^2.2.0" + }, + "dependencies": { + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", + "dev": true + } + } + }, + "@angular-eslint/schematics": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-12.3.1.tgz", + "integrity": "sha512-r1yZaqyO0oJhKDIWio3gH9TWpWEN8bUpiftgkkR6Yyc4hKBbiR5N4RQo5aZ5bnGytdW8QP8zq2k1yYBWjhEX7A==", + "dev": true, + "requires": { + "@angular-eslint/eslint-plugin": "12.3.1", + "@angular-eslint/eslint-plugin-template": "12.3.1", + "ignore": "5.1.8", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" + }, + "dependencies": { + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@angular-eslint/template-parser": { + "version": "12.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-12.3.1.tgz", + "integrity": "sha512-6DkXqTaVEHZdcN3isHQ2CDoTsKLuJ5C1SYEOuFzOU1Zp85SvjxO92v6gPkFPKk0iQNVRmQS2XcKef6weehUUGA==", + "dev": true, + "requires": { + "eslint-scope": "^5.1.0" + } + }, "@angular/animations": { "version": "12.1.3", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-12.1.3.tgz", @@ -21299,6 +24708,16 @@ "regenerator-runtime": "^0.13.4" } }, + "@babel/runtime-corejs3": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz", + "integrity": "sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A==", + "dev": true, + "requires": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + } + }, "@babel/template": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", @@ -21373,6 +24792,108 @@ "integrity": "sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==", "dev": true }, + "@es-joy/jsdoccomment": { + "version": "0.10.7", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.7.tgz", + "integrity": "sha512-aNKZEoMESDzOBjKxCWrFuG50mcpMeKVBnBNko4+IZZ5t9zXYs8GT1KB0ZaOq1YUsKumDRc6YII/TQm309MJ0KQ==", + "dev": true, + "requires": { + "comment-parser": "1.2.3", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.1.1" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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 + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -21502,13 +25023,150 @@ "read-package-json-fast": "^2.0.1" } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "@nrwl/devkit": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-12.7.2.tgz", + "integrity": "sha512-Uk0DOkQ35sAMSMQPWNo+n4muDAueX651Seb66GSVbeHrFGNGPOM4X1iElYqocXevnMta1Q3xwragudXSdAnHkw==", "dev": true, "requires": { - "any-observable": "^0.3.0" + "@nrwl/tao": "12.7.2", + "ejs": "^3.1.5", + "ignore": "^5.0.4", + "rxjs": "^6.5.4", + "semver": "7.3.4", + "tslib": "^2.0.0" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@nrwl/tao": { + "version": "12.7.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-12.7.2.tgz", + "integrity": "sha512-LnylUSOznJ+EDmJWu7vvQTnAERPTjKRHznShTe6eMoaJUH0ds3WSGMBxLUulzN2P5dWqO9u26GWMZpInYWwkfA==", + "dev": true, + "requires": { + "chalk": "4.1.0", + "enquirer": "~2.3.6", + "fs-extra": "^9.1.0", + "jsonc-parser": "3.0.0", + "rxjs": "^6.5.4", + "rxjs-for-await": "0.0.2", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.0.0", + "yargs-parser": "20.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "yargs-parser": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.0.0.tgz", + "integrity": "sha512-8eblPHTL7ZWRkyjIZJjnGf+TijiKJSwA24svzLRVvtgoi/RZiKa9fFQTrlx0OKLnyHSdt/enrdadji6WFfESVA==", + "dev": true + } } }, "@schematics/angular": { @@ -21522,6 +25180,25 @@ "jsonc-parser": "3.0.0" } }, + "@stylelint/postcss-css-in-js": { + "version": "0.37.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz", + "integrity": "sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA==", + "dev": true, + "requires": { + "@babel/core": ">=7.9.0" + } + }, + "@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "dev": true, + "requires": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + } + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -21881,18 +25558,45 @@ "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", "dev": true }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "@types/mdast": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.7.tgz", + "integrity": "sha512-YwR7OK8aPmaBvMMUi+pZXBNoW2unbVbfok4YRqGMJBe1dpDlzpRkJrYEYmvjxgs5JhuQmKfDexrN98u941Zasg==", + "dev": true, + "requires": { + "@types/unist": "*" + } + }, "@types/minimatch": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, + "@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "@types/node": { "version": "12.20.17", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.17.tgz", "integrity": "sha512-so8EHl4S6MmatPS0f9sE1ND94/ocbcEshW5OpyYthRqeRpiYyW2uXYTo/84kmfdfeNrDycARkvuiXl6nO40NGg==", "dev": true }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -21917,6 +25621,12 @@ "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", "dev": true }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==", + "dev": true + }, "@types/webpack-sources": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.9.tgz", @@ -21936,6 +25646,122 @@ } } }, + "@typescript-eslint/eslint-plugin": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.2.tgz", + "integrity": "sha512-PGqpLLzHSxq956rzNGasO3GsAPf2lY9lDUBXhS++SKonglUmJypaUtcKzRtUte8CV7nruwnDxtLUKpVxs0wQBw==", + "dev": true, + "requires": { + "@typescript-eslint/experimental-utils": "4.28.2", + "@typescript-eslint/scope-manager": "4.28.2", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/experimental-utils": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.2.tgz", + "integrity": "sha512-MwHPsL6qo98RC55IoWWP8/opTykjTp4JzfPu1VfO2Z0MshNP0UZ1GEV5rYSSnZSUI8VD7iHvtIPVGW5Nfh7klQ==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, + "@typescript-eslint/parser": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.2.tgz", + "integrity": "sha512-Q0gSCN51eikAgFGY+gnd5p9bhhCUAl0ERMiDKrTzpSoMYRubdB8MJrTTR/BBii8z+iFwz8oihxd0RAdP4l8w8w==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "4.28.2", + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/typescript-estree": "4.28.2", + "debug": "^4.3.1" + } + }, + "@typescript-eslint/scope-manager": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.2.tgz", + "integrity": "sha512-MqbypNjIkJFEFuOwPWNDjq0nqXAKZvDNNs9yNseoGBB1wYfz1G0WHC2AVOy4XD7di3KCcW3+nhZyN6zruqmp2A==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2" + } + }, + "@typescript-eslint/types": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.2.tgz", + "integrity": "sha512-Gr15fuQVd93uD9zzxbApz3wf7ua3yk4ZujABZlZhaxxKY8ojo448u7XTm/+ETpy0V0dlMtj6t4VdDvdc0JmUhA==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.2.tgz", + "integrity": "sha512-86lLstLvK6QjNZjMoYUBMMsULFw0hPHJlk1fzhAVoNjDBuPVxiwvGuPQq3fsBMCxuDJwmX87tM/AXoadhHRljg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.2", + "@typescript-eslint/visitor-keys": "4.28.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.2.tgz", + "integrity": "sha512-aT2B4PLyyRDUVUafXzpZFoc0C9t0za4BJAKP5sgWIhG+jHECQZUEjuQSCIwZdiJJ4w4cgu5r3Kh20SOdtEBl0w==", + "dev": true, + "requires": { + "@typescript-eslint/types": "4.28.2", + "eslint-visitor-keys": "^2.0.0" + } + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -22128,6 +25954,13 @@ "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", "dev": true }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "adjust-sourcemap-loader": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", @@ -22277,12 +26110,6 @@ "color-convert": "^1.9.0" } }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true - }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -22293,12 +26120,6 @@ "picomatch": "^2.0.4" } }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true - }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -22358,16 +26179,6 @@ } } }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -22392,6 +26203,19 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -22410,6 +26234,17 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, + "array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -22437,10 +26272,10 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { @@ -22470,6 +26305,12 @@ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -22531,15 +26372,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, "babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -22621,6 +26453,12 @@ "@babel/helper-define-polyfill-provider": "^0.2.2" } }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -22874,12 +26712,6 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "builtins": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", @@ -22973,6 +26805,17 @@ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, + "camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + } + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -23023,6 +26866,24 @@ "supports-color": "^5.3.0" } }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true + }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", @@ -23172,50 +27033,13 @@ "dev": true }, "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, "cli-width": { @@ -23233,43 +27057,6 @@ "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "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, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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, - "requires": { - "color-name": "~1.1.4" - } - }, - "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 - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } } }, "clone": { @@ -23289,54 +27076,29 @@ "shallow-clone": "^3.0.0" } }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "codelyzer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", - "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", - "dev": true, - "requires": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" + "clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "requires": { + "is-regexp": "^2.0.0" }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", "dev": true } } }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -23394,6 +27156,12 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "comment-parser": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.3.tgz", + "integrity": "sha512-vnqDwBSXSsdAkGS5NjwMIPelE47q+UkEgWKHvCDNhVIIaQSUFY6sNnEYGzdoPGMdpV+7KR3ZkRd7oyWIjtuvJg==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -23640,6 +27408,12 @@ } } }, + "core-js-pure": { + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.2.tgz", + "integrity": "sha512-oxKe64UH049mJqrKkynWp6Vu0Rlm/BTXO/bJZuN2mmR3RtOFNepLlSWDd1eo16PzHpQAoNG97rLU1V/YxesJjw==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -24086,16 +27860,6 @@ "nth-check": "^2.0.0" } }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, "css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -24120,15 +27884,6 @@ "integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==", "dev": true }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "X.X.X" - } - }, "cssdb": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", @@ -24547,12 +28302,6 @@ "lodash": "^4.17.15" } }, - "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", - "dev": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -24562,12 +28311,6 @@ "assert-plus": "^1.0.0" } }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", - "dev": true - }, "date-format": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", @@ -24588,18 +28331,30 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -24613,6 +28368,12 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -24661,67 +28422,6 @@ "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" }, - "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", - "dev": true, - "requires": { - "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -24809,6 +28509,15 @@ "buffer-indexof": "^1.0.0" } }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serialize": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", @@ -24882,18 +28591,21 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dev": true, + "requires": { + "jake": "^10.6.1" + } + }, "electron-to-chromium": { "version": "1.3.789", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.789.tgz", "integrity": "sha512-lK4xn6C6ZF1kgLaC/EhOtC1MSKENExj3rMwGVnBTfHW81Z/Hb1Rge5YaWawN/YOXy3xCaESuE4KWSD50kOZ9rQ==", "dev": true }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -24977,6 +28689,15 @@ "tapable": "^2.2.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "ent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", @@ -25090,6 +28811,494 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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 + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "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 + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "requires": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, + "eslint-plugin-jsdoc": { + "version": "36.0.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.0.7.tgz", + "integrity": "sha512-x73l/WCRQ1qCjLq46Ca7csuGd5o3y3vbJIa3cktg11tdf3UZleBdIXKN9Cf0xjs3tXYPEy2SoNXowT8ydnjNDQ==", + "dev": true, + "requires": { + "@es-joy/jsdoccomment": "0.10.7", + "comment-parser": "1.2.3", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.1.1", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "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, + "requires": {} + }, + "eslint-plugin-prettier": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", + "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-unused-imports": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-1.1.4.tgz", + "integrity": "sha512-6M9iqqZbnsLdcpYm8ZAyjHHxw1Gmv/pK8yK9Za/cfrKKkOyxaXmiw5/EtBXPcp/JJ6Ge9ur+OROSAcYho45smA==", + "dev": true, + "requires": { + "eslint-rule-composer": "^0.3.0" + } + }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -25100,12 +29309,69 @@ "estraverse": "^4.1.1" } }, + "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, + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "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 + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -25177,6 +29443,15 @@ "strip-eof": "^1.0.0" } }, + "execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "requires": { + "clone-regexp": "^2.1.0" + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -25444,6 +29719,12 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -25463,10 +29744,16 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", "dev": true }, "fastq": { @@ -25501,6 +29788,15 @@ "escape-string-regexp": "^1.0.5" } }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -25508,6 +29804,15 @@ "dev": true, "optional": true }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -25569,6 +29874,24 @@ "locate-path": "^3.0.0" } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "dependencies": { + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + } + } + }, "flatted": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", @@ -25593,12 +29916,6 @@ "uglify-js": "^2.6.2" } }, - "fn-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fn-name/-/fn-name-2.0.1.tgz", - "integrity": "sha1-UhTXU3pNBqSjAcDMJi/rhBiAAuc=", - "dev": true - }, "follow-redirects": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", @@ -25700,16 +30017,11 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, - "g-status": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/g-status/-/g-status-2.0.2.tgz", - "integrity": "sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "matcher": "^1.0.0", - "simple-git": "^1.85.0" - } + "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", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true }, "gauge": { "version": "2.7.4", @@ -25850,6 +30162,34 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -25870,6 +30210,21 @@ "slash": "^3.0.0" } }, + "globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", + "dev": true + }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -25926,6 +30281,12 @@ } } }, + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -26100,6 +30461,83 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -26305,6 +30743,12 @@ "debug": "4" } }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -26408,6 +30852,12 @@ "resolve-from": "^3.0.0" } }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -26435,12 +30885,6 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -26594,6 +31038,22 @@ "kind-of": "^6.0.0" } }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, "is-arguments": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", @@ -26693,6 +31153,12 @@ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true + }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -26746,6 +31212,12 @@ "is-extglob": "^2.1.1" } }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true + }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -26780,23 +31252,6 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", - "dev": true, - "requires": { - "symbol-observable": "^1.1.0" - }, - "dependencies": { - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", - "dev": true - } - } - }, "is-path-cwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", @@ -26821,6 +31276,12 @@ "path-is-inside": "^1.0.1" } }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -26830,12 +31291,6 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, "is-regex": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", @@ -27022,6 +31477,26 @@ "istanbul-lib-report": "^3.0.0" } }, + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dev": true, + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", + "dev": true + } + } + }, "jasmine": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", @@ -27112,6 +31587,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -27142,6 +31623,12 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -27371,6 +31858,12 @@ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", "dev": true }, + "known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, "lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", @@ -27450,6 +31943,16 @@ "klona": "^2.0.4" } }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, "license-webpack-plugin": { "version": "2.3.20", "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.20.tgz", @@ -27482,328 +31985,231 @@ "dev": true }, "lint-staged": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.2.1.tgz", - "integrity": "sha512-n0tDGR/rTCgQNwXnUf/eWIpPNddGWxC32ANTNYsj2k02iZb7Cz5ox2tytwBu+2r0zDXMEMKw7Y9OD/qsav561A==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.1.2.tgz", + "integrity": "sha512-6lYpNoA9wGqkL6Hew/4n1H6lRqF3qCsujVT0Oq5Z4hiSAM7S6NksPJ3gnr7A7R52xCtiZMcEUNNQ6d6X5Bvh9w==", "dev": true, "requires": { - "chalk": "^2.3.1", - "commander": "^2.14.1", - "cosmiconfig": "^5.2.0", - "debug": "^3.1.0", - "dedent": "^0.7.0", - "del": "^3.0.0", - "execa": "^1.0.0", - "g-status": "^2.0.2", - "is-glob": "^4.0.0", - "is-windows": "^1.0.2", - "listr": "^0.14.2", - "listr-update-renderer": "^0.5.0", - "lodash": "^4.17.11", - "log-symbols": "^2.2.0", - "micromatch": "^3.1.8", - "npm-which": "^3.0.1", - "p-map": "^1.1.1", - "path-is-inside": "^1.0.2", - "pify": "^3.0.0", - "please-upgrade-node": "^3.0.2", - "staged-git-files": "1.1.2", - "string-argv": "^0.0.2", - "stringify-object": "^3.2.2", - "yup": "^0.27.0" + "chalk": "^4.1.1", + "cli-truncate": "^2.1.0", + "commander": "^7.2.0", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "listr2": "^3.8.2", + "log-symbols": "^4.1.0", + "micromatch": "^4.0.4", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.2.0", + "string-argv": "0.3.1", + "stringify-object": "^3.3.0" }, "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "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, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "color-convert": "^2.0.1" } }, - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "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, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "color-name": "~1.1.4" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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 }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", "dev": true, "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" } }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" } - } - } - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", - "dev": true, - "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - } - } - }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { - "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" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "chalk": "^1.0.0" + "path-key": "^3.0.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true - } - } - }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" - }, - "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } }, - "figures": { + "shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "shebang-regex": "^3.0.0" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "has-flag": "^4.0.0" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "isexe": "^2.0.0" } } } }, + "listr2": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.0.tgz", + "integrity": "sha512-XLJVe2JgXCyQTa3FbSv11lkKExYmEyA4jltVo8z4FX10Vt1Yj8IMekBfwim0BSOM9uj1QMTJvDQQpHyuPbB/dQ==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -27836,6 +32242,12 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -27848,6 +32260,18 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -27855,63 +32279,122 @@ "dev": true }, "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "requires": { - "chalk": "^2.0.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } } }, "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true + "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, + "requires": { + "color-convert": "^2.0.1" + } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "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, "requires": { - "restore-cursor": "^2.0.0" + "color-name": "~1.1.4" } }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "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 }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "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, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } @@ -27940,6 +32423,12 @@ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -28020,6 +32509,12 @@ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, + "map-obj": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz", + "integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==", + "dev": true + }, "map-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", @@ -28029,15 +32524,45 @@ "object-visit": "^1.0.0" } }, - "matcher": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", - "integrity": "sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg==", + "mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true + }, + "mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.4" + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" } }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true + }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", @@ -28113,6 +32638,164 @@ } } }, + "meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "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, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -28154,6 +32837,16 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", "dev": true }, + "micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "requires": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, "micromatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", @@ -28191,6 +32884,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "mini-css-extract-plugin": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", @@ -28259,6 +32958,25 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, "minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -28417,6 +33135,12 @@ "to-regex": "^3.0.1" } }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, "needle": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.8.0.tgz", @@ -28565,6 +33289,12 @@ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", "dev": true }, + "normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=", + "dev": true + }, "normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -28618,15 +33348,6 @@ "npm-normalize-package-bin": "^1.0.1" } }, - "npm-path": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.4.tgz", - "integrity": "sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw==", - "dev": true, - "requires": { - "which": "^1.2.10" - } - }, "npm-pick-manifest": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", @@ -28662,17 +33383,6 @@ "path-key": "^2.0.0" } }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", - "dev": true, - "requires": { - "commander": "^2.9.0", - "npm-path": "^2.0.2", - "which": "^1.2.10" - } - }, "npmlog": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", @@ -28834,6 +33544,17 @@ "isobject": "^3.0.1" } }, + "object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + } + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -28900,6 +33621,20 @@ } } }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -28957,16 +33692,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -29108,6 +33833,20 @@ } } }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -29303,6 +34042,60 @@ } } }, + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, "please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -30058,6 +34851,15 @@ } } }, + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "requires": { + "htmlparser2": "^3.10.0" + } + }, "postcss-image-set-function": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", @@ -30183,6 +34985,43 @@ } } }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "postcss-loader": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.1.0.tgz", @@ -30311,6 +35150,12 @@ } } }, + "postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", + "dev": true + }, "postcss-merge-longhand": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.2.tgz", @@ -30731,22 +35576,208 @@ } } }, - "postcss-pseudo-class-any-link": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", - "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "dev": true + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "dev": true + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "requires": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" + "postcss": "^7.0.6" }, "dependencies": { - "cssesc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", - "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", - "dev": true - }, "postcss": { "version": "7.0.36", "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", @@ -30758,17 +35789,6 @@ "supports-color": "^6.1.0" } }, - "postcss-selector-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", - "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", - "dev": true, - "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -30786,32 +35806,13 @@ } } }, - "postcss-reduce-initial": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", - "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", - "dev": true, - "requires": { - "browserslist": "^4.16.0", - "caniuse-api": "^3.0.0" - } - }, - "postcss-reduce-transforms": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", - "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", - "dev": true, - "requires": { - "cssnano-utils": "^2.0.1", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-replace-overflow-wrap": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", - "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", "dev": true, "requires": { + "balanced-match": "^1.0.0", "postcss": "^7.0.2" }, "dependencies": { @@ -30843,10 +35844,10 @@ } } }, - "postcss-selector-matches": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", - "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -30881,14 +35882,24 @@ } } }, - "postcss-selector-not": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", - "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sorting": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz", + "integrity": "sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==", + "dev": true, + "requires": { + "lodash": "^4.17.14", + "postcss": "^7.0.17" }, "dependencies": { "postcss": { @@ -30919,16 +35930,6 @@ } } }, - "postcss-selector-parser": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", - "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, "postcss-svgo": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.2.tgz", @@ -30939,6 +35940,13 @@ "svgo": "^2.3.0" } }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true, + "requires": {} + }, "postcss-unique-selectors": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", @@ -30967,12 +35975,27 @@ "uniq": "^1.0.1" } }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, "prettier": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -30985,6 +36008,12 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -31001,12 +36030,6 @@ "retry": "^0.12.0" } }, - "property-expr": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-1.5.1.tgz", - "integrity": "sha512-CGuc0VUTGthpJXL36ydB6jnbyOf/rAHFvmVrJlH+Rg0DqqLFQGAP6hIaxD/G0OAmBJPhXDHuEJigrp0e0wFV6g==", - "dev": true - }, "protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -31319,6 +36342,12 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -31432,6 +36461,81 @@ "pify": "^3.0.0" } }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + } + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -31452,6 +36556,24 @@ "picomatch": "^2.2.1" } }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -31513,6 +36635,12 @@ "define-properties": "^1.1.3" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "regexpu-core": { "version": "4.7.1", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", @@ -31527,6 +36655,12 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, + "regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==", + "dev": true + }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -31550,6 +36684,35 @@ } } }, + "remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "requires": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + } + }, + "remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^0.8.0" + } + }, + "remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "requires": { + "mdast-util-to-markdown": "^0.6.0" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -31879,6 +37042,13 @@ } } }, + "rxjs-for-await": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/rxjs-for-await/-/rxjs-for-await-0.0.2.tgz", + "integrity": "sha512-IJ8R/ZCFMHOcDIqoABs82jal00VrZx8Xkgfe7TOKoaRPAW5nH/VFlG23bXpeGdrmtqI9UobFPgUKgCuFc7Lncw==", + "dev": true, + "requires": {} + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -32063,23 +37233,6 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", @@ -32286,15 +37439,6 @@ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, - "simple-git": { - "version": "1.132.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz", - "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==", - "dev": true, - "requires": { - "debug": "^4.0.1" - } - }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -32302,10 +37446,41 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + } + } }, "smart-buffer": { "version": "4.1.0", @@ -32726,6 +37901,12 @@ "wbuf": "^1.7.3" } }, + "specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true + }, "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", @@ -32735,12 +37916,6 @@ "extend-shallow": "^3.0.0" } }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true - }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -32773,12 +37948,6 @@ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", "dev": true }, - "staged-git-files": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-1.1.2.tgz", - "integrity": "sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA==", - "dev": true - }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -32900,9 +38069,9 @@ } }, "string-argv": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.0.2.tgz", - "integrity": "sha1-2sMECGkMIfPDYwo/86BYd73L1zY=", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-width": { @@ -32964,12 +38133,39 @@ "ansi-regex": "^5.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "requires": { + "min-indent": "^1.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "style-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", @@ -33018,6 +38214,12 @@ } } }, + "style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", + "dev": true + }, "stylehacks": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", @@ -33028,6 +38230,332 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", + "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "dev": true, + "requires": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "cosmiconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz", + "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "stylelint-config-hudochenkov": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-hudochenkov/-/stylelint-config-hudochenkov-5.0.0.tgz", + "integrity": "sha512-XudW7b/NEmoGo5g0Dy6ipnOSMknl6he+FgLS4QxL/QsV7gAAWwoIfriqke1+rZgrmLE89OY/DM3IQVuR7stubw==", + "dev": true, + "requires": {} + }, + "stylelint-config-prettier": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/stylelint-config-prettier/-/stylelint-config-prettier-8.0.2.tgz", + "integrity": "sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==", + "dev": true, + "requires": {} + }, + "stylelint-config-recommended": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz", + "integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==", + "dev": true, + "requires": {} + }, + "stylelint-config-standard": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-22.0.0.tgz", + "integrity": "sha512-uQVNi87SHjqTm8+4NIP5NMAyY/arXrBgimaaT7skvRfE9u3JKXRK9KBkbr4pVmeciuCcs64kAdjlxfq6Rur7Hw==", + "dev": true, + "requires": { + "stylelint-config-recommended": "^5.0.0" + } + }, + "stylelint-order": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz", + "integrity": "sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==", + "dev": true, + "requires": { + "lodash": "^4.17.15", + "postcss": "^7.0.31", + "postcss-sorting": "^5.0.1" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "stylelint-prettier": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stylelint-prettier/-/stylelint-prettier-1.2.0.tgz", + "integrity": "sha512-/MYz6W2CNgKHblPzPtk7cybu8H5dGG3c2GevL64RButERj1uJg4SdBIIat1hMfDOmN6QQpldc6tCc//ZAWh9WQ==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "stylus": { "version": "0.54.8", "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", @@ -33078,6 +38606,43 @@ "normalize-path": "^3.0.0" } }, + "sugarss": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "postcss": { + "version": "7.0.36", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz", + "integrity": "sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -33087,6 +38652,12 @@ "has-flag": "^3.0.0" } }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, "svgo": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.3.1.tgz", @@ -33165,11 +38736,56 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, - "synchronous-promise": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/synchronous-promise/-/synchronous-promise-2.0.15.tgz", - "integrity": "sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==", - "dev": true + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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, + "requires": { + "color-name": "~1.1.4" + } + }, + "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 + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } }, "tapable": { "version": "2.2.0", @@ -33200,9 +38816,9 @@ } }, "tar": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.2.tgz", - "integrity": "sha512-EwKEgqJ7nJoS+s8QfLYVGMDmAsj+StbI2AM/RTHeUSsOw6Z8bwNBRv5z3CY0m7laC5qUAqruLX5AhMuc5deY3Q==", + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -33367,12 +38983,6 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, - "toposort": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=", - "dev": true - }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -33389,6 +38999,18 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true + }, "ts-node": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", @@ -33416,77 +39038,33 @@ } } }, - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, - "tslint": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz", - "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==", + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", "dev": true, "requires": { - "@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" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.0" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true } } }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, "tunnel-agent": { "version": "0.6.0", @@ -33503,6 +39081,15 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", @@ -33519,6 +39106,15 @@ "mime-types": "~2.1.24" } }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { "version": "4.3.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", @@ -33619,6 +39215,28 @@ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, + "unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -33669,6 +39287,30 @@ "imurmurhash": "^0.1.4" } }, + "unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "requires": { + "@types/unist": "^2.0.2" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -33794,6 +39436,12 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -33846,6 +39494,36 @@ "extsprintf": "^1.2.0" } }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true + } + } + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -34908,51 +40586,51 @@ "resolved": "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz", "integrity": "sha1-NcGsDdGsDBXjXZgVCPwiCEoToBE=" }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" }, "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "color-convert": "^2.0.1" } }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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, "requires": { - "ansi-regex": "^3.0.0" + "color-name": "~1.1.4" } + }, + "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 } } }, @@ -34961,6 +40639,18 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", @@ -35035,20 +40725,6 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, - "yup": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-0.27.0.tgz", - "integrity": "sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.0.0", - "fn-name": "~2.0.1", - "lodash": "^4.17.11", - "property-expr": "^1.5.0", - "synchronous-promise": "^2.0.6", - "toposort": "^2.0.2" - } - }, "zone.js": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", @@ -35056,6 +40732,12 @@ "requires": { "tslib": "^2.0.0" } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true } } } diff --git a/flink-runtime-web/web-dashboard/package.json b/flink-runtime-web/web-dashboard/package.json index a43d479a390a7..3cb7727b23c21 100644 --- a/flink-runtime-web/web-dashboard/package.json +++ b/flink-runtime-web/web-dashboard/package.json @@ -6,7 +6,9 @@ "start": "ng serve", "build": "ng build --configuration production --base-href ./", "test": "ng test", - "lint": "ng lint", + "lint": "eslint --cache src --ext .ts,.html && stylelint \"**/*.less\"", + "lint:fix": "eslint --fix --cache src --ext .ts,.html && stylelint \"**/*.less\" --fix", + "ci-check": "npm run lint && npm run build", "proxy": "ng serve --proxy-config proxy.conf.json" }, "private": true, @@ -33,6 +35,11 @@ }, "devDependencies": { "@angular-devkit/build-angular": "~12.1.3", + "@angular-eslint/builder": "12.3.1", + "@angular-eslint/eslint-plugin": "12.3.1", + "@angular-eslint/eslint-plugin-template": "12.3.1", + "@angular-eslint/schematics": "12.3.1", + "@angular-eslint/template-parser": "12.3.1", "@angular/cli": "~12.1.3", "@angular/compiler-cli": "~12.1.3", "@angular/language-service": "~12.1.3", @@ -41,7 +48,15 @@ "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^12.11.1", - "codelyzer": "^6.0.0", + "@typescript-eslint/eslint-plugin": "4.28.2", + "@typescript-eslint/parser": "4.28.2", + "eslint": "^7.26.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "latest", + "eslint-plugin-jsdoc": "latest", + "eslint-plugin-prefer-arrow": "latest", + "eslint-plugin-prettier": "^3.4.0", + "eslint-plugin-unused-imports": "^1.1.4", "husky": "^1.3.1", "jasmine-core": "~3.8.0", "jasmine-spec-reporter": "~5.0.0", @@ -50,17 +65,24 @@ "karma-coverage": "~2.0.3", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "lint-staged": "^8.1.5", + "lint-staged": "^11.1.2", "prettier": "^1.16.4", "protractor": "~7.0.0", + "stylelint": "^13.13.1", + "stylelint-config-hudochenkov": "^5.0.0", + "stylelint-config-prettier": "^8.0.2", + "stylelint-config-standard": "^22.0.0", + "stylelint-order": "^4.1.0", + "stylelint-prettier": "^1.2.0", "ts-node": "~7.0.0", - "tslint": "~6.1.0", "typescript": "~4.3.5" }, "lint-staged": { - "*.{ts,less,json}": [ - "./node_modules/.bin/prettier --write", - "git add" + "**/*.{ts,html}": [ + "eslint --fix" + ], + "**/*.less": [ + "stylelint --fix" ] }, "husky": { diff --git a/flink-runtime-web/web-dashboard/src/@types/d3-flame-graph/index.d.ts b/flink-runtime-web/web-dashboard/src/@types/d3-flame-graph/index.d.ts index e9ccde4a2016e..92ee39ea1406d 100644 --- a/flink-runtime-web/web-dashboard/src/@types/d3-flame-graph/index.d.ts +++ b/flink-runtime-web/web-dashboard/src/@types/d3-flame-graph/index.d.ts @@ -16,12 +16,14 @@ * limitations under the License. */ +import { SafeAny } from 'interfaces'; + declare module 'd3-flame-graph' { - type ColorMapper = (node: any, originalColor: string) => string; + type ColorMapper = (node: SafeAny, originalColor: string) => string; export function flamegraph(): FlameGraph; export const offCpuColorMapper: ColorMapper; - export function defaultFlamegraphTooltip(): any; + export function defaultFlamegraphTooltip(): SafeAny; export interface StackFrame { name: string; @@ -29,14 +31,14 @@ declare module 'd3-flame-graph' { children: StackFrame[]; } - type LabelHandler = (node: any) => string; - type ClickHandler = (node: any) => void; - type DetailsHandler = (node: any) => void; - type SearchHandler = (results: any, sum: any, totalValue: any) => void; - type SearchMatch = (node: any, term: string) => boolean; + type LabelHandler = (node: SafeAny) => string; + type ClickHandler = (node: SafeAny) => void; + type DetailsHandler = (node: SafeAny) => void; + type SearchHandler = (results: SafeAny, sum: SafeAny, totalValue: SafeAny) => void; + type SearchMatch = (node: SafeAny, term: string) => boolean; interface FlameGraph { - (selection: any): any; + (selection: SafeAny): SafeAny; selfValue(val: boolean): FlameGraph; selfValue(): boolean; diff --git a/flink-runtime-web/web-dashboard/src/app/app.component.html b/flink-runtime-web/web-dashboard/src/app/app.component.html index 47b2f3172aa03..035abdd42b2e4 100644 --- a/flink-runtime-web/web-dashboard/src/app/app.component.html +++ b/flink-runtime-web/web-dashboard/src/app/app.component.html @@ -18,54 +18,98 @@ - - +
- Version: {{ statusService.configuration['flink-version'] }} + Version: + {{ statusService.configuration['flink-version'] }} - Commit: {{ statusService.configuration['flink-revision'] }} + Commit: + {{ statusService.configuration['flink-revision'] }} - - Message: - + + Message: + Lost Connection, Reconnecting Now... @@ -78,13 +122,20 @@

Apache Flink Dashboard

- + - - + diff --git a/flink-runtime-web/web-dashboard/src/app/app.component.less b/flink-runtime-web/web-dashboard/src/app/app.component.less index cdfbbd2543bdb..dd510e9aa51f8 100644 --- a/flink-runtime-web/web-dashboard/src/app/app.component.less +++ b/flink-runtime-web/web-dashboard/src/app/app.component.less @@ -18,11 +18,11 @@ @import "theme.less"; .trigger { + padding: 0 24px; font-size: 18px; line-height: 64px; - padding: 0 24px; cursor: pointer; - transition: color .3s; + transition: color 0.3s; } .trigger:hover { @@ -30,60 +30,59 @@ } .logo { - height: 64px; position: relative; - line-height: 64px; + overflow: hidden; + height: 64px; padding-left: 24px; - transition: all 0.3s ease 0s; background: @layout-header-background; - overflow: hidden; + line-height: 64px; + transition: all 0.3s ease 0s; a { line-height: 64px; h1 { - color: #ffffff; - font-size: 14px; - font-family: "Myriad Pro", "Helvetica Neue", Arial, Helvetica, sans-serif; - font-weight: 600; - margin: 0px 0px 0px 12px; display: inline-block; vertical-align: middle; + margin: 0 0 0 12px; + color: #fff; + font-weight: 600; + font-size: 14px; + font-family: "Myriad Pro", "Helvetica Neue", Arial, Helvetica, sans-serif; } img { - height: 32px; - width: 32px; + position: relative; + top: -4px; display: inline-block; vertical-align: middle; - top: -4px; - position: relative; + width: 32px; + height: 32px; } } - } nz-layout { - min-height: 100vh; overflow: hidden; + min-height: 100vh; background: darken(@component-background, 5%); } nz-sider { - min-height: 100vh; - box-shadow: rgba(0, 21, 41, 0.35) 2px 0px 6px; position: relative; z-index: 10; + min-height: 100vh; + box-shadow: rgba(0, 21, 41, 0.35) 2px 0 6px; } nz-header { - background: @component-background; - border-bottom: 1px solid @border-color-split; - box-shadow: 0 1px 4px rgba(0, 21, 41, .08); position: relative; - padding: 0px 12px 0px 0px; flex: 0 0 auto; overflow: hidden; + padding: 0 12px 0 0; + border-bottom: 1px solid @border-color-split; + background: @component-background; + box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); nz-badge { vertical-align: middle; @@ -112,22 +111,22 @@ nz-header { height: 100%; .text { - padding: 0 12px; display: inline-block; height: 100%; + padding: 0 12px; color: @text-color; } .action { - transition: all .3s; + transition: all 0.3s; &:hover { background: @background-color-light; } i { - font-size: 16px; vertical-align: middle; + font-size: 16px; } } @@ -138,13 +137,13 @@ nz-header { } nz-content { - margin: 24px; - height: 100%; flex: 1 1 auto; + height: 100%; + margin: 24px; } .menu { - padding: 16px 0px; + padding: 16px 0; } nz-alert { @@ -160,11 +159,12 @@ nz-alert { 0% { opacity: 1; } + 50% { opacity: 0.2; } + 100% { opacity: 1; } } - diff --git a/flink-runtime-web/web-dashboard/src/app/app.component.ts b/flink-runtime-web/web-dashboard/src/app/app.component.ts index 77e9a4451f21f..b371020278023 100644 --- a/flink-runtime-web/web-dashboard/src/app/app.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/app.component.ts @@ -19,9 +19,11 @@ import { Component } from '@angular/core'; import { fromEvent, merge } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { StatusService } from 'services'; + import { MonacoEditorService } from 'share/common/monaco-editor/monaco-editor.service'; +import { StatusService } from 'services'; + @Component({ selector: 'flink-root', templateUrl: './app.component.html', @@ -37,18 +39,18 @@ export class AppComponent { webSubmitEnabled = this.statusService.configuration.features['web-submit']; - showMessage() { + showMessage(): void { if (this.statusService.listOfErrorMessage.length) { this.visible = true; } } - clearMessage() { + clearMessage(): void { this.statusService.listOfErrorMessage = []; this.visible = false; } - toggleCollapse() { + toggleCollapse(): void { this.collapsed = !this.collapsed; this.monacoEditorService.layout(); } diff --git a/flink-runtime-web/web-dashboard/src/app/app.interceptor.ts b/flink-runtime-web/web-dashboard/src/app/app.interceptor.ts index 08f3fb34b803f..94af39b811eee 100644 --- a/flink-runtime-web/web-dashboard/src/app/app.interceptor.ts +++ b/flink-runtime-web/web-dashboard/src/app/app.interceptor.ts @@ -18,16 +18,19 @@ import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; import { Injectable, Injector } from '@angular/core'; -import { NzNotificationService } from 'ng-zorro-antd/notification'; import { throwError, Observable } from 'rxjs'; import { catchError } from 'rxjs/operators'; + +import { NzNotificationService } from 'ng-zorro-antd/notification'; + +import { SafeAny } from 'interfaces'; import { StatusService } from 'services'; @Injectable() export class AppInterceptor implements HttpInterceptor { constructor(private injector: Injector) {} - intercept(req: HttpRequest, next: HttpHandler): Observable> { + intercept(req: HttpRequest, next: HttpHandler): Observable> { /** * Error response from below url should be ignored */ diff --git a/flink-runtime-web/web-dashboard/src/app/app.module.ts b/flink-runtime-web/web-dashboard/src/app/app.module.ts index 66b7a102dd44b..128a647092059 100644 --- a/flink-runtime-web/web-dashboard/src/app/app.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/app.module.ts @@ -16,25 +16,14 @@ * limitations under the License. */ -import { BrowserModule } from '@angular/platform-browser'; +import { registerLocaleData } from '@angular/common'; +import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; +import en from '@angular/common/locales/en'; import { APP_INITIALIZER, Injector, NgModule } from '@angular/core'; -import { Router } from '@angular/router'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { NZ_I18N, en_US } from 'ng-zorro-antd/i18n'; -import { NZ_ICONS, NzIconModule } from 'ng-zorro-antd/icon'; -import { NZ_CONFIG, NzConfig } from 'ng-zorro-antd/core/config'; -import { NzLayoutModule } from 'ng-zorro-antd/layout'; -import { NzMenuModule } from 'ng-zorro-antd/menu'; -import { NzDividerModule } from 'ng-zorro-antd/divider'; -import { NzBadgeModule } from 'ng-zorro-antd/badge'; -import { NzDrawerModule } from 'ng-zorro-antd/drawer'; -import { NzAlertModule } from 'ng-zorro-antd/alert'; import { FormsModule } from '@angular/forms'; -import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; +import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { registerLocaleData } from '@angular/common'; -import en from '@angular/common/locales/en'; +import { Router } from '@angular/router'; import { BarsOutline, @@ -73,11 +62,23 @@ import { ShrinkOutline, PicCenterOutline } from '@ant-design/icons-angular/icons'; +import { NzAlertModule } from 'ng-zorro-antd/alert'; +import { NzBadgeModule } from 'ng-zorro-antd/badge'; +import { NZ_CONFIG, NzConfig } from 'ng-zorro-antd/core/config'; +import { NzDividerModule } from 'ng-zorro-antd/divider'; +import { NzDrawerModule } from 'ng-zorro-antd/drawer'; +import { NZ_I18N, en_US } from 'ng-zorro-antd/i18n'; +import { NZ_ICONS, NzIconModule } from 'ng-zorro-antd/icon'; +import { NzLayoutModule } from 'ng-zorro-antd/layout'; +import { NzMenuModule } from 'ng-zorro-antd/menu'; +import { NzNotificationModule } from 'ng-zorro-antd/notification'; -import { StatusService } from 'services'; import { ConfigurationInterface } from 'interfaces'; +import { StatusService } from 'services'; + +import { AppRoutingModule } from './app-routing.module'; +import { AppComponent } from './app.component'; import { AppInterceptor } from './app.interceptor'; -import { NzNotificationModule } from 'ng-zorro-antd/notification'; registerLocaleData(en); diff --git a/flink-runtime-web/web-dashboard/src/app/interfaces/job-checkpoint.ts b/flink-runtime-web/web-dashboard/src/app/interfaces/job-checkpoint.ts index c91acd80bf74a..a38571aa3e490 100644 --- a/flink-runtime-web/web-dashboard/src/app/interfaces/job-checkpoint.ts +++ b/flink-runtime-web/web-dashboard/src/app/interfaces/job-checkpoint.ts @@ -16,6 +16,8 @@ * limitations under the License. */ +import { SafeAny } from './safe-any'; + export interface CheckPointInterface { counts: { restored: number; @@ -111,7 +113,7 @@ export interface CheckPointTaskStatisticsInterface { } export interface CheckPointConfigInterface { - mode: any; + mode: SafeAny; interval: number; timeout: number; min_pause: number; @@ -143,7 +145,7 @@ export interface CheckPointDetailInterface { num_acknowledged_subtasks: number; checkpoint_type: string; tasks: Array<{ - [ taskId: string ]: { + [taskId: string]: { id: number; status: string; latest_ack_timestamp: number; diff --git a/flink-runtime-web/web-dashboard/src/app/interfaces/job-detail.ts b/flink-runtime-web/web-dashboard/src/app/interfaces/job-detail.ts index 91c424a186ae6..a0969aa00689c 100644 --- a/flink-runtime-web/web-dashboard/src/app/interfaces/job-detail.ts +++ b/flink-runtime-web/web-dashboard/src/app/interfaces/job-detail.ts @@ -16,6 +16,8 @@ * limitations under the License. */ +import { SafeAny } from './safe-any'; + export interface JobStatusCountsInterface { CREATED: number; SCHEDULED: number; @@ -61,7 +63,7 @@ export interface JobDetailInterface { interface Plan { jid: string; name: string; - type: string; + type: string; nodes: NodesItemInterface[]; } @@ -126,7 +128,7 @@ export interface NodesItemInterface { operator_strategy: string; description: string; inputs?: InputsItem[]; - optimizer_properties: {}; + optimizer_properties: SafeAny; width?: number; height?: number; } diff --git a/flink-runtime-web/web-dashboard/src/app/interfaces/job-exception.ts b/flink-runtime-web/web-dashboard/src/app/interfaces/job-exception.ts index 16b5b8bc22904..c07206fd74c28 100644 --- a/flink-runtime-web/web-dashboard/src/app/interfaces/job-exception.ts +++ b/flink-runtime-web/web-dashboard/src/app/interfaces/job-exception.ts @@ -21,7 +21,7 @@ export interface JobExceptionInterface { timestamp: number; truncated: boolean; 'all-exceptions': JobExceptionItemInterface[]; - 'exceptionHistory': JobExceptionHistoryInterface; + exceptionHistory: JobExceptionHistoryInterface; } export interface JobExceptionItemInterface { diff --git a/flink-runtime-web/web-dashboard/src/app/interfaces/public-api.ts b/flink-runtime-web/web-dashboard/src/app/interfaces/public-api.ts index 3aedb4e6d1151..e28d85c980a75 100644 --- a/flink-runtime-web/web-dashboard/src/app/interfaces/public-api.ts +++ b/flink-runtime-web/web-dashboard/src/app/interfaces/public-api.ts @@ -32,3 +32,4 @@ export * from './plan'; export * from './overview'; export * from './task-manager'; export * from './job-accumulators'; +export * from './safe-any'; diff --git a/flink-runtime-web/web-dashboard/src/app/interfaces/safe-any.ts b/flink-runtime-web/web-dashboard/src/app/interfaces/safe-any.ts new file mode 100644 index 0000000000000..395145638d63c --- /dev/null +++ b/flink-runtime-web/web-dashboard/src/app/interfaces/safe-any.ts @@ -0,0 +1,6 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/** + * @deprecated We should avoid using type any. Instead, try to infer the type or use unknown as an alternative. + */ +export type SafeAny = any; diff --git a/flink-runtime-web/web-dashboard/src/app/interfaces/task-manager.ts b/flink-runtime-web/web-dashboard/src/app/interfaces/task-manager.ts index 275cb6ea38c70..220282cbf9cf1 100644 --- a/flink-runtime-web/web-dashboard/src/app/interfaces/task-manager.ts +++ b/flink-runtime-web/web-dashboard/src/app/interfaces/task-manager.ts @@ -33,7 +33,7 @@ export interface TaskManagerDetailInterface { } export interface TaskManagerLogInterface { - logs: { name: string; size: number }[]; + logs: Array<{ name: string; size: number }>; } export interface TaskmanagersItemInterface { diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.html index 2d3f896d28af1..247392107548b 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.html @@ -20,16 +20,19 @@ nzSize="small" [nzData]="listOfConfig" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" +> - Key - Value + Key + Value - {{ config.key }} + + {{ config.key }} + {{ config.value }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.ts index 1dc88ee0aa790..3fe5c3477e314 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/configuration/job-manager-configuration.component.ts @@ -17,6 +17,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; + import { JobManagerService } from 'services'; @Component({ @@ -30,7 +31,7 @@ export class JobManagerConfigurationComponent implements OnInit { constructor(private jobManagerService: JobManagerService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobManagerService.loadConfig().subscribe(data => { this.listOfConfig = data.sort((pre, next) => (pre.key > next.key ? 1 : -1)); this.cdr.markForCheck(); diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager-routing.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager-routing.module.ts index 2220a3498a327..7ffb5fa87bcf2 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager-routing.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager-routing.module.ts @@ -18,13 +18,14 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; + import { JobManagerConfigurationComponent } from './configuration/job-manager-configuration.component'; import { JobManagerComponent } from './job-manager.component'; import { JobManagerLogDetailComponent } from './log-detail/job-manager-log-detail.component'; import { JobManagerLogListComponent } from './log-list/job-manager-log-list.component'; import { JobManagerLogsComponent } from './logs/job-manager-logs.component'; -import { JobManagerStdoutComponent } from './stdout/job-manager-stdout.component'; import { JobManagerMetricsComponent } from './metrics/job-manager-metrics.component'; +import { JobManagerStdoutComponent } from './stdout/job-manager-stdout.component'; const routes: Routes = [ { diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.component.less index ef12d52ae2477..17becf50d66d7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.component.less @@ -18,17 +18,18 @@ @import "theme"; :host { + position: relative; + display: block; + box-sizing: border-box; + border: 1px solid @border-color-split; + border-radius: 2px; + background: @body-background; + font-size: 14px; + line-height: 1.5; + flink-navigation { ::ng-deep .ant-tabs-nav-wrap { margin: 0 @margin-md; } } - display: block; - font-size: 14px; - line-height: 1.5; - box-sizing: border-box; - border: 1px solid @border-color-split; - background: @body-background; - border-radius: 2px; - position: relative; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.module.ts index 938bcd7126219..b00ce67a2449e 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/job-manager.module.ts @@ -16,18 +16,9 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { ShareModule } from 'share/share.module'; +import { NgModule } from '@angular/core'; -import { JobManagerRoutingModule } from './job-manager-routing.module'; -import { JobManagerComponent } from './job-manager.component'; -import { JobManagerConfigurationComponent } from './configuration/job-manager-configuration.component'; -import { JobManagerLogDetailComponent } from './log-detail/job-manager-log-detail.component'; -import { JobManagerLogListComponent } from './log-list/job-manager-log-list.component'; -import { JobManagerLogsComponent } from './logs/job-manager-logs.component'; -import { JobManagerStdoutComponent } from './stdout/job-manager-stdout.component'; -import { JobManagerMetricsComponent } from './metrics/job-manager-metrics.component'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzCardModule } from 'ng-zorro-antd/card'; import { NzGridModule } from 'ng-zorro-antd/grid'; @@ -35,6 +26,16 @@ import { NzIconModule } from 'ng-zorro-antd/icon'; import { NzProgressModule } from 'ng-zorro-antd/progress'; import { NzTableModule } from 'ng-zorro-antd/table'; import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; +import { ShareModule } from 'share/share.module'; + +import { JobManagerConfigurationComponent } from './configuration/job-manager-configuration.component'; +import { JobManagerRoutingModule } from './job-manager-routing.module'; +import { JobManagerComponent } from './job-manager.component'; +import { JobManagerLogDetailComponent } from './log-detail/job-manager-log-detail.component'; +import { JobManagerLogListComponent } from './log-list/job-manager-log-list.component'; +import { JobManagerLogsComponent } from './logs/job-manager-logs.component'; +import { JobManagerMetricsComponent } from './metrics/job-manager-metrics.component'; +import { JobManagerStdoutComponent } from './stdout/job-manager-stdout.component'; @NgModule({ imports: [ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.html index 1ac5c7a8aa391..aa96ca171ab07 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.html @@ -19,7 +19,10 @@ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.less index 3949a6f929ba0..6ff14b8c0c649 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.less @@ -18,37 +18,39 @@ @import "theme"; +flink-monaco-editor { + height: calc(~"100vh - 205px"); +} + :host { display: block; height: 100%; + &.full-screen { position: fixed; top: 0; - bottom: 0; right: 0; + bottom: 0; left: 0; - background: @component-background; z-index: 99; + background: @component-background; + flink-monaco-editor { height: calc(~"100vh - 46px"); } } } -flink-monaco-editor { - height: calc(~"100vh - 205px"); -} - .breadcrumb { - background: @component-background; - border-bottom: 1px solid @border-color-split; - padding: 12px 24px; position: relative; + padding: 12px 24px; + border-bottom: 1px solid @border-color-split; + background: @component-background; } flink-refresh-download { position: absolute; - right: 12px; top: 0; + right: 12px; line-height: 47px; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.ts index 8277d821a898a..e89cb7b398df5 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-detail/job-manager-log-detail.component.ts @@ -19,9 +19,11 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { finalize } from 'rxjs/operators'; -import { JobManagerService } from 'services'; + import { MonacoEditorComponent } from 'share/common/monaco-editor/monaco-editor.component'; +import { JobManagerService } from 'services'; + @Component({ selector: 'flink-job-manager-log-detail', templateUrl: './job-manager-log-detail.component.html', @@ -44,7 +46,7 @@ export class JobManagerLogDetailComponent implements OnInit { private activatedRoute: ActivatedRoute ) {} - reload() { + reload(): void { this.isLoading = true; this.cdr.markForCheck(); this.jobManagerService @@ -66,12 +68,12 @@ export class JobManagerLogDetailComponent implements OnInit { setTimeout(() => this.monacoEditorComponent.layout()); } - toggleFullScreen(fullScreen: boolean) { + toggleFullScreen(fullScreen: boolean): void { this.isFullScreen = fullScreen; this.layoutEditor(); } - ngOnInit() { + ngOnInit(): void { this.logName = this.activatedRoute.snapshot.params.logName; this.reload(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.html index 287cf5a1f45fe..079b4bdb7e628 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.html @@ -34,11 +34,11 @@ - + {{ log.name }} - {{ (log.size / 1024) | number : '1.0-2' }} + {{ log.size / 1024 | number: '1.0-2' }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.ts index a3244bd1790bc..b7af2c67628ab 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/log-list/job-manager-log-list.component.ts @@ -18,6 +18,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { finalize } from 'rxjs/operators'; + import { JobManagerService } from 'services'; @Component({ @@ -27,14 +28,14 @@ import { JobManagerService } from 'services'; changeDetection: ChangeDetectionStrategy.OnPush }) export class JobManagerLogListComponent implements OnInit { - listOfLog: { name: string; size: number }[] = []; + listOfLog: Array<{ name: string; size: number }> = []; isLoading = true; - trackByName = (_: number, log: { name: string; size: number }) => log.name; + trackByName = (_: number, log: { name: string; size: number }): string => log.name; constructor(private jobManagerService: JobManagerService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobManagerService .loadLogList() .pipe( diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.html index 20325c57baa88..342de35728a95 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.html @@ -22,14 +22,20 @@ *ngIf="metrics" nzTemplateMode nzSize="small" - [nzWidthConfig]="['220px','160px','200px',null]" + [nzWidthConfig]="['220px', '160px', '200px', null]" > Flink Memory Model Effective Configuration - + Metric @@ -37,33 +43,60 @@ - + JVM Heap {{ config['jobmanager.memory.heap.size'] | parseInt | humanizeBytes }} - + {{ metrics['Status.JVM.Memory.Heap.Used'] | humanizeBytes }} / {{ metrics['Status.JVM.Memory.Heap.Max'] | humanizeBytes }} - + Off-Heap Memory {{ config['jobmanager.memory.off-heap.size'] | parseInt | humanizeBytes }} - + + + JVM Metaspace {{ config['jobmanager.memory.jvm-metaspace.size'] | parseInt | humanizeBytes }} - + {{ metrics['Status.JVM.Memory.Metaspace.Used'] | humanizeBytes }} / {{ metrics['Status.JVM.Memory.Metaspace.Max'] | humanizeBytes }} @@ -71,17 +104,29 @@ JVM Overhead - + {{ config['jobmanager.memory.jvm-overhead.min'] | parseInt | humanizeBytes }} - Min: {{ config['jobmanager.memory.jvm-overhead.min'] || '-'}} -
- Max: {{ config['jobmanager.memory.jvm-overhead.max'] || '-'}} + Min: {{ config['jobmanager.memory.jvm-overhead.min'] || '-' }} +
+ Max: {{ config['jobmanager.memory.jvm-overhead.max'] || '-' }}
- + + + @@ -98,26 +143,26 @@ [nzSize]="'small'" > - - Type - Committed - Used - Maximum - + + Type + Committed + Used + Maximum + - - Heap - {{ metrics['Status.JVM.Memory.Heap.Committed'] | humanizeBytes }} - {{ metrics['Status.JVM.Memory.Heap.Used'] | humanizeBytes }} - {{ metrics['Status.JVM.Memory.Heap.Max'] | humanizeBytes }} - - - Non-Heap - {{ metrics['Status.JVM.Memory.NonHeap.Committed'] | humanizeBytes }} - {{ metrics['Status.JVM.Memory.NonHeap.Used'] | humanizeBytes }} - {{ metrics['Status.JVM.Memory.NonHeap.Max'] | humanizeBytes }} - + + Heap + {{ metrics['Status.JVM.Memory.Heap.Committed'] | humanizeBytes }} + {{ metrics['Status.JVM.Memory.Heap.Used'] | humanizeBytes }} + {{ metrics['Status.JVM.Memory.Heap.Max'] | humanizeBytes }} + + + Non-Heap + {{ metrics['Status.JVM.Memory.NonHeap.Committed'] | humanizeBytes }} + {{ metrics['Status.JVM.Memory.NonHeap.Used'] | humanizeBytes }} + {{ metrics['Status.JVM.Memory.NonHeap.Max'] | humanizeBytes }} +
@@ -131,26 +176,26 @@ [nzSize]="'small'" > - - Type - Count - Used - Capacity - + + Type + Count + Used + Capacity + - - Direct - {{ metrics['Status.JVM.Memory.Direct.Count'] | number }} - {{ metrics['Status.JVM.Memory.Direct.MemoryUsed'] | humanizeBytes }} - {{ metrics['Status.JVM.Memory.Direct.TotalCapacity'] | humanizeBytes }} - - - Mapped - {{ metrics['Status.JVM.Memory.Mapped.Count'] | number }} - {{ metrics['Status.JVM.Memory.Mapped.MemoryUsed'] | humanizeBytes }} - {{ metrics['Status.JVM.Memory.Mapped.TotalCapacity'] | humanizeBytes }} - + + Direct + {{ metrics['Status.JVM.Memory.Direct.Count'] | number }} + {{ metrics['Status.JVM.Memory.Direct.MemoryUsed'] | humanizeBytes }} + {{ metrics['Status.JVM.Memory.Direct.TotalCapacity'] | humanizeBytes }} + + + Mapped + {{ metrics['Status.JVM.Memory.Mapped.Count'] | number }} + {{ metrics['Status.JVM.Memory.Mapped.MemoryUsed'] | humanizeBytes }} + {{ metrics['Status.JVM.Memory.Mapped.TotalCapacity'] | humanizeBytes }} + @@ -164,23 +209,23 @@ [nzSize]="'small'" > - - Collector - Count - Time - + + Collector + Count + Time + - - {{ gc.name }} - {{ gc.count || '-' }} - {{ gc.time || '-' }} - + + + {{ gc.name }} + + {{ gc.count || '-' }} + {{ gc.time || '-' }} + - - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.less index 56fa181c64401..d9332f78893dc 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.less @@ -19,7 +19,7 @@ @import "theme"; .wrapper { - margin: 0 @margin-lg @margin-lg @margin-lg; + margin: @margin-lg; } .header-icon { @@ -27,43 +27,52 @@ top: 1px; } +nz-progress { + display: block; + width: 90%; + + ::ng-deep { + .ant-progress-inner { + border-radius: 0 !important; + } + } +} + .flink-memory-model { margin-bottom: @margin-md; + ::ng-deep { table { border-collapse: collapse; } + .ant-table-small { border: none; + .ant-table-body { - margin: 0; overflow: hidden !important; + margin: 0; } - tr { - &:hover { - td, th { - background: transparent; - } - } - } - td, th { + + td, + th { border-collapse: collapse; + &.table-header { background: @table-header-bg !important; color: @table-header-color; font-weight: 500; } } - } - } -} -nz-progress { - display: block; - width: 90%; - ::ng-deep { - .ant-progress-inner { - border-radius: 0 !important; + tr { + &:hover { + td, + th { + background: transparent; + } + } + } } } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.ts index e9364d30b6a29..4fd39b3f98a04 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/metrics/job-manager-metrics.component.ts @@ -17,10 +17,11 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { JobManagerService, StatusService } from 'services'; import { Subject } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; +import { JobManagerService, StatusService } from 'services'; + @Component({ selector: 'flink-job-manager-metrics', templateUrl: './job-manager-metrics.component.html', @@ -39,7 +40,7 @@ export class JobManagerMetricsComponent implements OnInit, OnDestroy { private cdr: ChangeDetectorRef ) {} - ngOnInit() { + ngOnInit(): void { this.jobManagerService.loadConfig().subscribe(data => { for (const item of data) { this.config[item.key] = item.value; @@ -96,7 +97,7 @@ export class JobManagerMetricsComponent implements OnInit, OnDestroy { }); }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.html index 8528b2b0df9fe..4114e50b89213 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.html @@ -17,4 +17,9 @@ --> - + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.ts index 19dc63664e89c..16ff756b7fde1 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job-manager/stdout/job-manager-stdout.component.ts @@ -17,9 +17,11 @@ */ import { ChangeDetectorRef, Component, OnInit, ViewChild, ChangeDetectionStrategy } from '@angular/core'; -import { JobManagerService } from 'services'; + import { MonacoEditorComponent } from 'share/common/monaco-editor/monaco-editor.component'; +import { JobManagerService } from 'services'; + @Component({ selector: 'flink-job-manager-stdout', templateUrl: './job-manager-stdout.component.html', @@ -30,7 +32,7 @@ export class JobManagerStdoutComponent implements OnInit { @ViewChild(MonacoEditorComponent, { static: true }) monacoEditorComponent: MonacoEditorComponent; stdout = ''; - reload() { + reload(): void { this.jobManagerService.loadStdout().subscribe(data => { this.monacoEditorComponent.layout(); this.stdout = data; @@ -40,7 +42,7 @@ export class JobManagerStdoutComponent implements OnInit { constructor(private jobManagerService: JobManagerService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.reload(); } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.html index 8111d545e7cd1..7c077ca484770 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.html @@ -18,14 +18,18 @@
Checkpoint Detail:
- Path: {{checkPointDetail?.external_path || '-'}} + Path: + {{ checkPointDetail?.external_path || '-' }} - Discarded: {{checkPointDetail?.discarded || '-'}} + Discarded: + {{ checkPointDetail?.discarded || '-' }} - Checkpoint Type: {{checkPointType}} + Checkpoint Type: + {{ checkPointType }} - Failure Message: {{checkPointDetail?.failure_message || '-' }} + Failure Message: + {{ checkPointDetail?.failure_message || '-' }}
@@ -37,7 +41,8 @@ [nzLoading]="isLoading" [nzData]="listOfVertex" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" + > @@ -50,27 +55,48 @@ - +
{{ vertex.name }}
- {{ checkPointDetail['tasks'][vertex.id]['num_acknowledged_subtasks'] }}/{{ checkPointDetail['tasks'][vertex.id]['num_subtasks'] }} ({{ (checkPointDetail['tasks'][vertex.id]['num_acknowledged_subtasks'] / checkPointDetail['tasks'][vertex.id]['num_subtasks']) | percent }}) - {{ checkPointDetail['tasks'][vertex.id]['latest_ack_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} - n/a - {{ checkPointDetail['tasks'][vertex.id]['end_to_end_duration'] | humanizeDuration}} - n/a + + {{ checkPointDetail['tasks'][vertex.id]['num_acknowledged_subtasks'] }}/{{ + checkPointDetail['tasks'][vertex.id]['num_subtasks'] + }} + ({{ + checkPointDetail['tasks'][vertex.id]['num_acknowledged_subtasks'] / + checkPointDetail['tasks'][vertex.id]['num_subtasks'] | percent + }}) + + + {{ + checkPointDetail['tasks'][vertex.id]['latest_ack_timestamp'] + | date: 'yyyy-MM-dd HH:mm:ss' + }} + + n/a + + {{ checkPointDetail['tasks'][vertex.id]['end_to_end_duration'] | humanizeDuration }} + + n/a {{ checkPointDetail['tasks'][vertex.id]['state_size'] | humanizeBytes }} - {{ checkPointDetail['tasks'][vertex.id]['processed_data'] | humanizeBytes }} ({{ checkPointDetail['tasks'][vertex.id]['persisted_data'] | humanizeBytes }}) + + {{ checkPointDetail['tasks'][vertex.id]['processed_data'] | humanizeBytes }} ({{ + checkPointDetail['tasks'][vertex.id]['persisted_data'] | humanizeBytes + }}) + - +
- diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.less index a4b78a572426a..5c1935be547c7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.less @@ -18,9 +18,9 @@ @import "theme"; .name { + overflow: hidden; width: 400px; word-break: break-all; - overflow: hidden; } .more-detail { @@ -29,14 +29,14 @@ } .extra { - background: darken(@component-background, 1%); + margin-bottom: 12px; padding: 12px; border: 1px solid @border-color-split; - margin-bottom: 12px; + background: darken(@component-background, 1%); } .operators { padding: 12px; - background: darken(@component-background, 1%); border: 1px solid @border-color-split; + background: darken(@component-background, 1%); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.ts index 1580dc74727ad..e850c291197a9 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/detail/job-checkpoints-detail.component.ts @@ -17,6 +17,9 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'; +import { forkJoin } from 'rxjs'; +import { first } from 'rxjs/operators'; + import { CheckPointCompletedStatisticsInterface, CheckPointDetailInterface, @@ -24,8 +27,6 @@ import { VerticesItemInterface, CheckPointConfigInterface } from 'interfaces'; -import { forkJoin } from 'rxjs'; -import { first } from 'rxjs/operators'; import { JobService } from 'services'; @Component({ @@ -45,7 +46,7 @@ export class JobCheckpointsDetailComponent implements OnInit { this.refresh(); } - get checkPoint() { + get checkPoint(): CheckPointCompletedStatisticsInterface { return this.innerCheckPoint; } @@ -54,11 +55,11 @@ export class JobCheckpointsDetailComponent implements OnInit { listOfVertex: VerticesItemInterface[] = []; isLoading = true; - trackVertexBy(_: number, node: VerticesItemInterface) { + trackVertexBy(_: number, node: VerticesItemInterface): string { return node.id; } - refresh() { + refresh(): void { this.isLoading = true; if (this.jobDetail && this.jobDetail.jid) { forkJoin([ @@ -94,7 +95,7 @@ export class JobCheckpointsDetailComponent implements OnInit { constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobDetail$.pipe(first()).subscribe(data => { this.jobDetail = data; this.listOfVertex = data!.vertices; diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.html index 4c1b311c083c6..1ae25ab5957a5 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.html @@ -16,94 +16,190 @@ ~ limitations under the License. --> - + + [nzShowPagination]="false" + > Checkpoint Counts - Triggered: {{ checkPointStats['counts']['total'] }} + + Triggered: + {{ checkPointStats['counts']['total'] }} + - In Progress: {{ checkPointStats['counts']['in_progress'] }} + + In Progress: + {{ checkPointStats['counts']['in_progress'] }} + - Completed: {{ checkPointStats['counts']['completed'] }} + + Completed: + {{ checkPointStats['counts']['completed'] }} + - Failed: {{ checkPointStats['counts']['failed'] }} + + Failed: + {{ checkPointStats['counts']['failed'] }} + - Restored: {{ checkPointStats['counts']['restored'] }} + + Restored: + {{ checkPointStats['counts']['restored'] }} + Latest Completed Checkpoint - ID: {{ checkPointStats['latest']['completed']['id'] }} + + ID: + {{ checkPointStats['latest']['completed']['id'] }} + - Completion Time: {{ checkPointStats['latest']['completed']['latest_ack_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} + + Completion Time: + {{ + checkPointStats['latest']['completed']['latest_ack_timestamp'] + | date: 'yyyy-MM-dd HH:mm:ss' + }} + - End to End Duration: {{ checkPointStats['latest']['completed']['end_to_end_duration'] | humanizeDuration}} + + End to End Duration: + {{ + checkPointStats['latest']['completed']['end_to_end_duration'] | humanizeDuration + }} + - Checkpointed Data Size: {{ checkPointStats['latest']['completed']['state_size'] | humanizeBytes }} + + Checkpointed Data Size: + {{ checkPointStats['latest']['completed']['state_size'] | humanizeBytes }} + None - + Latest Failed Checkpoint - ID: {{ checkPointStats['latest']['failed']['id'] }} + + ID: + {{ checkPointStats['latest']['failed']['id'] }} + - Failure Time: {{ checkPointStats['latest']['failed']['failure_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} + + Failure Time: + {{ + checkPointStats['latest']['failed']['failure_timestamp'] + | date: 'yyyy-MM-dd HH:mm:ss' + }} + - Cause: {{ checkPointStats['latest']['failed']['failure_message'] }} - Cause: n/a + + + Cause: + + {{ checkPointStats['latest']['failed']['failure_message'] }} + + + Cause: + n/a + None - + Latest Savepoint - ID: {{ checkPointStats['latest']['savepoint']['id'] }} + + ID: + {{ checkPointStats['latest']['savepoint']['id'] }} + - Completion Time: {{ checkPointStats['latest']['savepoint']['latest_ack_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} + + Completion Time: + {{ + checkPointStats['latest']['savepoint']['latest_ack_timestamp'] + | date: 'yyyy-MM-dd HH:mm:ss' + }} + - Checkpointed Data Size: {{ checkPointStats['latest']['savepoint']['state_size'] | humanizeBytes }} + + Checkpointed Data Size: + {{ checkPointStats['latest']['savepoint']['state_size'] | humanizeBytes }} + - Path: {{ checkPointStats['latest']['savepoint']['external_path'] }} + + Path: + {{ checkPointStats['latest']['savepoint']['external_path'] }} + None - + Latest Restore - ID: {{ checkPointStats['latest']['restored']['id'] }} + + ID: + {{ checkPointStats['latest']['restored']['id'] }} + - Restore Time: {{ checkPointStats['latest']['restored']['restore_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} + + Restore Time: + {{ + checkPointStats['latest']['restored']['restore_timestamp'] + | date: 'yyyy-MM-dd HH:mm:ss' + }} + - Type: Savepoint - Type: Checkpoint + + Type: + Savepoint + + + Type: + Checkpoint + - Path: {{ checkPointStats['latest']['restored']['external_path'] }} + + + Path: + + {{ checkPointStats['latest']['restored']['external_path'] }} + None @@ -117,7 +213,8 @@ [nzSize]="'small'" [nzData]="checkPointStats['history'] || []" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" + > @@ -132,7 +229,9 @@ - + {{ checkpoint['id'] }} @@ -141,25 +240,40 @@ {{ checkpoint['status'] }} [Savepoint] + + {{ checkpoint['num_acknowledged_subtasks'] }}/{{ checkpoint['num_subtasks'] }} - ({{ (checkpoint['num_acknowledged_subtasks']/checkpoint['num_subtasks']) | percent }}) + + ({{ + checkpoint['num_acknowledged_subtasks'] / checkpoint['num_subtasks'] | percent + }}) + + + {{ checkpoint['trigger_timestamp'] | date: 'yyyy-MM-dd HH:mm:ss' }} + + {{ checkpoint['latest_ack_timestamp'] | date: 'yyyy-MM-dd HH:mm:ss' }} - {{ checkpoint['trigger_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} - {{ checkpoint['latest_ack_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} n/a - {{ checkpoint['end_to_end_duration'] | humanizeDuration}} - n/a + + {{ checkpoint['end_to_end_duration'] | humanizeDuration }} + + n/a {{ checkpoint['state_size'] | humanizeBytes }} - {{ checkpoint['processed_data'] | humanizeBytes }} ({{ checkpoint['persisted_data'] | humanizeBytes }}) + + {{ checkpoint['processed_data'] | humanizeBytes }} ({{ + checkpoint['persisted_data'] | humanizeBytes + }}) + - + - @@ -167,10 +281,11 @@ + [nzShowPagination]="false" + > @@ -183,92 +298,142 @@ Minimum - {{ checkPointStats['summary']['end_to_end_duration']['min'] | humanizeDuration}} + + {{ checkPointStats['summary']['end_to_end_duration']['min'] | humanizeDuration }} + {{ checkPointStats['summary']['state_size']['min'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['min'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['min'] | humanizeBytes }}) + + {{ checkPointStats['summary']['processed_data']['min'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['min'] | humanizeBytes + }}) + Average - {{ checkPointStats['summary']['end_to_end_duration']['avg'] | humanizeDuration}} + + {{ checkPointStats['summary']['end_to_end_duration']['avg'] | humanizeDuration }} + {{ checkPointStats['summary']['state_size']['avg'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['avg'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['avg'] | humanizeBytes }}) + + {{ checkPointStats['summary']['processed_data']['avg'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['avg'] | humanizeBytes + }}) + + + + Maximum + + {{ checkPointStats['summary']['end_to_end_duration']['max'] | humanizeDuration }} + + {{ checkPointStats['summary']['state_size']['max'] | humanizeBytes }} + + {{ checkPointStats['summary']['processed_data']['max'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['max'] | humanizeBytes + }}) + - - Maximum - {{ checkPointStats['summary']['end_to_end_duration']['max'] | humanizeDuration}} - {{ checkPointStats['summary']['state_size']['max'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['max'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['max'] | humanizeBytes }}) - - - - - - - End to End Duration - Checkpointed Data Size - Processed (persisted) in-flight data - - - - - - 50% percentile - {{ checkPointStats['summary']['end_to_end_duration']['p50'] | humanizeDuration}} - {{ checkPointStats['summary']['state_size']['p50'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['p50'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['p50'] | humanizeBytes }}) - - - 90% percentile - {{ checkPointStats['summary']['end_to_end_duration']['p90'] | humanizeDuration}} - {{ checkPointStats['summary']['state_size']['p90'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['p90'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['p90'] | humanizeBytes }}) - - - 99% percentile - {{ checkPointStats['summary']['end_to_end_duration']['p99'] | humanizeDuration}} - {{ checkPointStats['summary']['state_size']['p99'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['p99'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['p99'] | humanizeBytes }}) - - - 99% percentile - {{ checkPointStats['summary']['end_to_end_duration']['p99'] | humanizeDuration}} - {{ checkPointStats['summary']['state_size']['p99'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['p99'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['p99'] | humanizeBytes }}) - - - 99.9% percentile - {{ checkPointStats['summary']['end_to_end_duration']['p999'] | humanizeDuration}} - {{ checkPointStats['summary']['state_size']['p999'] | humanizeBytes }} - {{ checkPointStats['summary']['processed_data']['p999'] | humanizeBytes }} ({{ checkPointStats['summary']['persisted_data']['p999'] | humanizeBytes }}) - + + + + + + End to End Duration + Checkpointed Data Size + Processed (persisted) in-flight data + + + + + + 50% percentile + + {{ checkPointStats['summary']['end_to_end_duration']['p50'] | humanizeDuration }} + + {{ checkPointStats['summary']['state_size']['p50'] | humanizeBytes }} + + {{ checkPointStats['summary']['processed_data']['p50'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['p50'] | humanizeBytes + }}) + + + + 90% percentile + + {{ checkPointStats['summary']['end_to_end_duration']['p90'] | humanizeDuration }} + + {{ checkPointStats['summary']['state_size']['p90'] | humanizeBytes }} + + {{ checkPointStats['summary']['processed_data']['p90'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['p90'] | humanizeBytes + }}) + + + + 99% percentile + + {{ checkPointStats['summary']['end_to_end_duration']['p99'] | humanizeDuration }} + + {{ checkPointStats['summary']['state_size']['p99'] | humanizeBytes }} + + {{ checkPointStats['summary']['processed_data']['p99'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['p99'] | humanizeBytes + }}) + + + + 99% percentile + + {{ checkPointStats['summary']['end_to_end_duration']['p99'] | humanizeDuration }} + + {{ checkPointStats['summary']['state_size']['p99'] | humanizeBytes }} + + {{ checkPointStats['summary']['processed_data']['p99'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['p99'] | humanizeBytes + }}) + + + + 99.9% percentile + + {{ checkPointStats['summary']['end_to_end_duration']['p999'] | humanizeDuration }} + + {{ checkPointStats['summary']['state_size']['p999'] | humanizeBytes }} + + {{ checkPointStats['summary']['processed_data']['p999'] | humanizeBytes }} ({{ + checkPointStats['summary']['persisted_data']['p999'] | humanizeBytes + }}) + + - + - + [nzShowPagination]="false" + > Option @@ -279,8 +444,8 @@ Checkpointing Mode - Exactly Once - At Least Once + Exactly Once + At Least Once Checkpoint Storage @@ -292,16 +457,20 @@ Interval - Periodic checkpoints disabled - {{ checkPointConfig['interval'] | humanizeDuration}} + + Periodic checkpoints disabled + + + {{ checkPointConfig['interval'] | humanizeDuration }} + Timeout - {{ checkPointConfig['timeout'] | humanizeDuration}} + {{ checkPointConfig['timeout'] | humanizeDuration }} Minimum Pause Between Checkpoints - {{ checkPointConfig['min_pause'] | humanizeDuration}} + {{ checkPointConfig['min_pause'] | humanizeDuration }} Maximum Concurrent Checkpoints @@ -313,13 +482,18 @@ Aligned checkpoint timeout - {{ checkPointConfig['aligned_checkpoint_timeout'] | humanizeDuration}} + {{ checkPointConfig['aligned_checkpoint_timeout'] | humanizeDuration }} Persist Checkpoints Externally - Enabled - (delete on cancellation) - (retain on cancellation) + + Enabled + + (delete on cancellation) + + + (retain on cancellation) + Disabled @@ -334,7 +508,10 @@ - + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.less index f995e926b64fc..6b78072948107 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.less @@ -16,14 +16,14 @@ * limitations under the License. */ - :host { ::ng-deep { .ant-tabs-tabpane { - padding: 24px; - top: -16px; position: relative; + top: -16px; + padding: 24px; } + .ant-tabs-nav-list { padding: 4px 16px; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.ts index 17f0bf4762c44..4e90d97f68735 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/job-checkpoints.component.ts @@ -17,13 +17,14 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { distinctUntilChanged } from 'rxjs/operators'; + import { CheckPointConfigInterface, CheckPointHistoryInterface, CheckPointInterface, JobDetailCorrectInterface } from 'interfaces'; -import { distinctUntilChanged } from 'rxjs/operators'; import { JobService } from 'services'; @Component({ @@ -37,20 +38,20 @@ export class JobCheckpointsComponent implements OnInit { checkPointConfig: CheckPointConfigInterface; jobDetail: JobDetailCorrectInterface; - moreDetailsPanel = { active: false, disabled: false } + moreDetailsPanel = { active: false, disabled: false }; - trackHistoryBy(_: number, node: CheckPointHistoryInterface) { + trackHistoryBy(_: number, node: CheckPointHistoryInterface): number { return node.id; } - refresh() { + refresh(): void { this.jobService.loadCheckpointStats(this.jobDetail.jid).subscribe(data => (this.checkPointStats = data)); this.jobService.loadCheckpointConfig(this.jobDetail.jid).subscribe(data => (this.checkPointConfig = data)); } constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobDetail$.pipe(distinctUntilChanged((pre, next) => pre.jid === next.jid)).subscribe(data => { this.jobDetail = data; this.jobService.loadCheckpointStats(this.jobDetail.jid).subscribe(stats => { diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.html index 4d0aba3927273..fcfa09fbbb789 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.html @@ -24,7 +24,8 @@ [nzSize]="'small'" [nzLoading]="isLoading" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" + > @@ -41,33 +42,81 @@ Minimum - {{ subTaskCheckPoint['summary']['end_to_end_duration']['min'] | humanizeDuration}} + + {{ subTaskCheckPoint['summary']['end_to_end_duration']['min'] | humanizeDuration }} + {{ subTaskCheckPoint['summary']['state_size']['min'] | humanizeBytes }} - {{ subTaskCheckPoint['summary']['checkpoint_duration']['sync']['min'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['checkpoint_duration']['async']['min'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['alignment']['processed']['min'] | humanizeBytes }} ({{ subTaskCheckPoint['summary']['alignment']['persisted']['min'] | humanizeBytes }}) - {{ subTaskCheckPoint['summary']['alignment']['duration']['min'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['start_delay']['min'] | humanizeDuration}} + + {{ + subTaskCheckPoint['summary']['checkpoint_duration']['sync']['min'] | humanizeDuration + }} + + + {{ + subTaskCheckPoint['summary']['checkpoint_duration']['async']['min'] | humanizeDuration + }} + + + {{ subTaskCheckPoint['summary']['alignment']['processed']['min'] | humanizeBytes }} ({{ + subTaskCheckPoint['summary']['alignment']['persisted']['min'] | humanizeBytes + }}) + + + {{ subTaskCheckPoint['summary']['alignment']['duration']['min'] | humanizeDuration }} + + {{ subTaskCheckPoint['summary']['start_delay']['min'] | humanizeDuration }} Average - {{ subTaskCheckPoint['summary']['end_to_end_duration']['avg'] | humanizeDuration}} + + {{ subTaskCheckPoint['summary']['end_to_end_duration']['avg'] | humanizeDuration }} + {{ subTaskCheckPoint['summary']['state_size']['avg'] | humanizeBytes }} - {{ subTaskCheckPoint['summary']['checkpoint_duration']['sync']['avg'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['checkpoint_duration']['async']['avg'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['alignment']['processed']['avg'] | humanizeBytes }} ({{ subTaskCheckPoint['summary']['alignment']['persisted']['avg'] | humanizeBytes }}) - {{ subTaskCheckPoint['summary']['alignment']['duration']['avg'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['start_delay']['avg'] | humanizeDuration}} + + {{ + subTaskCheckPoint['summary']['checkpoint_duration']['sync']['avg'] | humanizeDuration + }} + + + {{ + subTaskCheckPoint['summary']['checkpoint_duration']['async']['avg'] | humanizeDuration + }} + + + {{ subTaskCheckPoint['summary']['alignment']['processed']['avg'] | humanizeBytes }} ({{ + subTaskCheckPoint['summary']['alignment']['persisted']['avg'] | humanizeBytes + }}) + + + {{ subTaskCheckPoint['summary']['alignment']['duration']['avg'] | humanizeDuration }} + + {{ subTaskCheckPoint['summary']['start_delay']['avg'] | humanizeDuration }} Maximum - {{ subTaskCheckPoint['summary']['end_to_end_duration']['max'] | humanizeDuration}} + + {{ subTaskCheckPoint['summary']['end_to_end_duration']['max'] | humanizeDuration }} + {{ subTaskCheckPoint['summary']['state_size']['max'] | humanizeBytes }} - {{ subTaskCheckPoint['summary']['checkpoint_duration']['sync']['max'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['checkpoint_duration']['async']['max'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['alignment']['processed']['max'] | humanizeBytes }} ({{ subTaskCheckPoint['summary']['alignment']['persisted']['max'] | humanizeBytes }}) - {{ subTaskCheckPoint['summary']['alignment']['duration']['max'] | humanizeDuration}} - {{ subTaskCheckPoint['summary']['start_delay']['max'] | humanizeDuration}} + + {{ + subTaskCheckPoint['summary']['checkpoint_duration']['sync']['max'] | humanizeDuration + }} + + + {{ + subTaskCheckPoint['summary']['checkpoint_duration']['async']['max'] | humanizeDuration + }} + + + {{ subTaskCheckPoint['summary']['alignment']['processed']['max'] | humanizeBytes }} ({{ + subTaskCheckPoint['summary']['alignment']['persisted']['max'] | humanizeBytes + }}) + + + {{ subTaskCheckPoint['summary']['alignment']['duration']['max'] | humanizeDuration }} + + {{ subTaskCheckPoint['summary']['start_delay']['max'] | humanizeDuration }} @@ -80,7 +129,8 @@ [nzSize]="'small'" [nzLoading]="isLoading" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" + > ID @@ -98,18 +148,25 @@ {{ subTask['index'] }} - - {{ subTask['ack_timestamp'] | date:'yyyy-MM-dd HH:mm:ss' }} - {{ subTask['end_to_end_duration'] | humanizeDuration}} (aborted) + + {{ subTask['ack_timestamp'] | date: 'yyyy-MM-dd HH:mm:ss' }} + + {{ subTask['end_to_end_duration'] | humanizeDuration }} + (aborted) + {{ subTask['state_size'] | humanizeBytes }} - {{ subTask['checkpoint']['sync'] | humanizeDuration}} - {{ subTask['checkpoint']['async'] | humanizeDuration}} - {{ subTask['alignment']['processed'] | humanizeBytes }} ({{ subTask['alignment']['persisted'] | humanizeBytes }}) - {{ subTask['alignment']['duration'] | humanizeDuration}} - {{ subTask['start_delay'] | humanizeDuration}} - {{ subTask['unaligned_checkpoint']}} + {{ subTask['checkpoint']['sync'] | humanizeDuration }} + {{ subTask['checkpoint']['async'] | humanizeDuration }} + + {{ subTask['alignment']['processed'] | humanizeBytes }} ({{ + subTask['alignment']['persisted'] | humanizeBytes + }}) + + {{ subTask['alignment']['duration'] | humanizeDuration }} + {{ subTask['start_delay'] | humanizeDuration }} + {{ subTask['unaligned_checkpoint'] }} - + n/a diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.less index ef8c9398ef420..cd7dfdd32695c 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.less @@ -19,6 +19,6 @@ .subtasks { padding: 12px; - background: darken(@component-background, 1%); border: 1px solid @border-color-split; + background: darken(@component-background, 1%); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.ts index c1ab0f8a47ae9..13896707727e2 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/checkpoints/subtask/job-checkpoints-subtask.component.ts @@ -25,11 +25,13 @@ import { OnInit, SimpleChanges } from '@angular/core'; -import { CheckPointSubTaskInterface, JobDetailCorrectInterface, VerticesItemInterface } from 'interfaces'; import { first } from 'rxjs/operators'; + +import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; + +import { CheckPointSubTaskInterface, JobDetailCorrectInterface, VerticesItemInterface } from 'interfaces'; import { JobService } from 'services'; import { deepFind } from 'utils'; -import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; @Component({ selector: 'flink-job-checkpoints-subtask', @@ -62,7 +64,7 @@ export class JobCheckpointsSubtaskComponent implements OnInit, OnChanges { deepFind(pre, path) > deepFind(next, path) ? 1 : -1; } - refresh() { + refresh(): void { if (this.jobDetail && this.jobDetail.jid) { this.jobService.loadCheckpointSubtaskDetails(this.jobDetail.jid, this.checkPointId, this.vertex.id).subscribe( data => { @@ -81,7 +83,7 @@ export class JobCheckpointsSubtaskComponent implements OnInit, OnChanges { constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobDetail$.pipe(first()).subscribe(job => { this.jobDetail = job; this.refresh(); diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.html index 75b1eb23318b8..2544a9dc52180 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.html @@ -23,7 +23,8 @@ [nzTemplateMode]="true" [nzSize]="'small'" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" + > Execution mode @@ -35,7 +36,13 @@ Job parallelism - {{ config['execution-config']['job-parallelism'] === -1 ? 'auto' : config['execution-config']['job-parallelism'] }} + + {{ + config['execution-config']['job-parallelism'] === -1 + ? 'auto' + : config['execution-config']['job-parallelism'] + }} + Object reuse mode @@ -51,7 +58,8 @@ [nzData]="listOfUserConfig" [nzSize]="'small'" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" + > {{ config.key }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.ts index d0a0045c1559c..873e3f893cc31 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/configuration/job-configuration.component.ts @@ -17,8 +17,9 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; -import { JobConfigInterface } from 'interfaces'; import { flatMap } from 'rxjs/operators'; + +import { JobConfigInterface } from 'interfaces'; import { JobService } from 'services'; @Component({ @@ -33,7 +34,7 @@ export class JobConfigurationComponent implements OnInit { constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobDetail$.pipe(flatMap(job => this.jobService.loadJobConfig(job.jid))).subscribe(data => { this.config = data; const userConfig = this.config['execution-config']['user-config']; diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.html index 2d3f36f728c84..079bdb5cc5d8c 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.html @@ -16,7 +16,7 @@ ~ limitations under the License. --> - + @@ -26,7 +26,8 @@ [nzSize]="'small'" [nzData]="exceptionHistory" [nzShowPagination]="false" - [nzFrontPagination]="false"> + [nzFrontPagination]="false" + > @@ -37,35 +38,75 @@ - + - {{item.selected.timestamp | date:'yyyy-MM-dd HH:mm:ss'}} -
{{item.selected.exceptionName}}
+ {{ item.selected.timestamp | date: 'yyyy-MM-dd HH:mm:ss' }} + +
{{ item.selected.exceptionName }}
+ - - - {{ ex.taskName }} + + + + {{ ex.taskName }} + - {{item.selected.location || "(unassigned)"}} + {{ item.selected.location || '(unassigned)' }} - +
-   - The exception history is limited to the most recent failures that caused parts of the job or the entire job to restart. The maximum history size can be configured via the Flink configuration property web.exception-history-size. + +   + + The exception history is limited to the most recent failures that caused parts of the + job or the entire job to restart. The maximum history size can be configured via the + Flink configuration property + web.exception-history-size + . + - + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.ts index 228d2690d9f73..64c79d28ade96 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/exceptions/job-exceptions.component.ts @@ -18,12 +18,12 @@ import { formatDate } from '@angular/common'; import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; -import { ExceptionInfoInterface, RootExceptionInfoInterface } from 'interfaces'; import { distinctUntilChanged, flatMap, tap } from 'rxjs/operators'; + +import { ExceptionInfoInterface, RootExceptionInfoInterface } from 'interfaces'; import { JobService } from 'services'; interface ExceptionHistoryItem { - /** * List of concurrent exceptions that caused this failure. */ @@ -40,17 +40,17 @@ interface ExceptionHistoryItem { expand: boolean; } -const stripConcurrentExceptions = function (rootException: RootExceptionInfoInterface): ExceptionInfoInterface { - const {concurrentExceptions, ...mainException} = rootException; +const stripConcurrentExceptions = function(rootException: RootExceptionInfoInterface): ExceptionInfoInterface { + const { concurrentExceptions, ...mainException } = rootException; return mainException; -} +}; -const markGlobalFailure = function (exception: ExceptionInfoInterface) { +const markGlobalFailure = function(exception: ExceptionInfoInterface): ExceptionInfoInterface { if (exception.taskName == null) { exception.taskName = '(global failure)'; } return exception; -} +}; @Component({ selector: 'flink-job-exceptions', @@ -66,10 +66,10 @@ export class JobExceptionsComponent implements OnInit { maxExceptions = 0; total = 0; - trackExceptionBy(_: number, node: ExceptionInfoInterface) { + trackExceptionBy(_: number, node: ExceptionInfoInterface): number { return node.timestamp; } - loadMore() { + loadMore(): void { this.isLoading = true; this.maxExceptions += 10; this.jobService.jobDetail$ @@ -83,10 +83,12 @@ export class JobExceptionsComponent implements OnInit { ) .subscribe(data => { // @ts-ignore - const exceptionHistory = data.exceptionHistory + const exceptionHistory = data.exceptionHistory; if (exceptionHistory.entries.length > 0) { - const mostRecentException = exceptionHistory.entries[0] - this.rootException = formatDate(mostRecentException.timestamp, 'yyyy-MM-dd HH:mm:ss', 'en') + '\n' + mostRecentException.stacktrace; + const mostRecentException = exceptionHistory.entries[0]; + this.rootException = `${formatDate(mostRecentException.timestamp, 'yyyy-MM-dd HH:mm:ss', 'en')}\n${ + mostRecentException.stacktrace + }`; } else { this.rootException = 'No Root Exception'; } @@ -104,7 +106,7 @@ export class JobExceptionsComponent implements OnInit { constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.loadMore(); } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/job-routing.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/job-routing.module.ts index 488b24eef8a16..cbabe6b51e37f 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/job-routing.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/job-routing.module.ts @@ -18,7 +18,9 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; + import { JobListComponent } from 'share/customize/job-list/job-list.component'; + import { JobCheckpointsComponent } from './checkpoints/job-checkpoints.component'; import { JobConfigurationComponent } from './configuration/job-configuration.component'; import { JobExceptionsComponent } from './exceptions/job-exceptions.component'; diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.html index cb1fedcec8d53..8653fcf37ec6d 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.html @@ -25,9 +25,13 @@
- - + -
{{errorDetails}}
+
{{ errorDetails }}
- diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.less index 0d2d695ad6000..87f453e50e1ba 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.less @@ -18,19 +18,19 @@ @import "theme"; .content { - margin-top: 16px; - font-size: 14px; - line-height: 1.5; + position: relative; box-sizing: border-box; + margin-top: 16px; padding: 0; - list-style: none; - background: @component-background; - border-radius: 2px; - position: relative; border: 1px solid @border-color-split; + border-radius: 2px; + background: @component-background; + list-style: none; + font-size: 14px; + line-height: 1.5; } .router { - height: 100%; width: 100%; + height: 100%; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.ts index bf185ab529f02..10b9bc4214f5a 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/job.component.ts @@ -16,11 +16,12 @@ * limitations under the License. */ -import {ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit} from '@angular/core'; -import {ActivatedRoute} from '@angular/router'; -import {EMPTY, Subject} from 'rxjs'; -import {catchError, flatMap, takeUntil} from 'rxjs/operators'; -import {JobService, StatusService} from 'services'; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; +import { EMPTY, Subject } from 'rxjs'; +import { catchError, flatMap, takeUntil } from 'rxjs/operators'; + +import { JobService, StatusService } from 'services'; @Component({ selector: 'flink-job', @@ -41,7 +42,7 @@ export class JobComponent implements OnInit, OnDestroy { private statusService: StatusService ) {} - ngOnInit() { + ngOnInit(): void { this.statusService.refresh$ .pipe( takeUntil(this.destroy$), @@ -67,7 +68,7 @@ export class JobComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/job.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/job.module.ts index f36f4f7d3ffce..ec4d0362ab048 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/job.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/job.module.ts @@ -16,10 +16,25 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; + +import { NzAlertModule } from 'ng-zorro-antd/alert'; +import { NzButtonModule } from 'ng-zorro-antd/button'; +import { NzCardModule } from 'ng-zorro-antd/card'; +import { NzCollapseModule } from 'ng-zorro-antd/collapse'; +import { NzDividerModule } from 'ng-zorro-antd/divider'; +import { NzEmptyModule } from 'ng-zorro-antd/empty'; +import { NzIconModule } from 'ng-zorro-antd/icon'; +import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm'; +import { NzSelectModule } from 'ng-zorro-antd/select'; +import { NzSkeletonModule } from 'ng-zorro-antd/skeleton'; +import { NzTableModule } from 'ng-zorro-antd/table'; +import { NzTabsModule } from 'ng-zorro-antd/tabs'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; import { ShareModule } from 'share/share.module'; + import { JobCheckpointsDetailComponent } from './checkpoints/detail/job-checkpoints-detail.component'; import { JobCheckpointsComponent } from './checkpoints/job-checkpoints.component'; import { JobCheckpointsSubtaskComponent } from './checkpoints/subtask/job-checkpoints-subtask.component'; @@ -29,16 +44,6 @@ import { JobRoutingModule } from './job-routing.module'; import { JobComponent } from './job.component'; import { JobStatusComponent } from './status/job-status.component'; import { JobTimelineComponent } from './timeline/job-timeline.component'; -import { NzAlertModule } from 'ng-zorro-antd/alert'; -import { NzButtonModule } from 'ng-zorro-antd/button'; -import { NzCardModule } from 'ng-zorro-antd/card'; -import { NzCollapseModule } from 'ng-zorro-antd/collapse'; -import { NzDividerModule } from 'ng-zorro-antd/divider'; -import { NzEmptyModule } from 'ng-zorro-antd/empty'; -import { NzSkeletonModule } from 'ng-zorro-antd/skeleton'; -import { NzTableModule } from 'ng-zorro-antd/table'; -import { NzTabsModule } from 'ng-zorro-antd/tabs'; -import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm'; @NgModule({ imports: [ @@ -55,7 +60,10 @@ import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm'; NzEmptyModule, NzSkeletonModule, NzAlertModule, - NzPopconfirmModule + NzPopconfirmModule, + NzIconModule, + NzSelectModule, + NzToolTipModule ], declarations: [ JobComponent, diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.html index eeeb52b84e6e5..fd233b1b8e905 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.html @@ -19,13 +19,13 @@ + [nzShowPagination]="false" + > Name @@ -34,41 +34,41 @@ - + {{ accumulator.name }} {{ accumulator.type }} - {{ (accumulator.value | number:'1.0-3' ) || accumulator.value }} + {{ (accumulator.value | number: '1.0-3') || accumulator.value }} + [nzShowPagination]="false" + > - SubTask - Name - Type - Value + SubTask + Name + Type + Value - - - ({{ accumulator.subtask }}) {{ accumulator.host }}, attempt: {{ accumulator.attempt + 1 }} - {{ data.name }} - {{ data.type }} - {{ data.value }} - - - + + + ({{ data.subtask }}) {{ data.host }}, attempt: + {{ data.attempt + 1 }} + + {{ data.name }} + {{ data.type }} + {{ data.value }} + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.less index 9a71e8494a764..7088bd7f63a52 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.less @@ -16,9 +16,11 @@ * limitations under the License. */ +@import "theme"; + :host { - display: block; position: relative; + display: block; height: 100%; nz-tabset { @@ -40,6 +42,17 @@ .ant-tabs-small > .ant-tabs-nav .ant-tabs-tab { font-size: 12px; + + &:first-of-type { + margin: 0 0 0 @margin-md; + } + } + + nz-table { + td, + th { + font-size: 12px; + } } } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.ts index bdb25251f0535..65ce3072fff84 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/accumulators/job-overview-drawer-accumulators.component.ts @@ -19,6 +19,7 @@ import { Component, OnDestroy, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; + import { SubTaskAccumulatorsInterface, UserAccumulatorsInterface } from 'interfaces'; import { JobService } from 'services'; @@ -34,16 +35,32 @@ export class JobOverviewDrawerAccumulatorsComponent implements OnInit, OnDestroy listOfSubTaskAccumulator: SubTaskAccumulatorsInterface[] = []; isLoading = true; - trackAccumulatorBy(_: number, node: SubTaskAccumulatorsInterface) { + trackAccumulatorBy(_: number, node: SubTaskAccumulatorsInterface): string { return node.name; } - trackSubtaskBy(_: number, node: SubTaskAccumulatorsInterface) { + trackSubtaskBy(_: number, node: SubTaskAccumulatorsInterface): number { return node.subtask; } constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + transformToSubTaskAccumulator(list: SubTaskAccumulatorsInterface[]): SubTaskAccumulatorsInterface[] { + const transformed: SubTaskAccumulatorsInterface[] = []; + list.forEach(accumulator => { + // @ts-ignore + accumulator['user-accumulators'].forEach(userAccumulator => { + transformed.push({ + ...accumulator, + name: userAccumulator.name, + type: userAccumulator.type, + value: userAccumulator.value + }); + }); + }); + return transformed; + } + + ngOnInit(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -53,7 +70,7 @@ export class JobOverviewDrawerAccumulatorsComponent implements OnInit, OnDestroy data => { this.isLoading = false; this.listOfAccumulator = data.main; - this.listOfSubTaskAccumulator = data.subtasks || []; + this.listOfSubTaskAccumulator = this.transformToSubTaskAccumulator(data.subtasks) || []; this.cdr.markForCheck(); }, () => { @@ -63,7 +80,7 @@ export class JobOverviewDrawerAccumulatorsComponent implements OnInit, OnDestroy ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.html index 6b8b2fcc357f4..ed67ae6b37ee5 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.html @@ -21,28 +21,31 @@ [nzSize]="'small'" [nzLoading]="isLoading" [nzData]="listOfSubTaskBackpressure" - [nzScroll]="{y:'calc( 100% - 72px )'}" - [nzWidthConfig]="['33.33%','33.33%','33.33%']" + [nzScroll]="{ y: 'calc( 100% - 72px )' }" + [nzWidthConfig]="['33.33%', '33.33%', '33.33%']" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" +> - + - Measurement: + Measurement: - {{ (now - backpressure['end-timestamp']) | humanizeDuration }} ago + {{ now - backpressure['end-timestamp'] | humanizeDuration }} ago Sampling in progress... - + - Back Pressure Status: - + @@ -57,11 +60,16 @@ - + {{ subtask['subtask'] }} - {{ this.prettyPrint(subtask['ratio']) }} / {{ this.prettyPrint(subtask['idleRatio']) }} / {{ this.prettyPrint(subtask['busyRatio']) }} - + {{ this.prettyPrint(subtask['ratio']) }} / {{ this.prettyPrint(subtask['idleRatio']) }} / + {{ this.prettyPrint(subtask['busyRatio']) }} + + + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.less index cdabc0a2af012..744deb1863815 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.less @@ -16,6 +16,25 @@ * limitations under the License. */ -.pressure-badge { - margin-top: -4px; +@import "theme"; + +:host { + nz-table { + ::ng-deep { + td, + th { + font-size: 12px; + } + } + + th, + .title { + border-bottom: 1px solid @border-color-split; + } + } + + flink-backpressure-badge { + display: inline-block; + margin-left: 4px; + } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.ts index 2068006cacca6..125af1f83dd05 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/backpressure/job-overview-drawer-backpressure.component.ts @@ -19,6 +19,7 @@ import { Component, OnInit, ChangeDetectionStrategy, OnDestroy, ChangeDetectorRef } from '@angular/core'; import { Subject } from 'rxjs'; import { flatMap, takeUntil, tap } from 'rxjs/operators'; + import { JobBackpressureInterface, JobBackpressureSubtaskInterface, NodesItemCorrectInterface } from 'interfaces'; import { JobService } from 'services'; @@ -37,20 +38,19 @@ export class JobOverviewDrawerBackpressureComponent implements OnInit, OnDestroy listOfSubTaskBackpressure: JobBackpressureSubtaskInterface[] = []; constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - trackBackPressureBy(_: number, node: JobBackpressureSubtaskInterface) { + trackBackPressureBy(_: number, node: JobBackpressureSubtaskInterface): number { return node.subtask; } prettyPrint(value: number): string { if (isNaN(value)) { - return "N/A" - } - else { - return Math.round(value * 100) + "%"; + return 'N/A'; + } else { + return `${Math.round(value * 100)}%`; } } - ngOnInit() { + ngOnInit(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -72,7 +72,7 @@ export class JobOverviewDrawerBackpressureComponent implements OnInit, OnDestroy ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.html index 729a13120b8d2..ce767a96b1379 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.html @@ -17,19 +17,32 @@ -->
- No Available Metric + No Available Metric Add Metric: - - - {{name}} - + + + {{ name }} +
- +
diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.less index 9fc27b24021b0..45874bff69808 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.less @@ -25,6 +25,6 @@ nz-select { } :host { - padding: 16px; display: block; + padding: 16px; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.ts index 924836a8317a3..d29fb3d937e7f 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/chart/job-overview-drawer-chart.component.ts @@ -27,9 +27,11 @@ import { } from '@angular/core'; import { Subject } from 'rxjs'; import { distinctUntilChanged, filter, flatMap, takeUntil } from 'rxjs/operators'; -import { JobService, MetricsService } from 'services'; + import { JobChartComponent } from 'share/customize/job-chart/job-chart.component'; +import { JobService, MetricsService } from 'services'; + @Component({ selector: 'flink-job-overview-drawer-chart', templateUrl: './job-overview-drawer-chart.component.html', @@ -45,7 +47,7 @@ export class JobOverviewDrawerChartComponent implements OnInit, OnDestroy { cacheMetricKey: string; @ViewChildren(JobChartComponent) listOfJobChartComponent: QueryList; - loadMetricList(jobId: string, vertexId: string) { + loadMetricList(jobId: string, vertexId: string): void { this.cacheMetricKey = `${jobId}/${vertexId}`; this.metricsService.getAllAvailableMetrics(jobId, vertexId).subscribe(data => { this.listOfMetricName = data.map(item => item.id); @@ -55,25 +57,25 @@ export class JobOverviewDrawerChartComponent implements OnInit, OnDestroy { }); } - updateMetric(metric: string) { + updateMetric(metric: string): void { this.listOfSelectedMetric = [...this.listOfSelectedMetric, metric]; this.jobService.metricsCacheMap.set(this.cacheMetricKey, this.listOfSelectedMetric); this.updateUnselectedMetricList(); } - closeMetric(metric: string) { + closeMetric(metric: string): void { this.listOfSelectedMetric = this.listOfSelectedMetric.filter(item => item !== metric); this.jobService.metricsCacheMap.set(this.cacheMetricKey, this.listOfSelectedMetric); this.updateUnselectedMetricList(); } - updateUnselectedMetricList() { + updateUnselectedMetricList(): void { this.listOfUnselectedMetric = this.listOfMetricName.filter(item => this.listOfSelectedMetric.indexOf(item) === -1); } constructor(private metricsService: MetricsService, private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -98,7 +100,7 @@ export class JobOverviewDrawerChartComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.html index fee30af426164..0167783b3cd7d 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.html @@ -40,13 +40,17 @@ Start Time - {{ node.detail['start-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + + {{ node.detail['start-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + End Time - {{ node.detail['end-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + + {{ node.detail['end-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + @@ -71,9 +75,9 @@ Records Sent - - {{ node.detail.metrics['write-records'] | number:'1.0-0' }} - + + {{ node.detail.metrics['write-records'] | number: '1.0-0' }} + @@ -81,9 +85,9 @@ Bytes Received - - {{ node.detail.metrics['read-bytes'] | humanizeBytes }} - + + {{ node.detail.metrics['read-bytes'] | humanizeBytes }} + @@ -91,9 +95,9 @@ Records Received - - {{ node.detail.metrics['read-records'] | number:'1.0-0' }} - + + {{ node.detail.metrics['read-records'] | number: '1.0-0' }} + @@ -101,9 +105,9 @@ Bytes Sent - - {{ node.detail.metrics['write-bytes'] | humanizeBytes }} - + + {{ node.detail.metrics['write-bytes'] | humanizeBytes }} + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.less index 734d528d7cce0..d9c06d0e1ba7b 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.less @@ -17,33 +17,33 @@ */ @import "theme"; +nz-form-label { + ::ng-deep { + label { + font-size: 12px; + } + } +} + :host { display: block; - height: 100%; width: 100%; + height: 100%; } .name { - font-size: 12px; + margin-bottom: 12px; padding: 12px; - word-break: break-all; - background: @background-color-light; border-bottom: solid 1px @border-color-split; - margin-bottom: 12px; + background: @background-color-light; + font-size: 12px; + word-break: break-all; } nz-form-item { margin-bottom: @margin-sm; } -nz-form-label { - ::ng-deep { - label { - font-size: 12px; - } - } -} - nz-form-text { font-size: 12px; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.ts index 627dc909de8bd..f46d74b90fb91 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/detail/job-overview-drawer-detail.component.ts @@ -17,9 +17,10 @@ */ import { Component, ChangeDetectionStrategy, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'; -import { NodesItemCorrectInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; + +import { NodesItemCorrectInterface } from 'interfaces'; import { JobService } from 'services'; @Component({ @@ -34,7 +35,7 @@ export class JobOverviewDrawerDetailComponent implements OnInit, OnDestroy { constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.selectedVertex$.pipe(takeUntil(this.destroy$)).subscribe(node => { this.node = node; this.cdr.markForCheck(); diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.less index 3bdf6927ed979..1c8703485bca8 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.less @@ -18,20 +18,48 @@ @import "theme"; -:host { +.handler { + position: absolute; + top: 50%; + z-index: 2; display: block; + padding: 12px 0; + border: 1px solid @border-color-split; + background: @background-color-light; + font-size: 14px; + transform: translateY(-50%); + + &.close { + left: -16px; + margin-top: -25px; + } + + &.full { + left: -16px; + margin-top: 25px; + } + + &:hover { + background: @primary-color; + color: #fff; + } +} + +:host { + position: absolute; + top: 0; + right: 0; z-index: 10; + display: block; width: 60%; height: 100%; - position: absolute; - right: 0; - top: 0; - background: @component-background; border-left: solid 1px @border-color-split; + background: @component-background; &.full-width { width: 100%; border-left: none; + .handler { &.close { left: -1px; @@ -47,6 +75,7 @@ .ant-tabs-bar { margin: 0; } + .ant-tabs-tab:first-of-type { margin: 0 0 0 @margin-md; } @@ -54,33 +83,6 @@ } .drawer-content { - height: calc(~"100% - 34px"); overflow: auto; -} - -.handler { - z-index: 2; - font-size: 14px; - top: 50%; - display: block; - transform: translateY(-50%); - position: absolute; - background: @background-color-light; - padding: 12px 0; - border: 1px solid @border-color-split; - - &.close { - left: -16px; - margin-top: -25px; - } - - &.full { - left: -16px; - margin-top: 25px; - } - - &:hover { - color: #ffffff; - background: @primary-color; - } + height: calc(~"100% - 34px"); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.ts index 450c42c8e4ea6..243e83cc631d9 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/drawer/job-overview-drawer.component.ts @@ -16,14 +16,16 @@ * limitations under the License. */ +import { trigger, animate, style, transition } from '@angular/animations'; import { Component, ChangeDetectionStrategy, OnInit, OnDestroy } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { combineLatest, Subject } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; -import { JobService } from 'services'; -import { trigger, animate, style, transition } from '@angular/animations'; + import { JobChartService } from 'share/customize/job-chart/job-chart.service'; +import { JobService } from 'services'; + @Component({ selector: 'flink-job-overview-drawer', templateUrl: './job-overview-drawer.component.html', @@ -61,7 +63,7 @@ export class JobOverviewDrawerComponent implements OnInit, OnDestroy { private cachePath = this.listOfNavigation[0].path; private destroy$ = new Subject(); - closeDrawer() { + closeDrawer(): void { if (this.fullScreen) { this.fullScreen = false; this.jobChartService.resize(); @@ -70,7 +72,7 @@ export class JobOverviewDrawerComponent implements OnInit, OnDestroy { } } - fullDrawer() { + fullDrawer(): void { this.fullScreen = true; this.jobChartService.resize(); } @@ -82,7 +84,7 @@ export class JobOverviewDrawerComponent implements OnInit, OnDestroy { private jobChartService: JobChartService ) {} - ngOnInit() { + ngOnInit(): void { const nodeId$ = this.activatedRoute.params.pipe(map(item => item.vertexId)); combineLatest(this.jobService.jobDetail$.pipe(map(item => item.plan.nodes)), nodeId$) .pipe(takeUntil(this.destroy$)) diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html index 4a55f4b7ec79d..b5b49d59e15cd 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html @@ -16,23 +16,48 @@ ~ limitations under the License. --> - - Operator is not running. Cannot sample back pressure. + Operator is not running. Cannot sample back pressure. Type: - - - + + + The task has already been terminated - The flame graph feature is currently disabled (enable it by setting rest.flamegraph.enabled: true) + + The flame graph feature is currently disabled (enable it by setting rest.flamegraph.enabled: + true) + We are waiting for the first samples to create a flame graph - Measurement: {{ (now - flameGraph.endTimestamp) | humanizeDuration }} ago + + Measurement: {{ now - flameGraph.endTimestamp | humanizeDuration }} ago +
@@ -42,7 +67,3 @@
- - - - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.less index cf9c7f1713dd7..58c534074c424 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.less @@ -27,8 +27,8 @@ nz-select { } :host { - padding: 16px; display: block; + padding: 16px; } nz-radio-group { diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.ts index f72c7e65822dc..2a667c7e834a7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.ts @@ -19,6 +19,7 @@ import { Component, OnInit, ChangeDetectionStrategy, OnDestroy, ChangeDetectorRef } from '@angular/core'; import { Subject } from 'rxjs'; import { flatMap, takeUntil, tap } from 'rxjs/operators'; + import { JobFlameGraphInterface, NodesItemCorrectInterface } from 'interfaces'; import { JobService } from 'services'; @@ -39,11 +40,11 @@ export class JobOverviewDrawerFlameGraphComponent implements OnInit, OnDestroy { constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.requestFlameGraph(); } - private requestFlameGraph() { + private requestFlameGraph(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -67,7 +68,7 @@ export class JobOverviewDrawerFlameGraphComponent implements OnInit, OnDestroy { ); } - selectFrameGraphType() { + selectFrameGraphType(): void { this.destroy$.next(); this.destroy$.complete(); this.destroy$ = new Subject(); @@ -75,7 +76,7 @@ export class JobOverviewDrawerFlameGraphComponent implements OnInit, OnDestroy { this.requestFlameGraph(); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview-routing.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview-routing.module.ts index 5a01f5d316e24..de9adcf620e71 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview-routing.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview-routing.module.ts @@ -18,12 +18,13 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; + import { JobOverviewDrawerAccumulatorsComponent } from './accumulators/job-overview-drawer-accumulators.component'; import { JobOverviewDrawerBackpressureComponent } from './backpressure/job-overview-drawer-backpressure.component'; -import { JobOverviewDrawerFlameGraphComponent } from './flamegraph/job-overview-drawer-flamegraph.component'; import { JobOverviewDrawerChartComponent } from './chart/job-overview-drawer-chart.component'; import { JobOverviewDrawerDetailComponent } from './detail/job-overview-drawer-detail.component'; import { JobOverviewDrawerComponent } from './drawer/job-overview-drawer.component'; +import { JobOverviewDrawerFlameGraphComponent } from './flamegraph/job-overview-drawer-flamegraph.component'; import { JobOverviewComponent } from './job-overview.component'; import { JobOverviewDrawerSubtasksComponent } from './subtasks/job-overview-drawer-subtasks.component'; import { JobOverviewDrawerTaskmanagersComponent } from './taskmanagers/job-overview-drawer-taskmanagers.component'; diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.html index a5dbd69b4e9e9..78c28d53d71f7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.html @@ -20,5 +20,15 @@
- - + + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.less index 0b76685efdb38..9912d9cdc6bda 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.less @@ -19,20 +19,21 @@ @import "theme"; .container { - width: 100%; + position: relative; overflow: hidden; + width: 100%; height: 500px; - position: relative; border-bottom: solid 1px @border-color-split; } nz-radio-group { position: absolute; + top: 15px; right: 24px; z-index: 1; - top: 15px; - opacity: .7; - transition: opacity ease-in .28s; + opacity: 0.7; + transition: opacity ease-in 0.28s; + &:hover { opacity: 1; } @@ -40,23 +41,22 @@ nz-radio-group { flink-dagre { position: absolute; + left: 0; width: 100%; height: 100%; - left: 0; } flink-job-overview-drawer { - width: 60%; - height: 100%; position: absolute; right: 0; - background: #ffffff; + width: 60%; + height: 100%; border-left: solid 1px @border-color-split; + background: #fff; } :host { - height: 100%; - display: block; position: relative; + display: block; + height: 100%; } - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.ts index ba093027bce4a..986a289e4d9d3 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.component.ts @@ -28,9 +28,11 @@ import { import { ActivatedRoute, Router } from '@angular/router'; import { forkJoin, Observable, of, Subject } from 'rxjs'; import { catchError, filter, map, takeUntil } from 'rxjs/operators'; + +import { DagreComponent } from 'share/common/dagre/dagre.component'; + import { NodesItemCorrectInterface, NodesItemLinkInterface } from 'interfaces'; import { JobService, MetricsService } from 'services'; -import { DagreComponent } from 'share/common/dagre/dagre.component'; @Component({ selector: 'flink-job-overview', @@ -48,13 +50,13 @@ export class JobOverviewComponent implements OnInit, OnDestroy { jobId: string; timeoutId: number; - onNodeClick(node: NodesItemCorrectInterface) { + onNodeClick(node: NodesItemCorrectInterface): void { if (!(this.selectedNode && this.selectedNode.id === node.id)) { this.router.navigate([node.id], { relativeTo: this.activatedRoute }).then(); } } - onResizeEnd() { + onResizeEnd(): void { if (!this.selectedNode) { this.dagreComponent.moveToCenter(); } else { @@ -63,20 +65,22 @@ export class JobOverviewComponent implements OnInit, OnDestroy { } mergeWithBackPressure(nodes: NodesItemCorrectInterface[]): Observable { - return forkJoin( - nodes.map(node => { - return this.metricService.getAggregatedMetrics(this.jobId, node.id, ["backPressuredTimeMsPerSecond", "busyTimeMsPerSecond"]).pipe( + return forkJoin( + nodes.map(node => { + return this.metricService + .getAggregatedMetrics(this.jobId, node.id, ['backPressuredTimeMsPerSecond', 'busyTimeMsPerSecond']) + .pipe( map(result => { return { ...node, backPressuredPercentage: Math.min(Math.round(result.backPressuredTimeMsPerSecond / 10), 100), - busyPercentage: Math.min(Math.round(result.busyTimeMsPerSecond / 10), 100), + busyPercentage: Math.min(Math.round(result.busyTimeMsPerSecond / 10), 100) }; }) ); - }) - ).pipe(catchError(() => of(nodes))); - } + }) + ).pipe(catchError(() => of(nodes))); + } mergeWithWatermarks(nodes: NodesItemCorrectInterface[]): Observable { return forkJoin( @@ -90,7 +94,7 @@ export class JobOverviewComponent implements OnInit, OnDestroy { ).pipe(catchError(() => of(nodes))); } - refreshNodesWithMetrics() { + refreshNodesWithMetrics(): void { this.mergeWithBackPressure(this.nodes).subscribe(nodes => { this.mergeWithWatermarks(nodes).subscribe(nodes2 => { nodes2.forEach(node => { @@ -109,7 +113,7 @@ export class JobOverviewComponent implements OnInit, OnDestroy { private cdr: ChangeDetectorRef ) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobDetail$ .pipe( filter(job => job.jid === this.activatedRoute.parent!.parent!.snapshot.params.jid), @@ -139,7 +143,7 @@ export class JobOverviewComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); clearTimeout(this.timeoutId); diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.module.ts index ab5c7e2f7a71f..9a36c7f1e8e78 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/job-overview.module.ts @@ -19,29 +19,31 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; + +import { NzDividerModule } from 'ng-zorro-antd/divider'; +import { NzDropDownModule } from 'ng-zorro-antd/dropdown'; +import { NzFormModule } from 'ng-zorro-antd/form'; +import { NzIconModule } from 'ng-zorro-antd/icon'; +import { NzRadioModule } from 'ng-zorro-antd/radio'; +import { NzSelectModule } from 'ng-zorro-antd/select'; +import { NzSpinModule } from 'ng-zorro-antd/spin'; +import { NzTableModule } from 'ng-zorro-antd/table'; +import { NzTabsModule } from 'ng-zorro-antd/tabs'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; import { ShareModule } from 'share/share.module'; + import { JobOverviewDrawerAccumulatorsComponent } from './accumulators/job-overview-drawer-accumulators.component'; import { JobOverviewDrawerBackpressureComponent } from './backpressure/job-overview-drawer-backpressure.component'; -import { JobOverviewDrawerFlameGraphComponent } from './flamegraph/job-overview-drawer-flamegraph.component'; import { JobOverviewDrawerChartComponent } from './chart/job-overview-drawer-chart.component'; import { JobOverviewDrawerDetailComponent } from './detail/job-overview-drawer-detail.component'; import { JobOverviewDrawerComponent } from './drawer/job-overview-drawer.component'; +import { JobOverviewDrawerFlameGraphComponent } from './flamegraph/job-overview-drawer-flamegraph.component'; import { JobOverviewRoutingModule } from './job-overview-routing.module'; import { JobOverviewComponent } from './job-overview.component'; import { JobOverviewListComponent } from './list/job-overview-list.component'; import { JobOverviewDrawerSubtasksComponent } from './subtasks/job-overview-drawer-subtasks.component'; import { JobOverviewDrawerTaskmanagersComponent } from './taskmanagers/job-overview-drawer-taskmanagers.component'; import { JobOverviewDrawerWatermarksComponent } from './watermarks/job-overview-drawer-watermarks.component'; -import { NzDividerModule } from 'ng-zorro-antd/divider'; -import { NzDropDownModule } from 'ng-zorro-antd/dropdown'; -import { NzFormModule } from 'ng-zorro-antd/form'; -import { NzIconModule } from 'ng-zorro-antd/icon'; -import { NzRadioModule } from 'ng-zorro-antd/radio'; -import { NzSelectModule } from 'ng-zorro-antd/select'; -import { NzSpinModule } from 'ng-zorro-antd/spin'; -import { NzTableModule } from 'ng-zorro-antd/table'; -import { NzTabsModule } from 'ng-zorro-antd/tabs'; -import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; @NgModule({ imports: [ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.html index 315933c62b87f..932288d638b99 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.html @@ -21,12 +21,13 @@ class="no-border small" [nzSize]="'small'" [nzData]="nodes" - [nzScroll]="{x:((1360+left)+'px')}" + [nzScroll]="{ x: 1360 + left + 'px' }" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" +> - Name + Name Status Bytes Received Records Received @@ -40,37 +41,64 @@ - + - {{ node.detail?.name }} + + {{ node.detail?.name }} + - - {{ node.detail?.metrics['read-bytes'] | humanizeBytes }} + + {{ node.detail.metrics['read-bytes'] | humanizeBytes }} - - {{ node.detail?.metrics['read-records'] | number:'1.0-0' }} + + {{ node.detail.metrics['read-records'] | number: '1.0-0' }} - - {{ node.detail?.metrics['write-bytes'] | humanizeBytes }} + + {{ node.detail.metrics['write-bytes'] | humanizeBytes }} - - {{ node.detail?.metrics['write-records'] | number:'1.0-0' }} + + {{ node.detail.metrics['write-records'] | number: '1.0-0' }} {{ node.parallelism }} - {{ node.detail["start-time"] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ node.detail['start-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} {{ node.detail?.duration | humanizeDuration }} - {{ node.detail["end-time"] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ node.detail['end-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.less index 9a6161ddfd870..a624703c77bdb 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.less @@ -18,8 +18,8 @@ @import "theme"; :host { - display: block; position: relative; + display: block; } .name { @@ -27,14 +27,14 @@ a { position: absolute; + top: 0; + left: 8px; display: inline-block; + overflow: hidden; width: calc(~"100% - 12px"); line-height: 34px; - top: 0; - left: 8px; - white-space: nowrap; text-overflow: ellipsis; - overflow: hidden; + white-space: nowrap; } } @@ -48,4 +48,3 @@ } } } - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.ts index 2bd503566235c..1e7a0dd591ae7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/list/job-overview-list.component.ts @@ -17,10 +17,12 @@ */ import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy, ElementRef } from '@angular/core'; -import { deepFind } from 'utils'; -import { NodesItemCorrectInterface } from 'interfaces'; + import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; +import { NodesItemCorrectInterface } from 'interfaces'; +import { deepFind } from 'utils'; + @Component({ selector: 'flink-job-overview-list', templateUrl: './job-overview-list.component.html', @@ -40,7 +42,7 @@ export class JobOverviewListComponent { this.innerNodes = value; } - get nodes() { + get nodes(): NodesItemCorrectInterface[] { return this.innerNodes; } @@ -59,11 +61,11 @@ export class JobOverviewListComponent { deepFind(pre, path) > deepFind(next, path) ? 1 : -1; } - trackJobBy(_: number, node: NodesItemCorrectInterface) { + trackJobBy(_: number, node: NodesItemCorrectInterface): string { return node.id; } - clickNode(node: NodesItemCorrectInterface) { + clickNode(node: NodesItemCorrectInterface): void { this.nodeClick.emit(node); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.html index ddaac1b19cd39..8bee8cfc72b9b 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.html @@ -22,9 +22,10 @@ [nzSize]="'small'" [nzLoading]="isLoading" [nzData]="listOfTask" - [nzScroll]="{x:'1480px',y:'calc( 100% - 35px )'}" + [nzScroll]="{ x: '1480px', y: 'calc( 100% - 35px )' }" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" +> ID @@ -42,40 +43,44 @@ - + {{ task.subtask }} - + {{ task.metrics['read-bytes'] | humanizeBytes }} - - {{ task.metrics['read-records'] | number:'1.0-0' }} + + {{ task.metrics['read-records'] | number: '1.0-0' }} - + {{ task.metrics['write-bytes'] | humanizeBytes }} - - {{ task.metrics['write-records'] | number:'1.0-0' }} + + {{ task.metrics['write-records'] | number: '1.0-0' }} {{ task.attempt + 1 }} {{ task.host }} - {{ task["start_time"] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ task['start_time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} {{ task.duration | humanizeDuration }} - {{ task["end-time"] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ task['end-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} - - + + - + @@ -83,7 +88,9 @@ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.less index b8041ef885013..4d7b92d9d3f4f 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.less @@ -19,6 +19,6 @@ :host { display: block; - height: 100%; width: 100%; + height: 100%; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.ts index d770134304686..5700b14be0b65 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/subtasks/job-overview-drawer-subtasks.component.ts @@ -19,10 +19,12 @@ import { Component, OnInit, ChangeDetectionStrategy, OnDestroy, ChangeDetectorRef } from '@angular/core'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; -import { deepFind } from 'utils'; + +import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; + import { JobSubTaskInterface } from 'interfaces'; import { JobService } from 'services'; -import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; +import { deepFind } from 'utils'; @Component({ selector: 'flink-job-overview-drawer-subtasks', @@ -53,13 +55,13 @@ export class JobOverviewDrawerSubtasksComponent implements OnInit, OnDestroy { deepFind(pre, path) > deepFind(next, path) ? 1 : -1; } - trackTaskBy(_: number, node: JobSubTaskInterface) { + trackTaskBy(_: number, node: JobSubTaskInterface): number { return node.subtask; } constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -78,7 +80,7 @@ export class JobOverviewDrawerSubtasksComponent implements OnInit, OnDestroy { ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.html index ec09028ad6275..2ee359f4c6ea1 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.html @@ -22,9 +22,10 @@ [nzSize]="'small'" [nzLoading]="isLoading" [nzData]="listOfTaskManager" - [nzScroll]="{x:'1500px',y:'calc( 100% - 35px )'}" + [nzScroll]="{ x: '1500px', y: 'calc( 100% - 35px )' }" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" +> Host @@ -41,36 +42,48 @@ - + {{ taskManager.host }} - - + + - + - LOG + + LOG + - + {{ taskManager.metrics['read-bytes'] | humanizeBytes }} - + {{ taskManager.metrics['read-records'] | number }} - + {{ taskManager.metrics['write-bytes'] | humanizeBytes }} - + {{ taskManager.metrics['write-records'] | number }} - {{ taskManager['start-time'] | humanizeDate:'yyyy-MM-dd HH:mm:ss' }} - {{ taskManager['end-time'] | humanizeDate:'yyyy-MM-dd HH:mm:ss' }} + {{ taskManager['start-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ taskManager['end-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} {{ taskManager['duration'] | humanizeDuration }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.less index e5cdfe96e7bb8..2379ddac12ccf 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.less @@ -15,4 +15,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.ts index 306746429cc7c..fb294e24135ff 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/taskmanagers/job-overview-drawer-taskmanagers.component.ts @@ -19,10 +19,12 @@ import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; -import { deepFind } from 'utils'; + +import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; + import { VertexTaskManagerDetailInterface } from 'interfaces'; import { JobService } from 'services'; -import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; +import { deepFind } from 'utils'; @Component({ selector: 'flink-job-overview-drawer-taskmanagers', @@ -52,13 +54,13 @@ export class JobOverviewDrawerTaskmanagersComponent implements OnInit, OnDestroy deepFind(pre, path) > deepFind(next, path) ? 1 : -1; } - trackTaskManagerBy(_: number, node: VertexTaskManagerDetailInterface) { + trackTaskManagerBy(_: number, node: VertexTaskManagerDetailInterface): string { return node.host; } constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -77,7 +79,7 @@ export class JobOverviewDrawerTaskmanagersComponent implements OnInit, OnDestroy ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.html index 43afabab17e5c..bcd924b5f76fd 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.html @@ -21,9 +21,10 @@ [nzSize]="'small'" [nzLoading]="isLoading" [nzData]="listOfWaterMark" - [nzScroll]="{y:'calc( 100% - 35px )'}" + [nzScroll]="{ y: 'calc( 100% - 35px )' }" [nzFrontPagination]="false" - [nzShowPagination]="false"> + [nzShowPagination]="false" +> SubTask @@ -31,7 +32,7 @@ - + {{ watermark.subTaskIndex }} {{ watermark.watermark | humanizeWatermark }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.less index e5cdfe96e7bb8..2379ddac12ccf 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.less @@ -15,4 +15,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.ts index 96a7bb37efedc..03e6de632c0de 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/watermarks/job-overview-drawer-watermarks.component.ts @@ -19,6 +19,7 @@ import { Component, OnDestroy, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; + import { JobService, MetricsService } from 'services'; @Component({ @@ -32,13 +33,13 @@ export class JobOverviewDrawerWatermarksComponent implements OnInit, OnDestroy { listOfWaterMark: Array<{ subTaskIndex: number; watermark: number }> = []; isLoading = true; - trackWatermarkBy(_: number, node: { subTaskIndex: string; watermark: number }) { + trackWatermarkBy(_: number, node: { subTaskIndex: string; watermark: number }): string { return node.subTaskIndex; } constructor(private jobService: JobService, private metricsService: MetricsService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.jobService.jobWithVertex$ .pipe( takeUntil(this.destroy$), @@ -64,7 +65,7 @@ export class JobOverviewDrawerWatermarksComponent implements OnInit, OnDestroy { ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.html index e291979ba6ad0..76fec6314d7a7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.html @@ -32,19 +32,19 @@

{{ jobDetail.name }}

Start Time:
-
{{ jobDetail['start-time'] | date:'yyyy-MM-dd HH:mm:ss' }}
+
{{ jobDetail['start-time'] | date: 'yyyy-MM-dd HH:mm:ss' }}
- +
End Time:
-
{{ jobDetail['end-time'] | date:'yyyy-MM-dd HH:mm:ss' }}
+
{{ jobDetail['end-time'] | date: 'yyyy-MM-dd HH:mm:ss' }}
Duration:
-
{{ jobDetail.duration | humanizeDuration}}
+
{{ jobDetail.duration | humanizeDuration }}
@@ -57,7 +57,12 @@

{{ jobDetail.name }}

nzOkText="Yes" nzCancelText="No" (nzOnConfirm)="cancelJob()" - *ngIf="webCancelEnabled && (jobDetail.state=='RUNNING' || jobDetail.state=='CREATED' || jobDetail.state=='RESTARTING')" + *ngIf=" + webCancelEnabled && + (jobDetail.state === 'RUNNING' || + jobDetail.state === 'CREATED' || + jobDetail.state === 'RESTARTING') + " > Cancel Job diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.less index 0bd07666abffe..545fdab95d801 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.less @@ -20,10 +20,10 @@ :host { display: block; - background: @component-background; + margin: -24px -24px 0; padding: 16px 32px 0; border-bottom: 1px solid @border-color-split; - margin: -24px -24px 0px; + background: @component-background; } .wrapper { @@ -31,9 +31,11 @@ } .name { - h2, flink-job-badge { + h2, + flink-job-badge { display: inline-block; } + nz-divider { margin: 0 12px; } @@ -43,35 +45,38 @@ display: flex; font-size: 14px; line-height: 22px; + div { line-height: 22px; + &:last-child { margin-left: 8px; - font-weight: 700; color: @heading-color; + font-weight: 700; } } } .status { - margin-bottom: 12px; display: flex; align-items: center; + margin-bottom: 12px; + nz-divider { margin: 0 24px; } } .operate { - font-size: 24px; position: absolute; - right: 16px; top: 24px; + right: 16px; + font-size: 24px; } flink-navigation { - margin-bottom: -1px; display: block; + margin-bottom: -1px; } flink-task-badge { diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.ts index a6b7661642345..f3ae5228212fa 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/status/job-status.component.ts @@ -17,10 +17,11 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { JobDetailCorrectInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { distinctUntilKeyChanged, takeUntil } from 'rxjs/operators'; -import {JobService, StatusService} from 'services'; + +import { JobDetailCorrectInterface } from 'interfaces'; +import { JobService, StatusService } from 'services'; @Component({ selector: 'flink-job-status', @@ -57,9 +58,9 @@ export class JobStatusComponent implements OnInit, OnDestroy { ]; checkpointIndexOfNavigation = this.checkpointIndexOfNav(); - webCancelEnabled = this.statusService.configuration.features["web-cancel"]; + webCancelEnabled = this.statusService.configuration.features['web-cancel']; - cancelJob() { + cancelJob(): void { this.jobService.cancelJob(this.jobDetail.jid).subscribe(() => { this.statusTips = 'Cancelling...'; this.cdr.markForCheck(); @@ -68,14 +69,17 @@ export class JobStatusComponent implements OnInit, OnDestroy { constructor(private jobService: JobService, public statusService: StatusService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { const jobDetail$ = this.jobService.jobDetail$.pipe(takeUntil(this.destroy$)); jobDetail$.subscribe(data => { this.jobDetail = data; this.cdr.markForCheck(); var index = this.checkpointIndexOfNav(); if (data.plan.type == 'STREAMING' && index == -1) { - this.listOfNavigation.splice(this.checkpointIndexOfNavigation, 0, {path: 'checkpoints', title: 'Checkpoints'}); + this.listOfNavigation.splice(this.checkpointIndexOfNavigation, 0, { + path: 'checkpoints', + title: 'Checkpoints' + }); } else if (data.plan.type == 'BATCH' && index > -1) { this.listOfNavigation.splice(index, 1); } @@ -85,12 +89,12 @@ export class JobStatusComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } - checkpointIndexOfNav() { + checkpointIndexOfNav(): number { return this.listOfNavigation.findIndex(item => item.path === 'checkpoints'); } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.less b/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.less index fb168bfaece4a..41b09fe171c12 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.less @@ -19,16 +19,16 @@ @import "theme"; :host { - display: block; position: relative; + display: block; background: @component-background; } .name { - font-size: 12px; padding: 12px; - word-break: break-all; - background: @background-color-light; border-top: solid 1px @border-color-split; border-bottom: solid 1px @border-color-split; + background: @background-color-light; + font-size: 12px; + word-break: break-all; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.ts index aa56e879b8e81..4d3232b83a7fd 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/timeline/job-timeline.component.ts @@ -25,26 +25,28 @@ import { ChangeDetectorRef, AfterViewInit } from '@angular/core'; -import { Chart } from '@antv/g2'; -import * as G2 from '@antv/g2'; import { Subject } from 'rxjs'; import { distinctUntilChanged, filter, takeUntil } from 'rxjs/operators'; -import { JobDetailCorrectInterface, VerticesItemRangeInterface } from 'interfaces'; -import { JobService } from 'services'; + +import { Chart } from '@antv/g2'; +import * as G2 from '@antv/g2'; + import { COLOR_MAP } from 'config'; +import { JobDetailCorrectInterface, SafeAny, VerticesItemRangeInterface } from 'interfaces'; +import { JobService } from 'services'; /// @Component({ - selector : 'flink-job-timeline', - templateUrl : './job-timeline.component.html', - styleUrls : [ './job-timeline.component.less' ], + selector: 'flink-job-timeline', + templateUrl: './job-timeline.component.html', + styleUrls: ['./job-timeline.component.less'], changeDetection: ChangeDetectionStrategy.OnPush }) export class JobTimelineComponent implements AfterViewInit, OnDestroy { destroy$ = new Subject(); listOfVertex: VerticesItemRangeInterface[] = []; - listOfSubTaskTimeLine: Array<{ name: string; status: string; range: [ number, number ] }> = []; + listOfSubTaskTimeLine: Array<{ name: string; status: string; range: [number, number] }> = []; mainChartInstance: Chart; subTaskChartInstance: Chart; jobDetail: JobDetailCorrectInterface; @@ -53,17 +55,17 @@ export class JobTimelineComponent implements AfterViewInit, OnDestroy { @ViewChild('mainTimeLine', { static: true }) mainTimeLine: ElementRef; @ViewChild('subTaskTimeLine', { static: true }) subTaskTimeLine: ElementRef; - updateSubTaskChart(vertexId: string) { + updateSubTaskChart(vertexId: string): void { this.listOfSubTaskTimeLine = []; this.jobService.loadSubTaskTimes(this.jobDetail.jid, vertexId).subscribe(data => { data.subtasks.forEach(task => { const listOfTimeLine: Array<{ status: string; startTime: number }> = []; for (const key in task.timestamps) { // @ts-ignore - const time = task.timestamps[ key ]; + const time = task.timestamps[key]; if (time > 0) { listOfTimeLine.push({ - status : key, + status: key, startTime: time }); } @@ -72,15 +74,15 @@ export class JobTimelineComponent implements AfterViewInit, OnDestroy { listOfTimeLine.forEach((item, index) => { if (index === listOfTimeLine.length - 1) { this.listOfSubTaskTimeLine.push({ - name : `${task.subtask} - ${task.host}`, + name: `${task.subtask} - ${task.host}`, status: item.status, - range : [ item.startTime, task.duration + listOfTimeLine[ 0 ].startTime ] + range: [item.startTime, task.duration + listOfTimeLine[0].startTime] }); } else { this.listOfSubTaskTimeLine.push({ - name : `${task.subtask} - ${task.host}`, + name: `${task.subtask} - ${task.host}`, status: item.status, - range : [ item.startTime, listOfTimeLine[ index + 1 ].startTime ] + range: [item.startTime, listOfTimeLine[index + 1].startTime] }); } }); @@ -89,9 +91,9 @@ export class JobTimelineComponent implements AfterViewInit, OnDestroy { this.subTaskChartInstance.source(this.listOfSubTaskTimeLine, { range: { alias: 'Time', - type : 'time', - mask : 'HH:mm:ss', - nice : false + type: 'time', + mask: 'HH:mm:ss', + nice: false } }); this.subTaskChartInstance.render(); @@ -99,116 +101,114 @@ export class JobTimelineComponent implements AfterViewInit, OnDestroy { this.cdr.markForCheck(); setTimeout(() => { try { - (document.getElementById('subtask') as any).scrollIntoViewIfNeeded(); - } catch (e) { - } + (document.getElementById('subtask') as SafeAny).scrollIntoViewIfNeeded(); + } catch (e) {} }); }); } - setUpMainChart() { + setUpMainChart(): void { this.mainChartInstance = new G2.Chart({ container: this.mainTimeLine.nativeElement, - forceFit : true, - animate : false, - height : 500, - padding : [ 50, 50, 50, 50 ] + forceFit: true, + animate: false, + height: 500, + padding: [50, 50, 50, 50] }); this.mainChartInstance.axis('id', false); this.mainChartInstance - .coord('rect') - .transpose() - .scale(1, -1); + .coord('rect') + .transpose() + .scale(1, -1); this.mainChartInstance - .interval() - .position('id*range') - // @ts-ignore - .color('status', (type: any) => COLOR_MAP[ type ]) - .label('name', { - offset : -20, - formatter: (text: string) => { - if (text.length <= 120) { - return text; - } else { - return text.slice(0, 120) + '...'; + .interval() + .position('id*range') + // @ts-ignore + .color('status', (type: SafeAny) => COLOR_MAP[type]) + .label('name', { + offset: -20, + formatter: (text: string) => { + if (text.length <= 120) { + return text; + } else { + return `${text.slice(0, 120)}...`; + } + }, + textStyle: { + fill: '#ffffff', + textAlign: 'right', + fontWeight: 'bold' } - }, - textStyle: { - fill : '#ffffff', - textAlign : 'right', - fontWeight: 'bold' - } - }); + }); this.mainChartInstance.tooltip({ title: 'name' }); - this.mainChartInstance.on('click', (e: any) => { + this.mainChartInstance.on('click', (e: SafeAny) => { if (this.mainChartInstance.getSnapRecords(e).length) { - const data = (this.mainChartInstance.getSnapRecords(e)[ 0 ] as any)._origin; + const data = (this.mainChartInstance.getSnapRecords(e)[0] as SafeAny)._origin; this.selectedName = data.name; this.updateSubTaskChart(data.id); } }); } - setUpSubTaskChart() { + setUpSubTaskChart(): void { this.subTaskChartInstance = new G2.Chart({ container: this.subTaskTimeLine.nativeElement, - forceFit : true, - height : 10, - animate : false, - padding : [ 50, 50, 50, 300 ] + forceFit: true, + height: 10, + animate: false, + padding: [50, 50, 50, 300] }); this.subTaskChartInstance - .coord('rect') - .transpose() - .scale(1, -1); + .coord('rect') + .transpose() + .scale(1, -1); this.subTaskChartInstance - .interval() - .position('name*range') - // @ts-ignore - .color('status', (type: any) => COLOR_MAP[ type ]); + .interval() + .position('name*range') + // @ts-ignore + .color('status', (type: SafeAny) => COLOR_MAP[type]); } - constructor(private jobService: JobService, private cdr: ChangeDetectorRef) { - } + constructor(private jobService: JobService, private cdr: ChangeDetectorRef) {} - ngAfterViewInit() { + ngAfterViewInit(): void { this.setUpMainChart(); this.setUpSubTaskChart(); this.jobService.jobDetail$ - .pipe( - filter(() => !!this.mainChartInstance), - distinctUntilChanged((pre, next) => pre.jid === next.jid), - takeUntil(this.destroy$) - ) - .subscribe(data => { - this.jobDetail = data; - this.listOfVertex = data.vertices - .filter(v => v[ 'start-time' ] > -1) - .map(vertex => { - const endTime = vertex[ 'end-time' ] > -1 ? vertex[ 'end-time' ] : (vertex[ 'start-time' ] + vertex.duration); - return { - ...vertex, - range: [ vertex[ 'start-time' ], endTime ] - }; - }); - this.listOfVertex = this.listOfVertex.sort((a, b) => a.range[ 0 ] - b.range[ 0 ]); - this.mainChartInstance.changeHeight(Math.max(this.listOfVertex.length * 50 + 100, 150)); - this.mainChartInstance.source(this.listOfVertex, { - range: { - alias: 'Time', - type : 'time', - mask : 'HH:mm:ss', - nice : false - } + .pipe( + filter(() => !!this.mainChartInstance), + distinctUntilChanged((pre, next) => pre.jid === next.jid), + takeUntil(this.destroy$) + ) + .subscribe(data => { + this.jobDetail = data; + this.listOfVertex = data.vertices + .filter(v => v['start-time'] > -1) + .map(vertex => { + const endTime = vertex['end-time'] > -1 ? vertex['end-time'] : vertex['start-time'] + vertex.duration; + return { + ...vertex, + range: [vertex['start-time'], endTime] + }; + }); + this.listOfVertex = this.listOfVertex.sort((a, b) => a.range[0] - b.range[0]); + this.mainChartInstance.changeHeight(Math.max(this.listOfVertex.length * 50 + 100, 150)); + this.mainChartInstance.source(this.listOfVertex, { + range: { + alias: 'Time', + type: 'time', + mask: 'HH:mm:ss', + nice: false + } + }); + this.mainChartInstance.render(); + this.cdr.markForCheck(); }); - this.mainChartInstance.render(); - this.cdr.markForCheck(); - }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview-routing.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview-routing.module.ts index 7adc272911e60..64c719becd452 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview-routing.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview-routing.module.ts @@ -18,6 +18,7 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; + import { OverviewComponent } from './overview.component'; const routes: Routes = [{ path: '', component: OverviewComponent }]; diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.html b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.html index 164ff2dc3d417..3ecb99e398313 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.html @@ -17,5 +17,13 @@ --> - - + + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.ts index 8c621cb6fe0ca..e3b4f0b5ac8fd 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.component.ts @@ -17,9 +17,10 @@ */ import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core'; -import { JobsItemInterface } from 'interfaces'; import { Observable, Subject } from 'rxjs'; import { flatMap, share, takeUntil } from 'rxjs/operators'; + +import { JobsItemInterface } from 'interfaces'; import { StatusService, JobService } from 'services'; @Component({ @@ -34,7 +35,7 @@ export class OverviewComponent implements OnInit, OnDestroy { constructor(private statusService: StatusService, private jobService: JobService) {} - ngOnInit() { + ngOnInit(): void { this.jobData$ = this.statusService.refresh$.pipe( takeUntil(this.destroy$), flatMap(() => this.jobService.loadJobs()), @@ -42,7 +43,7 @@ export class OverviewComponent implements OnInit, OnDestroy { ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.module.ts index 01927a4e03ffe..3b2b4e6d4ba79 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/overview.module.ts @@ -16,15 +16,17 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + +import { NzCardModule } from 'ng-zorro-antd/card'; +import { NzDividerModule } from 'ng-zorro-antd/divider'; +import { NzGridModule } from 'ng-zorro-antd/grid'; import { ShareModule } from 'share/share.module'; + import { OverviewRoutingModule } from './overview-routing.module'; import { OverviewComponent } from './overview.component'; import { OverviewStatisticComponent } from './statistic/overview-statistic.component'; -import { NzDividerModule } from 'ng-zorro-antd/divider'; -import { NzCardModule } from 'ng-zorro-antd/card'; -import { NzGridModule } from 'ng-zorro-antd/grid'; @NgModule({ imports: [CommonModule, ShareModule, OverviewRoutingModule, NzDividerModule, NzCardModule, NzGridModule], diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.html b/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.html index a84ed924f88ca..5629ed72cb635 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.html @@ -20,16 +20,16 @@
-
{{ statistic['slots-available'] | number:'1.0-0' }}
+
{{ statistic['slots-available'] | number: '1.0-0' }}
@@ -38,21 +38,21 @@
-
{{ statistic['jobs-running'] | number:'1.0-0' }}
+
{{ statistic['jobs-running'] | number: '1.0-0' }}
diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.less b/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.less index 5858371fcfc39..6bc6126ec7b6f 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.less @@ -36,8 +36,8 @@ nz-card { } .footer { - padding-top: 9px; margin-top: 16px; + padding-top: 9px; border-top: 1px solid @border-color-split; .field { @@ -50,8 +50,8 @@ nz-card { &:last-child { margin-left: 8px; - font-weight: 600; color: @heading-color; + font-weight: 600; } } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.ts index 674c59b5265d8..800c70a149df3 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/overview/statistic/overview-statistic.component.ts @@ -17,9 +17,10 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { OverviewInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; + +import { OverviewInterface } from 'interfaces'; import { OverviewService, StatusService } from 'services'; @Component({ @@ -38,7 +39,7 @@ export class OverviewStatisticComponent implements OnInit, OnDestroy { private cdr: ChangeDetectorRef ) {} - ngOnInit() { + ngOnInit(): void { this.statusService.refresh$ .pipe( takeUntil(this.destroy$), @@ -50,7 +51,7 @@ export class OverviewStatisticComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit-routing.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit-routing.module.ts index 47148ce771cb1..a65181c07ff6a 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit-routing.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit-routing.module.ts @@ -18,6 +18,7 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; + import { SubmitComponent } from './submit.component'; const routes: Routes = [ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.html b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.html index 79f89c694195f..163ff5c3ace66 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.html @@ -16,7 +16,12 @@ ~ limitations under the License. --> - + - + - {{jar.name}} - {{jar.uploaded | date:'yyyy-MM-dd, HH:mm:ss'}} + {{ jar.name }} + {{ jar.uploaded | date: 'yyyy-MM-dd, HH:mm:ss' }}
- {{entries.name}} + {{ entries.name }}
-
+
-
- Delete + + Delete + @@ -56,15 +68,17 @@ - + - + + + - + @@ -72,7 +86,11 @@ - + @@ -80,14 +98,20 @@ - + - + @@ -104,22 +128,49 @@ - Yarn's AM proxy doesn't allow file uploads. Please wait while we fetch an alternate url for you to use - Yarn's AM proxy doesn't allow file uploads. You can visit here to access this functionality. + + Yarn's AM proxy doesn't allow file uploads. Please wait while we fetch an alternate url for + you to use + + + Yarn's AM proxy doesn't allow file uploads. You can visit  + here +  to access this functionality. +
- + - +
- + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.less b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.less index d18757db6b243..0748e2bda5880 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.less @@ -16,24 +16,23 @@ * limitations under the License. */ - .input-file { + position: absolute; + z-index: -1; + overflow: hidden; width: 0.1px; height: 0.1px; opacity: 0; - overflow: hidden; - position: absolute; - z-index: -1; } .extra { position: absolute; - right: 24px; top: 18px; + right: 24px; nz-progress { - width: 150px; display: block; + width: 150px; } .upload { @@ -53,8 +52,8 @@ flink-dagre { position: absolute; top: 60px; - bottom: 0; right: 0; + bottom: 0; left: 0; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.ts index 2877cb0c45b85..52757d8fded0f 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.component.ts @@ -20,12 +20,14 @@ import { HttpEventType } from '@angular/common/http'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { FormBuilder, FormGroup } from '@angular/forms'; import { Router } from '@angular/router'; -import { JarFilesItemInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; -import { JarService, StatusService } from 'services'; + import { DagreComponent } from 'share/common/dagre/dagre.component'; +import { JarFilesItemInterface } from 'interfaces'; +import { JarService, StatusService } from 'services'; + @Component({ selector: 'flink-submit', templateUrl: './submit.component.html', @@ -48,9 +50,10 @@ export class SubmitComponent implements OnInit, OnDestroy { /** * Upload jar + * * @param file */ - uploadJar(file: File) { + uploadJar(file: File): void { this.jarService.uploadJar(file).subscribe( event => { if (event.type === HttpEventType.UploadProgress && event.total) { @@ -70,9 +73,10 @@ export class SubmitComponent implements OnInit, OnDestroy { /** * Delete jar + * * @param jar */ - deleteJar(jar: JarFilesItemInterface) { + deleteJar(jar: JarFilesItemInterface): void { this.jarService.deleteJar(jar.id).subscribe(() => { this.statusService.forceRefresh(); this.expandedMap.set(jar.id, false); @@ -81,9 +85,10 @@ export class SubmitComponent implements OnInit, OnDestroy { /** * Click to expand jar details + * * @param jar */ - expandJar(jar: JarFilesItemInterface) { + expandJar(jar: JarFilesItemInterface): void { if (this.expandedMap.get(jar.id)) { this.expandedMap.set(jar.id, false); } else { @@ -102,9 +107,10 @@ export class SubmitComponent implements OnInit, OnDestroy { /** * Show Plan Visualization + * * @param jar */ - showPlan(jar: JarFilesItemInterface) { + showPlan(jar: JarFilesItemInterface): void { this.jarService .getPlan( jar.id, @@ -121,15 +127,16 @@ export class SubmitComponent implements OnInit, OnDestroy { /** * Close Plan Visualization */ - hidePlan() { + hidePlan(): void { this.planVisible = false; } /** * Submit job + * * @param jar */ - submitJob(jar: JarFilesItemInterface) { + submitJob(jar: JarFilesItemInterface): void { this.jarService .runJob( jar.id, @@ -146,10 +153,11 @@ export class SubmitComponent implements OnInit, OnDestroy { /** * trackBy Func + * * @param _ * @param node */ - trackJarBy(_: number, node: JarFilesItemInterface) { + trackJarBy(_: number, node: JarFilesItemInterface): string { return node.id; } @@ -161,7 +169,7 @@ export class SubmitComponent implements OnInit, OnDestroy { private cdr: ChangeDetectorRef ) {} - ngOnInit() { + ngOnInit(): void { this.isYarn = window.location.href.indexOf('/proxy/application_') !== -1; this.validateForm = this.fb.group({ entryClass: [null], @@ -191,7 +199,7 @@ export class SubmitComponent implements OnInit, OnDestroy { ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.module.ts index 15255c9148bda..f561c0ceab82d 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/submit/submit.module.ts @@ -16,13 +16,10 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; -import { ShareModule } from 'share/share.module'; -import { SubmitRoutingModule } from './submit-routing.module'; -import { SubmitComponent } from './submit.component'; import { NzButtonModule } from 'ng-zorro-antd/button'; import { NzCardModule } from 'ng-zorro-antd/card'; import { NzCheckboxModule } from 'ng-zorro-antd/checkbox'; @@ -33,6 +30,10 @@ import { NzInputModule } from 'ng-zorro-antd/input'; import { NzPopconfirmModule } from 'ng-zorro-antd/popconfirm'; import { NzProgressModule } from 'ng-zorro-antd/progress'; import { NzTableModule } from 'ng-zorro-antd/table'; +import { ShareModule } from 'share/share.module'; + +import { SubmitRoutingModule } from './submit-routing.module'; +import { SubmitComponent } from './submit.component'; @NgModule({ imports: [ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.html index 2394109a8583a..c097bd9f797ff 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.html @@ -21,7 +21,7 @@ #table class="small" [nzSize]="'small'" - [nzScroll]="{x:'1250px',y:'calc(100vh - 260px)'}" + [nzScroll]="{ x: '1250px', y: 'calc(100vh - 260px)' }" [nzData]="listOfTaskManager" [nzFrontPagination]="false" [nzShowPagination]="false" @@ -36,25 +36,35 @@ CPU Cores Physical MEM JVM Heap Size - Flink Managed MEM + + Flink Managed MEM + - + - {{ manager.id }} -
+ + {{ manager.id }} + +
{{ manager.path }} {{ manager.dataPort }} - {{ manager.timeSinceLastHeartbeat | date:'yyyy-MM-dd HH:mm:ss' }} + {{ manager.timeSinceLastHeartbeat | date: 'yyyy-MM-dd HH:mm:ss' }} {{ manager.slotsNumber }} {{ manager.freeSlots }} {{ manager.hardware.cpuCores }} - {{ manager.hardware.physicalMemory | humanizeBytes }} - {{ manager.hardware.freeMemory | humanizeBytes }} - {{ manager.hardware.managedMemory | humanizeBytes }} + + {{ manager.hardware.physicalMemory | humanizeBytes }} + + + {{ manager.hardware.freeMemory | humanizeBytes }} + + + {{ manager.hardware.managedMemory | humanizeBytes }} +
diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.ts index 586d733e84526..ab695d5e40a13 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/list/task-manager-list.component.ts @@ -18,12 +18,14 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { TaskmanagersItemInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; + +import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; + +import { TaskmanagersItemInterface } from 'interfaces'; import { StatusService, TaskManagerService } from 'services'; import { deepFind } from 'utils'; -import { NzTableSortFn } from 'ng-zorro-antd/table/src/table.types'; @Component({ selector: 'flink-task-manager-list', @@ -52,11 +54,11 @@ export class TaskManagerListComponent implements OnInit, OnDestroy { deepFind(pre, path) > deepFind(next, path) ? 1 : -1; } - trackManagerBy(_: number, node: TaskmanagersItemInterface) { + trackManagerBy(_: number, node: TaskmanagersItemInterface): string { return node.id; } - navigateTo(taskManager: TaskmanagersItemInterface) { + navigateTo(taskManager: TaskmanagersItemInterface): void { this.router.navigate([taskManager.id, 'metrics'], { relativeTo: this.activatedRoute }).then(); } @@ -68,7 +70,7 @@ export class TaskManagerListComponent implements OnInit, OnDestroy { private activatedRoute: ActivatedRoute ) {} - ngOnInit() { + ngOnInit(): void { this.statusService.refresh$ .pipe( takeUntil(this.destroy$), @@ -87,7 +89,7 @@ export class TaskManagerListComponent implements OnInit, OnDestroy { ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.html index b2211292e3582..edf9302203094 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.html @@ -17,8 +17,12 @@ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.less b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.less index 73d1d21b1465a..819f6aa687a06 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.less @@ -16,45 +16,48 @@ @import "theme"; +flink-monaco-editor { + height: calc(~"100vh - 386px"); + border: 1px solid @border-color-split; +} + +.breadcrumb { + position: relative; + margin-bottom: 16px; + padding: 12px 24px; + border: 1px solid @border-color-split; + background: @component-background; +} + :host { display: block; height: 100%; + &.full-screen { position: fixed; top: 0; - bottom: 0; right: 0; + bottom: 0; left: 0; - background: @component-background; z-index: 99; + background: @component-background; + .breadcrumb { - margin-bottom: 0px; - border-top: 0px; + margin-bottom: 0; + border-top: 0; } + flink-monaco-editor { - border-top: 0px; - border-bottom: 0px; height: calc(~"100vh - 46px"); + border-top: 0; + border-bottom: 0; } } } -flink-monaco-editor { - height: calc(~"100vh - 386px"); - border: 1px solid @border-color-split; -} - -.breadcrumb { - background: @component-background; - border: 1px solid @border-color-split; - margin-bottom: 16px; - padding: 12px 24px; - position: relative; -} - flink-refresh-download { position: absolute; - right: 12px; top: 0; + right: 12px; line-height: 47px; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.ts index d57621e7d7458..41a2219c6f305 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-detail/task-manager-log-detail.component.ts @@ -16,11 +16,13 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { TaskManagerDetailInterface } from 'interfaces'; -import { TaskManagerService } from 'services'; import { first } from 'rxjs/operators'; + import { MonacoEditorComponent } from 'share/common/monaco-editor/monaco-editor.component'; +import { TaskManagerDetailInterface } from 'interfaces'; +import { TaskManagerService } from 'services'; + @Component({ selector: 'flink-task-manager-log-detail', templateUrl: './task-manager-log-detail.component.html', @@ -45,7 +47,7 @@ export class TaskManagerLogDetailComponent implements OnInit { private activatedRoute: ActivatedRoute ) {} - reloadLog() { + reloadLog(): void { this.isLoading = true; this.cdr.markForCheck(); this.taskManagerService.loadLog(this.taskManagerDetail.id, this.logName).subscribe( @@ -64,7 +66,7 @@ export class TaskManagerLogDetailComponent implements OnInit { ); } - toggleFullScreen(fullScreen: boolean) { + toggleFullScreen(fullScreen: boolean): void { this.isFullScreen = fullScreen; this.layoutEditor(); } @@ -73,7 +75,7 @@ export class TaskManagerLogDetailComponent implements OnInit { setTimeout(() => this.monacoEditorComponent.layout()); } - ngOnInit() { + ngOnInit(): void { this.taskManagerService.taskManagerDetail$.pipe(first()).subscribe(data => { this.taskManagerDetail = data; this.logName = this.activatedRoute.snapshot.params.logName; diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.html index e2dc2fc67c251..3506ec667a749 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.html @@ -33,11 +33,11 @@ - + {{ log.name }} - {{ (log.size / 1024) | number : '1.0-2' }} + {{ log.size / 1024 | number: '1.0-2' }} diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.ts index 9e9b3d64099c8..01e70484c9591 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/log-list/task-manager-log-list.component.ts @@ -16,6 +16,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { first, flatMap } from 'rxjs/operators'; + import { TaskManagerService } from 'services'; @Component({ @@ -24,14 +25,14 @@ import { TaskManagerService } from 'services'; changeDetection: ChangeDetectionStrategy.OnPush }) export class TaskManagerLogListComponent implements OnInit { - listOfLog: { name: string; size: number }[] = []; + listOfLog: Array<{ name: string; size: number }> = []; isLoading = true; - trackByName = (_: number, log: { name: string; size: number }) => log.name; + trackByName = (_: number, log: { name: string; size: number }): string => log.name; constructor(private taskManagerService: TaskManagerService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.taskManagerService.taskManagerDetail$ .pipe( first(), diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.html index fe3b4d92a4a74..4e2c55a65b304 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.html @@ -18,138 +18,223 @@ - + - - Flink Memory Model - Effective Configuration - - - Metric - + + Flink Memory Model + + Effective Configuration + + + Metric + - - - - - Framework Heap - {{taskManagerDetail.memoryConfiguration.frameworkHeap | humanizeBytes}} - - - {{metrics['Status.JVM.Memory.Heap.Used'] | humanizeBytes}} / {{metrics['Status.JVM.Memory.Heap.Max'] | humanizeBytes }} - - - - - Task Heap - {{taskManagerDetail.memoryConfiguration.taskHeap | humanizeBytes}} - - - Managed Memory - {{taskManagerDetail.memoryConfiguration.managedMemory | humanizeBytes}} - - - {{metrics['Status.Flink.Memory.Managed.Used'] | humanizeBytes}} / {{metrics['Status.Flink.Memory.Managed.Total'] | humanizeBytes }} - - - - Framework Off-Heap - {{ taskManagerDetail.memoryConfiguration.frameworkOffHeap | humanizeBytes}} - - - - - - Task Off-Heap - {{taskManagerDetail.memoryConfiguration.taskOffHeap | humanizeBytes}} - - - Network - {{taskManagerDetail.memoryConfiguration.networkMemory | humanizeBytes}} - - - {{metrics['Status.Shuffle.Netty.UsedMemory'] | humanizeBytes}} / {{metrics['Status.Shuffle.Netty.TotalMemory'] | humanizeBytes }} - - - - JVM Metaspace - {{taskManagerDetail.memoryConfiguration.jvmMetaspace | humanizeBytes}} - - - {{metrics['Status.JVM.Memory.Metaspace.Used'] | humanizeBytes}} / {{metrics['Status.JVM.Memory.Metaspace.Max'] | humanizeBytes }} - - - - JVM Overhead - {{taskManagerDetail.memoryConfiguration.jvmOverhead | humanizeBytes}} - - + + + Memory model + + Framework Heap + {{ taskManagerDetail.memoryConfiguration.frameworkHeap | humanizeBytes }} + + + {{ metrics['Status.JVM.Memory.Heap.Used'] | humanizeBytes }} / + {{ metrics['Status.JVM.Memory.Heap.Max'] | humanizeBytes }} + + + + + Task Heap + {{ taskManagerDetail.memoryConfiguration.taskHeap | humanizeBytes }} + + + Managed Memory + {{ taskManagerDetail.memoryConfiguration.managedMemory | humanizeBytes }} + + + {{ metrics['Status.Flink.Memory.Managed.Used'] | humanizeBytes }} / + {{ metrics['Status.Flink.Memory.Managed.Total'] | humanizeBytes }} + + + + Framework Off-Heap + {{ taskManagerDetail.memoryConfiguration.frameworkOffHeap | humanizeBytes }} + + + + + + Task Off-Heap + {{ taskManagerDetail.memoryConfiguration.taskOffHeap | humanizeBytes }} + + + Network + {{ taskManagerDetail.memoryConfiguration.networkMemory | humanizeBytes }} + + + {{ metrics['Status.Shuffle.Netty.UsedMemory'] | humanizeBytes }} / + {{ metrics['Status.Shuffle.Netty.TotalMemory'] | humanizeBytes }} + + + + JVM Metaspace + {{ taskManagerDetail.memoryConfiguration.jvmMetaspace | humanizeBytes }} + + + {{ metrics['Status.JVM.Memory.Metaspace.Used'] | humanizeBytes }} / + {{ metrics['Status.JVM.Memory.Metaspace.Max'] | humanizeBytes }} + + + + JVM Overhead + {{ taskManagerDetail.memoryConfiguration.jvmOverhead | humanizeBytes }} + + + +
- + + [nzTemplateMode]="true" + [nzFrontPagination]="false" + [nzShowPagination]="false" + [nzSize]="'small'" + class="no-border" + > - - Type - Committed - Used - Maximum - + + Type + Committed + Used + Maximum + - - Heap - {{ taskManagerDetail.metrics.heapCommitted | humanizeBytes }} - {{ taskManagerDetail.metrics.heapUsed | humanizeBytes }} - {{ taskManagerDetail.metrics.heapMax | humanizeBytes }} - - - Non-Heap - {{ taskManagerDetail.metrics.nonHeapCommitted | humanizeBytes }} - {{ taskManagerDetail.metrics.nonHeapUsed | humanizeBytes }} - {{ taskManagerDetail.metrics.nonHeapMax | humanizeBytes }} - + + Heap + {{ taskManagerDetail.metrics.heapCommitted | humanizeBytes }} + {{ taskManagerDetail.metrics.heapUsed | humanizeBytes }} + {{ taskManagerDetail.metrics.heapMax | humanizeBytes }} + + + Non-Heap + {{ taskManagerDetail.metrics.nonHeapCommitted | humanizeBytes }} + {{ taskManagerDetail.metrics.nonHeapUsed | humanizeBytes }} + {{ taskManagerDetail.metrics.nonHeapMax | humanizeBytes }} +
- + + [nzTemplateMode]="true" + [nzFrontPagination]="false" + [nzShowPagination]="false" + [nzSize]="'small'" + class="no-border" + > - - Type - Count - Used - Capacity - + + Type + Count + Used + Capacity + - - Direct - {{ taskManagerDetail.metrics.directCount | number }} - {{ taskManagerDetail.metrics.directUsed | humanizeBytes }} - {{ taskManagerDetail.metrics.directMax | humanizeBytes }} - - - Mapped - {{ taskManagerDetail.metrics.mappedCount | number }} - {{ taskManagerDetail.metrics.mappedUsed | humanizeBytes }} - {{ taskManagerDetail.metrics.mappedMax | humanizeBytes }} - + + Direct + {{ taskManagerDetail.metrics.directCount | number }} + {{ taskManagerDetail.metrics.directUsed | humanizeBytes }} + {{ taskManagerDetail.metrics.directMax | humanizeBytes }} + + + Mapped + {{ taskManagerDetail.metrics.mappedCount | number }} + {{ taskManagerDetail.metrics.mappedUsed | humanizeBytes }} + {{ taskManagerDetail.metrics.mappedMax | humanizeBytes }} + @@ -157,51 +242,57 @@
- + + [nzTemplateMode]="true" + [nzFrontPagination]="false" + [nzShowPagination]="false" + [nzSize]="'small'" + class="no-border" + > - - Type - Count - + + Type + Count + - - Available - {{ taskManagerDetail.metrics.memorySegmentsAvailable | number }} - - - Total - {{ taskManagerDetail.metrics.memorySegmentsTotal | number }} - + + Available + {{ taskManagerDetail.metrics.memorySegmentsAvailable | number }} + + + Total + {{ taskManagerDetail.metrics.memorySegmentsTotal | number }} +
- + + [nzTemplateMode]="true" + [nzFrontPagination]="false" + [nzShowPagination]="false" + [nzSize]="'small'" + class="no-border" + > - - Collector - Count - Time - + + Collector + Count + Time + - - {{ g.name }} - {{ g.count | number }} - {{ g.time | number }} - + + + {{ g.name }} + + {{ g.count | number }} + {{ g.time | number }} + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.less b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.less index 36006940b3731..b08f355b3826d 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.less @@ -17,6 +17,17 @@ */ @import "theme"; +nz-progress { + display: block; + width: 90%; + + ::ng-deep { + .ant-progress-inner { + border-radius: 0 !important; + } + } +} + :host { display: block; margin-bottom: 16px; @@ -36,38 +47,35 @@ nz-card:first-child { table { border-collapse: collapse; } + .ant-table-small { border: none; + .ant-table-body { - margin: 0; overflow: hidden !important; + margin: 0; } - tr { - &:hover { - td, th { - background: transparent; - } - } - } - td, th { - border-collapse: collapse; + + td, + th { border: 1px solid @border-color-split !important; + border-collapse: collapse; + &.table-header { background: @table-header-bg !important; color: @table-header-color; font-weight: 500; } } - } - } -} -nz-progress { - display: block; - width: 90%; - ::ng-deep { - .ant-progress-inner { - border-radius: 0 !important; + tr { + &:hover { + td, + th { + background: transparent; + } + } + } } } } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.ts index ca09147c16144..d590e96863178 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/metrics/task-manager-metrics.component.ts @@ -17,9 +17,10 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; -import { TaskManagerDetailInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; + +import { TaskManagerDetailInterface } from 'interfaces'; import { TaskManagerService } from 'services'; @Component({ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.html index 8ab2bcfd92782..ba1b52da4c722 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.html @@ -23,7 +23,7 @@

{{ taskManagerDetail.path }}

Last Heartbeat:
-
{{ taskManagerDetail.timeSinceLastHeartbeat | date:'yyyy-MM-dd HH:mm:ss' }}
+
{{ taskManagerDetail.timeSinceLastHeartbeat | date: 'yyyy-MM-dd HH:mm:ss' }}
@@ -63,4 +63,9 @@

{{ taskManagerDetail.path }}

- + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.less b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.less index f668072e89532..8a3b20dc0c1b2 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.less @@ -19,10 +19,10 @@ :host { display: block; - background: @component-background; + margin: -24px -24px 0; padding: 16px 24px 0; border-bottom: 1px solid @border-color-split; - margin: -24px -24px 0px; + background: @component-background; } .wrapper { @@ -30,7 +30,8 @@ } .name { - h2, flink-job-badge { + h2, + flink-job-badge { display: inline-block; } @@ -41,26 +42,26 @@ .field { display: flex; + margin-bottom: 12px; font-size: 14px; line-height: 22px; - margin-bottom: 12px; div { line-height: 22px; &:last-child { margin-left: 8px; - font-weight: 700; color: @heading-color; + font-weight: 700; } } } .status { - margin-bottom: 12px; display: flex; - align-items: center; flex-wrap: wrap; + align-items: center; + margin-bottom: 12px; padding: 12px 12px 0 12px; border: 1px solid @border-color-split; background: darken(@component-background, 1%); @@ -71,7 +72,6 @@ } flink-navigation { - margin-bottom: -1px; display: block; + margin-bottom: -1px; } - diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.ts index 054c4b1dcbac3..9cd9d60af89f4 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/status/task-manager-status.component.ts @@ -17,9 +17,10 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; -import { TaskManagerDetailInterface } from 'interfaces'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; + +import { TaskManagerDetailInterface } from 'interfaces'; import { TaskManagerService } from 'services'; @Component({ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.html index 3bb6282980b73..b8024396dcf58 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.html @@ -17,4 +17,9 @@ --> - + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.ts index b5b44242e565d..781cf009b3168 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/stdout/task-manager-stdout.component.ts @@ -17,11 +17,13 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; -import { TaskManagerDetailInterface } from 'interfaces'; import { first } from 'rxjs/operators'; -import { TaskManagerService } from 'services'; + import { MonacoEditorComponent } from 'share/common/monaco-editor/monaco-editor.component'; +import { TaskManagerDetailInterface } from 'interfaces'; +import { TaskManagerService } from 'services'; + @Component({ selector: 'flink-task-manager-stdout', templateUrl: './task-manager-stdout.component.html', @@ -33,7 +35,7 @@ export class TaskManagerStdoutComponent implements OnInit { stdout = ''; taskManagerDetail: TaskManagerDetailInterface; - reload() { + reload(): void { if (this.taskManagerDetail) { this.taskManagerService.loadStdout(this.taskManagerDetail.id).subscribe( data => { @@ -50,7 +52,7 @@ export class TaskManagerStdoutComponent implements OnInit { constructor(private taskManagerService: TaskManagerService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.taskManagerService.taskManagerDetail$.pipe(first()).subscribe(data => { this.taskManagerDetail = data; this.reload(); diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager-routing.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager-routing.module.ts index 7301fe31b4950..3072c01a4028a 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager-routing.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager-routing.module.ts @@ -18,13 +18,14 @@ import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; + +import { TaskManagerListComponent } from './list/task-manager-list.component'; import { TaskManagerLogDetailComponent } from './log-detail/task-manager-log-detail.component'; import { TaskManagerLogListComponent } from './log-list/task-manager-log-list.component'; -import { TaskManagerComponent } from './task-manager.component'; -import { TaskManagerListComponent } from './list/task-manager-list.component'; import { TaskManagerLogsComponent } from './logs/task-manager-logs.component'; import { TaskManagerMetricsComponent } from './metrics/task-manager-metrics.component'; import { TaskManagerStdoutComponent } from './stdout/task-manager-stdout.component'; +import { TaskManagerComponent } from './task-manager.component'; import { TaskManagerThreadDumpComponent } from './thread-dump/task-manager-thread-dump.component'; const routes: Routes = [ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.html index ef113f31c9e08..57d4ac3c5ea9b 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.html @@ -19,7 +19,7 @@
-
+
diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.less b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.less index 8dd6204f96090..111f938659742 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.less +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.less @@ -16,7 +16,6 @@ * limitations under the License. */ - @import "theme"; .content { @@ -24,6 +23,6 @@ } .router { - height: 100%; width: 100%; + height: 100%; } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.ts index 81914594fe4ab..acab3a1f7d74a 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.component.ts @@ -20,6 +20,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnIni import { ActivatedRoute } from '@angular/router'; import { Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; + import { StatusService, TaskManagerService } from 'services'; @Component({ @@ -39,7 +40,7 @@ export class TaskManagerComponent implements OnInit, OnDestroy { private statusService: StatusService ) {} - ngOnInit() { + ngOnInit(): void { this.statusService.refresh$ .pipe( takeUntil(this.destroy$), @@ -58,7 +59,7 @@ export class TaskManagerComponent implements OnInit, OnDestroy { ); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.module.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.module.ts index 9a6c3d95042f7..e17925d8480a2 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/task-manager.module.ts @@ -16,20 +16,9 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { ShareModule } from 'share/share.module'; -import { TaskManagerLogDetailComponent } from './log-detail/task-manager-log-detail.component'; -import { TaskManagerLogListComponent } from './log-list/task-manager-log-list.component'; +import { NgModule } from '@angular/core'; -import { TaskManagerRoutingModule } from './task-manager-routing.module'; -import { TaskManagerListComponent } from './list/task-manager-list.component'; -import { TaskManagerMetricsComponent } from './metrics/task-manager-metrics.component'; -import { TaskManagerComponent } from './task-manager.component'; -import { TaskManagerStatusComponent } from './status/task-manager-status.component'; -import { TaskManagerThreadDumpComponent } from './thread-dump/task-manager-thread-dump.component'; -import { TaskManagerLogsComponent } from './logs/task-manager-logs.component'; -import { TaskManagerStdoutComponent } from './stdout/task-manager-stdout.component'; import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb'; import { NzCardModule } from 'ng-zorro-antd/card'; import { NzDividerModule } from 'ng-zorro-antd/divider'; @@ -39,6 +28,18 @@ import { NzProgressModule } from 'ng-zorro-antd/progress'; import { NzSkeletonModule } from 'ng-zorro-antd/skeleton'; import { NzTableModule } from 'ng-zorro-antd/table'; import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; +import { ShareModule } from 'share/share.module'; + +import { TaskManagerListComponent } from './list/task-manager-list.component'; +import { TaskManagerLogDetailComponent } from './log-detail/task-manager-log-detail.component'; +import { TaskManagerLogListComponent } from './log-list/task-manager-log-list.component'; +import { TaskManagerLogsComponent } from './logs/task-manager-logs.component'; +import { TaskManagerMetricsComponent } from './metrics/task-manager-metrics.component'; +import { TaskManagerStatusComponent } from './status/task-manager-status.component'; +import { TaskManagerStdoutComponent } from './stdout/task-manager-stdout.component'; +import { TaskManagerRoutingModule } from './task-manager-routing.module'; +import { TaskManagerComponent } from './task-manager.component'; +import { TaskManagerThreadDumpComponent } from './thread-dump/task-manager-thread-dump.component'; @NgModule({ imports: [ diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.html b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.html index 35c7f7c96340f..b992a2da307d7 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.html @@ -17,4 +17,9 @@ --> - + diff --git a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.ts b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.ts index b7bae7ead8cfc..7c06898a66462 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/pages/task-manager/thread-dump/task-manager-thread-dump.component.ts @@ -17,10 +17,12 @@ */ import { ChangeDetectorRef, Component, OnInit, ViewChild, ChangeDetectionStrategy } from '@angular/core'; -import { TaskManagerService } from 'services'; import { first } from 'rxjs/operators'; + import { MonacoEditorComponent } from 'share/common/monaco-editor/monaco-editor.component'; + import { TaskManagerDetailInterface } from 'interfaces'; +import { TaskManagerService } from 'services'; @Component({ selector: 'flink-task-manager-thread-dump', @@ -33,21 +35,24 @@ export class TaskManagerThreadDumpComponent implements OnInit { dump = ''; taskManagerDetail: TaskManagerDetailInterface; - reload() { + reload(): void { if (this.taskManagerDetail) { - this.taskManagerService.loadThreadDump(this.taskManagerDetail.id).subscribe(data => { + this.taskManagerService.loadThreadDump(this.taskManagerDetail.id).subscribe( + data => { this.monacoEditorComponent.layout(); this.dump = data; this.cdr.markForCheck(); - }, () => { - this.cdr.markForCheck(); - }); + }, + () => { + this.cdr.markForCheck(); + } + ); } } constructor(private taskManagerService: TaskManagerService, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.taskManagerService.taskManagerDetail$.pipe(first()).subscribe(data => { this.taskManagerDetail = data; this.reload(); diff --git a/flink-runtime-web/web-dashboard/src/app/services/jar.service.ts b/flink-runtime-web/web-dashboard/src/app/services/jar.service.ts index 20d43b3291e6b..adca933e3a38c 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/jar.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/jar.service.ts @@ -18,11 +18,12 @@ import { HttpClient, HttpRequest, HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { BASE_URL } from 'config'; -import { JarListInterface, NodesItemCorrectInterface, PlanInterface, VerticesLinkInterface } from 'interfaces'; -import { of } from 'rxjs'; +import { Observable, of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; +import { BASE_URL } from 'config'; +import { JarListInterface, NodesItemCorrectInterface, PlanInterface, SafeAny, VerticesLinkInterface } from 'interfaces'; + @Injectable({ providedIn: 'root' }) @@ -30,7 +31,7 @@ export class JarService { /** * Get uploaded jar list */ - loadJarList() { + loadJarList(): Observable { return this.httpClient.get(`${BASE_URL}/jars`).pipe( catchError(() => { return of({ @@ -44,9 +45,10 @@ export class JarService { /** * Upload jar + * * @param fd */ - uploadJar(fd: File) { + uploadJar(fd: File): Observable { const formData = new FormData(); formData.append('jarfile', fd, fd.name); const req = new HttpRequest('POST', `${BASE_URL}/jars/upload`, formData, { @@ -57,14 +59,16 @@ export class JarService { /** * Delete jar + * * @param jarId */ - deleteJar(jarId: string) { + deleteJar(jarId: string): Observable { return this.httpClient.delete(`${BASE_URL}/jars/${jarId}`); } /** * Run job + * * @param jarId * @param entryClass * @param parallelism @@ -79,7 +83,7 @@ export class JarService { programArgs: string, savepointPath: string, allowNonRestoredState: string - ) { + ): Observable<{ jobid: string }> { const requestParam = { entryClass, parallelism, programArgs, savepointPath, allowNonRestoredState }; let params = new HttpParams(); if (entryClass) { @@ -102,12 +106,18 @@ export class JarService { /** * Get plan json from jar + * * @param jarId * @param entryClass * @param parallelism * @param programArgs */ - getPlan(jarId: string, entryClass: string, parallelism: string, programArgs: string) { + getPlan( + jarId: string, + entryClass: string, + parallelism: string, + programArgs: string + ): Observable<{ nodes: NodesItemCorrectInterface[]; links: VerticesLinkInterface[] }> { let params = new HttpParams(); if (entryClass) { params = params.append('entry-class', entryClass); @@ -118,28 +128,30 @@ export class JarService { if (programArgs) { params = params.append('program-args', programArgs); } - return this.httpClient.get(`${BASE_URL}/jars/${jarId}/plan`, { params }).pipe( - map(data => { - const links: VerticesLinkInterface[] = []; - let nodes: NodesItemCorrectInterface[] = []; - if (data.plan.nodes.length) { - nodes = data.plan.nodes.map(node => { - return { - ...node, - detail: undefined - }; - }); - nodes.forEach(node => { - if (node.inputs && node.inputs.length) { - node.inputs.forEach(input => { - links.push({ ...input, source: input.id, target: node.id, id: `${input.id}-${node.id}` }); - }); - } - }); - } - return { nodes, links }; - }) - ); + return this.httpClient + .get(`${BASE_URL}/jars/${jarId}/plan`, { params }) + .pipe( + map(data => { + const links: VerticesLinkInterface[] = []; + let nodes: NodesItemCorrectInterface[] = []; + if (data.plan.nodes.length) { + nodes = data.plan.nodes.map(node => { + return { + ...node, + detail: undefined + }; + }); + nodes.forEach(node => { + if (node.inputs && node.inputs.length) { + node.inputs.forEach(input => { + links.push({ ...input, source: input.id, target: node.id, id: `${input.id}-${node.id}` }); + }); + } + }); + } + return { nodes, links }; + }) + ); } constructor(private httpClient: HttpClient) {} diff --git a/flink-runtime-web/web-dashboard/src/app/services/job-manager.service.ts b/flink-runtime-web/web-dashboard/src/app/services/job-manager.service.ts index 1675c8d41b88b..4407424ef7cf6 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/job-manager.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/job-manager.service.ts @@ -18,9 +18,11 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { BASE_URL } from 'config'; +import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; +import { BASE_URL } from 'config'; + @Injectable({ providedIn: 'root' }) @@ -28,14 +30,14 @@ export class JobManagerService { /** * Load JM config */ - loadConfig() { + loadConfig(): Observable> { return this.httpClient.get>(`${BASE_URL}/jobmanager/config`); } /** * Load JM logs */ - loadLogs() { + loadLogs(): Observable { return this.httpClient.get(`${BASE_URL}/jobmanager/log`, { responseType: 'text', headers: new HttpHeaders().append('Cache-Control', 'no-cache') @@ -45,7 +47,7 @@ export class JobManagerService { /** * Load JM stdout */ - loadStdout() { + loadStdout(): Observable { return this.httpClient.get(`${BASE_URL}/jobmanager/stdout`, { responseType: 'text', headers: new HttpHeaders().append('Cache-Control', 'no-cache') @@ -54,7 +56,7 @@ export class JobManagerService { /** * Load JM log list */ - loadLogList() { + loadLogList(): Observable> { return this.httpClient .get<{ logs: Array<{ name: string; size: number }> }>(`${BASE_URL}/jobmanager/logs`) .pipe(map(data => data.logs)); @@ -62,9 +64,10 @@ export class JobManagerService { /** * Load JM log + * * @param logName */ - loadLog(logName: string) { + loadLog(logName: string): Observable<{ data: string; url: string }> { const url = `${BASE_URL}/jobmanager/logs/${logName}`; return this.httpClient .get(url, { responseType: 'text', headers: new HttpHeaders().append('Cache-Control', 'no-cache') }) @@ -81,7 +84,7 @@ export class JobManagerService { /** * Get JM metric name */ - getMetricsName() { + getMetricsName(): Observable { return this.httpClient .get>(`${BASE_URL}/jobmanager/metrics`) .pipe(map(arr => arr.map(item => item.id))); @@ -89,9 +92,10 @@ export class JobManagerService { /** * Get JM metric + * * @param listOfMetricName */ - getMetrics(listOfMetricName: string[]) { + getMetrics(listOfMetricName: string[]): Observable<{ [p: string]: number }> { const metricName = listOfMetricName.join(','); return this.httpClient .get>(`${BASE_URL}/jobmanager/metrics?get=${metricName}`) diff --git a/flink-runtime-web/web-dashboard/src/app/services/job.service.ts b/flink-runtime-web/web-dashboard/src/app/services/job.service.ts index 4838bd07259f9..c540abbf4ef97 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/job.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/job.service.ts @@ -18,6 +18,10 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { combineLatest, EMPTY, Observable, ReplaySubject } from 'rxjs'; +import { catchError, filter, flatMap, map, tap } from 'rxjs/operators'; + +import { BASE_URL } from 'config'; import { CheckPointConfigInterface, CheckPointDetailInterface, @@ -30,18 +34,17 @@ import { JobExceptionInterface, JobFlameGraphInterface, JobOverviewInterface, + JobsItemInterface, JobSubTaskInterface, JobSubTaskTimeInterface, JobVertexTaskManagerInterface, NodesItemCorrectInterface, + SafeAny, SubTaskAccumulatorsInterface, TaskStatusInterface, UserAccumulatorsInterface, VerticesLinkInterface } from 'interfaces'; -import { combineLatest, EMPTY, ReplaySubject } from 'rxjs'; -import { catchError, filter, flatMap, map, tap } from 'rxjs/operators'; -import { BASE_URL } from 'config'; @Injectable({ providedIn: 'root' @@ -58,7 +61,7 @@ export class JobService { /** * Current activated job with vertex */ - jobWithVertex$ = combineLatest(this.jobDetail$, this.selectedVertex$).pipe( + jobWithVertex$ = combineLatest([this.jobDetail$, this.selectedVertex$]).pipe( map(data => { const [job, vertex] = data; return { job, vertex }; @@ -75,23 +78,24 @@ export class JobService { /** * Uses the non REST-compliant GET yarn-cancel handler which is available in addition to the * proper BASE_URL + "jobs/" + jobid + "?mode=cancel" + * * @param jobId */ - cancelJob(jobId: string) { + cancelJob(jobId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}/yarn-cancel`); } /** * Get job list */ - loadJobs() { + loadJobs(): Observable { return this.httpClient.get(`${BASE_URL}/jobs/overview`).pipe( map(data => { data.jobs.forEach(job => { for (const key in job.tasks) { - const upperCaseKey = key.toUpperCase() as (keyof TaskStatusInterface); - job.tasks[upperCaseKey] = job.tasks[key as (keyof TaskStatusInterface)]; - delete job.tasks[key as (keyof TaskStatusInterface)]; + const upperCaseKey = key.toUpperCase() as keyof TaskStatusInterface; + job.tasks[upperCaseKey] = job.tasks[key as keyof TaskStatusInterface]; + delete job.tasks[key as keyof TaskStatusInterface]; } job.completed = ['FINISHED', 'FAILED', 'CANCELED'].indexOf(job.state) > -1; }); @@ -103,17 +107,19 @@ export class JobService { /** * Load job config + * * @param jobId */ - loadJobConfig(jobId: string) { + loadJobConfig(jobId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}/config`); } /** * Load single job detail + * * @param jobId */ - loadJob(jobId: string) { + loadJob(jobId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}`).pipe( map(job => this.convertJob(job)), tap(job => { @@ -124,10 +130,14 @@ export class JobService { /** * Get vertex & subtask accumulators + * * @param jobId * @param vertexId */ - loadAccumulators(jobId: string, vertexId: string) { + loadAccumulators( + jobId: string, + vertexId: string + ): Observable<{ main: UserAccumulatorsInterface[]; subtasks: SubTaskAccumulatorsInterface[] }> { return this.httpClient .get<{ 'user-accumulators': UserAccumulatorsInterface[] }>( `${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/accumulators` @@ -154,10 +164,11 @@ export class JobService { /** * Get job exception + * * @param jobId * @param maxExceptions */ - loadExceptions(jobId: string, maxExceptions: number) { + loadExceptions(jobId: string, maxExceptions: number): Observable { return this.httpClient.get( `${BASE_URL}/jobs/${jobId}/exceptions?maxExceptions=${maxExceptions}` ); @@ -165,20 +176,22 @@ export class JobService { /** * Get vertex back pressure + * * @param jobId * @param vertexId */ - loadOperatorBackPressure(jobId: string, vertexId: string) { + loadOperatorBackPressure(jobId: string, vertexId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/backpressure`); } /** * Get vertex flame graph + * * @param jobId * @param vertexId * @param type */ - loadOperatorFlameGraph(jobId: string, vertexId: string, type: string) { + loadOperatorFlameGraph(jobId: string, vertexId: string, type: string): Observable { return this.httpClient.get( `${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/flamegraph?type=${type}` ); @@ -186,10 +199,11 @@ export class JobService { /** * Get vertex subtask + * * @param jobId * @param vertexId */ - loadSubTasks(jobId: string, vertexId: string) { + loadSubTasks(jobId: string, vertexId: string): Observable { return this.httpClient .get<{ subtasks: JobSubTaskInterface[] }>(`${BASE_URL}/jobs/${jobId}/vertices/${vertexId}`) .pipe(map(data => (data && data.subtasks) || [])); @@ -197,19 +211,21 @@ export class JobService { /** * Get subtask timeline + * * @param jobId * @param vertexId */ - loadSubTaskTimes(jobId: string, vertexId: string) { + loadSubTaskTimes(jobId: string, vertexId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/subtasktimes`); } /** * Get vertex task manager list + * * @param jobId * @param vertexId */ - loadTaskManagers(jobId: string, vertexId: string) { + loadTaskManagers(jobId: string, vertexId: string): Observable { return this.httpClient.get( `${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/taskmanagers` ); @@ -217,26 +233,29 @@ export class JobService { /** * Get check point status + * * @param jobId */ - loadCheckpointStats(jobId: string) { + loadCheckpointStats(jobId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}/checkpoints`); } /** * Get check point configuration + * * @param jobId */ - loadCheckpointConfig(jobId: string) { + loadCheckpointConfig(jobId: string): Observable { return this.httpClient.get(`${BASE_URL}/jobs/${jobId}/checkpoints/config`); } /** * get check point detail + * * @param jobId * @param checkPointId */ - loadCheckpointDetails(jobId: string, checkPointId: number) { + loadCheckpointDetails(jobId: string, checkPointId: number): Observable { return this.httpClient.get( `${BASE_URL}/jobs/${jobId}/checkpoints/details/${checkPointId}` ); @@ -244,11 +263,16 @@ export class JobService { /** * get subtask check point detail + * * @param jobId * @param checkPointId * @param vertexId */ - loadCheckpointSubtaskDetails(jobId: string, checkPointId: number, vertexId: string) { + loadCheckpointSubtaskDetails( + jobId: string, + checkPointId: number, + vertexId: string + ): Observable { return this.httpClient.get( `${BASE_URL}/jobs/${jobId}/checkpoints/details/${checkPointId}/subtasks/${vertexId}` ); @@ -256,6 +280,7 @@ export class JobService { /** * nodes to nodes links in order to generate graph + * * @param job */ private convertJob(job: JobDetailInterface): JobDetailCorrectInterface { diff --git a/flink-runtime-web/web-dashboard/src/app/services/metrics.service.ts b/flink-runtime-web/web-dashboard/src/app/services/metrics.service.ts index 816ae5443ae55..40462492c6099 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/metrics.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/metrics.service.ts @@ -18,7 +18,9 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; + import { BASE_URL, LONG_MIN_VALUE } from 'config'; @Injectable({ @@ -29,10 +31,11 @@ export class MetricsService { /** * Get available metric list + * * @param jobId * @param vertexId */ - getAllAvailableMetrics(jobId: string, vertexId: string) { + getAllAvailableMetrics(jobId: string, vertexId: string): Observable> { return this.httpClient .get>(`${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/metrics`) .pipe( @@ -54,11 +57,16 @@ export class MetricsService { /** * Get metric data + * * @param jobId * @param vertexId * @param listOfMetricName */ - getMetrics(jobId: string, vertexId: string, listOfMetricName: string[]) { + getMetrics( + jobId: string, + vertexId: string, + listOfMetricName: string[] + ): Observable<{ timestamp: number; values: { [p: string]: number } }> { const metricName = listOfMetricName.join(','); return this.httpClient .get>( @@ -80,11 +88,18 @@ export class MetricsService { /** * Get aggregated metric data from all subtasks of the given vertexId + * * @param jobId * @param vertexId * @param listOfMetricName + * @param aggregate */ - getAggregatedMetrics(jobId: string, vertexId: string, listOfMetricName: string[], aggregate: string = "max") { + getAggregatedMetrics( + jobId: string, + vertexId: string, + listOfMetricName: string[], + aggregate: string = 'max' + ): Observable<{ [p: string]: number }> { const metricName = listOfMetricName.join(','); return this.httpClient .get>( @@ -95,20 +110,20 @@ export class MetricsService { const result: { [id: string]: number } = {}; arr.forEach(item => { switch (aggregate) { - case "min": + case 'min': result[item.id] = +item.min; break; - case "max": + case 'max': result[item.id] = +item.max; break; - case "avg": + case 'avg': result[item.id] = +item.avg; break; - case "sum": + case 'sum': result[item.id] = +item.sum; break; default: - throw new Error("Unsupported aggregate: " + aggregate); + throw new Error(`Unsupported aggregate: ${aggregate}`); } }); return result; @@ -118,18 +133,20 @@ export class MetricsService { /** * Gets the watermarks for a given vertex id. + * * @param jobId * @param vertexId */ - getWatermarks(jobId: string, vertexId: string) { + getWatermarks( + jobId: string, + vertexId: string + ): Observable<{ lowWatermark: number; watermarks: { [p: string]: number } }> { return this.httpClient - .get>( - `${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/watermarks` - ) + .get>(`${BASE_URL}/jobs/${jobId}/vertices/${vertexId}/watermarks`) .pipe( map(arr => { let minValue = NaN; - let lowWatermark = NaN; + let lowWatermark: number; const watermarks: { [id: string]: number } = {}; arr.forEach(item => { const value = parseInt(item.value, 10); @@ -148,7 +165,7 @@ export class MetricsService { lowWatermark, watermarks }; - }) - ); + }) + ); } } diff --git a/flink-runtime-web/web-dashboard/src/app/services/overview.service.ts b/flink-runtime-web/web-dashboard/src/app/services/overview.service.ts index 4c81cfc005875..449de415391a1 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/overview.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/overview.service.ts @@ -18,9 +18,10 @@ import { HttpClient } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { EMPTY } from 'rxjs'; +import { EMPTY, Observable } from 'rxjs'; import { catchError } from 'rxjs/operators'; -import { BASE_URL } from '../app.config'; + +import { BASE_URL } from 'config'; import { OverviewInterface } from 'interfaces'; @Injectable({ @@ -32,7 +33,7 @@ export class OverviewService { /** * Get cluster overview status */ - loadOverview() { + loadOverview(): Observable { return this.httpClient.get(`${BASE_URL}/overview`).pipe(catchError(() => EMPTY)); } } diff --git a/flink-runtime-web/web-dashboard/src/app/services/status.service.ts b/flink-runtime-web/web-dashboard/src/app/services/status.service.ts index efadfa69d0e61..d4a186582fccc 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/status.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/status.service.ts @@ -21,7 +21,8 @@ import { Injectable } from '@angular/core'; import { NavigationEnd, Router } from '@angular/router'; import { EMPTY, fromEvent, interval, merge, Subject } from 'rxjs'; import { debounceTime, filter, map, mapTo, share, startWith, switchMap, tap } from 'rxjs/operators'; -import { BASE_URL } from '../app.config'; + +import { BASE_URL } from 'config'; import { ConfigurationInterface } from 'interfaces'; @Injectable({ @@ -52,13 +53,14 @@ export class StatusService { /** * Trigger force refresh */ - forceRefresh() { + forceRefresh(): void { this.forceRefresh$.next(true); } /** * Create refresh stream when APP_INITIALIZER * refresh interval stream will be regenerated when NavigationEnd || forceRefresh || visibility change + * * @param router */ boot(router: Router): Promise { @@ -71,10 +73,7 @@ export class StatusService { filter(item => item instanceof NavigationEnd), mapTo(true) ); - const interval$ = interval(this.configuration['refresh-interval']).pipe( - mapTo(true), - startWith(true) - ); + const interval$ = interval(this.configuration['refresh-interval']).pipe(mapTo(true), startWith(true)); this.refresh$ = merge(this.visibility$, this.forceRefresh$, navigationEnd$).pipe( startWith(true), debounceTime(300), diff --git a/flink-runtime-web/web-dashboard/src/app/services/task-manager.service.ts b/flink-runtime-web/web-dashboard/src/app/services/task-manager.service.ts index 7ac61c9c0187b..aba6fc9fe0def 100644 --- a/flink-runtime-web/web-dashboard/src/app/services/task-manager.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/services/task-manager.service.ts @@ -18,14 +18,16 @@ import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { EMPTY, of, ReplaySubject } from 'rxjs'; +import { EMPTY, Observable, of, ReplaySubject } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; + import { BASE_URL } from 'config'; import { TaskManagerListInterface, TaskManagerDetailInterface, TaskManagerLogInterface, - TaskManagerThreadDumpInterface + TaskManagerThreadDumpInterface, + TaskmanagersItemInterface } from 'interfaces'; @Injectable({ @@ -37,7 +39,7 @@ export class TaskManagerService { /** * Load TM list */ - loadManagers() { + loadManagers(): Observable { return this.httpClient.get(`${BASE_URL}/taskmanagers`).pipe( map(data => data.taskmanagers || []), catchError(() => of([])) @@ -46,9 +48,10 @@ export class TaskManagerService { /** * Load specify TM + * * @param taskManagerId */ - loadManager(taskManagerId: string) { + loadManager(taskManagerId: string): Observable { return this.httpClient .get(`${BASE_URL}/taskmanagers/${taskManagerId}`) .pipe(catchError(() => EMPTY)); @@ -56,9 +59,10 @@ export class TaskManagerService { /** * Load TM log list + * * @param taskManagerId */ - loadLogList(taskManagerId: string) { + loadLogList(taskManagerId: string): Observable> { return this.httpClient .get(`${BASE_URL}/taskmanagers/${taskManagerId}/logs`) .pipe(map(data => data.logs)); @@ -66,10 +70,11 @@ export class TaskManagerService { /** * Load TM log + * * @param taskManagerId * @param logName */ - loadLog(taskManagerId: string, logName: string) { + loadLog(taskManagerId: string, logName: string): Observable<{ data: string; url: string }> { const url = `${BASE_URL}/taskmanagers/${taskManagerId}/logs/${logName}`; return this.httpClient .get(url, { responseType: 'text', headers: new HttpHeaders().append('Cache-Control', 'no-cache') }) @@ -86,7 +91,7 @@ export class TaskManagerService { /** * Load TM thread dump */ - loadThreadDump(taskManagerId: string) { + loadThreadDump(taskManagerId: string): Observable { return this.httpClient .get(`${BASE_URL}/taskmanagers/${taskManagerId}/thread-dump`) .pipe( @@ -98,9 +103,10 @@ export class TaskManagerService { /** * Load TM logs + * * @param taskManagerId */ - loadLogs(taskManagerId: string) { + loadLogs(taskManagerId: string): Observable { return this.httpClient.get(`${BASE_URL}/taskmanagers/${taskManagerId}/log`, { responseType: 'text', headers: new HttpHeaders().append('Cache-Control', 'no-cache') @@ -109,9 +115,10 @@ export class TaskManagerService { /** * Load TM stdout + * * @param taskManagerId */ - loadStdout(taskManagerId: string) { + loadStdout(taskManagerId: string): Observable { return this.httpClient.get(`${BASE_URL}/taskmanagers/${taskManagerId}/stdout`, { responseType: 'text', headers: new HttpHeaders().append('Cache-Control', 'no-cache') @@ -120,10 +127,11 @@ export class TaskManagerService { /** * Get TM metric + * * @param taskManagerId * @param listOfMetricName */ - getMetrics(taskManagerId: string, listOfMetricName: string[]) { + getMetrics(taskManagerId: string, listOfMetricName: string[]): Observable<{ [p: string]: number }> { const metricName = listOfMetricName.join(','); return this.httpClient .get>(`${BASE_URL}/taskmanagers/${taskManagerId}/metrics?get=${metricName}`) diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.html b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.html index 22ed1de9cd173..e5c1754cf2b68 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.html @@ -16,38 +16,67 @@ ~ limitations under the License. --> - + - + - + - - - + [id]="link.id" + > + - - {{link?.detail?.ship_strategy}} {{link?.detail?.local_strategy}} + + {{ link?.detail?.ship_strategy }} {{ link?.detail?.local_strategy }} - + (mouseleave)="onNodeMouseLeave($event)" + > + x="-1" + y="-1" + width="2" + height="2" + > - - + diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.less b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.less index 630caa0df8105..7227fb9126de5 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.less @@ -19,16 +19,16 @@ @import "theme"; :host { + display: block; width: 100%; height: 100%; - display: block; } nz-slider { position: absolute; + top: 50%; right: 12px; height: 200px; - top: 50%; margin-top: -100px; } @@ -39,45 +39,49 @@ nz-slider { color: @text-color; fill: @text-color; } + .edge-marker-focus { color: @primary-color; fill: @primary-color; } + .edge { + fill: none; stroke: @text-color; stroke-opacity: 0.6; stroke-width: 1px; - fill: none; &.focused { stroke: @primary-color; - stroke-linecap: round; - stroke-dashoffset: 0; + animation: circle-draw 0.3s linear infinite; stroke-dasharray: 10; + stroke-dashoffset: 0; + stroke-linecap: round; stroke-opacity: 1; - animation: circle-draw .3s linear infinite; } } .link-group { .edge-label { - stroke: none; font-size: 10px; fill: @text-color; + stroke: none; } } .panning-rect { - fill: rgba(0, 0, 0, 0); cursor: move; + fill: rgba(0, 0, 0, 0); } + .nodes-chart-overlay { - pointer-events: none; opacity: 0; - -webkit-transition: opacity ease-in .45s; + pointer-events: none; fill: @component-background; + -webkit-transition: opacity ease-in 0.45s; + &.active { - -webkit-opacity: .7; + -webkit-opacity: 0.7; } } } @@ -86,6 +90,7 @@ nz-slider { 0% { stroke-dashoffset: 20; } + 100% { stroke-dashoffset: 0; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.ts b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.ts index 16b99612a6592..cba03beb5f66c 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.component.ts @@ -32,7 +32,9 @@ import { import { select } from 'd3-selection'; import { zoomIdentity } from 'd3-zoom'; -import { NodesItemCorrectInterface, NodesItemLinkInterface } from 'interfaces'; + +import { NodesItemCorrectInterface, NodesItemLinkInterface, SafeAny } from 'interfaces'; + import { LayoutNode, NzGraph } from './graph'; import { NodeComponent } from './node.component'; import { SvgContainerComponent } from './svg-container.component'; @@ -70,10 +72,11 @@ export class DagreComponent extends NzGraph { /** * Update Node detail + * * @param id * @param appendNode */ - updateNode(id: string, appendNode: NodesItemCorrectInterface) { + updateNode(id: string, appendNode: NodesItemCorrectInterface): void { const nodes = this.rectNodeComponents; const node = nodes.find(n => n.id === id); if (node) { @@ -84,31 +87,33 @@ export class DagreComponent extends NzGraph { /** * Focus on specific node + * * @param node * @param force */ - focusNode(node: NodesItemCorrectInterface, force = false) { + focusNode(node: NodesItemCorrectInterface, force = false): void { const layoutNode = this.layoutNodes.find(n => n.id === node.id); this.clickNode(layoutNode, null, force, false); } /** * Zoom to level + * * @param value */ - zoomToLevel(value: number) { + zoomToLevel(value: number): void { this.svgContainer.zoomTo(value); } /** * Move graph to center */ - moveToCenter() { + moveToCenter(): void { if (this.graph && this.graph.graph()) { this.visibility = Visibility.Visible; const hostDims = this.elementRef.nativeElement.getBoundingClientRect(); - const generatedGraph = this.graph.graph() as any; + const generatedGraph = this.graph.graph() as SafeAny; this.cacheTransform.k = Math.min( hostDims.height / (generatedGraph.height + 200), hostDims.width / (generatedGraph.width + 120), @@ -132,6 +137,7 @@ export class DagreComponent extends NzGraph { /** * Flush graph with nodes and links + * * @param nodes * @param links * @param isResizeNode @@ -167,18 +173,18 @@ export class DagreComponent extends NzGraph { }); } - trackByLink(_: number, link: NodesItemLinkInterface) { + trackByLink(_: number, link: NodesItemLinkInterface): string { return link.id; } - trackByNode(_: number, link: NodesItemCorrectInterface) { + trackByNode(_: number, link: NodesItemCorrectInterface): string { return link.id; } /** * Calculate node size */ - resetNodeSize() { + resetNodeSize(): Promise { this.graphElement.nativeElement.querySelectorAll(`.node-group`).forEach((nodeEle: HTMLElement) => { const contentEle = nodeEle.querySelector('.content-wrap'); if (contentEle) { @@ -196,6 +202,7 @@ export class DagreComponent extends NzGraph { /** * Redraw all lines + * * @param animate */ redrawLines(animate = true): void { @@ -216,9 +223,10 @@ export class DagreComponent extends NzGraph { /** * Redraw all nodes + * * @param animate */ - redrawNodes(animate = true) { + redrawNodes(animate = true): void { this.nodeElements.map(nodeEl => { const node = this.layoutNodes.find(n => n.id === nodeEl.nativeElement.id); if (node) { @@ -241,11 +249,13 @@ export class DagreComponent extends NzGraph { /** * Click specific node + * * @param node * @param $event * @param force + * @param emit */ - clickNode(node: LayoutNode | undefined, $event?: MouseEvent | null, force = false, emit = true) { + clickNode(node: LayoutNode | undefined, $event?: MouseEvent | null, force = false, emit = true): void { if ($event) { $event.stopPropagation(); } @@ -298,7 +308,7 @@ export class DagreComponent extends NzGraph { /** * Redraw graph */ - redrawGraph() { + redrawGraph(): void { this.selectedNodeId = null; this.circleNodeIds = []; this.focusedLinkIds = []; @@ -319,9 +329,10 @@ export class DagreComponent extends NzGraph { /** * Handle svg container transform event + * * @param $event */ - onTransform($event: { x: number; y: number; k: number }) { + onTransform($event: { x: number; y: number; k: number }): void { this.cd.detectChanges(); this.cacheTransform.x = $event.x; this.cacheTransform.y = $event.y; @@ -331,9 +342,10 @@ export class DagreComponent extends NzGraph { /** * Mouse enter node event + * * @param $event */ - onNodeMouseEnter($event: MouseEvent) { + onNodeMouseEnter($event: MouseEvent): void { this.graphElement.nativeElement.appendChild($event.target); this.layoutLinks.forEach(l => { if (l.id.split('-').indexOf(($event.target as HTMLElement).id) !== -1) { @@ -346,7 +358,7 @@ export class DagreComponent extends NzGraph { /** * Mouse leave node event */ - onNodeMouseLeave() { + onNodeMouseLeave(): void { this.layoutLinks.forEach(l => { l.options.focused = this.focusedLinkIds.indexOf(l.id) !== -1; }); diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.module.ts b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.module.ts index 165d647147e66..1d5a69784dab9 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/dagre.module.ts @@ -16,13 +16,15 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; -import { NodeComponent } from './node.component'; + +import { NzSliderModule } from 'ng-zorro-antd/slider'; + import { DagreComponent } from './dagre.component'; +import { NodeComponent } from './node.component'; import { SvgContainerComponent } from './svg-container.component'; -import { NzSliderModule } from 'ng-zorro-antd/slider'; @NgModule({ imports: [CommonModule, FormsModule, NzSliderModule], diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/graph.ts b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/graph.ts index 8b5dcc7a7705b..a008738ae290a 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/graph.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/graph.ts @@ -19,7 +19,9 @@ import { curveLinear, line } from 'd3'; import * as dagre from 'dagre'; import { GraphEdge, graphlib } from 'dagre'; -import { NodesItemCorrectInterface, NodesItemLinkInterface } from 'interfaces'; + +import { NodesItemCorrectInterface, NodesItemLinkInterface, SafeAny } from 'interfaces'; + import Graph = graphlib.Graph; export interface LayoutNode extends NodesItemCorrectInterface { @@ -39,9 +41,9 @@ export interface LayoutNodeOptions { } export interface LayoutLink extends NodesItemLinkInterface { - [key: string]: any; + [key: string]: SafeAny; - detail: any; + detail: SafeAny; options: LayoutLinkOptions; points: Array<{ x: number; y: number }>; } @@ -86,34 +88,37 @@ export class NzGraph { /** * Create graph + * * @param opt */ - createGraph(opt: CreateGraphOpt = {}) { + createGraph(opt: CreateGraphOpt = {}): void { this.graph = new dagre.graphlib.Graph(opt); this.graph.setGraph({ rankdir: 'LR', ...this.config - } as any); + } as SafeAny); this.graph.setDefaultEdgeLabel(() => ({})); } /** * Set nodes for graph + * * @param nodes */ - setNodes(nodes: NodesItemCorrectInterface[]) { + setNodes(nodes: NodesItemCorrectInterface[]): void { nodes.forEach(n => { n.width = n.width || 48; n.height = n.height || 48; - this.graph.setNode(n.id, n as any); + this.graph.setNode(n.id, n as SafeAny); }); } /** * Set links for graph + * * @param links */ - setEdge(links: NodesItemLinkInterface[]) { + setEdge(links: NodesItemLinkInterface[]): void { links.forEach(l => { let length = 0; if (l.local_strategy) { @@ -123,14 +128,14 @@ export class NzGraph { length += l.ship_strategy.length; } l.width = (length || 1) * 3; - this.graph.setEdge(l.source, l.target, l as any); + this.graph.setEdge(l.source, l.target, l as SafeAny); }); } /** * Init graph layout */ - initLayout() { + initLayout(): Promise { if (!this.graph) { return Promise.reject(); } @@ -141,7 +146,7 @@ export class NzGraph { this.copyLayoutLinks = []; dagre.layout(this.graph); - const generatedGraph = this.graph.graph() as any; + const generatedGraph = this.graph.graph() as SafeAny; if (generatedGraph.width < generatedGraph.height) { this.graph.setGraph({ rankdir: 'TB', @@ -156,7 +161,7 @@ export class NzGraph { } this.graph.nodes().forEach(id => { - const node: LayoutNode = this.graph.node(id) as any; + const node: LayoutNode = this.graph.node(id) as SafeAny; const transform = `translate(${node.x - node.width / 2 || 0}, ${node.y - 1 / 2 || 0})`; node.options = { transform, @@ -171,7 +176,7 @@ export class NzGraph { }); this.graph.edges().forEach(e => { - const edge = this.graph.edge(e) as (LayoutLink & GraphEdge); + const edge = this.graph.edge(e) as LayoutLink & GraphEdge; const initLine = this.generateLine(edge.points) as string; const link: LayoutLink = { id: edge.id, @@ -197,9 +202,10 @@ export class NzGraph { /** * Calculate text base line + * * @param edge */ - getDominantBaseline(edge: GraphEdge) { + getDominantBaseline(edge: GraphEdge): string { const firstPoint = edge.points[0]; const lastPoint = edge.points[edge.points.length - 1]; return lastPoint.x < firstPoint.x ? 'rtl' : 'ltr'; @@ -207,9 +213,10 @@ export class NzGraph { /** * Zoom when focus on some node + * * @param opt */ - zoomFocusLayout(opt: ZoomFocusLayoutOpt) { + zoomFocusLayout(opt: ZoomFocusLayoutOpt): Promise { if (!this.graph.hasNode(opt.nodeId)) { console.warn(`node ${opt.nodeId} not exist`); return Promise.reject(); @@ -257,7 +264,7 @@ export class NzGraph { /** * Recover layout position */ - recoveryLayout() { + recoveryLayout(): Promise { this.layoutNodes.forEach(node => { const oNode = this.copyLayoutNodes.find(n => n.id === node.id); if (oNode) { @@ -286,17 +293,24 @@ export class NzGraph { /** * Get circle node from selected node + * * @param selectedNode */ - circleNodes(selectedNode: LayoutNode) { + circleNodes(selectedNode: LayoutNode): LayoutNode[] { const nodes = []; for (const link of this.layoutLinks) { if (link.target === selectedNode.id) { - nodes.push(this.layoutNodes.find(n => n.id === link.source)); + const node = this.layoutNodes.find(n => n.id === link.source); + if (node) { + nodes.push(node); + } } if (link.source === selectedNode.id) { - nodes.push(this.layoutNodes.find(n => n.id === link.target)); + const node = this.layoutNodes.find(n => n.id === link.target); + if (node) { + nodes.push(node); + } } } return nodes; @@ -304,13 +318,14 @@ export class NzGraph { /** * Generate Line from points + * * @param points */ generateLine(points: Array<{ x: number; y: number }>): string | null { - const transformPoints = points as any; + const transformPoints = points as SafeAny; const lineFunction = line() - .x((d: any) => d.x) - .y((d: any) => d.y) + .x((d: SafeAny) => d.x) + .y((d: SafeAny) => d.y) .curve(curveLinear); return lineFunction(transformPoints); } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.html b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.html index 9b5552df7924b..6add6d60ea652 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.html @@ -17,27 +17,37 @@ --> - - -

- {{operator}} - {{description}} - Parallelism: {{parallelism}} - - Backpressured (max): {{prettyPrint(backPressuredPercentage)}} - - - Busy (max): {{prettyPrint(busyPercentage)}} - - - Low Watermark: {{lowWatermark}} - - - Operation: {{operatorStrategy}} - -

+ + +

+ {{ operator }} + {{ description }} + Parallelism: {{ parallelism }} + + Backpressured (max): {{ prettyPrint(backPressuredPercentage) }} - + + Busy (max): {{ prettyPrint(busyPercentage) }} + + + Low Watermark: {{ lowWatermark }} + + + Operation: {{ operatorStrategy }} + +

+
+
diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.less b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.less index 16986064ba1de..b9cb15172f976 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.less @@ -23,45 +23,46 @@ .node-label-wrapper { display: inline-block; vertical-align: top; - cursor: pointer; - pointer-events: all; - font-size: 12px; width: 100%; height: 100%; - line-height: 1.2; - border-radius: 0; padding: 15px; + border-width: 1px; + border-style: solid; + border-radius: 0; color: @text-color; + font-size: 12px; + line-height: 1.2; text-align: left; word-break: break-all; - border-width: 1px; - border-style: solid; + cursor: pointer; + pointer-events: all; .content-wrap { font-size: 12px; } .node-label { - text-align: center; width: 100%; margin-bottom: 12px; font-weight: bold; + text-align: center; &:first-child { margin-top: 24px; } &.metric { - font-weight: normal;; - font-weight: 12px; margin-bottom: 2px; color: @text-color-secondary; + font-weight: normal; + font-size: 12px; } } .detail { margin-bottom: 2px; color: @text-color; + &.description { color: @heading-color; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.ts b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.ts index b95b0c2a2ec81..41124ef9c0304 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/node.component.ts @@ -17,6 +17,7 @@ */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input } from '@angular/core'; + import { NodesItemCorrectInterface } from 'interfaces'; @Component({ @@ -46,7 +47,7 @@ export class NodeComponent { decodeHTML(value: string): string | null { const parser = new DOMParser(); - const dom = parser.parseFromString('' + value, 'text/html'); + const dom = parser.parseFromString(`${value}`, 'text/html'); return dom.body.textContent; } @@ -58,25 +59,25 @@ export class NodeComponent { this.parallelism = value.parallelism; this.lowWatermark = value.lowWatermark; if (this.isValid(value.backPressuredPercentage)) { - this.backPressuredPercentage = value.backPressuredPercentage + this.backPressuredPercentage = value.backPressuredPercentage; } if (this.isValid(value.busyPercentage)) { - this.busyPercentage = value.busyPercentage; + this.busyPercentage = value.busyPercentage; } this.height = value.height || 0; this.id = value.id; if (description && description.length > 300) { - this.description = description.slice(0, 300) + '...'; + this.description = `${description.slice(0, 300)}...`; } else { this.description = description; } } - isValid = (value?: number) => { - return value || value === 0 || value === NaN; - } + isValid = (value?: number): boolean => { + return !!value || value === 0 || value === NaN; + }; - toRGBA = (d: string) => { + toRGBA = (d: string): number[] => { const l = d.length; const rgba = []; const hex = parseInt(d.slice(1), 16); @@ -87,7 +88,7 @@ export class NodeComponent { return rgba; }; - blend = (from: string, to: string, p = 0.5) => { + blend = (from: string, to: string, p = 0.5): string => { from = from.trim(); to = to.trim(); const b = p < 0; @@ -95,33 +96,40 @@ export class NodeComponent { const f = this.toRGBA(from); const t = this.toRGBA(to); if (to[0] === 'r') { - return 'rgb' + (to[3] === 'a' ? 'a(' : '(') + - Math.round(((t[0] - f[0]) * p) + f[0]) + ',' + - Math.round(((t[1] - f[1]) * p) + f[1]) + ',' + - Math.round(((t[2] - f[2]) * p) + f[2]) + ( - f[3] < 0 && t[3] < 0 ? '' : ',' + ( - f[3] > -1 && t[3] > -1 - ? Math.round((((t[3] - f[3]) * p) + f[3]) * 10000) / 10000 - : t[3] < 0 ? f[3] : t[3] - ) - ) + ')'; + return `rgb${to[3] === 'a' ? 'a(' : '('}${Math.round((t[0] - f[0]) * p + f[0])},${Math.round( + (t[1] - f[1]) * p + f[1] + )},${Math.round((t[2] - f[2]) * p + f[2])}${ + f[3] < 0 && t[3] < 0 + ? '' + : `,${ + f[3] > -1 && t[3] > -1 ? Math.round(((t[3] - f[3]) * p + f[3]) * 10000) / 10000 : t[3] < 0 ? f[3] : t[3] + }` + })`; } - return '#' + (0x100000000 + (( - f[3] > -1 && t[3] > -1 - ? Math.round((((t[3] - f[3]) * p) + f[3]) * 255) - : t[3] > -1 ? Math.round(t[3] * 255) : f[3] > -1 ? Math.round(f[3] * 255) : 255 - ) * 0x1000000) + - (Math.round(((t[0] - f[0]) * p) + f[0]) * 0x10000) + - (Math.round(((t[1] - f[1]) * p) + f[1]) * 0x100) + - Math.round(((t[2] - f[2]) * p) + f[2]) - ).toString(16).slice(f[3] > -1 || t[3] > -1 ? 1 : 3); + return `#${( + 0x100000000 + + (f[3] > -1 && t[3] > -1 + ? Math.round(((t[3] - f[3]) * p + f[3]) * 255) + : t[3] > -1 + ? Math.round(t[3] * 255) + : f[3] > -1 + ? Math.round(f[3] * 255) + : 255) * + 0x1000000 + + Math.round((t[0] - f[0]) * p + f[0]) * 0x10000 + + Math.round((t[1] - f[1]) * p + f[1]) * 0x100 + + Math.round((t[2] - f[2]) * p + f[2]) + ) + .toString(16) + .slice(f[3] > -1 || t[3] > -1 ? 1 : 3)}`; }; constructor(protected cd: ChangeDetectorRef) {} /** * Update and check node component + * * @param node */ update(node: NodesItemCorrectInterface): void { @@ -129,22 +137,29 @@ export class NodeComponent { this.backgroundColor = this.backgroundDefaultColor; this.borderColor = this.borderDefaultColor; if (node.busyPercentage) { - this.backgroundColor = this.blend(this.backgroundColor, this.backgroundBusyColor, node.busyPercentage / 100.0 ); + this.backgroundColor = this.blend(this.backgroundColor, this.backgroundBusyColor, node.busyPercentage / 100.0); this.borderColor = this.blend(this.borderColor, this.borderBusyColor, node.busyPercentage / 100.0); } if (node.backPressuredPercentage) { - this.backgroundColor = this.blend(this.backgroundColor, this.backgroundBackPressuredColor, node.backPressuredPercentage / 100.0); - this.borderColor = this.blend(this.borderColor, this.borderBackPressuredColor, node.backPressuredPercentage / 100.0); + this.backgroundColor = this.blend( + this.backgroundColor, + this.backgroundBackPressuredColor, + node.backPressuredPercentage / 100.0 + ); + this.borderColor = this.blend( + this.borderColor, + this.borderBackPressuredColor, + node.backPressuredPercentage / 100.0 + ); } this.cd.markForCheck(); } prettyPrint(value: number | undefined): string { if (value === undefined || isNaN(value)) { - return "N/A" - } - else { - return value + "%"; + return 'N/A'; + } else { + return `${value}%`; } } } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.html b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.html index 60c0e3aae9286..8ba2e0847481e 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.html @@ -18,7 +18,13 @@
- + diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.less b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.less index 263709a83ba32..cab62ca2f8162 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.less @@ -17,21 +17,23 @@ */ :host { - display: block; position: relative; - height: 100%; + display: block; width: 100%; + height: 100%; } .svg-container { - display: block; position: relative; - height: 100%; + display: block; width: 100%; + height: 100%; + .svg-inner { position: absolute; top: 0; left: 0; + .background { cursor: move; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.ts b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.ts index 137dfd44cf9f4..7f46dc5b6e08b 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/dagre/svg-container.component.ts @@ -27,9 +27,12 @@ import { Output, ViewChild } from '@angular/core'; + +import * as d3 from 'd3'; import { select, Selection } from 'd3-selection'; import { zoom, ZoomBehavior } from 'd3-zoom'; -import * as d3 from 'd3'; + +import { SafeAny } from 'interfaces'; @Component({ selector: 'flink-svg-container', @@ -43,8 +46,8 @@ export class SvgContainerComponent implements OnInit, AfterContentInit { height: number; transform = 'translate(0, 0) scale(1)'; containerTransform = { x: 0, y: 0, k: 1 }; - svgSelect: Selection; - zoomController: ZoomBehavior; + svgSelect: Selection; + zoomController: ZoomBehavior; @ViewChild('svgContainer', { static: true }) svgContainer: ElementRef; @ViewChild('svgInner', { static: true }) svgInner: ElementRef; @Input() nzMaxZoom = 5; @@ -55,9 +58,10 @@ export class SvgContainerComponent implements OnInit, AfterContentInit { /** * Zoom to spec level + * * @param zoomLevel */ - zoomTo(zoomLevel: number) { + zoomTo(zoomLevel: number): void { this.svgSelect .transition() .duration(0) @@ -66,10 +70,11 @@ export class SvgContainerComponent implements OnInit, AfterContentInit { /** * Set transform position + * * @param transform * @param animate */ - setPositionByTransform(transform: { x: number; y: number; k: number }, animate = false) { + setPositionByTransform(transform: { x: number; y: number; k: number }, animate = false): void { this.svgSelect .transition() .duration(animate ? 500 : 0) @@ -78,7 +83,7 @@ export class SvgContainerComponent implements OnInit, AfterContentInit { constructor(private el: ElementRef) {} - ngOnInit() { + ngOnInit(): void { this.svgSelect = select(this.svgContainer.nativeElement); this.zoomController = zoom() .scaleExtent([this.nzMinZoom, this.nzMaxZoom]) @@ -86,17 +91,15 @@ export class SvgContainerComponent implements OnInit, AfterContentInit { this.containerTransform = d3.event.transform; this.zoom = this.containerTransform.k; if (!isNaN(this.containerTransform.x)) { - this.transform = `translate(${this.containerTransform.x} ,${this.containerTransform.y})scale(${ - this.containerTransform.k - })`; + this.transform = `translate(${this.containerTransform.x} ,${this.containerTransform.y})scale(${this.containerTransform.k})`; } this.zoomEvent.emit(this.zoom); - this.transformEvent.emit(this.containerTransform as any); + this.transformEvent.emit(this.containerTransform as SafeAny); }); this.svgSelect.call(this.zoomController).on('wheel.zoom', null); } - ngAfterContentInit() { + ngAfterContentInit(): void { const hostElem = this.el.nativeElement; if (hostElem.parentNode !== null) { const dims = hostElem.parentNode.getBoundingClientRect(); diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/file-read/file-read.directive.ts b/flink-runtime-web/web-dashboard/src/app/share/common/file-read/file-read.directive.ts index 5d0540a7c9f0c..79760e39fdec9 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/file-read/file-read.directive.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/file-read/file-read.directive.ts @@ -25,7 +25,7 @@ export class FileReadDirective { @Output() fileRead = new EventEmitter(); @HostListener('change', ['$event']) - onChange(changeEvent: Event) { + onChange(changeEvent: Event): void { const target = changeEvent.target as HTMLInputElement; this.fileRead.emit(target!.files![0]); } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.less b/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.less index 97c48a63981cf..98453475f434d 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.less @@ -17,9 +17,9 @@ */ :host { - display: block; position: relative; + display: block; + overflow: hidden; width: 100%; height: 100%; - overflow: hidden; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.ts b/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.ts index e25ed170b92bf..570fe687e75b4 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.component.ts @@ -21,7 +21,11 @@ import { AfterViewInit, Component, ElementRef, ChangeDetectionStrategy, Input, OnDestroy } from '@angular/core'; import { fromEvent, merge, Subject } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; + import { MonacoEditorService } from 'share/common/monaco-editor/monaco-editor.service'; + +import { SafeAny } from 'interfaces'; + import IStandaloneCodeEditor = monaco.editor.IStandaloneCodeEditor; @Component({ @@ -43,11 +47,11 @@ export class MonacoEditorComponent implements AfterViewInit, OnDestroy { } } - get value() { + get value(): string { return this.innerValue; } - setupMonaco() { + setupMonaco(): void { const hostElement = this.elementRef.nativeElement; this.editor = monaco.editor.create(hostElement, { scrollBeyondLastLine: false, @@ -64,7 +68,7 @@ export class MonacoEditorComponent implements AfterViewInit, OnDestroy { } } - layout() { + layout(): void { if (this.editor) { this.editor.layout(); } @@ -72,8 +76,8 @@ export class MonacoEditorComponent implements AfterViewInit, OnDestroy { constructor(private elementRef: ElementRef, private monacoEditorService: MonacoEditorService) {} - ngAfterViewInit() { - if ((window as any).monaco) { + ngAfterViewInit(): void { + if ((window as SafeAny).monaco) { // TODO: temporary solution, the editor should render depending on its own dimension setTimeout(() => this.setupMonaco()); } else { @@ -81,10 +85,10 @@ export class MonacoEditorComponent implements AfterViewInit, OnDestroy { script.type = 'text/javascript'; script.src = 'libs/vs/loader.js'; script.onload = () => { - const onGotAmdLoader = () => { + const onGotAmdLoader = (): void => { // Load monaco - (window as any).require.config({ paths: { vs: 'libs/vs' } }); - (window as any).require(['vs/editor/editor.main'], () => { + (window as SafeAny).require.config({ paths: { vs: 'libs/vs' } }); + (window as SafeAny).require(['vs/editor/editor.main'], () => { setTimeout(() => this.setupMonaco()); }); }; @@ -100,9 +104,9 @@ export class MonacoEditorComponent implements AfterViewInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); - this.editor.dispose(); + this.editor?.dispose(); } } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.service.ts b/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.service.ts index 302c1f32feb4e..79d3f1468f825 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/monaco-editor/monaco-editor.service.ts @@ -28,7 +28,7 @@ export class MonacoEditorService { /** * Recalculate monaco editor layout manually */ - layout() { + layout(): void { this.layout$.next(); } } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.html b/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.html index 6fd59bd73a9cb..55f933106ed74 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.html @@ -17,5 +17,9 @@ --> - + diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.ts b/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.ts index 5c4af6e4c5d01..ebeb10d8cdf67 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/navigation/navigation.component.ts @@ -33,13 +33,13 @@ export class NavigationComponent implements OnInit, OnDestroy { navIndex = 0; destroy$ = new Subject(); - navigateTo(path: string) { + navigateTo(path: string): void { this.router.navigate([path], { relativeTo: this.activatedRoute }).then(); } constructor(private activatedRoute: ActivatedRoute, private router: Router, private cdr: ChangeDetectorRef) {} - ngOnInit() { + ngOnInit(): void { this.router.events .pipe( filter(e => e instanceof NavigationEnd), @@ -55,7 +55,7 @@ export class NavigationComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.html b/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.html index 4f54f3ff46ca5..30f3214713b6e 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.html @@ -16,12 +16,20 @@ ~ limitations under the License. --> -
-
+ (mousedown)="startMove()" +> +
+ +
diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.less b/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.less index b9518b2a86ae0..4ac73ea14fa4b 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.less @@ -23,43 +23,47 @@ top: 0; left: 0; z-index: 10; + background: transparent; + &.vertical { - border-left: 1px solid @border-color-split; width: 7px; height: 100%; + border-left: 1px solid @border-color-split; cursor: col-resize; } + &.horizontal { width: 100%; height: 7px; - transform: translateY(-3.5px); cursor: row-resize; + transform: translateY(-3.5px); } - background: transparent; } .resize-handle { - pointer-events: none; position: relative; + top: -2px; left: 50%; - margin-right: 15px; width: 30px; height: 10px; - line-height: 10px; - text-align: center; - background: #fbfbfb; - top: -2px; + margin-right: 15px; border: 1px solid #e8e8e8; border-radius: 2px; + background: #fbfbfb; + line-height: 10px; + text-align: center; + pointer-events: none; + &.vertical { - transform: rotate(90deg); - transform-origin: left top; top: 50%; - margin-top: -15px; left: auto; + margin-top: -15px; margin-right: auto; margin-left: 5px; + transform: rotate(90deg); + transform-origin: left top; } + i { position: relative; top: -2px; diff --git a/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.ts b/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.ts index c62a6c0ea6b88..73b6250e56cf9 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/common/resize/resize.component.ts @@ -31,6 +31,8 @@ import { } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; + +import { SafeAny } from 'interfaces'; import { isNil } from 'utils'; export enum ResizeModeEnums { @@ -59,16 +61,17 @@ export class ResizeComponent implements OnInit, OnDestroy { @Output() resizeEnd = new EventEmitter<{ left: number; top: number }>(); @ViewChild('trigger', { static: true }) trigger: ElementRef; - startMove() { + startMove(): void { this.isMoving = true; } /** * Get recursive top + * * @param e */ getResizeTop(e: MouseEvent): number { - const getOffsetTop = (elem: HTMLElement | null) => { + const getOffsetTop = (elem: HTMLElement | null): number => { let innerOffsetTop = 0; do { if (!isNil(elem!.offsetTop)) { @@ -91,10 +94,11 @@ export class ResizeComponent implements OnInit, OnDestroy { /** * Get recursive left + * * @param e */ getResizeLeft(e: MouseEvent): number { - const getOffsetLeft = (elem: HTMLElement | null) => { + const getOffsetLeft = (elem: HTMLElement | null): number => { let innerOffsetLeft = 0; do { if (!isNil(elem!.offsetLeft)) { @@ -115,7 +119,7 @@ export class ResizeComponent implements OnInit, OnDestroy { return newLeft; } - constructor(@Inject(DOCUMENT) private document: any) {} + constructor(@Inject(DOCUMENT) private document: SafeAny) {} ngOnInit(): void { fromEvent(this.document, 'mouseup') diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.html b/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.html index 4b7fac66e1a70..8826d152394e0 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.html @@ -17,7 +17,7 @@ -->
- - {{ (state|uppercase) || '-'}} + + {{ (state | uppercase) || '-' }}
diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.less b/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.less index 0f3821537d4f4..38e7059d79cf4 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.less @@ -18,12 +18,12 @@ @import "theme"; span { + margin-left: 6px; + padding: 1px 6px; + color: #fff; font-weight: 500; text-align: center; - color: #fff; - padding: 1px 6px; cursor: default; - margin-left: 6px; } .background { diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.ts index 970dafb8acc2d..7418a936ca494 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/backpressure-badge/backpressure-badge.component.ts @@ -18,6 +18,8 @@ import { Component, ChangeDetectionStrategy, Input } from '@angular/core'; +import { SafeAny } from 'interfaces'; + @Component({ selector: 'flink-backpressure-badge', templateUrl: './backpressure-badge.component.html', @@ -25,8 +27,8 @@ import { Component, ChangeDetectionStrategy, Input } from '@angular/core'; changeDetection: ChangeDetectionStrategy.OnPush }) export class BackpressureBadgeComponent { - @Input() state: any; - colorMap: any = { + @Input() state: SafeAny; + colorMap: SafeAny = { 'in-progress': '#f5222d', ok: '#52c41a', low: '#faad14', diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.less b/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.less index a64eca3ef2e6d..95f669ee66c89 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.less @@ -17,10 +17,10 @@ */ span { - font-weight: 700; - text-align: center; - color: #fff; width: 30px; padding: 3px 5px; + color: #fff; + font-weight: 700; + text-align: center; cursor: default; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.ts index ec0c3f83c26ff..44be7754ccf69 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/checkpoint-badge/checkpoint-badge.component.ts @@ -17,7 +17,9 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + import { COLOR_MAP } from 'config'; +import { SafeAny } from 'interfaces'; @Component({ selector: 'flink-checkpoint-badge', @@ -26,9 +28,9 @@ import { COLOR_MAP } from 'config'; changeDetection: ChangeDetectionStrategy.OnPush }) export class CheckpointBadgeComponent { - @Input() state: any; + @Input() state: SafeAny; - get colorMap(): any { + get colorMap(): SafeAny { return COLOR_MAP; } } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.html b/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.html index 43da3db20a88a..723060aaa4844 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.html @@ -17,7 +17,6 @@ -->
-
-
+
{{ draw() }}
diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.ts index 4741a27c2c7a6..97b8abaf48495 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/flame-graph/flame-graph.component.ts @@ -17,14 +17,15 @@ */ import { Component, ChangeDetectionStrategy, ElementRef, Input, ViewChild } from '@angular/core'; -import { JobFlameGraphNodeInterface } from 'interfaces'; -import { select } from 'd3-selection'; -import { format } from 'd3-format'; -import { flamegraph, offCpuColorMapper } from 'd3-flame-graph'; import * as _d3 from 'd3'; +import { flamegraph, offCpuColorMapper } from 'd3-flame-graph'; +import { format } from 'd3-format'; +import { select } from 'd3-selection'; import _d3Tip from 'd3-tip'; +import { JobFlameGraphNodeInterface } from 'interfaces'; + @Component({ selector: 'flink-flame-graph', templateUrl: './flame-graph.component.html', @@ -34,22 +35,22 @@ import _d3Tip from 'd3-tip'; export class FlameGraphComponent { @ViewChild('flameGraphContainer', { static: true }) flameGraphContainer: ElementRef; @Input() data: JobFlameGraphNodeInterface; - @Input() graphType: String; + @Input() graphType: string; - draw() { + draw(): void { if (this.data) { const element = this.flameGraphContainer.nativeElement; const chart = flamegraph().width(element.clientWidth); const d3 = { ..._d3, tip: _d3Tip }; - var tip = d3 + const tip = d3 .tip() .direction('s') .offset([8, 0]) .attr('class', 'd3-flame-graph-tip') .html(function(d: { data: { name: string; value: string }; x1: number; x0: number }) { - return d.data.name + ' (' + format('.3f')(100 * (d.x1 - d.x0)) + '%, ' + d.data.value + ' samples)'; + return `${d.data.name} (${format('.3f')(100 * (d.x1 - d.x0))}%, ${d.data.value} samples)`; }); chart.tooltip(tip); diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.less b/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.less index a64eca3ef2e6d..95f669ee66c89 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.less @@ -17,10 +17,10 @@ */ span { - font-weight: 700; - text-align: center; - color: #fff; width: 30px; padding: 3px 5px; + color: #fff; + font-weight: 700; + text-align: center; cursor: default; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.ts index 217c792f9da8b..49992cb25d0c8 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-badge/job-badge.component.ts @@ -17,6 +17,7 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + import { COLOR_MAP } from 'config'; @Component({ @@ -28,7 +29,7 @@ import { COLOR_MAP } from 'config'; export class JobBadgeComponent { @Input() state: string; - backgroundColor(state: string) { + backgroundColor(state: string): string { // @ts-ignore return COLOR_MAP[state]; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.html b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.html index 598d571707067..bcc8478a1ee39 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.html @@ -18,22 +18,46 @@
-
{{title}}
+
{{ title }}
- - + + - +
-
{{latestValue | humanizeChartNumeric:title}}
+
+ {{ latestValue | humanizeChartNumeric: title }} +
- - + +
diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.less b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.less index 3f204a34895a7..d86654d721845 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.less @@ -18,10 +18,10 @@ @import "theme"; :host { - padding: 12px; - margin-bottom: 12px; float: left; width: 33.33%; + margin-bottom: 12px; + padding: 12px; &.big { width: 100%; @@ -38,33 +38,33 @@ } .title { - padding: 12px; position: relative; + padding: 12px; border-bottom: 1px solid @border-color-split; } .text { - font-size: 12px; - line-height: 24px; overflow: hidden; max-width: calc(~"100% - 128px"); + font-size: 12px; + line-height: 24px; text-overflow: ellipsis; } .operate { - display: flex; - align-items: center; position: absolute; top: 12px; right: 12px; + display: flex; + align-items: center; } .content { padding: 12px; .numeric { - line-height: 150px; font-size: 32px; + line-height: 150px; text-align: center; } } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.ts index 56e176b799093..ce802e1e9863d 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.component.ts @@ -31,10 +31,11 @@ import { Output, ViewChild } from '@angular/core'; -import { Chart } from '@antv/g2'; -import * as G2 from '@antv/g2'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; + +import { Chart } from '@antv/g2'; +import * as G2 from '@antv/g2'; import { JobChartService } from 'share/customize/job-chart/job-chart.service'; @Component({ @@ -55,11 +56,11 @@ export class JobChartComponent implements AfterViewInit, OnDestroy { destroy$ = new Subject(); @HostBinding('class.big') - get isBig() { + get isBig(): boolean { return this.size === 'big'; } - refresh(res: { timestamp: number; values: { [id: string]: number } }) { + refresh(res: { timestamp: number; values: { [id: string]: number } }): void { this.latestValue = res.values[this.title]; if (this.displayMode === 'numeric') { this.cdr.detectChanges(); @@ -78,24 +79,24 @@ export class JobChartComponent implements AfterViewInit, OnDestroy { } } - setMode(mode: 'chart' | 'numeric') { + setMode(mode: 'chart' | 'numeric'): void { this.displayMode = mode; this.cdr.detectChanges(); } - resize(size: string) { + resize(size: string): void { this.size = size; this.cdr.detectChanges(); setTimeout(() => this.chartInstance.forceFit()); } - close() { + close(): void { this.closed.emit(this.title); } constructor(private cdr: ChangeDetectorRef, private jobChartService: JobChartService) {} - ngAfterViewInit() { + ngAfterViewInit(): void { this.cdr.detach(); G2.track(false); this.chartInstance = new G2.Chart({ @@ -137,7 +138,7 @@ export class JobChartComponent implements AfterViewInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); if (this.chartInstance) { diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.service.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.service.ts index c406b1531693e..09382a779db2f 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.service.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-chart/job-chart.service.ts @@ -22,7 +22,7 @@ import { Subject } from 'rxjs'; @Injectable({ providedIn: 'root' }) export class JobChartService { resize$ = new Subject(); - resize() { + resize(): void { this.resize$.next(); } } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.html b/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.html index 3743b499921fc..9ec86d62e756e 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.html @@ -36,11 +36,15 @@ - + {{ job.name }} - {{ job["start-time"] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ job['start-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} {{ job.duration | humanizeDuration }} - {{ job["end-time"] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} + {{ job['end-time'] | humanizeDate: 'yyyy-MM-dd HH:mm:ss' }} diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.ts index 0700492af43de..f97d76502c9e9 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/job-list/job-list.component.ts @@ -18,12 +18,14 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; -import { JobsItemInterface } from 'interfaces'; import { Observable, Subject } from 'rxjs'; import { flatMap, takeUntil } from 'rxjs/operators'; + +import { NzMessageService } from 'ng-zorro-antd/message'; + +import { JobsItemInterface } from 'interfaces'; import { JobService, StatusService } from 'services'; import { isNil } from 'utils'; -import { NzMessageService } from 'ng-zorro-antd/message'; @Component({ selector: 'flink-job-list', @@ -41,16 +43,16 @@ export class JobListComponent implements OnInit, OnDestroy { @Input() title: string; @Input() jobData$: Observable; - sortStartTimeFn = (pre: JobsItemInterface, next: JobsItemInterface) => pre['start-time'] - next['start-time']; - sortDurationFn = (pre: JobsItemInterface, next: JobsItemInterface) => pre.duration - next.duration; - sortEndTimeFn = (pre: JobsItemInterface, next: JobsItemInterface) => pre['end-time'] - next['end-time']; - sortStateFn = (pre: JobsItemInterface, next: JobsItemInterface) => pre.state.localeCompare(next.state); + sortStartTimeFn = (pre: JobsItemInterface, next: JobsItemInterface): number => pre['start-time'] - next['start-time']; + sortDurationFn = (pre: JobsItemInterface, next: JobsItemInterface): number => pre.duration - next.duration; + sortEndTimeFn = (pre: JobsItemInterface, next: JobsItemInterface): number => pre['end-time'] - next['end-time']; + sortStateFn = (pre: JobsItemInterface, next: JobsItemInterface): number => pre.state.localeCompare(next.state); - trackJobBy(_: number, node: JobsItemInterface) { + trackJobBy(_: number, node: JobsItemInterface): string { return node.jid; } - navigateToJob(job: JobsItemInterface) { + navigateToJob(job: JobsItemInterface): void { if (job.state === 'INITIALIZING') { this.nzMessageService.info('Job detail page is not available while it is in state INITIALIZING.'); } else { @@ -67,7 +69,7 @@ export class JobListComponent implements OnInit, OnDestroy { private router: Router ) {} - ngOnInit() { + ngOnInit(): void { if (this.activatedRoute.snapshot.data) { this.completed = isNil(this.activatedRoute.snapshot.data.completed) ? this.completed @@ -89,7 +91,7 @@ export class JobListComponent implements OnInit, OnDestroy { }); } - ngOnDestroy() { + ngOnDestroy(): void { this.destroy$.next(); this.destroy$.complete(); } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.html b/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.html index 26e77db6ebba2..e520450570009 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.html @@ -16,26 +16,35 @@ ~ limitations under the License. --> - - + + + - Loading... + Loading... - Reload + + + Reload + - Download + + + Download + - - Exit FullScreen + + + Exit FullScreen - FullScreen + + FullScreen diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.ts index 506ae7e223866..dc881c90b9746 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/refresh-download/refresh-download.component.ts @@ -33,7 +33,7 @@ export class RefreshDownloadComponent { @Output() fullScreen = new EventEmitter(); isFullScreen = false; - toggleFullScreen() { + toggleFullScreen(): void { this.isFullScreen = !this.isFullScreen; this.fullScreen.emit(this.isFullScreen); } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.html b/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.html index 76980ac456a2c..f559fe50571da 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.html +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.html @@ -18,6 +18,13 @@
- {{ tasks[status] }} + + {{ tasks[status] }} +
diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.less b/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.less index 1fa01e9dd7cad..bcc836b91c170 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.less +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.less @@ -17,10 +17,10 @@ */ span { - font-weight: 700; - text-align: center; - color: #fff; min-width: 32px; padding: 3px 5px; + color: #fff; + font-weight: 700; + text-align: center; cursor: default; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.ts b/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.ts index 920803cb73394..2d41fc04e92c1 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/customize/task-badge/task-badge.component.ts @@ -17,6 +17,7 @@ */ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; + import { COLOR_MAP } from 'config'; import { TaskStatusInterface } from 'interfaces'; @@ -30,6 +31,7 @@ export class TaskBadgeComponent { @Input() tasks: TaskStatusInterface; statusList = Object.keys(COLOR_MAP); + // eslint-disable-next-line @typescript-eslint/explicit-function-return-type get colorMap() { return COLOR_MAP; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-bytes.pipe.ts b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-bytes.pipe.ts index 5b9fc16f73332..0cf317efdae46 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-bytes.pipe.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-bytes.pipe.ts @@ -17,29 +17,31 @@ */ import { Pipe, PipeTransform } from '@angular/core'; + +import { SafeAny } from 'interfaces'; import { isNil } from 'utils'; @Pipe({ name: 'humanizeBytes' }) export class HumanizeBytesPipe implements PipeTransform { - transform(value: number): any { + transform(value: number): SafeAny { if (isNil(value) || value < 0) { return '-'; - } + } const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB']; const converter = (v: number, p: number): string => { const base = Math.pow(1024, p); if (v < base) { - return (v / base).toFixed(2) + ' ' + units[p]; + return `${(v / base).toFixed(2)} ${units[p]}`; } else if (v < base * 1000) { - return (v / base).toPrecision(3) + ' ' + units[p]; + return `${(v / base).toPrecision(3)} ${units[p]}`; } else { return converter(v, p + 1); } }; if (value < 1000) { - return value + ' B'; + return `${value} B`; } else { return converter(value, 1); } diff --git a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-chart-numeric.pipe.ts b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-chart-numeric.pipe.ts index 4ad8b9249600d..82d4135ad8cdb 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-chart-numeric.pipe.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-chart-numeric.pipe.ts @@ -17,7 +17,9 @@ */ import { Pipe, PipeTransform } from '@angular/core'; + import { isNil } from 'utils'; + import { HumanizeBytesPipe } from './humanize-bytes.pipe'; import { HumanizeDurationPipe } from './humanize-duration.pipe'; @@ -31,11 +33,11 @@ export class HumanizeChartNumericPipe implements PipeTransform { } let returnVal = ''; if (/bytes/i.test(id) && /persecond/i.test(id)) { - returnVal = new HumanizeBytesPipe().transform(value) + ' / s'; + returnVal = `${new HumanizeBytesPipe().transform(value)} / s`; } else if (/bytes/i.test(id)) { returnVal = new HumanizeBytesPipe().transform(value); } else if (/persecond/i.test(id)) { - returnVal = value + ' / s'; + returnVal = `${value} / s`; } else if (/time/i.test(id) || /latency/i.test(id)) { returnVal = new HumanizeDurationPipe().transform(value, true); } else { diff --git a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-date.pipe.ts b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-date.pipe.ts index a6ab66c26c3f1..87e7f3049e77b 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-date.pipe.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-date.pipe.ts @@ -16,8 +16,10 @@ * limitations under the License. */ -import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core'; import { formatDate } from '@angular/common'; +import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core'; + +import { SafeAny } from 'interfaces'; @Pipe({ name: 'humanizeDate' @@ -25,7 +27,7 @@ import { formatDate } from '@angular/common'; export class HumanizeDatePipe implements PipeTransform { constructor(@Inject(LOCALE_ID) private locale: string) {} - transform(value: any, format = 'mediumDate', timezone?: string, locale?: string): string | null | undefined { + transform(value: SafeAny, format = 'mediumDate', timezone?: string, locale?: string): string | null | undefined { if (value == null || value === '' || value !== value || value < 0) { return '-'; } diff --git a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-duration.pipe.ts b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-duration.pipe.ts index a7ed91fae1595..9b30d944303cf 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-duration.pipe.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-duration.pipe.ts @@ -17,13 +17,15 @@ */ import { Pipe, PipeTransform } from '@angular/core'; + +import { SafeAny } from 'interfaces'; import { isNil } from 'utils'; @Pipe({ name: 'humanizeDuration' }) export class HumanizeDurationPipe implements PipeTransform { - transform(value: number, short: boolean = false): any { + transform(value: number, short: boolean = false): SafeAny { if (isNil(value) || isNaN(value)) { return '-'; } else if (value < 0) { diff --git a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-watermark.pipe.ts b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-watermark.pipe.ts index 812e634035553..c6c3b841b685f 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-watermark.pipe.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/pipes/humanize-watermark.pipe.ts @@ -17,13 +17,15 @@ */ import { Pipe, PipeTransform } from '@angular/core'; + import { LONG_MIN_VALUE } from 'config'; +import { SafeAny } from 'interfaces'; @Pipe({ name: 'humanizeWatermark' }) export class HumanizeWatermarkPipe implements PipeTransform { - transform(value: any): any { + transform(value: SafeAny): SafeAny { if (isNaN(value) || value <= LONG_MIN_VALUE) { return 'No Watermark (Watermarks are only available if EventTime is used)'; } else { diff --git a/flink-runtime-web/web-dashboard/src/app/share/pipes/pipe.module.ts b/flink-runtime-web/web-dashboard/src/app/share/pipes/pipe.module.ts index d9ffcf9b47c6c..f569c06c75498 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/pipes/pipe.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/pipes/pipe.module.ts @@ -16,13 +16,15 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; + import { HumanizeBytesPipe } from 'share/pipes/humanize-bytes.pipe'; import { HumanizeWatermarkPipe } from 'share/pipes/humanize-watermark.pipe'; -import { HumanizeDurationPipe } from './humanize-duration.pipe'; -import { HumanizeDatePipe } from './humanize-date.pipe'; + import { HumanizeChartNumericPipe } from './humanize-chart-numeric.pipe'; +import { HumanizeDatePipe } from './humanize-date.pipe'; +import { HumanizeDurationPipe } from './humanize-duration.pipe'; import { ParseIntPipe } from './parse-int.pipe'; @NgModule({ diff --git a/flink-runtime-web/web-dashboard/src/app/share/share.module.ts b/flink-runtime-web/web-dashboard/src/app/share/share.module.ts index b74d898868109..51586e3815b94 100644 --- a/flink-runtime-web/web-dashboard/src/app/share/share.module.ts +++ b/flink-runtime-web/web-dashboard/src/app/share/share.module.ts @@ -16,30 +16,32 @@ * limitations under the License. */ -import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { ResizeComponent } from 'share/common/resize/resize.component'; -import { CheckpointBadgeComponent } from 'share/customize/checkpoint-badge/checkpoint-badge.component'; -import { JobChartComponent } from 'share/customize/job-chart/job-chart.component'; -import { PipeModule } from 'share/pipes/pipe.module'; +import { NgModule } from '@angular/core'; + +import { NzButtonModule } from 'ng-zorro-antd/button'; +import { NzCardModule } from 'ng-zorro-antd/card'; +import { NzDividerModule } from 'ng-zorro-antd/divider'; +import { NzIconModule } from 'ng-zorro-antd/icon'; +import { NzMessageModule } from 'ng-zorro-antd/message'; +import { NzTableModule } from 'ng-zorro-antd/table'; +import { NzTabsModule } from 'ng-zorro-antd/tabs'; +import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; import { DagreModule } from 'share/common/dagre/dagre.module'; import { FileReadDirective } from 'share/common/file-read/file-read.directive'; import { MonacoEditorComponent } from 'share/common/monaco-editor/monaco-editor.component'; import { NavigationComponent } from 'share/common/navigation/navigation.component'; +import { ResizeComponent } from 'share/common/resize/resize.component'; +import { CheckpointBadgeComponent } from 'share/customize/checkpoint-badge/checkpoint-badge.component'; import { JobBadgeComponent } from 'share/customize/job-badge/job-badge.component'; +import { JobChartComponent } from 'share/customize/job-chart/job-chart.component'; import { JobListComponent } from 'share/customize/job-list/job-list.component'; -import { TaskBadgeComponent } from 'share/customize/task-badge/task-badge.component'; import { RefreshDownloadComponent } from 'share/customize/refresh-download/refresh-download.component'; +import { TaskBadgeComponent } from 'share/customize/task-badge/task-badge.component'; +import { PipeModule } from 'share/pipes/pipe.module'; + import { BackpressureBadgeComponent } from './customize/backpressure-badge/backpressure-badge.component'; import { FlameGraphComponent } from './customize/flame-graph/flame-graph.component'; -import { NzButtonModule } from 'ng-zorro-antd/button'; -import { NzCardModule } from 'ng-zorro-antd/card'; -import { NzDividerModule } from 'ng-zorro-antd/divider'; -import { NzMessageModule } from 'ng-zorro-antd/message'; -import { NzTableModule } from 'ng-zorro-antd/table'; -import { NzTabsModule } from 'ng-zorro-antd/tabs'; -import { NzToolTipModule } from 'ng-zorro-antd/tooltip'; -import { NzIconModule } from 'ng-zorro-antd/icon'; @NgModule({ imports: [ diff --git a/flink-runtime-web/web-dashboard/src/app/utils/deepFind.ts b/flink-runtime-web/web-dashboard/src/app/utils/deepFind.ts index cf83f7b9d877a..39fbcca3018fd 100644 --- a/flink-runtime-web/web-dashboard/src/app/utils/deepFind.ts +++ b/flink-runtime-web/web-dashboard/src/app/utils/deepFind.ts @@ -16,7 +16,9 @@ * limitations under the License. */ -export function deepFind(obj: any, path: string) { +import { SafeAny } from 'interfaces'; + +export function deepFind(obj: SafeAny, path: string): SafeAny { const paths = path.split('.'); let current = obj; for (let i = 0; i < paths.length; ++i) { diff --git a/flink-runtime-web/web-dashboard/src/app/utils/isNil.ts b/flink-runtime-web/web-dashboard/src/app/utils/isNil.ts index 995da4a98db17..a7c3b44eb8989 100644 --- a/flink-runtime-web/web-dashboard/src/app/utils/isNil.ts +++ b/flink-runtime-web/web-dashboard/src/app/utils/isNil.ts @@ -16,6 +16,8 @@ * limitations under the License. */ -export function isNil(value: any) { +import { SafeAny } from 'interfaces'; + +export function isNil(value: SafeAny): boolean { return value == null; } diff --git a/flink-runtime-web/web-dashboard/src/index.html b/flink-runtime-web/web-dashboard/src/index.html index d17ea6d1127de..150177c507261 100644 --- a/flink-runtime-web/web-dashboard/src/index.html +++ b/flink-runtime-web/web-dashboard/src/index.html @@ -16,24 +16,24 @@ ~ limitations under the License. --> - + - - - - - Apache Flink Web Dashboard - - - - - - - - - - - - - + + + + + Apache Flink Web Dashboard + + + + + + + + + + + + + diff --git a/flink-runtime-web/web-dashboard/src/styles/base.less b/flink-runtime-web/web-dashboard/src/styles/base.less index d19f1f7fa2542..4996b416c6a4a 100644 --- a/flink-runtime-web/web-dashboard/src/styles/base.less +++ b/flink-runtime-web/web-dashboard/src/styles/base.less @@ -24,27 +24,27 @@ } ::-webkit-scrollbar { - width: 12px + width: 12px; } ::-webkit-scrollbar-corner { background: @component-background; } -::-webkit-scrollbar:horizontal { - height: 12px -} - ::-webkit-scrollbar-track { - background-color: fade(@border-color-split, 20%); border-radius: 0; + background-color: fade(@border-color-split, 20%); } ::-webkit-scrollbar-thumb { width: 12px; height: 12px; - background: @border-color-split; border-radius: 0; + background: @border-color-split; +} + +::-webkit-scrollbar:horizontal { + height: 12px; } ::-webkit-scrollbar-thumb:window-inactive { @@ -56,5 +56,5 @@ } ::-webkit-scrollbar-thumb:hover { - background: darken(@border-color-split, 30%) + background: darken(@border-color-split, 30%); } diff --git a/flink-runtime-web/web-dashboard/src/styles/index.less b/flink-runtime-web/web-dashboard/src/styles/index.less index f14f4a91bbeb5..457c8587215fa 100644 --- a/flink-runtime-web/web-dashboard/src/styles/index.less +++ b/flink-runtime-web/web-dashboard/src/styles/index.less @@ -23,15 +23,14 @@ @import "./theme"; @import "./rewrite"; - .d3-flame-graph-tip { - line-height: 1; - font-family: Verdana; - font-size: 14px; + z-index: 1000; padding: 12px; + border-radius: 2px; background: rgba(0, 0, 0, 0.8); color: #fff; - border-radius: 2px; + font-size: 14px; + font-family: Verdana; + line-height: 1; pointer-events: none; - z-index: 1000; -} \ No newline at end of file +} diff --git a/flink-runtime-web/web-dashboard/src/styles/rewrite.less b/flink-runtime-web/web-dashboard/src/styles/rewrite.less index 899f3d0710c56..f78136cd487f1 100644 --- a/flink-runtime-web/web-dashboard/src/styles/rewrite.less +++ b/flink-runtime-web/web-dashboard/src/styles/rewrite.less @@ -30,9 +30,9 @@ nz-table { } &.full-height { + position: relative; display: block; height: 100%; - position: relative; nz-spin { display: block; @@ -40,8 +40,8 @@ nz-table { .ant-spin-container { position: relative; - zoom: 1; height: 100%; + zoom: 1; .ant-table { height: 100%; @@ -59,7 +59,14 @@ nz-table { } } -.ant-table-small > .ant-table-content > .ant-table-scroll > .ant-table-header > table > .ant-table-thead > tr > th.ant-table-column-sort { +.ant-table-small + > .ant-table-content + > .ant-table-scroll + > .ant-table-header + > table + > .ant-table-thead + > tr + > th.ant-table-column-sort { background: @table-header-sort-active-bg; } @@ -72,15 +79,16 @@ nz-table { } .ant-tooltip-inner { - word-break: break-word; font-size: 12px; + word-break: break-word; } .ant-table table { - border-collapse: separate; border-spacing: 0; + border-collapse: separate; } -.ant-table-tbody>tr>td, .ant-table-thead>tr>th{ +.ant-table-tbody > tr > td, +.ant-table-thead > tr > th { word-break: break-word; } diff --git a/flink-runtime-web/web-dashboard/src/test.ts b/flink-runtime-web/web-dashboard/src/test.ts index e99c54e0f2ad3..6b2ccd897602b 100644 --- a/flink-runtime-web/web-dashboard/src/test.ts +++ b/flink-runtime-web/web-dashboard/src/test.ts @@ -22,7 +22,9 @@ import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; -declare const require: any; +import {SafeAny} from "interfaces"; + +declare const require: SafeAny; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); diff --git a/flink-runtime-web/web-dashboard/tslint.json b/flink-runtime-web/web-dashboard/tslint.json deleted file mode 100644 index 24ab11e3f298b..0000000000000 --- a/flink-runtime-web/web-dashboard/tslint.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "extends": "tslint:recommended", - "rulesDirectory": ["codelyzer"], - "rules": { - "align": { - "options": ["parameters", "statements"] - }, - "array-type": false, - "arrow-parens": false, - "arrow-return-shorthand": true, - "deprecation": { - "severity": "warn" - }, - "curly": true, - "import-blacklist": [true, "rxjs/Rx"], - "forin": false, - "eofline": true, - "interface-name": false, - "max-classes-per-file": false, - "import-spacing": true, - "indent": { - "options": ["spaces"] - }, - "max-line-length": [true, 140], - "member-access": false, - "member-ordering": [ - true, - { - "order": ["static-field", "instance-field", "static-method", "instance-method"] - } - ], - "no-reference": false, - "no-conditional-assignment": false, - "no-consecutive-blank-lines": false, - "no-console": [true, "debug", "info", "time", "timeEnd", "trace"], - "no-empty": false, - "no-inferrable-types": [true, "ignore-params"], - "prefer-for-of": [false], - "no-non-null-assertion": false, - "no-redundant-jsdoc": false, - "no-switch-case-fall-through": true, - "no-var-requires": false, - "object-literal-key-quotes": [true, "as-needed"], - "object-literal-sort-keys": false, - "ordered-imports": false, - "quotemark": [true, "single"], - "trailing-comma": false, - "no-output-on-prefix": true, - "no-inputs-metadata-property": true, - "no-outputs-metadata-property": true, - "no-host-metadata-property": false, - "no-input-rename": true, - "no-output-rename": true, - "use-lifecycle-interface": true, - "semicolon": { - "options": ["always"] - }, - "space-before-function-paren": { - "options": { - "anonymous": "never", - "asyncArrow": "always", - "constructor": "never", - "method": "never", - "named": "never" - } - }, - "use-pipe-transform-interface": true, - "typedef-whitespace": { - "options": [ - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } - ] - }, - "component-class-suffix": true, - "directive-class-suffix": true, - "variable-name": { - "options": ["ban-keywords", "check-format", "allow-pascal-case"] - }, - "whitespace": { - "options": ["check-branch", "check-decl", "check-operator", "check-separator", "check-type", "check-typecast"] - } - } -}