From cfec7278822d453d3483a1f0963565d0d7307307 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 13 Jan 2022 08:25:03 -0700 Subject: [PATCH 01/50] Replace outdated dependency with the correct one for code coverage (cherry picked from commit 699ff7232593a74d90c0856f4224e0197087efd4) --- experimental/traffic-portal/karma.conf.js | 7 +- experimental/traffic-portal/package-lock.json | 117 +++++++----------- experimental/traffic-portal/package.json | 3 +- 3 files changed, 49 insertions(+), 78 deletions(-) diff --git a/experimental/traffic-portal/karma.conf.js b/experimental/traffic-portal/karma.conf.js index 1239bc281b..9abfcb1e3e 100644 --- a/experimental/traffic-portal/karma.conf.js +++ b/experimental/traffic-portal/karma.conf.js @@ -23,15 +23,16 @@ module.exports = function (config) { require("karma-jasmine"), require("karma-chrome-launcher"), require("karma-jasmine-html-reporter"), - require("karma-coverage-istanbul-reporter"), + require("karma-coverage"), require("@angular-devkit/build-angular/plugins/karma") ], client: { clearContext: false // leave Jasmine Spec Runner output visible in browser }, - coverageIstanbulReporter: { + coverageReporter: { dir: require("path").join(__dirname, "./coverage/traffic-portal"), - reports: ["html", "lcovonly", "text-summary"], + reports: [{type: "html"}, {type: "text-summary"}], + subdir: ".", fixWebpackSourcePaths: true }, reporters: ["progress", "kjhtml"], diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index f4078d232d..1eecaa1b29 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -6978,64 +6978,6 @@ } } }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "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" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "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 - } - } - }, "istanbul-reports": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.5.tgz", @@ -7083,15 +7025,6 @@ "integrity": "sha512-ooZWSDVAdh79Rrj4/nnfklL3NQVra0BcuhcuWoAwwi+znLDoUeH87AFfeX8s+YeYi6xlv5nveRyaA1v7CintfA==", "dev": true }, - "jasmine-spec-reporter": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-5.0.2.tgz", - "integrity": "sha512-6gP1LbVgJ+d7PKksQBc2H0oDGNRQI3gKUsWlswKaQ2fif9X5gzhQcgM5+kiJGCQVurOG09jqNhk7payggyp5+g==", - "dev": true, - "requires": { - "colors": "1.4.0" - } - }, "jasminewd2": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", @@ -7415,17 +7348,55 @@ } } }, - "karma-coverage-istanbul-reporter": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz", - "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==", + "karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", + "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^3.0.2", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", "minimatch": "^3.0.4" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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 + } } }, "karma-jasmine": { diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index 51d289e771..3c8d357593 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -75,10 +75,9 @@ "eslint-plugin-jsdoc": "^37.0.3", "eslint-plugin-prefer-arrow": "^1.2.3", "jasmine-core": "^3.10.1", - "jasmine-spec-reporter": "~5.0.0", "karma": "~6.3.2", "karma-chrome-launcher": "~3.1.0", - "karma-coverage-istanbul-reporter": "~3.0.2", + "karma-coverage": "~2.0.3", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", From d6e6d609e27d55515d58717803ee20498ec83a81 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 13 Jan 2022 08:28:36 -0700 Subject: [PATCH 02/50] Update Angular to version 13.1.3 (cherry picked from commit b3f8fa87bcbf96431e60637215405376e6680e26) --- experimental/traffic-portal/package-lock.json | 3580 ++++++++++++----- experimental/traffic-portal/package.json | 28 +- .../src/app/shared/shared.module.ts | 14 +- 3 files changed, 2566 insertions(+), 1056 deletions(-) diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index 1eecaa1b29..1295b864c9 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@ampproject/remapping": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.1.tgz", - "integrity": "sha512-Ta9bMA3EtUHDaZJXqUoT5cn/EecwOp+SXpKJqxDbDuMbLvEMu6YTyDDuvTWeStODfdmXyfMo7LymQyPkN3BicA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.2.tgz", + "integrity": "sha512-SncaVxs+E3EdoA9xJgHfWPxZfowAgeIsd71VpqCKP6KNKm6s7zSqqvUc70UpKUFsrV3dAmy6qxHoIj5NG+3DiA==", "dev": true, "requires": { "@jridgewell/resolve-uri": "1.0.0", @@ -15,105 +15,322 @@ } }, "@angular-devkit/architect": { - "version": "0.1300.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1300.3.tgz", - "integrity": "sha512-XY3sjRLk06Q+uAU0BePuIWcK1n3Jr0ksNV0ACNAct+MnI3QFfPPaYA/Tdhp9uWobuZ4lUrL0drc2uppNu0wKmA==", + "version": "0.1301.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.3.tgz", + "integrity": "sha512-fFSevgYGZHCybYoyTkZ9b1YCSthBmoi77alwWjqMhYXUNXx7yx50zJZ6Ur2v3YpctVjU6eoGc5FDFyVHwXT0Iw==", "dev": true, "requires": { - "@angular-devkit/core": "13.0.3", + "@angular-devkit/core": "13.1.3", "rxjs": "6.6.7" } }, "@angular-devkit/build-angular": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.0.3.tgz", - "integrity": "sha512-5KFsknpnq3mc0KwcIDjvmqB3trz5cMt48dB0nrc23zkFI9v4hkpalc/OEg/H3G93K0c9g6dcyxmHkNfsU1+CHw==", - "dev": true, - "requires": { - "@ampproject/remapping": "1.0.1", - "@angular-devkit/architect": "0.1300.3", - "@angular-devkit/build-webpack": "0.1300.3", - "@angular-devkit/core": "13.0.3", - "@babel/core": "7.15.8", - "@babel/generator": "7.15.8", - "@babel/helper-annotate-as-pure": "7.15.4", - "@babel/plugin-proposal-async-generator-functions": "7.15.8", - "@babel/plugin-transform-async-to-generator": "7.14.5", - "@babel/plugin-transform-runtime": "7.15.8", - "@babel/preset-env": "7.15.8", - "@babel/runtime": "7.15.4", - "@babel/template": "7.15.4", - "@discoveryjs/json-ext": "0.5.5", - "@ngtools/webpack": "13.0.3", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.3.tgz", + "integrity": "sha512-C5Qv8aGmpGbETG4Mawly/5LnkRwfJAzANL5BtYJn8ZaDlZKCkhvAaRXHpm4Mdqg5idACAT8hgYqPQvqyEBaVDA==", + "dev": true, + "requires": { + "@ampproject/remapping": "1.0.2", + "@angular-devkit/architect": "0.1301.3", + "@angular-devkit/build-webpack": "0.1301.3", + "@angular-devkit/core": "13.1.3", + "@babel/core": "7.16.0", + "@babel/generator": "7.16.0", + "@babel/helper-annotate-as-pure": "7.16.0", + "@babel/plugin-proposal-async-generator-functions": "7.16.4", + "@babel/plugin-transform-async-to-generator": "7.16.0", + "@babel/plugin-transform-runtime": "7.16.4", + "@babel/preset-env": "7.16.4", + "@babel/runtime": "7.16.3", + "@babel/template": "7.16.0", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.1.3", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", "cacache": "15.3.0", - "caniuse-lite": "^1.0.30001032", "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "9.0.1", - "core-js": "3.19.0", - "critters": "0.0.14", - "css-loader": "6.5.0", - "esbuild": "0.13.12", - "esbuild-wasm": "0.13.12", + "copy-webpack-plugin": "10.0.0", + "core-js": "3.19.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild": "0.14.11", + "esbuild-wasm": "0.14.11", "glob": "7.2.0", "https-proxy-agent": "5.0.0", "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", "karma-source-map-support": "1.4.0", "less": "4.1.2", "less-loader": "10.2.0", "license-webpack-plugin": "4.0.0", - "loader-utils": "3.0.0", - "mini-css-extract-plugin": "2.4.3", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.4.5", "minimatch": "3.0.4", "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", "piscina": "3.1.0", - "postcss": "8.3.11", + "postcss": "8.4.4", "postcss-import": "14.0.2", - "postcss-loader": "6.2.0", + "postcss-loader": "6.2.1", "postcss-preset-env": "6.7.0", "regenerator-runtime": "0.13.9", "resolve-url-loader": "4.0.0", "rxjs": "6.6.7", - "sass": "1.43.4", - "sass-loader": "12.3.0", + "sass": "1.44.0", + "sass-loader": "12.4.0", "semver": "7.3.5", "source-map-loader": "3.0.0", - "source-map-support": "0.5.20", + "source-map-support": "0.5.21", "stylus": "0.55.0", "stylus-loader": "6.2.0", - "terser": "5.9.0", + "terser": "5.10.0", "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.64.1", - "webpack-dev-middleware": "5.2.1", - "webpack-dev-server": "4.4.0", + "webpack": "5.65.0", + "webpack-dev-middleware": "5.2.2", + "webpack-dev-server": "4.6.0", "webpack-merge": "5.8.0", "webpack-subresource-integrity": "5.0.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "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" + } + }, + "critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "css-select": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "esbuild": { + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.11.tgz", + "integrity": "sha512-xZvPtVj6yecnDeFb3KjjCM6i7B5TCAQZT77kkW/CpXTMnd6VLnRPKrUB1XHI1pSq6a4Zcy3BGueQ8VljqjDGCg==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.14.11", + "esbuild-darwin-64": "0.14.11", + "esbuild-darwin-arm64": "0.14.11", + "esbuild-freebsd-64": "0.14.11", + "esbuild-freebsd-arm64": "0.14.11", + "esbuild-linux-32": "0.14.11", + "esbuild-linux-64": "0.14.11", + "esbuild-linux-arm": "0.14.11", + "esbuild-linux-arm64": "0.14.11", + "esbuild-linux-mips64le": "0.14.11", + "esbuild-linux-ppc64le": "0.14.11", + "esbuild-linux-s390x": "0.14.11", + "esbuild-netbsd-64": "0.14.11", + "esbuild-openbsd-64": "0.14.11", + "esbuild-sunos-64": "0.14.11", + "esbuild-windows-32": "0.14.11", + "esbuild-windows-64": "0.14.11", + "esbuild-windows-arm64": "0.14.11" + } + }, + "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 + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "postcss": { + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", + "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "dev": true, + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "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" + } + } } }, "@angular-devkit/build-webpack": { - "version": "0.1300.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1300.3.tgz", - "integrity": "sha512-3DNo8575FFPMqJaVMXxrIduWkrcKm5zYSCvkMOmzHLp+gx+RXQiwnoXfVJpukcE/jwK/4SWyRE8Tw75sfPJ71A==", + "version": "0.1301.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.3.tgz", + "integrity": "sha512-FFwKdhq5n0lrqkiJRZoWKy21gERtvupkk0BpIVPTbRqyiqB2htiGM995uBBjpeDngytDLx+BwPFipVfQ+WIi9w==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1300.3", + "@angular-devkit/architect": "0.1301.3", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.0.3.tgz", - "integrity": "sha512-5yTYW6m4pkDPSYNxThm+47h+UZ6XVEfdfsXR3o+WlRG0hc18EuQ+sXZkzhvZrk5KMLlXFex4eO40RPq2vvWS/w==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.3.tgz", + "integrity": "sha512-o14jGDk4h14dVYYQafOn+2rq9CDmDMbDV6logqKYCLzTDRlK8gccDnqJM/QKAlfWCzbllZqcHDmg6FyoRLO9RQ==", "dev": true, "requires": { - "ajv": "8.6.3", + "ajv": "8.8.2", "ajv-formats": "2.1.1", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", @@ -122,12 +339,12 @@ } }, "@angular-devkit/schematics": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.0.3.tgz", - "integrity": "sha512-+Va1E0zJBCg5jqSfITusghoMJgPAwlU+WUs49fuGVCzfJPwfSjTKSrsbhanahMd27+Ys3rovGZq0F2JUdL801A==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.3.tgz", + "integrity": "sha512-TvjThB/pFXNFM0j0WX5yg0L2/3xNsqawQuWhkDJ05MBDEnSxbgv5hmOzNL8SNIEMgP0VbSTHtSg5kZvmNiH7vg==", "dev": true, "requires": { - "@angular-devkit/core": "13.0.3", + "@angular-devkit/core": "13.1.3", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", @@ -205,35 +422,35 @@ } }, "@angular/animations": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.0.2.tgz", - "integrity": "sha512-ROR70rM6E13pIJzaYf0Su/ALSoBm5fIMjozey636pAq21TxTy5IfhgaBjv/vflC9psbpaySGw2H5XnwejP0gSw==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.1.2.tgz", + "integrity": "sha512-k1eQ8YZq3eelLhJDQjkRCt/4MXxwK2TFeGdtcYJF0G7vFOppE8hlI4PT7Bvmk08lTqvgiqtTI3ZaYmIINLfUMg==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.0.2.tgz", - "integrity": "sha512-m7RHIAXpFpgsrydhWXX1hAXRmQpQ+m9eRCYAoz8QiDCchYyVvTaxkZ8J7XGS8RtJ2EiocXSp4TlwQQrpXe+4lg==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.1.2.tgz", + "integrity": "sha512-xORyqvfM0MueJpxHxVi3CR/X/f1RPKr45vt7NV6/x91OTnh2ukwxg++dAGuA6M5gUAHcVAcaBrfju4GQlU9hmg==", "requires": { "parse5": "^5.0.0", "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.0.3.tgz", - "integrity": "sha512-LDXDXDbQ1MBHVUstu4aNjFbyg5f9hLP52gEKB8Z6fQlf5CB1X5zD6UPcR4IvoYt03EFxg3DHco+ueJQ20oZUWQ==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.1.3.tgz", + "integrity": "sha512-Ju/A8LFnfcv1PC665a5FiIQx9SXqB+3yWYFXPIiVkkRcye95gpfsbV48WW7QV35gzIwbR1m3H907Zg6ptiNv0A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1300.3", - "@angular-devkit/core": "13.0.3", - "@angular-devkit/schematics": "13.0.3", - "@schematics/angular": "13.0.3", + "@angular-devkit/architect": "0.1301.3", + "@angular-devkit/core": "13.1.3", + "@angular-devkit/schematics": "13.1.3", + "@schematics/angular": "13.1.3", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "4.3.2", + "debug": "4.3.3", "ini": "2.0.0", "inquirer": "8.2.0", "jsonc-parser": "3.0.0", @@ -246,28 +463,39 @@ "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "@angular/common": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.0.2.tgz", - "integrity": "sha512-UxWzNAU/o9pP02AYB5MrnIlShirfO631NolmvP0jTSEmym1nAeDOwZIYlkgfcJMHFXFc7DBnE2XOGaTZ8if3kw==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.1.2.tgz", + "integrity": "sha512-/8RWYQkZ1KPNvu2FANJM44wXlOMjMyxZVOEIn3llMRgxV2iiYtmluAOJNafTAbKedAuD6wiSpbi++QbioqCyyA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.0.2.tgz", - "integrity": "sha512-EvIFT8y5VNICrnPgiamv/z9hfQ7KjLCM52g4ssXGCeGPVj58OEfslEc3jO4BCJG7xuLm7dCuSRV0pBlJNTSYFg==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.2.tgz", + "integrity": "sha512-xbM3eClhUIHEFR0Et1bVC18Q7+kJx+hNNWWQl63RNYYBxTZnZpXA3mYi6IcEasy7BHkobVW+5teqlibFQY4gfQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.0.2.tgz", - "integrity": "sha512-KVDntMBoPoAPdpyO3LxR2U3BO3ja5fY5Im5rzynjBCC3dnwAPPKoIlYZlFY/5ov6yVoVleeb/BOovYxHuxZBsA==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.1.2.tgz", + "integrity": "sha512-yqM6RLcYtfwIuqBQ7eS7WdksBYY7Dh9sP4rElgLiEhDGIPQf6YE5zeuRThGq5pQ2fvHbNflw8QmTHu/18Y1u/g==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -284,49 +512,49 @@ } }, "@angular/core": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.0.2.tgz", - "integrity": "sha512-6Jbct50lncMqzwLILzfmwQRK8eOEMv0quCL3pQptEpYPSlPqKz6QRxD76BykSUOs7XYJ/KdZmu3uGcT2Q/DUVg==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.2.tgz", + "integrity": "sha512-dsb90lUf8BELzdg7MgSMfPc36xzZKsDggOimfXhIvmctgc+H71Zo07KYTy5JVqsscLdT+A/KBvtU1bKk4P+Rfg==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.0.2.tgz", - "integrity": "sha512-JGgEOTH/OYr7/RlqJUPSzKQF/a55UM5PD6CgpUjAXKrCV18+zhofO05g+ibIZH3OfONntthcbKEXxMTX2EEQqg==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.1.2.tgz", + "integrity": "sha512-r5I5cPngk2Erxe/OEL9Hl1j1VcNSAAyVzh7KmtOP8z7RZYCd0MeRISKrmA5CGn5Dh7A5POFLoOpBatmvnc4Z/A==", "requires": { "tslib": "^2.3.0" } }, "@angular/material": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.0.2.tgz", - "integrity": "sha512-DbbkQFpZ73oxOuR9LkkpeUPWP31DNIG3Z94sOrtdBhX3HfbLLOCaAJAIwMl8+bEuzDgtWBmx3taUR8l4WKCO8g==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.1.2.tgz", + "integrity": "sha512-M7eDgTMCZ/naoiS6Z5nj3N/sNUFc+CGPHX4yb563RuknqN7huDCvdyxA6KnhYLZsVlNCPh5ZrEr6H8ZiYJWcpg==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.0.2.tgz", - "integrity": "sha512-fkLGr9Vj2cvFzXefyhNaqwXX90+WbpYj5cCii7S1HcbJ9qSM5ZenLp1t8mGRhmWI7odY4BrFskWOChlWFrLEkA==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.1.2.tgz", + "integrity": "sha512-yBUWtYJHr/1LuK3/YRRav2O82i6RHVPtRoAlZHoeTlh2CYA4u1m3JHq9XBrxIxSXexBX69pMrZENW1xskwKRTQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.0.2.tgz", - "integrity": "sha512-2wZX2oop3A1kWFcbRYqe8AxBQjT35DXf1qlGyFQoMn7D0vOAprg6X1hUK2XBItRrvwRWh3hSVhzkustTIl+r6g==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.2.tgz", + "integrity": "sha512-gABOn8DxGai56WmIt5o+eXtduabiq4Mlprg+6+dv+2PvWV871pLvswV9EGUSgwKXvbhBlDZDuNFU5LgvNDuGFg==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-server": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.0.2.tgz", - "integrity": "sha512-N+RPEQFiZN5CQ4j9zPLSnMaqzLW6iDuHI1Had6C0a34qH6VjpIavu8650PVn2wDG/dbDFNL2bO7R8WeUQH1xtg==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.1.2.tgz", + "integrity": "sha512-fSrdMeLoypuH0NfivYnztfKbwZhAGtfFFfBYZL27gQJLDmYkbr5fWFe3e4cVNdY/J2LcIDUSJptQmnIC1EKOlA==", "requires": { "domino": "^2.1.2", "tslib": "^2.3.0", @@ -334,9 +562,9 @@ } }, "@angular/router": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.0.2.tgz", - "integrity": "sha512-AfmT845dcYPvNbUdV2ALlf++szZP3ie2d0eu7JyGWe3anV1fbDcg76RhjxFK8yVUxryrCQtEnot1VEEVlhGkyw==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.1.2.tgz", + "integrity": "sha512-5S0De6SdlbERoX9FwOBiTWxINchW7nTPUIH/tdanOqq12cqp6/7NigOr3BZDSvUNIh/6Is+pSQTKGAbhxejN2w==", "requires": { "tslib": "^2.3.0" } @@ -419,22 +647,40 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.15.4", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", - "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", "dev": true, "requires": { - "@babel/types": "^7.15.4" + "@babel/types": "^7.16.0" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", - "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-compilation-targets": { @@ -458,55 +704,229 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", - "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", + "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", - "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", + "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^4.7.1" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" } } } }, "@babel/helper-define-polyfill-provider": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", - "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -527,17 +947,62 @@ } } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", - "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, - "@babel/helper-function-name": { - "version": "7.16.0", + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", "dev": true, @@ -635,29 +1100,45 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.4.tgz", - "integrity": "sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-wrap-function": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" } } } @@ -714,27 +1195,142 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", - "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -779,184 +1375,235 @@ "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", "dev": true }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", - "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0" + "@babel/plugin-proposal-optional-chaining": "^7.16.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", - "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/helper-remap-async-to-generator": "^7.16.4", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, "@babel/plugin-proposal-class-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", - "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-class-static-block": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", - "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", - "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", - "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-json-strings": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", - "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", - "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", - "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", - "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", - "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.16.0" + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "dependencies": { + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", - "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", - "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", - "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", + "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", - "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-create-class-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "dependencies": { "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" } } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", - "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-async-generators": { @@ -1086,274 +1733,1339 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", - "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", - "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-module-imports": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.14.5" + "@babel/helper-remap-async-to-generator": "^7.16.0" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", - "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", - "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-classes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", - "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", "globals": "^11.1.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", - "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", - "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", - "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", - "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", - "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-for-of": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", - "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", - "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "@babel/plugin-transform-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", - "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", - "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", - "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", - "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", - "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", - "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", - "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0" + "@babel/helper-create-regexp-features-plugin": "^7.16.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", - "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", - "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-replace-supers": "^7.16.0" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "@babel/plugin-transform-parameters": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", - "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-property-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", - "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-regenerator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", - "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", - "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", - "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-module-imports": "^7.16.0", "@babel/helper-plugin-utils": "^7.14.5", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.5", - "babel-plugin-polyfill-regenerator": "^0.2.2", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, "dependencies": { @@ -1366,96 +3078,97 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", - "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-spread": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", - "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", - "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", - "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", - "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", - "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", - "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/preset-env": { - "version": "7.15.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", - "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", "dev": true, "requires": { - "@babel/compat-data": "^7.15.0", - "@babel/helper-compilation-targets": "^7.15.4", + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", "@babel/helper-plugin-utils": "^7.14.5", "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", - "@babel/plugin-proposal-async-generator-functions": "^7.15.8", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-class-static-block": "^7.15.4", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-json-strings": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-object-rest-spread": "^7.15.6", - "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.15.4", - "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -1470,44 +3183,44 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.14.5", - "@babel/plugin-transform-async-to-generator": "^7.14.5", - "@babel/plugin-transform-block-scoped-functions": "^7.14.5", - "@babel/plugin-transform-block-scoping": "^7.15.3", - "@babel/plugin-transform-classes": "^7.15.4", - "@babel/plugin-transform-computed-properties": "^7.14.5", - "@babel/plugin-transform-destructuring": "^7.14.7", - "@babel/plugin-transform-dotall-regex": "^7.14.5", - "@babel/plugin-transform-duplicate-keys": "^7.14.5", - "@babel/plugin-transform-exponentiation-operator": "^7.14.5", - "@babel/plugin-transform-for-of": "^7.15.4", - "@babel/plugin-transform-function-name": "^7.14.5", - "@babel/plugin-transform-literals": "^7.14.5", - "@babel/plugin-transform-member-expression-literals": "^7.14.5", - "@babel/plugin-transform-modules-amd": "^7.14.5", - "@babel/plugin-transform-modules-commonjs": "^7.15.4", - "@babel/plugin-transform-modules-systemjs": "^7.15.4", - "@babel/plugin-transform-modules-umd": "^7.14.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", - "@babel/plugin-transform-new-target": "^7.14.5", - "@babel/plugin-transform-object-super": "^7.14.5", - "@babel/plugin-transform-parameters": "^7.15.4", - "@babel/plugin-transform-property-literals": "^7.14.5", - "@babel/plugin-transform-regenerator": "^7.14.5", - "@babel/plugin-transform-reserved-words": "^7.14.5", - "@babel/plugin-transform-shorthand-properties": "^7.14.5", - "@babel/plugin-transform-spread": "^7.15.8", - "@babel/plugin-transform-sticky-regex": "^7.14.5", - "@babel/plugin-transform-template-literals": "^7.14.5", - "@babel/plugin-transform-typeof-symbol": "^7.14.5", - "@babel/plugin-transform-unicode-escapes": "^7.14.5", - "@babel/plugin-transform-unicode-regex": "^7.14.5", - "@babel/preset-modules": "^0.1.4", - "@babel/types": "^7.15.6", - "babel-plugin-polyfill-corejs2": "^0.2.2", - "babel-plugin-polyfill-corejs3": "^0.2.5", - "babel-plugin-polyfill-regenerator": "^0.2.2", - "core-js-compat": "^3.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", "semver": "^6.3.0" }, "dependencies": { @@ -1615,9 +3328,9 @@ "dev": true }, "@discoveryjs/json-ext": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", - "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", "dev": true }, "@es-joy/jsdoccomment": { @@ -1784,9 +3497,9 @@ "dev": true }, "@ngtools/webpack": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.0.3.tgz", - "integrity": "sha512-sVi1Xk8pyy6Y6JODySucYfvuxb5k3IIX/oIWy8QxlFVzpeB2UMqEOevrgvtmiEbQNB1W+aYSTph6oeV+PRX5YA==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.3.tgz", + "integrity": "sha512-6Pf52IbChm/dFuegfv0smeBTW2moi0Gdkyjgk/7VWqE6hN35m+YGrCh+XnPp1POJwOKxhAByhV9zs6NWxrK1vA==", "dev": true }, "@nguniversal/common": { @@ -1835,9 +3548,9 @@ } }, "@npmcli/fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", - "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", "dev": true, "requires": { "@gar/promisify": "^1.0.1", @@ -2161,13 +3874,13 @@ } }, "@schematics/angular": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.0.3.tgz", - "integrity": "sha512-qH6mnmGaDCuG1FM3vLdvSFDG394TeZO0ZvRDrw3iCYlX5Nkbz0Kvt0MPtWNZmlohwFhGlbXKVQiR++1dxa6eEA==", + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.1.3.tgz", + "integrity": "sha512-IixVWAEtN97N74PCxg3T03Ar/ECjGyJBWKAjKTTCrgNSWhm2mKgIc4RyI6cVCnltfJWIo48fcFhlOx/elShaCg==", "dev": true, "requires": { - "@angular-devkit/core": "13.0.3", - "@angular-devkit/schematics": "13.0.3", + "@angular-devkit/core": "13.1.3", + "@angular-devkit/schematics": "13.1.3", "jsonc-parser": "3.0.0" } }, @@ -2235,9 +3948,9 @@ "dev": true }, "@types/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-74hbvsnc+7TEDa1z5YLSe4/q8hGYB3USNvCuzHUJrjPV6hXaq8IXcngCrHkuvFt0+8rFz7xYXrHgNayIX0UZvQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", "dev": true, "requires": { "@types/estree": "*", @@ -2245,9 +3958,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", "dev": true, "requires": { "@types/eslint": "*", @@ -2284,9 +3997,9 @@ } }, "@types/http-proxy": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", - "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", "dev": true, "requires": { "@types/node": "*" @@ -2802,12 +4515,6 @@ "regex-parser": "^2.2.11" }, "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -2856,9 +4563,9 @@ } }, "agentkeepalive": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.4.tgz", - "integrity": "sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", + "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", "dev": true, "requires": { "debug": "^4.1.0", @@ -2877,9 +4584,9 @@ } }, "ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -2897,6 +4604,12 @@ "ajv": "^8.0.0" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -2950,45 +4663,19 @@ "dev": true }, "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "dev": true, "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "readable-stream": "^3.6.0" } }, "arg": { @@ -3172,12 +4859,6 @@ "schema-utils": "^2.6.5" }, "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -3223,13 +4904,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", - "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.2.4", + "@babel/helper-define-polyfill-provider": "^0.3.0", "semver": "^6.1.1" }, "dependencies": { @@ -3242,22 +4923,22 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", - "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.2", - "core-js-compat": "^3.16.2" + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", - "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.2.4" + "@babel/helper-define-polyfill-provider": "^0.3.0" } }, "balanced-match": { @@ -3294,9 +4975,9 @@ } }, "big.js": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.1.1.tgz", - "integrity": "sha512-1vObw81a8ylZO5ePrtMay0n018TcftpTA5HFKDaSuiUDBo8biRBtjIobw60OpwuvrGk+FsxKamqN4cnmj/eXdg==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, "binary-extensions": { @@ -3691,12 +5372,6 @@ "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", @@ -3790,6 +5465,12 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "colorette": { "version": "2.0.16", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", @@ -3970,36 +5651,32 @@ } }, "copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.0.0.tgz", + "integrity": "sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==", "dev": true, "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", - "globby": "^11.0.3", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "schema-utils": "^4.0.0", "serialize-javascript": "^6.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "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" + "requires": { + "fast-deep-equal": "^3.1.3" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", "dev": true }, "glob-parent": { @@ -4011,41 +5688,81 @@ "is-glob": "^4.0.3" } }, - "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 + "globby": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", + "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.8", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true } } }, "core-js": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.0.tgz", - "integrity": "sha512-L1TpFRWXZ76vH1yLM+z6KssLZrP8Z6GxxW4auoCj+XiViOzNPJCAuTIkn03BGdFe6Z5clX5t64wRIRypsZQrUg==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", "dev": true }, "core-js-compat": { - "version": "3.19.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", - "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", + "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", "dev": true, "requires": { - "browserslist": "^4.17.6", + "browserslist": "^4.19.1", "semver": "7.0.0" }, "dependencies": { + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001299", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", + "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.44", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz", + "integrity": "sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw==", + "dev": true + }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -4262,9 +5979,9 @@ } }, "css-loader": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.0.tgz", - "integrity": "sha512-VmuSdQa3K+wJsl39i7X3qGBM5+ZHmtTnv65fqMGI+fzmHoYmszTVvTqC1XN8JwWDViCB1a8wgNim5SV4fb37xg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", @@ -4912,154 +6629,135 @@ "es6-promise": "^4.0.3" } }, - "esbuild": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.13.12.tgz", - "integrity": "sha512-vTKKUt+yoz61U/BbrnmlG9XIjwpdIxmHB8DlPR0AAW6OdS+nBQBci6LUHU2q9WbBobMEIQxxDpKbkmOGYvxsow==", - "dev": true, - "optional": true, - "requires": { - "esbuild-android-arm64": "0.13.12", - "esbuild-darwin-64": "0.13.12", - "esbuild-darwin-arm64": "0.13.12", - "esbuild-freebsd-64": "0.13.12", - "esbuild-freebsd-arm64": "0.13.12", - "esbuild-linux-32": "0.13.12", - "esbuild-linux-64": "0.13.12", - "esbuild-linux-arm": "0.13.12", - "esbuild-linux-arm64": "0.13.12", - "esbuild-linux-mips64le": "0.13.12", - "esbuild-linux-ppc64le": "0.13.12", - "esbuild-netbsd-64": "0.13.12", - "esbuild-openbsd-64": "0.13.12", - "esbuild-sunos-64": "0.13.12", - "esbuild-windows-32": "0.13.12", - "esbuild-windows-64": "0.13.12", - "esbuild-windows-arm64": "0.13.12" - } - }, "esbuild-android-arm64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.12.tgz", - "integrity": "sha512-TSVZVrb4EIXz6KaYjXfTzPyyRpXV5zgYIADXtQsIenjZ78myvDGaPi11o4ZSaHIwFHsuwkB6ne5SZRBwAQ7maw==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.11.tgz", + "integrity": "sha512-6iHjgvMnC/SzDH8TefL+/3lgCjYWwAd1LixYfmz/TBPbDQlxcuSkX0yiQgcJB9k+ibZ54yjVXziIwGdlc+6WNw==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.12.tgz", - "integrity": "sha512-c51C+N+UHySoV2lgfWSwwmlnLnL0JWj/LzuZt9Ltk9ub1s2Y8cr6SQV5W3mqVH1egUceew6KZ8GyI4nwu+fhsw==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.11.tgz", + "integrity": "sha512-olq84ikh6TiBcrs3FnM4eR5VPPlcJcdW8BnUz/lNoEWYifYQ+Po5DuYV1oz1CTFMw4k6bQIZl8T3yxL+ZT2uvQ==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.12.tgz", - "integrity": "sha512-JvAMtshP45Hd8A8wOzjkY1xAnTKTYuP/QUaKp5eUQGX+76GIie3fCdUUr2ZEKdvpSImNqxiZSIMziEiGB5oUmQ==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.11.tgz", + "integrity": "sha512-Jj0ieWLREPBYr/TZJrb2GFH8PVzDqiQWavo1pOFFShrcmHWDBDrlDxPzEZ67NF/Un3t6sNNmeI1TUS/fe1xARg==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.12.tgz", - "integrity": "sha512-r6On/Skv9f0ZjTu6PW5o7pdXr8aOgtFOEURJZYf1XAJs0IQ+gW+o1DzXjVkIoT+n1cm3N/t1KRJfX71MPg/ZUA==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.11.tgz", + "integrity": "sha512-C5sT3/XIztxxz/zwDjPRHyzj/NJFOnakAanXuyfLDwhwupKPd76/PPHHyJx6Po6NI6PomgVp/zi6GRB8PfrOTA==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.12.tgz", - "integrity": "sha512-F6LmI2Q1gii073kmBE3NOTt/6zLL5zvZsxNLF8PMAwdHc+iBhD1vzfI8uQZMJA1IgXa3ocr3L3DJH9fLGXy6Yw==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.11.tgz", + "integrity": "sha512-y3Llu4wbs0bk4cwjsdAtVOesXb6JkdfZDLKMt+v1U3tOEPBdSu6w8796VTksJgPfqvpX22JmPLClls0h5p+L9w==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.12.tgz", - "integrity": "sha512-U1UZwG3UIwF7/V4tCVAo/nkBV9ag5KJiJTt+gaCmLVWH3bPLX7y+fNlhIWZy8raTMnXhMKfaTvWZ9TtmXzvkuQ==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.11.tgz", + "integrity": "sha512-Cg3nVsxArjyLke9EuwictFF3Sva+UlDTwHIuIyx8qpxRYAOUTmxr2LzYrhHyTcGOleLGXUXYsnUVwKqnKAgkcg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.12.tgz", - "integrity": "sha512-YpXSwtu2NxN3N4ifJxEdsgd6Q5d8LYqskrAwjmoCT6yQnEHJSF5uWcxv783HWN7lnGpJi9KUtDvYsnMdyGw71Q==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.11.tgz", + "integrity": "sha512-oeR6dIrrojr8DKVrxtH3xl4eencmjsgI6kPkDCRIIFwv4p+K7ySviM85K66BN01oLjzthpUMvBVfWSJkBLeRbg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.12.tgz", - "integrity": "sha512-SyiT/JKxU6J+DY2qUiSLZJqCAftIt3uoGejZ0HDnUM2MGJqEGSGh7p1ecVL2gna3PxS4P+j6WAehCwgkBPXNIw==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.11.tgz", + "integrity": "sha512-vcwskfD9g0tojux/ZaTJptJQU3a7YgTYsptK1y6LQ/rJmw7U5QJvboNawqM98Ca3ToYEucfCRGbl66OTNtp6KQ==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.12.tgz", - "integrity": "sha512-sgDNb8kb3BVodtAlcFGgwk+43KFCYjnFOaOfJibXnnIojNWuJHpL6aQJ4mumzNWw8Rt1xEtDQyuGK9f+Y24jGA==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.11.tgz", + "integrity": "sha512-+e6ZCgTFQYZlmg2OqLkg1jHLYtkNDksxWDBWNtI4XG4WxuOCUErLqfEt9qWjvzK3XBcCzHImrajkUjO+rRkbMg==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.12.tgz", - "integrity": "sha512-qQJHlZBG+QwVIA8AbTEtbvF084QgDi4DaUsUnA+EolY1bxrG+UyOuGflM2ZritGhfS/k7THFjJbjH2wIeoKA2g==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.11.tgz", + "integrity": "sha512-Rrs99L+p54vepmXIb87xTG6ukrQv+CzrM8eoeR+r/OFL2Rg8RlyEtCeshXJ2+Q66MXZOgPJaokXJZb9snq28bw==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.12.tgz", - "integrity": "sha512-2dSnm1ldL7Lppwlo04CGQUpwNn5hGqXI38OzaoPOkRsBRWFBozyGxTFSee/zHFS+Pdh3b28JJbRK3owrrRgWNw==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.11.tgz", + "integrity": "sha512-JyzziGAI0D30Vyzt0HDihp4s1IUtJ3ssV2zx9O/c+U/dhUHVP2TmlYjzCfCr2Q6mwXTeloDcLS4qkyvJtYptdQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.11.tgz", + "integrity": "sha512-DoThrkzunZ1nfRGoDN6REwmo8ZZWHd2ztniPVIR5RMw/Il9wiWEYBahb8jnMzQaSOxBsGp0PbyJeVLTUatnlcw==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.12.tgz", - "integrity": "sha512-D4raxr02dcRiQNbxOLzpqBzcJNFAdsDNxjUbKkDMZBkL54Z0vZh4LRndycdZAMcIdizC/l/Yp/ZsBdAFxc5nbA==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.11.tgz", + "integrity": "sha512-12luoRQz+6eihKYh1zjrw0CBa2aw3twIiHV/FAfjh2NEBDgJQOY4WCEUEN+Rgon7xmLh4XUxCQjnwrvf8zhACw==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.12.tgz", - "integrity": "sha512-KuLCmYMb2kh05QuPJ+va60bKIH5wHL8ypDkmpy47lzwmdxNsuySeCMHuTv5o2Af1RUn5KLO5ZxaZeq4GEY7DaQ==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.11.tgz", + "integrity": "sha512-l18TZDjmvwW6cDeR4fmizNoxndyDHamGOOAenwI4SOJbzlJmwfr0jUgjbaXCUuYVOA964siw+Ix+A+bhALWg8Q==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.12.tgz", - "integrity": "sha512-jBsF+e0woK3miKI8ufGWKG3o3rY9DpHvCVRn5eburMIIE+2c+y3IZ1srsthKyKI6kkXLvV4Cf/E7w56kLipMXw==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.11.tgz", + "integrity": "sha512-bmYzDtwASBB8c+0/HVOAiE9diR7+8zLm/i3kEojUH2z0aIs6x/S4KiTuT5/0VKJ4zk69kXel1cNWlHBMkmavQg==", "dev": true, "optional": true }, "esbuild-wasm": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.13.12.tgz", - "integrity": "sha512-eGdiSewbnJffEvyA0qQmr+w3HurBMVp4QhOfICzeeoL9naC8qC3PFaw6hZaqSgks5DXnQONtUGUFLsX3eXpq8A==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.11.tgz", + "integrity": "sha512-9e1R6hv0hiU+BkJI2edqUuWfXUbOP2Mox+Ijl/uY1vLLlSsunkrcADqD/4Rz+VCEDzw6ecscJM+uJqR2fRmEUg==", "dev": true }, "esbuild-windows-32": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.12.tgz", - "integrity": "sha512-L9m4lLFQrFeR7F+eLZXG82SbXZfUhyfu6CexZEil6vm+lc7GDCE0Q8DiNutkpzjv1+RAbIGVva9muItQ7HVTkQ==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.11.tgz", + "integrity": "sha512-J1Ys5hMid8QgdY00OBvIolXgCQn1ARhYtxPnG6ESWNTty3ashtc4+As5nTrsErnv8ZGUcWZe4WzTP/DmEVX1UQ==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.12.tgz", - "integrity": "sha512-k4tX4uJlSbSkfs78W5d9+I9gpd+7N95W7H2bgOMFPsYREVJs31+Q2gLLHlsnlY95zBoPQMIzHooUIsixQIBjaQ==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.11.tgz", + "integrity": "sha512-h9FmMskMuGeN/9G9+LlHPAoiQk9jlKDUn9yA0MpiGzwLa82E7r1b1u+h2a+InprbSnSLxDq/7p5YGtYVO85Mlg==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.13.12", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.12.tgz", - "integrity": "sha512-2tTv/BpYRIvuwHpp2M960nG7uvL+d78LFW/ikPItO+2GfK51CswIKSetSpDii+cjz8e9iSPgs+BU4o8nWICBwQ==", + "version": "0.14.11", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.11.tgz", + "integrity": "sha512-dZp7Krv13KpwKklt9/1vBFBMqxEQIO6ri7Azf8C+ob4zOegpJmha2XY9VVWP/OyQ0OWk6cEeIzMJwInRZrzBUQ==", "dev": true, "optional": true }, @@ -5950,56 +7648,20 @@ "dev": true }, "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", + "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", "dev": true, "requires": { - "aproba": "^1.0.3", + "ansi-regex": "^5.0.1", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "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" - } - } + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" } }, "gensync": { @@ -6213,9 +7875,9 @@ "dev": true }, "hdr-histogram-js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.1.tgz", - "integrity": "sha512-uPZxl1dAFnjUFHWLZmt93vUUvtHeaBay9nVNHu38SdOjMSF/4KqJUqa1Seuj08ptU1rEb6AHvB41X8n/zFZ74Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", "dev": true, "requires": { "@assemblyscript/loader": "^0.10.1", @@ -6230,9 +7892,9 @@ "dev": true }, "hosted-git-info": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", - "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -6328,9 +7990,9 @@ } }, "http-parser-js": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", - "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", "dev": true }, "http-proxy": { @@ -6450,6 +8112,12 @@ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "dev": true }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6571,12 +8239,12 @@ "dev": true }, "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz", + "integrity": "sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==", "dev": true, "requires": { - "tslib": "~2.1.0" + "tslib": "^2.1.0" } }, "supports-color": { @@ -6587,27 +8255,9 @@ "requires": { "has-flag": "^4.0.0" } - }, - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true } } }, - "internal-ip": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", - "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", - "dev": true, - "requires": { - "default-gateway": "^6.0.0", - "ipaddr.js": "^1.9.1", - "is-ip": "^3.1.0", - "p-event": "^4.2.0" - } - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -6625,12 +8275,6 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ip-regex": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", - "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", - "dev": true - }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -6737,15 +8381,6 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, - "is-ip": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", - "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", - "dev": true, - "requires": { - "ip-regex": "^4.0.0" - } - }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -7032,9 +8667,9 @@ "dev": true }, "jest-worker": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", - "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", "dev": true, "requires": { "@types/node": "*", @@ -7532,9 +9167,9 @@ } }, "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "loader-runner": { @@ -7544,13 +9179,10 @@ "dev": true }, "loader-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.0.0.tgz", - "integrity": "sha512-ry4RE7qen73BFLgihlbyllGIW9SVWLUD5Cq9VWtzrqhntOMOJl8yEjA89d5mCUTT0puCnHo4EecO6bz+BOAS8w==", - "dev": true, - "requires": { - "big.js": "^6.1.1" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true }, "locate-path": { "version": "5.0.0", @@ -7745,9 +9377,9 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "memfs": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", - "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", "dev": true, "requires": { "fs-monkey": "1.0.3" @@ -7811,47 +9443,33 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.3.tgz", - "integrity": "sha512-zekavl9mZuGyk7COjsfFY/f655AX61EKE0AthXPrmDk+oZyjZ9WzO4WPjXnnO9xl8obK2kmM6rAQrBEmk+WK1g==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz", + "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", "dev": true, "requires": { - "schema-utils": "^3.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "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" + "fast-deep-equal": "^3.1.3" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "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 - }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } @@ -7878,9 +9496,9 @@ "dev": true }, "minipass": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", - "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -8063,9 +9681,9 @@ "dev": true }, "node-gyp": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.0.tgz", - "integrity": "sha512-Bi/oCm5bH6F+FmzfUxJpPaxMEyIhszULGR3TprmTeku8/dMFcdTcypk120NeZqEt54r1BrgEKtm2jJiuIKE28Q==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", "dev": true, "requires": { "env-paths": "^2.2.0", @@ -8073,7 +9691,7 @@ "graceful-fs": "^4.2.6", "make-fetch-happen": "^9.1.0", "nopt": "^5.0.0", - "npmlog": "^4.1.2", + "npmlog": "^6.0.0", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.2", @@ -8197,15 +9815,15 @@ } }, "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", + "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" } }, "nth-check": { @@ -8222,12 +9840,6 @@ "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", "dev": true }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -8430,30 +10042,6 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dev": true, - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -8497,23 +10085,6 @@ "requires": { "@types/retry": "^0.12.0", "retry": "^0.13.1" - }, - "dependencies": { - "retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true - } - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" } }, "p-try": { @@ -9527,13 +11098,13 @@ } }, "postcss-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.0.tgz", - "integrity": "sha512-H9hv447QjQJVDbHj3OUdciyAXY3v5+UDduzEytAlZCVHCpNAAg/mCSwhYYqZr9BiGYhmYspU8QXxZwiHTLn3yA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", - "klona": "^2.0.4", + "klona": "^2.0.5", "semver": "^7.3.5" } }, @@ -9993,9 +11564,9 @@ } }, "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==", + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", + "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -10003,9 +11574,9 @@ } }, "postcss-value-parser": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", - "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, "postcss-values-parser": { @@ -10056,6 +11627,14 @@ "requires": { "err-code": "^2.0.2", "retry": "^0.12.0" + }, + "dependencies": { + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + } } }, "protractor": { @@ -10583,12 +12162,6 @@ "source-map": "0.6.1" }, "dependencies": { - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, "loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", @@ -10635,9 +12208,9 @@ } }, "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true }, "reusify": { @@ -10708,18 +12281,19 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.43.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz", - "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0" + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" } }, "sass-loader": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.3.0.tgz", - "integrity": "sha512-6l9qwhdOb7qSrtOu96QQ81LVl8v6Dp9j1w3akOm0aWHyrTYtagDt5+kS32N4yq4hHk3M+rdqoRMH+lIdqvW6HA==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", "dev": true, "requires": { "klona": "^2.0.4", @@ -10802,12 +12376,6 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10855,9 +12423,9 @@ } }, "selfsigned": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", - "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -11114,22 +12682,14 @@ } }, "sockjs": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", - "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", "dev": true, "requires": { "faye-websocket": "^0.11.3", - "uuid": "^3.4.0", + "uuid": "^8.3.2", "websocket-driver": "^0.7.4" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } } }, "socks": { @@ -11143,9 +12703,9 @@ } }, "socks-proxy-agent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz", - "integrity": "sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", "dev": true, "requires": { "agent-base": "^6.0.2", @@ -11517,9 +13077,9 @@ } }, "terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "requires": { "commander": "^2.20.0", @@ -11528,12 +13088,12 @@ } }, "terser-webpack-plugin": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", - "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", "dev": true, "requires": { - "jest-worker": "^27.0.6", + "jest-worker": "^27.4.1", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0", "source-map": "^0.6.1", @@ -11552,12 +13112,6 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -11960,9 +13514,9 @@ } }, "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -12085,9 +13639,9 @@ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, "webpack": { - "version": "5.64.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.1.tgz", - "integrity": "sha512-b4FHmRgaaAjP+aVOVz41a9Qa5SmkUPQ+u8FntTQ1roPHahSComB6rXnLwc976VhUY4CqTaLu5mCswuHiNhOfVw==", + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -12112,7 +13666,7 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", + "watchpack": "^2.3.1", "webpack-sources": "^3.2.2" }, "dependencies": { @@ -12128,12 +13682,6 @@ "uri-js": "^4.2.2" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -12154,59 +13702,45 @@ } }, "webpack-dev-middleware": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz", - "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz", + "integrity": "sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==", "dev": true, "requires": { "colorette": "^2.0.10", "memfs": "^3.2.2", "mime-types": "^2.1.31", "range-parser": "^1.2.1", - "schema-utils": "^3.1.0" + "schema-utils": "^4.0.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "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" + "fast-deep-equal": "^3.1.3" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, - "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 - }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } } } }, "webpack-dev-server": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.4.0.tgz", - "integrity": "sha512-+S0XRIbsopVjPFjCO8I07FXYBWYqkFmuP56ucGMTs2hA/gV4q2M9xTmNo5Tg4o8ffRR+Nm3AsXnQXxKRyYovrA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", + "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", "dev": true, "requires": { "ansi-html-community": "^0.0.8", @@ -12215,17 +13749,17 @@ "colorette": "^2.0.10", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", "del": "^6.0.0", "express": "^4.17.1", "graceful-fs": "^4.2.6", "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.0", - "internal-ip": "^6.2.0", "ipaddr.js": "^2.0.1", "open": "^8.0.9", "p-retry": "^4.5.0", "portfinder": "^1.0.28", - "schema-utils": "^3.1.0", + "schema-utils": "^4.0.0", "selfsigned": "^1.10.11", "serve-index": "^1.9.1", "sockjs": "^0.3.21", @@ -12236,24 +13770,15 @@ "ws": "^8.1.0" }, "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "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" + "fast-deep-equal": "^3.1.3" } }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true - }, "ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -12294,21 +13819,16 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, - "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 - }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" } }, "strip-ansi": { @@ -12333,9 +13853,9 @@ } }, "webpack-sources": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", - "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, "webpack-subresource-integrity": { @@ -12536,24 +14056,24 @@ "dev": true }, "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", "dev": true, "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.0.0" }, "dependencies": { "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", "dev": true } } @@ -12570,12 +14090,6 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - }, "zone.js": { "version": "0.11.4", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index 3c8d357593..44a24ebc22 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -27,17 +27,17 @@ }, "private": true, "dependencies": { - "@angular/animations": "~13.0.2", - "@angular/cdk": "^13.0.2", - "@angular/common": "~13.0.2", - "@angular/compiler": "~13.0.2", - "@angular/core": "~13.0.2", - "@angular/forms": "~13.0.2", - "@angular/material": "^13.0.2", - "@angular/platform-browser": "~13.0.2", - "@angular/platform-browser-dynamic": "~13.0.2", - "@angular/platform-server": "^13.0.2", - "@angular/router": "~13.0.2", + "@angular/animations": "~13.1.2", + "@angular/cdk": "^13.1.2", + "@angular/common": "~13.1.2", + "@angular/compiler": "~13.1.2", + "@angular/core": "~13.1.2", + "@angular/forms": "~13.1.2", + "@angular/material": "^13.1.2", + "@angular/platform-browser": "~13.1.2", + "@angular/platform-browser-dynamic": "~13.1.2", + "@angular/platform-server": "^13.1.2", + "@angular/router": "~13.1.2", "@fortawesome/angular-fontawesome": "^0.10.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-regular-svg-icons": "^5.15.2", @@ -53,14 +53,14 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~13.0.3", + "@angular-devkit/build-angular": "~13.1.3", "@angular-eslint/builder": "13.0.1", "@angular-eslint/eslint-plugin": "13.0.1", "@angular-eslint/eslint-plugin-template": "13.0.1", "@angular-eslint/schematics": "13.0.1", "@angular-eslint/template-parser": "13.0.1", - "@angular/cli": "~13.0.3", - "@angular/compiler-cli": "~13.0.2", + "@angular/cli": "~13.1.3", + "@angular/compiler-cli": "~13.1.2", "@types/argparse": "^2.0.2", "@types/chart.js": "^2.9.34", "@types/express": "^4.17.0", diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 38426a893d..26d010ad2a 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -53,13 +53,10 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- GenericTableComponent, BooleanFilterComponent, UpdateCellRendererComponent, - CustomvalidityDirective, LinechartDirective, - OpenableDirective - ], - entryComponents: [ - SSHCellRendererComponent + OpenableDirective, + SSHCellRendererComponent, ], exports: [ AlertComponent, @@ -68,7 +65,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- GenericTableComponent, BooleanFilterComponent, UpdateCellRendererComponent, - CustomvalidityDirective, LinechartDirective, OpenableDirective @@ -79,8 +75,8 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- RouterModule ], providers: [ - {multi: true, provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor}, - {multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor}, + { multi: true, provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor }, + { multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor }, AlertService, CacheGroupService, CDNService, @@ -92,6 +88,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- ServerService, TypeService, UserService - ], + ] }) export class SharedModule { } From afd49621698c77e7f8560cbf9b9efc8ba4c05a8a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 13 Jan 2022 08:56:03 -0700 Subject: [PATCH 03/50] Remove now-unused directive for dialogs (Replaced by Angular Material MatDialog) (cherry picked from commit 593a04ce36334ae9e60c6e6580dd4532476279bf) --- .../invalidation-jobs.component.spec.ts | 2 - .../openable/openable.directive.spec.ts | 23 ------ .../app/shared/openable/openable.directive.ts | 70 ------------------- .../src/app/shared/shared.module.ts | 3 - 4 files changed, 98 deletions(-) delete mode 100644 experimental/traffic-portal/src/app/shared/openable/openable.directive.spec.ts delete mode 100644 experimental/traffic-portal/src/app/shared/openable/openable.directive.ts diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index c4b1b24265..91105859b1 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -23,7 +23,6 @@ import {DeliveryServiceService, InvalidationJobService, UserService} from "src/a import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { CustomvalidityDirective } from "../../shared/validation/customvalidity.directive"; -import { OpenableDirective } from "../../shared/openable/openable.directive"; import { DeliveryService, GeoLimit, GeoProvider, InvalidationJob, JobType } from "../../models"; import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; import { InvalidationJobsComponent } from "./invalidation-jobs.component"; @@ -64,7 +63,6 @@ describe("InvalidationJobsComponent", () => { declarations: [ InvalidationJobsComponent, TpHeaderComponent, - OpenableDirective, CustomvalidityDirective ], imports: [ diff --git a/experimental/traffic-portal/src/app/shared/openable/openable.directive.spec.ts b/experimental/traffic-portal/src/app/shared/openable/openable.directive.spec.ts deleted file mode 100644 index 646352e9ec..0000000000 --- a/experimental/traffic-portal/src/app/shared/openable/openable.directive.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -import { ElementRef } from "@angular/core"; - -import { OpenableDirective } from "./openable.directive"; - -describe("OpenableDirective", () => { - it("should create an instance", () => { - const directive = new OpenableDirective(new ElementRef(document.createElement("dialog"))); - expect(directive).toBeTruthy(); - }); -}); diff --git a/experimental/traffic-portal/src/app/shared/openable/openable.directive.ts b/experimental/traffic-portal/src/app/shared/openable/openable.directive.ts deleted file mode 100644 index 655f05a9fe..0000000000 --- a/experimental/traffic-portal/src/app/shared/openable/openable.directive.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from "@angular/core"; - -import { Observable, of, Subscription } from "rxjs"; - -/** - * OpenableDirective allows or toggle-able dialogs. This is essentially a - * polyfill for browsers that don't support true dialog elements. - */ -@Directive({ - selector: "dialog[openable][toggle]" -}) -export class OpenableDirective implements AfterViewInit, OnDestroy { - /** An Observable that emits toggle states for the dialog. */ - @Input() public toggle: Observable = of(true); - - /** A subscription for the toggle input. */ - private subscription: Subscription | null = null; - - /** - * Constructor. - */ - constructor(private readonly element: ElementRef) { } - - /** Initializes toggle listening. */ - public ngAfterViewInit(): void { - if (!this.element.nativeElement) { - console.warn("Use of DOM directive in non-DOM context!"); - return; - } - - this.subscription = this.toggle.subscribe( - v => { - if (v) { - if (!this.element.nativeElement.open) { - this.element.nativeElement.showModal(); - } else { - console.warn("Attempted to open dialog that is already open!"); - } - } else if (this.element.nativeElement.open) { - this.element.nativeElement.close(); - } else { - console.warn("Attempted to close dialog that is already closed!"); - } - }, - e => { - console.error(e); - } - ); - } - - /** cleans up subscriptions on element destruction. */ - public ngOnDestroy(): void { - if (this.subscription) { - this.subscription.unsubscribe(); - } - } -} diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 26d010ad2a..9e3d3f5a89 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -35,7 +35,6 @@ import { import {PhysicalLocationService} from "./api/PhysicalLocationService"; import {CurrentUserService} from "./currentUser/current-user.service"; import {CustomvalidityDirective} from "./validation/customvalidity.directive"; -import {OpenableDirective} from "./openable/openable.directive"; import {SSHCellRendererComponent} from "./table-components/ssh-cell-renderer/ssh-cell-renderer.component"; import {UpdateCellRendererComponent} from "./table-components/update-cell-renderer/update-cell-renderer.component"; import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean-filter.component"; @@ -55,7 +54,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- UpdateCellRendererComponent, CustomvalidityDirective, LinechartDirective, - OpenableDirective, SSHCellRendererComponent, ], exports: [ @@ -67,7 +65,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- UpdateCellRendererComponent, CustomvalidityDirective, LinechartDirective, - OpenableDirective ], imports: [ AppUIModule, From 058e10cba19533bd9a8f265dcf1bde3a38695dc2 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 13 Jan 2022 12:46:19 -0700 Subject: [PATCH 04/50] Simplify customvalidity directive (cherry picked from commit 73891df8e6368d1d5801d93b5d7ef7a537aaa890) --- .../update-password-dialog.component.html | 2 +- .../new-invalidation-job-dialog.component.html | 2 +- .../src/app/shared/validation/customvalidity.directive.ts | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.html b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.html index 63e34c6cfb..9636f702b1 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.html +++ b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.html @@ -20,7 +20,7 @@

Change Password

Confirm Password - +
diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.html b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.html index 10b29d47e0..48e80ab131 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.html +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.html @@ -26,7 +26,7 @@

New Content Invalidation Job

Content Pattern to Invalidate - + A regular expression. Matching request paths will be invalidated diff --git a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts index 7e677c6793..760ce5c4a6 100644 --- a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts +++ b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts @@ -20,7 +20,7 @@ import { Observable, of, Subscription } from "rxjs"; * them. */ @Directive({ - selector: "input[customvalidity][valid]" + selector: "input[customvalidity]" }) export class CustomvalidityDirective implements AfterViewInit, OnDestroy { /** @@ -28,7 +28,7 @@ export class CustomvalidityDirective implements AfterViewInit, OnDestroy { * the input changes. An empty string signifies "valid", whereas any other * string should be a description of why the input is invalid. */ - @Input() public valid: Observable = of(""); + @Input() public customvalidity: Observable = of(""); /** A subscription for the 'validity' input. */ private subscription: Subscription | null = null; @@ -45,7 +45,7 @@ export class CustomvalidityDirective implements AfterViewInit, OnDestroy { return; } - this.subscription = this.valid.subscribe( + this.subscription = this.customvalidity.subscribe( s => { if (s) { this.element.nativeElement.setCustomValidity(s); From de143b57d35ba83f08b5e70c58c02b8a770b0e92 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 14 Jan 2022 10:52:21 -0700 Subject: [PATCH 05/50] Increase test coverage --- .../invalidation-jobs.component.spec.ts | 2 +- .../server-details.component.spec.ts | 56 ++++++++++ .../servers-table.component.spec.ts | 100 +++++++++++++++++- .../servers-table/servers-table.component.ts | 6 +- .../update-status.component.spec.ts | 47 ++++++++ .../app/core/users/users.component.spec.ts | 82 +++++++++++++- .../traffic-portal/src/app/models/user.ts | 18 ++-- .../app/shared/alert/alert.component.spec.ts | 17 ++- .../src/app/shared/alert/alert.component.ts | 3 - .../src/app/shared/alert/alert.service.ts | 2 +- .../shared/charts/linechart.directive.spec.ts | 24 ++++- .../generic-table.component.spec.ts | 38 ++++++- .../generic-table/generic-table.component.ts | 2 +- .../boolean-filter.component.spec.ts | 53 ++++++++++ .../boolean-filter.component.ts | 4 +- .../ssh-cell-renderer.component.spec.ts | 19 ++++ .../update-cell-renderer.component.spec.ts | 22 ++++ .../validation/customvalidity.directive.ts | 10 +- .../src/app/utils/order-by.spec.ts | 21 ++++ .../traffic-portal/src/app/utils/order-by.ts | 17 +-- 20 files changed, 488 insertions(+), 55 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index 91105859b1..581ee8dbf6 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -108,7 +108,7 @@ describe("InvalidationJobsComponent", () => { j.startTime = new Date(component.now); j.startTime.setMinutes(j.startTime.getMinutes()-30); expect(component.isInProgress(j)).toBeTrue(); - j.startTime = new Date(); + j.startTime.setMinutes(j.startTime.getMinutes()+31); expect(component.isInProgress(j)).toBeFalse(); }); diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index 69b79becb3..ac5b0cb246 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -16,6 +16,8 @@ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; +import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; +import { defaultServer } from "src/app/models"; import {CacheGroupService, CDNService, ProfileService, ServerService, TypeService} from "../../../shared/api"; import {PhysicalLocationService} from "../../../shared/api/PhysicalLocationService"; @@ -53,10 +55,64 @@ describe("ServerDetailsComponent", () => { beforeEach(() => { fixture = TestBed.createComponent(ServerDetailsComponent); component = fixture.componentInstance; + component.server = {...defaultServer}; fixture.detectChanges(); }); it("should create", () => { expect(component).toBeTruthy(); }); + + it("gets the right status icon", () => { + component.server.status = "ONLINE"; + expect(component.statusChangeIcon).toBe(faToggleOn); + component.server.status = "OFFLINE"; + expect(component.statusChangeIcon).toBe(faToggleOff); + component.server.status = "REPORTED"; + expect(component.statusChangeIcon).toBe(faToggleOn); + component.server.status = "Anything else"; + expect(component.statusChangeIcon).toBe(faToggleOff); + }); + + it("adds and removes interfaces", () => { + expect(component.server.interfaces.length).toBe(0); + component.addInterface(new MouseEvent("click")); + expect(component.server.interfaces.length).toBe(1); + component.addInterface(new MouseEvent("click")); + expect(component.server.interfaces.length).toBe(2); + component.deleteInterface(1); + expect(component.server.interfaces.length).toBe(1); + component.deleteInterface(0); + expect(component.server.interfaces.length).toBe(0); + }); + + it("adds and removes IP addresses to/from an interface", () => { + component.addInterface(new MouseEvent("click")); + expect(component.server.interfaces[0].ipAddresses.length).toBe(0); + component.addIP(component.server.interfaces[0]); + expect(component.server.interfaces[0].ipAddresses.length).toBe(1); + component.addIP(component.server.interfaces[0]); + expect(component.server.interfaces[0].ipAddresses.length).toBe(2); + component.deleteIP(component.server.interfaces[0], 1); + expect(component.server.interfaces[0].ipAddresses.length).toBe(1); + component.deleteIP(component.server.interfaces[0], 0); + expect(component.server.interfaces[0].ipAddresses.length).toBe(0); + }); + + it("knows if it's a cache", () => { + const s = component.server; + expect(component.isCache()).toBeFalse(); + s.type = "EDGE"; + expect(component.isCache()).toBeTrue(); + s.type = "EDGE_anything"; + expect(component.isCache()).toBeTrue(); + s.type = "MID"; + expect(component.isCache()).toBeTrue(); + s.type = "MID_anything"; + expect(component.isCache()).toBeTrue(); + s.type = "a string that merely CONTAINS 'EDGE' instead of starting with it"; + expect(component.isCache()).toBeFalse(); + s.type = "RASCAL"; + expect(component.isCache()).toBeFalse(); + }); }); diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts index b1a2942a9a..554ff81038 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts @@ -17,9 +17,10 @@ import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import {TpHeaderComponent} from "../../../shared/tp-header/tp-header.component"; -import {ServerService, UserService} from "../../../shared/api"; -import { ServersTableComponent } from "./servers-table.component"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { ServerService, UserService } from "src/app/shared/api"; +import { defaultServer, Server } from "src/app/models"; +import { augment, AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; describe("ServersTableComponent", () => { @@ -51,4 +52,97 @@ describe("ServersTableComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("knows if a server is a cache", () => { + const s: AugmentedServer = {...defaultServer, ipv4Address: "", ipv6Address: "", type: undefined}; + expect(serverIsCache(s)).toBeFalse(); + s.type = "EDGE"; + expect(serverIsCache(s)).toBeTrue(); + s.type = "EDGE_anything"; + expect(serverIsCache(s)).toBeTrue(); + s.type = "MID"; + expect(serverIsCache(s)).toBeTrue(); + s.type = "MID_anything"; + expect(serverIsCache(s)).toBeTrue(); + s.type = "a string that merely CONTAINS 'EDGE' instead of starting with it"; + expect(serverIsCache(s)).toBeFalse(); + s.type = "RASCAL"; + expect(serverIsCache(s)).toBeFalse(); + }); + + it("augments servers", () => { + const s: Server = {...defaultServer, interfaces: []}; + let a = augment(s); + expect(a.ipv4Address).toBe(""); + expect(a.ipv6Address).toBe(""); + + s.interfaces.push({ + ipAddresses: [], + maxBandwidth: null, + monitor: false, + mtu: null, + name: "test" + }); + a = augment(s); + expect(a.ipv4Address).toBe(""); + expect(a.ipv6Address).toBe(""); + + s.interfaces[0].ipAddresses.push({ + address: "192.0.2.0", + gateway: null, + serviceAddress: false + }); + a = augment(s); + expect(a.ipv4Address).toBe(""); + expect(a.ipv6Address).toBe(""); + + s.interfaces[0].ipAddresses.push({ + address: "2001::1", + gateway: null, + serviceAddress: false + }); + a = augment(s); + expect(a.ipv4Address).toBe(""); + expect(a.ipv6Address).toBe(""); + + s.interfaces.push({ + ipAddresses: [ + { + address: "192.0.2.1", + gateway: null, + serviceAddress: false + }, + { + address: "2001::2", + gateway: null, + serviceAddress: false + } + ], + maxBandwidth: null, + monitor: true, + mtu: null, + name: "quest" + }); + a = augment(s); + expect(a.ipv4Address).toBe(""); + expect(a.ipv6Address).toBe(""); + + s.interfaces[1].ipAddresses.push({ + address: "192.0.2.2", + gateway: null, + serviceAddress: true + }); + a = augment(s); + expect(a.ipv4Address).toBe("192.0.2.2"); + expect(a.ipv6Address).toBe(""); + + s.interfaces[1].ipAddresses.push({ + address: "2001::3", + gateway: null, + serviceAddress: true + }); + a = augment(s); + expect(a.ipv4Address).toBe("192.0.2.2"); + expect(a.ipv6Address).toBe("2001::3"); + }); }); diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts index 9e62ec57eb..37616d61a6 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts @@ -27,7 +27,7 @@ import { ContextMenuActionEvent, ContextMenuItem } from "../../../shared/generic /** * AugmentedServer has fields that give direct access to its service addresses without needing to recalculate them. */ -interface AugmentedServer extends Server { +export interface AugmentedServer extends Server { /** The server's IPv4 service address */ ipv4Address: string; /** The server's IPv6 service address */ @@ -40,7 +40,7 @@ interface AugmentedServer extends Server { * @param s The server to convert. * @returns The converted server. */ -function augment(s: Server): AugmentedServer { +export function augment(s: Server): AugmentedServer { const aug: AugmentedServer = {ipv4Address: "", ipv6Address: "", ...s}; let inf: Interface; try { @@ -74,7 +74,7 @@ function augment(s: Server): AugmentedServer { * @param data The server to check. * @returns Whether or not 'data' is a Cache Server. */ -function serverIsCache(data: AugmentedServer): boolean { +export function serverIsCache(data: AugmentedServer): boolean { if (!data || !data.type) { return false; } diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts index 6fc5506151..47fd1dcd21 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts @@ -13,6 +13,7 @@ */ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { defaultServer } from "src/app/models"; import {ServerService} from "../../../shared/api"; import { UpdateStatusComponent } from "./update-status.component"; @@ -43,4 +44,50 @@ describe("UpdateStatusComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("gets server names", () => { + expect(component.serverName).toBe("0 servers"); + component.servers = [{ + ...defaultServer, + hostName: "host", + }]; + expect(component.serverName).toBe("host"); + component.servers.push({...defaultServer, hostName: "a different host"}); + expect(component.serverName).toBe("2 servers"); + }); + + it("sets the 'current' status ID based on selected servers", () => { + expect(component.currentStatus).toBeNull(); + + fixture = TestBed.createComponent(UpdateStatusComponent); + component = fixture.componentInstance; + component.servers = [{...defaultServer, statusId: 9001}]; + fixture.detectChanges(); + expect(component.currentStatus).toBe(9001); + + fixture = TestBed.createComponent(UpdateStatusComponent); + component = fixture.componentInstance; + component.servers = [{...defaultServer, statusId: 9001}, {...defaultServer, statusId: 9001}]; + fixture.detectChanges(); + expect(component.currentStatus).toBe(9001); + + fixture = TestBed.createComponent(UpdateStatusComponent); + component = fixture.componentInstance; + component.servers = [{...defaultServer, statusId: 9001}, {...defaultServer, statusId: 9}]; + fixture.detectChanges(); + expect(component.currentStatus).toBeNull(); + }); + + it("cancels", () => { + let isDone = false; + const spy = jasmine.createSpy("doneSubscription", (v: boolean): void => { + expect(v).toBe(isDone); + }); + component.done.subscribe(spy); + isDone = true; + component.cancel(); + expect(spy).toHaveBeenCalled(); + component.closeOnEscape(new KeyboardEvent("keydown", {code: "Escape"})); + expect(spy).toHaveBeenCalledTimes(2); + }); }); diff --git a/experimental/traffic-portal/src/app/core/users/users.component.spec.ts b/experimental/traffic-portal/src/app/core/users/users.component.spec.ts index ccc5244fdf..54851ab366 100644 --- a/experimental/traffic-portal/src/app/core/users/users.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/users/users.component.spec.ts @@ -17,10 +17,10 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { User } from "../../models"; -import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; -import {LoadingComponent} from "../../shared/loading/loading.component"; -import {UserService} from "../../shared/api"; +import type { User } from "src/app/models"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { LoadingComponent } from "src/app/shared/loading/loading.component"; +import { UserService } from "src/app/shared/api"; import { UsersComponent } from "./users.component"; describe("UsersComponent", () => { @@ -70,6 +70,80 @@ describe("UsersComponent", () => { expect(component).toBeTruthy(); }); + it("can tell if a user has a location", () => { + const u: User = { + city: "Townsville", + country: "Countryland", + id: -1, + newUser: false, + postalCode: "00000", + stateOrProvince: "Provincia", + username: "test" + }; + expect(component.userHasLocation(u)).toBeTrue(); + u.city = null; + expect(component.userHasLocation(u)).toBeTrue(); + u.stateOrProvince = null; + expect(component.userHasLocation(u)).toBeTrue(); + u.country = null; + expect(component.userHasLocation(u)).toBeTrue(); + u.postalCode = null; + expect(component.userHasLocation(u)).toBeFalse(); + u.country = "Countryland"; + expect(component.userHasLocation(u)).toBeTrue(); + u.country = null; + u.stateOrProvince = "Provincia"; + expect(component.userHasLocation(u)).toBeTrue(); + u.stateOrProvince = null; + u.city = "Townsville"; + expect(component.userHasLocation(u)).toBeTrue(); + }); + + it("builds user location strings", () => { + const u: User = { + city: "Townsville", + country: "Countryland", + id: -1, + newUser: false, + postalCode: "00000", + stateOrProvince: "Provincia", + username: "test" + }; + expect(component.userLocationString(u)).toBe("Townsville, Provincia, Countryland, 00000"); + u.city = null; + expect(component.userLocationString(u)).toBe("Provincia, Countryland, 00000"); + u.stateOrProvince = null; + expect(component.userLocationString(u)).toBe("Countryland, 00000"); + u.country = null; + expect(component.userLocationString(u)).toBe("00000"); + u.postalCode = null; + expect(component.userLocationString(u)).toBeNull(); + u.country = "Countryland"; + expect(component.userLocationString(u)).toBe("Countryland"); + u.country = null; + u.stateOrProvince = "Provincia"; + expect(component.userLocationString(u)).toBe("Provincia"); + u.stateOrProvince = null; + u.city = "Townsville"; + expect(component.userLocationString(u)).toBe("Townsville"); + }); + + it("searches fuzz-ily", ()=>{ + const u = { + id: -1, + newUser: false, + username: "test" + }; + expect(component.fuzzControl.value).toBe(""); + expect(component.fuzzy(u)).toBeTrue(); + component.fuzzControl.setValue(`${u.username}z`); + expect(component.fuzzy(u)).toBeFalse(); + component.fuzzControl.setValue(u.username); + expect(component.fuzzy(u)).toBeTrue(); + component.fuzzControl.setValue(`${u.username[0]}${u.username.slice(-1)[0]}`); + expect(component.fuzzy(u)).toBeTrue(); + }); + afterAll(() => { try{ TestBed.resetTestingModule(); diff --git a/experimental/traffic-portal/src/app/models/user.ts b/experimental/traffic-portal/src/app/models/user.ts index 388573e60d..85535e8bb8 100644 --- a/experimental/traffic-portal/src/app/models/user.ts +++ b/experimental/traffic-portal/src/app/models/user.ts @@ -17,17 +17,17 @@ */ export interface User { /** Line one of the user's address. */ - addressLine1?: string; + addressLine1?: string | null; /** Line two of the user's address. */ - addressLine2?: string; + addressLine2?: string | null; /** The city in which the user lives/is based. */ - city?: string; + city?: string | null; /** The company for which the user works. */ - company?: string; + company?: string | null; /** A confirmation field for the user's password - this has no known effect, but we set it anyway on password update. */ confirmLocalPasswd?: string; /** The country in which the user lives/is based. */ - country?: string; + country?: string | null; /** The user's email address. */ email?: string; /** The user's full name. */ @@ -48,17 +48,17 @@ export interface User { */ newUser: boolean; /** The user's phone number. */ - phoneNumber?: string; + phoneNumber?: string | null; /** The postal code where the user lives/is based. */ - postalCode?: string; + postalCode?: string | null; /** The user's public SSH key. */ - publicSshKey?: string; + publicSshKey?: string | null; /** The integral, unique identifier of the Role the user has. */ role?: number; /** The user's Role. */ rolename?: string; /** The state or province within which the user lives/is based. */ - stateOrProvince?: string; + stateOrProvince?: string | null; /** The Tenant to which the user belongs. */ tenant?: string; /** An integral, unique identifier for the Tenant to which the user belongs. */ diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts b/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts index 33533868cb..f42b2b60bd 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts @@ -49,19 +49,32 @@ describe("AlertComponent", () => { it("should load simple alerts", async () => { const levels: Array = ["error", "warning", "info", "success"]; + let snackBars; + let snackBar; for (const errLevel of levels) { const msg = `An alert at the '${errLevel}' level`; service.newAlert(errLevel, msg); - let snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + snackBars = await loader.getAllHarnesses(MatSnackBarHarness); expect(snackBars.length).toBe(1); - const snackBar = await loader.getHarness(MatSnackBarHarness); + snackBar = await loader.getHarness(MatSnackBarHarness); expect(await snackBar.getMessage()).toBe(msg); fixture.componentInstance.clear(); snackBars = await loader.getAllHarnesses(MatSnackBarHarness); expect(snackBars.length).toBe(0); } + service.newAlert({level: "info", text: ""}); + + snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + expect(snackBars.length).toBe(1); + + snackBar = await loader.getHarness(MatSnackBarHarness); + expect(await snackBar.getMessage()).toBe("Unknown"); + + fixture.componentInstance.clear(); + snackBars = await loader.getAllHarnesses(MatSnackBarHarness); + expect(snackBars.length).toBe(0); }); }); diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.component.ts b/experimental/traffic-portal/src/app/shared/alert/alert.component.ts index 7259c049a7..9a2e6c5751 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.component.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.component.ts @@ -59,9 +59,6 @@ export class AlertComponent implements OnDestroy { case "error": console.error("alert: ", a.text); break; - default: - console.log("unknown alert: ", a.text); - break; } this.snackBar.open(a.text, "dismiss", {duration: this.duration, verticalPosition: "top"}); } diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.service.ts b/experimental/traffic-portal/src/app/shared/alert/alert.service.ts index 50922e6fb7..6c4f415224 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.service.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.service.ts @@ -58,7 +58,7 @@ export class AlertService { */ public newAlert(levelOrAlert: AlertLevel | Alert, text?: string): void { if (typeof levelOrAlert === "string") { - if (text === null || text === undefined) { + if (text === undefined) { throw new Error("Can't pass raw level without raw text!"); } this.alertsSubject.next({level: levelOrAlert, text}); diff --git a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts index 6b40d0afbd..cf523e4ce0 100644 --- a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts +++ b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts @@ -12,11 +12,33 @@ * limitations under the License. */ import { ElementRef } from "@angular/core"; +import { BehaviorSubject } from "rxjs"; +import type { DataSet } from "src/app/models"; import { LinechartDirective } from "./linechart.directive"; describe("LinechartDirective", () => { + let directive: LinechartDirective; + const dataSets = new BehaviorSubject|null>(null); + + beforeEach(()=>{ + directive = new LinechartDirective(new ElementRef(document.createElement("canvas"))); + directive.chartDataSets = dataSets; + directive.ngAfterViewInit(); + }); + it("should create an instance", () => { - const directive = new LinechartDirective(new ElementRef(null)); expect(directive).toBeTruthy(); }); + + it("sets a default type when not given", () => { + expect(directive.chartType).toBe("linear"); + }); + + it("loads new data", () => { + // TODO: check more than just that these don't throw errors + dataSets.next([{data: [{x: 1, y: 2}, {x: 2, y: 4}], label: "label"}]); + dataSets.next([null, {data: [{x: 1, y: 2}], label: "label"}]); + dataSets.next([{data: [{x: 1, y: 2}, {x: 2, y: 4}], label: "label"}, null]); + dataSets.next(null); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts index 501b49c247..bcfa13a9cd 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts @@ -14,6 +14,8 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; +import { AgGridModule } from "ag-grid-angular"; +import type { RowNode } from "ag-grid-community"; import { GenericTableComponent } from "./generic-table.component"; @@ -23,13 +25,17 @@ describe("GenericTableComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ GenericTableComponent ], - imports: [ RouterTestingModule ] + declarations: [ + GenericTableComponent, + + ], + imports: [ + AgGridModule.withComponents([]), + RouterTestingModule + ] }).compileComponents(); - }); - beforeEach(() => { - fixture = TestBed.createComponent(GenericTableComponent); + fixture = TestBed.createComponent>(GenericTableComponent); component = fixture.componentInstance; fixture.detectChanges(); }); @@ -37,4 +43,26 @@ describe("GenericTableComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("can tell if a context menu item is an action", () => { + expect(component.isAction({href: "/core/dashboard", name: "Dashboard"})).toBeFalse(); + expect(component.isAction({href: "/core/dashboard", name: "Dashboard", newTab: true})).toBeFalse(); + expect(component.isAction({action: "do something", name: "Something"})).toBeTrue(); + expect(component.isAction({action: "do something", multiRow: true, name: "Something"})).toBeTrue(); + }); + + it("makes all data pass the filter when there is no search box", () => { + expect(component.filter({} as RowNode)).toBeTrue(); + }); + + it("throws an error trying to check if a context menu item is disabled with no selection", () => { + expect(()=>component.isDisabled({action: "anything", name: "whatever"})).toThrow(); + expect(()=>component.isDisabled({action: "anything", disabled: ()=>false, name: "who cares"})).toThrow(); + }); + + it("throws an error trying to emit a context menu action with no selection", ()=>{ + expect(()=>component.emitContextMenuAction("anything", false, new MouseEvent("click"))).toThrow(); + expect(()=>component.emitContextMenuAction("anything", true, new MouseEvent("click"))).toThrow(); + expect(()=>component.emitContextMenuAction("anything", undefined, new MouseEvent("click"))).toThrow(); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts index b8e914cd64..90b8410517 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts @@ -582,7 +582,7 @@ export class GenericTableComponent implements OnInit, OnDestroy { */ public selectAll(de?: boolean): void { if (!this.gridAPI) { - console.error("Cannot de-select: no grid API handle"); + console.error("Cannot (de-)select: no grid API handle"); return; } diff --git a/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.spec.ts b/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.spec.ts index 53b61c1b11..701b9cda79 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.spec.ts @@ -12,12 +12,14 @@ * limitations under the License. */ import { ComponentFixture, TestBed } from "@angular/core/testing"; +import type { IFilterParams, RowNode } from "ag-grid-community"; import { BooleanFilterComponent } from "./boolean-filter.component"; describe("BooleanFilterComponent", () => { let component: BooleanFilterComponent; let fixture: ComponentFixture; + let filterChangedCallback: jasmine.Spy; beforeEach(async () => { await TestBed.configureTestingModule({ @@ -27,12 +29,63 @@ describe("BooleanFilterComponent", () => { }); beforeEach(() => { + filterChangedCallback = jasmine.createSpy("AG-Grid filter changed callback"); fixture = TestBed.createComponent(BooleanFilterComponent); component = fixture.componentInstance; fixture.detectChanges(); + component.agInit({ + filterChangedCallback, + valueGetter: (n: RowNode): boolean => n.data, + } as unknown as IFilterParams); }); it("should create", () => { expect(component).toBeTruthy(); }); + + it("gets and sets the filter model", ()=>{ + const model = {should: false, value: false}; + expect(component.getModel()).toEqual(model); + expect(component.isFilterActive()).toBeFalse(); + + model.should = true; + component.setModel(model); + expect(component.getModel()).toEqual(model); + expect(component.isFilterActive()).toBeTrue(); + + model.value = true; + component.setModel(model); + expect(component.getModel()).toEqual(model); + expect(component.isFilterActive()).toBeTrue(); + + model.should = false; + component.setModel(model); + expect(component.getModel()).toEqual(model); + expect(component.isFilterActive()).toBeFalse(); + }); + + it("handles changes", () => { + component.onChange(true, "value"); + expect(filterChangedCallback).toHaveBeenCalled(); + expect(component.getModel().value).toBeTrue(); + expect(component.isFilterActive()).toBeFalse(); + + component.onChange(true, "should"); + expect(filterChangedCallback).toHaveBeenCalledTimes(2); + expect(component.getModel().should).toBeTrue(); + expect(component.isFilterActive()).toBeTrue(); + }); + + it("knows if a filter passes", () => { + const node = {data: false} as RowNode; + component.onChange(true, "should"); + expect(component.isFilterActive()).toBeTrue(); + expect(component.doesFilterPass({data: null, node})).toBeTrue(); + node.data = true; + expect(component.doesFilterPass({data: null, node})).toBeFalse(); + component.onChange(true, "value"); + expect(component.doesFilterPass({data: null, node})).toBeTrue(); + node.data = false; + expect(component.doesFilterPass({data: null, node})).toBeFalse(); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.ts b/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.ts index 7fb097d52d..bbb6a536e7 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/boolean-filter/boolean-filter.component.ts @@ -40,7 +40,7 @@ export class BooleanFilterComponent implements AgFilterComponent { public value = false; /** Initialization parameters. */ - private params: IFilterParams = null as unknown as IFilterParams; + private params!: IFilterParams; /** * Called by AG-Grid to check if the filter is in effect. @@ -71,14 +71,12 @@ export class BooleanFilterComponent implements AgFilterComponent { switch (input) { case "should": if (event !== this.shouldFilter) { - console.log("setting should filter:", event); this.shouldFilter = event; this.params.filterChangedCallback(); } break; case "value": if (event !== this.value) { - console.log("setting filter value:", event); this.value = event; this.params.filterChangedCallback(); } diff --git a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts index 7411966423..2204f74896 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts @@ -14,6 +14,7 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; +import type { ICellRendererParams } from "ag-grid-community"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { SSHCellRendererComponent } from "./ssh-cell-renderer.component"; @@ -42,4 +43,22 @@ describe("SshCellRendererComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("initializes", () => { + component.agInit({value: "192.0.2.1"} as ICellRendererParams); + expect(component.value).toBe("192.0.2.1"); + + component.agInit({value: "192.0.2.2"} as ICellRendererParams); + expect(component.value).toBe("192.0.2.2"); + }); + + it("refreshes", () => { + let ret = component.refresh({value: "192.0.2.1"} as ICellRendererParams); + expect(ret).toBeTrue(); + expect(component.value).toBe("192.0.2.1"); + + ret = component.refresh({value: "192.0.2.2"} as ICellRendererParams); + expect(ret).toBeTrue(); + expect(component.value).toBe("192.0.2.2"); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/table-components/update-cell-renderer/update-cell-renderer.component.spec.ts b/experimental/traffic-portal/src/app/shared/table-components/update-cell-renderer/update-cell-renderer.component.spec.ts index 576b54d9fb..adcf66df30 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/update-cell-renderer/update-cell-renderer.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/update-cell-renderer/update-cell-renderer.component.spec.ts @@ -12,6 +12,8 @@ * limitations under the License. */ import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { faCheck, faClock } from "@fortawesome/free-solid-svg-icons"; +import type { ICellRendererParams } from "ag-grid-community"; import { UpdateCellRendererComponent } from "./update-cell-renderer.component"; @@ -35,4 +37,24 @@ describe("UpdateCellRendererComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("initializes", () => { + component.agInit({value: true} as ICellRendererParams); + expect(component.value).toBeTrue(); + + component.agInit({value: false} as ICellRendererParams); + expect(component.value).toBeFalse(); + }); + + it("refreshes", () => { + let ret = component.refresh({value: true} as ICellRendererParams); + expect(ret).toBeTrue(); + expect(component.value).toBeTrue(); + expect(component.icon).toBe(faClock); + + ret = component.refresh({value: false} as ICellRendererParams); + expect(ret).toBeTrue(); + expect(component.value).toBeFalse(); + expect(component.icon).toBe(faCheck); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts index 760ce5c4a6..ad45decc5e 100644 --- a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts +++ b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts @@ -13,7 +13,7 @@ */ import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from "@angular/core"; -import { Observable, of, Subscription } from "rxjs"; +import type { Observable, Subscription } from "rxjs"; /** * CustomvalidityDirective decorates inputs, adding custom validity messages to @@ -28,10 +28,10 @@ export class CustomvalidityDirective implements AfterViewInit, OnDestroy { * the input changes. An empty string signifies "valid", whereas any other * string should be a description of why the input is invalid. */ - @Input() public customvalidity: Observable = of(""); + @Input() public customvalidity!: Observable; /** A subscription for the 'validity' input. */ - private subscription: Subscription | null = null; + private subscription!: Subscription; /** * Constructor. @@ -63,9 +63,7 @@ export class CustomvalidityDirective implements AfterViewInit, OnDestroy { * Cleans up subscription after the element is destroyed. */ public ngOnDestroy(): void { - if (this.subscription) { - this.subscription.unsubscribe(); - } + this.subscription.unsubscribe(); } } diff --git a/experimental/traffic-portal/src/app/utils/order-by.spec.ts b/experimental/traffic-portal/src/app/utils/order-by.spec.ts index 569d473e5d..b05c28cd8f 100644 --- a/experimental/traffic-portal/src/app/utils/order-by.spec.ts +++ b/experimental/traffic-portal/src/app/utils/order-by.spec.ts @@ -63,4 +63,25 @@ describe("orderBy", () => { expect(output[1].foo).toEqual(2); expect(output[2].foo).toEqual(1); }); + + it("sorts null values to be last", ()=>{ + let input = [{foo: 1}, {foo: -1}, {foo: null}]; + let output = orderBy(input, "foo"); + expect(output[0].foo).toBe(-1); + expect(output[1].foo).toBe(1); + expect(output[2].foo).toBeNull(); + + input = input.reverse(); + output = orderBy(input, "foo"); + expect(output[0].foo).toBe(-1); + expect(output[1].foo).toBe(1); + expect(output[2].foo).toBeNull(); + + input = [{foo: Infinity}, {foo: -Infinity}, {foo: null}, {foo: null}]; + output = orderBy(input, "foo"); + expect(output[0].foo).toBeNegativeInfinity(); + expect(output[1].foo).toBePositiveInfinity(); + expect(output[2].foo).toBeNull(); + expect(output[3].foo).toBeNull(); + }); }); diff --git a/experimental/traffic-portal/src/app/utils/order-by.ts b/experimental/traffic-portal/src/app/utils/order-by.ts index 7a61e55fc8..e62997da02 100644 --- a/experimental/traffic-portal/src/app/utils/order-by.ts +++ b/experimental/traffic-portal/src/app/utils/order-by.ts @@ -84,16 +84,12 @@ export function orderBy(value: Array, property: string | Array for (const p of props) { - let aProp; - let bProp; - - let bail = false; - if (!a.hasOwnProperty(p)) { + if (!Object.prototype.hasOwnProperty.call(a, p)) { console.error("object", a, `has no property "${p}"!`); bail = true; } - if (!b.hasOwnProperty(p)) { + if (!Object.prototype.hasOwnProperty.call(b, p)) { console.error("object", b, `has no property "${p}"!`); bail = true; } @@ -102,13 +98,8 @@ export function orderBy(value: Array, property: string | Array return 0; } - try { - aProp = a[p]; - bProp = b[p]; - } catch (e) { - console.error(e); - return 0; - } + const aProp = a[p]; + const bProp = b[p]; let result: number; try { From 1e02968e36c028ed69dc09c4d335473d63f33da8 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 19 Jan 2022 16:59:37 -0700 Subject: [PATCH 06/50] Add API module and companion testing module --- .../src/app/api/base-api.service.ts | 167 ++++++++++++++++++ .../traffic-portal/src/app/api/index.ts | 13 ++ .../src/app/api/testing/index.ts | 14 ++ .../traffic-portal/src/app/app.component.ts | 7 +- .../traffic-portal/src/app/app.module.ts | 4 +- experimental/traffic-portal/tsconfig.json | 5 +- .../traffic-portal/tsconfig.spec.json | 3 +- 7 files changed, 205 insertions(+), 8 deletions(-) create mode 100644 experimental/traffic-portal/src/app/api/base-api.service.ts create mode 100644 experimental/traffic-portal/src/app/api/index.ts create mode 100644 experimental/traffic-portal/src/app/api/testing/index.ts diff --git a/experimental/traffic-portal/src/app/api/base-api.service.ts b/experimental/traffic-portal/src/app/api/base-api.service.ts new file mode 100644 index 0000000000..2f536bb2cc --- /dev/null +++ b/experimental/traffic-portal/src/app/api/base-api.service.ts @@ -0,0 +1,167 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { HttpClient, HttpHeaders } from "@angular/common/http"; + +import type { Observable } from "rxjs"; +import { map } from "rxjs/operators"; + +import { environment } from "src/environments/environment"; + +/** + * This is the base class from which all other API classes inherit. + */ +export abstract class APIService { + /** + * The API version used by the service(s) - this will be overridden by the + * environment if a different API version is therein found. + */ + public apiVersion = "3.0"; + + /** + * Sends an HTTP DELETE request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected delete(path: string, data?: object, params?: Record): Observable { + return this.do("delete", path, data, params); + } + + /** + * Sends an HTTP GET request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected get(path: string, data?: object, params?: Record): Observable { + return this.do("get", path, data, params); + } + + /** + * Sends an HTTP HEAD request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected head(path: string, data?: object, params?: Record): Observable { + return this.do("head", path, data, params); + } + + /** + * Sends an HTTP OPTIONS request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected options(path: string, data?: object, params?: Record): Observable { + return this.do("options", path, data, params); + } + + /** + * Sends an HTTP PATCH request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected patch(path: string, data?: object, params?: Record): Observable { + return this.do("patch", path, data, params); + } + + /** + * Sends an HTTP POST request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected post(path: string, data?: object, params?: Record): Observable { + return this.do("post", path, data, params); + } + + /** + * Sends an HTTP PUT request to the API. + * + * @param path The request path. + * @param data Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected put(path: string, data?: object, params?: Record): Observable { + return this.do("put", path, data, params); + } + + /** + * Sends an HTTP request to the API. + * + * @param method The HTTP request method to use, e.g. "GET". + * @param path The request path. + * @param body Optional request body (will be JSON.stringify'd). + * @param params Option query parameters to send in the request. + * @returns An Observable that emits the server response. + */ + protected do(method: string, path: string, body?: object, params?: Record): Observable { + + const options = { + body, + params, + ...this.defaultOptions + }; + // TODO pass alerts to the alert service + // (TODO create the alert service) + return this.http.request<{response: T}>(method, `/api/${this.apiVersion}/${path.replace(/^\/+/, "")}`, options).pipe(map( + r => { + if (!r.body) { + throw new Error(`${method} ${path} returned no response body - ${r.status} ${r.statusText}`); + } + return r.body.response; + } + )); + } + + /** + * These are the default options sent in HttpClient methods - if subclasses + * make raw requests, they are encouraged to extend this rather than duplicate + * it. + */ + protected readonly defaultOptions = { + // This is part of the HTTP spec. I can't - and shouldn't - change it. + // eslint-disable-next-line @typescript-eslint/naming-convention + headers: new HttpHeaders({"Content-Type": "application/json"}), + observe: "response" as "response", + responseType: "json" as "json", + }; + + /** + * Constructs the service and sets the API version based on the execution environment. + * + * @param http The Angular HTTP client service. + */ + constructor(protected readonly http: HttpClient) { + if (environment.apiVersion) { + this.apiVersion = environment.apiVersion; + } + } +} diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts new file mode 100644 index 0000000000..352d613464 --- /dev/null +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -0,0 +1,13 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +/** + * The API Module contains all logic used to access the Traffic Ops API. + */ +@NgModule({ + declarations: [], + imports: [ + CommonModule + ], +}) +export class APIModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts new file mode 100644 index 0000000000..f8d57a9b67 --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -0,0 +1,14 @@ +import { NgModule } from "@angular/core"; +import { CommonModule } from "@angular/common"; + +/** + * The API Testing Module provides mock services that allow components to use + * the Traffic Ops API without actually requiring a running Traffic Ops. + */ +@NgModule({ + declarations: [], + imports: [ + CommonModule + ], +}) +export class APITestingModule { } diff --git a/experimental/traffic-portal/src/app/app.component.ts b/experimental/traffic-portal/src/app/app.component.ts index 7e70e36f93..eedae1bdd4 100644 --- a/experimental/traffic-portal/src/app/app.component.ts +++ b/experimental/traffic-portal/src/app/app.component.ts @@ -13,10 +13,10 @@ */ import { Component, OnInit } from "@angular/core"; -import {Router} from "@angular/router"; +import { Router } from "@angular/router"; import { CurrentUser } from "src/app/models"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; /** * The most basic component that contains everything else. This should be kept pretty simple. @@ -33,9 +33,6 @@ export class AppComponent implements OnInit { /** The currently logged-in user */ public currentUser: CurrentUser | null = null; - /** - * Constructor. - */ constructor(private readonly router: Router, private readonly auth: CurrentUserService) { } diff --git a/experimental/traffic-portal/src/app/app.module.ts b/experimental/traffic-portal/src/app/app.module.ts index 12d59b7e42..66e4f1d7cf 100644 --- a/experimental/traffic-portal/src/app/app.module.ts +++ b/experimental/traffic-portal/src/app/app.module.ts @@ -32,6 +32,7 @@ import {AppUIModule} from "./app.ui.module"; import {SharedModule} from "./shared/shared.module"; import {AuthenticatedGuard} from "./guards/authenticated-guard.service"; import { ResetPasswordDialogComponent } from "./login/reset-password-dialog/reset-password-dialog.component"; +import { APIModule } from "./api"; // TODO: Figure out the actual typing here. Chart.plugins.register({ @@ -69,7 +70,8 @@ Chart.plugins.register({ AppRoutingModule, HttpClientModule, AppUIModule, - SharedModule + SharedModule, + APIModule ], providers: [ AuthenticatedGuard diff --git a/experimental/traffic-portal/tsconfig.json b/experimental/traffic-portal/tsconfig.json index 1869964f63..4f1cb8f966 100644 --- a/experimental/traffic-portal/tsconfig.json +++ b/experimental/traffic-portal/tsconfig.json @@ -29,5 +29,8 @@ "strictTemplates": true, "strictInputTypes": true, "strictNullInputTypes": false - } + }, + "exclude": [ + "src/app/testing/*.ts" + ] } diff --git a/experimental/traffic-portal/tsconfig.spec.json b/experimental/traffic-portal/tsconfig.spec.json index 1a0d0dc542..9d41fb092d 100644 --- a/experimental/traffic-portal/tsconfig.spec.json +++ b/experimental/traffic-portal/tsconfig.spec.json @@ -12,6 +12,7 @@ ], "include": [ "src/**/*.spec.ts", - "src/**/*.d.ts" + "src/**/*.d.ts", + "src/app/api/testing/*.ts" ] } From a4cb389990f0cf62626d0bf9652ec387c4bd09a3 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 19 Jan 2022 17:01:54 -0700 Subject: [PATCH 07/50] Move the server service to the API module --- .../traffic-portal/src/app/api/index.ts | 4 + .../server.service.ts} | 4 +- .../src/app/api/testing/index.ts | 5 + .../src/app/api/testing/server.service.ts | 262 ++++++++++++++++++ .../server-details.component.spec.ts | 9 +- .../server-details.component.ts | 3 +- .../servers-table.component.spec.ts | 6 +- .../servers-table/servers-table.component.ts | 8 +- .../update-status.component.spec.ts | 9 +- .../update-status/update-status.component.ts | 2 +- .../src/app/shared/api/ProfileService.ts | 2 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 4 +- 13 files changed, 293 insertions(+), 26 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/ServerService.ts => api/server.service.ts} (98%) create mode 100644 experimental/traffic-portal/src/app/api/testing/server.service.ts diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 352d613464..7ff5b3f987 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -1,5 +1,8 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; +import { ServerService } from "./server.service"; + +export * from "./server.service"; /** * The API Module contains all logic used to access the Traffic Ops API. @@ -9,5 +12,6 @@ import { CommonModule } from "@angular/common"; imports: [ CommonModule ], + providers: [ServerService] }) export class APIModule { } diff --git a/experimental/traffic-portal/src/app/shared/api/ServerService.ts b/experimental/traffic-portal/src/app/api/server.service.ts similarity index 98% rename from experimental/traffic-portal/src/app/shared/api/ServerService.ts rename to experimental/traffic-portal/src/app/api/server.service.ts index aae80e2705..d68d144a74 100644 --- a/experimental/traffic-portal/src/app/shared/api/ServerService.ts +++ b/experimental/traffic-portal/src/app/api/server.service.ts @@ -15,9 +15,9 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { defaultServer, Server, Servercheck, Status } from "../../models"; +import { defaultServer, Server, Servercheck, Status } from "src/app/models"; -import { APIService } from "./APIService"; +import { APIService } from "./base-apiservice.service"; /** * Shared mapping for massaging Status requests. diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index f8d57a9b67..a6f5d751b7 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -1,5 +1,9 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; +import { ServerService } from "../server.service"; +import { ServerService as TestingServerService } from "./server.service"; + +export * from "./server.service"; /** * The API Testing Module provides mock services that allow components to use @@ -10,5 +14,6 @@ import { CommonModule } from "@angular/common"; imports: [ CommonModule ], + providers: [{provide: ServerService, useClass: TestingServerService}] }) export class APITestingModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/server.service.ts b/experimental/traffic-portal/src/app/api/testing/server.service.ts new file mode 100644 index 0000000000..969f30cad5 --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/server.service.ts @@ -0,0 +1,262 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { Injectable } from "@angular/core"; + +import type { Server, Servercheck, Status } from "../../models"; + +/** + * Generates a `Servercheck` for a given `server`. + * + * @todo Inject the necessary services into the ServerService to be able to + * generate this dynamically from IDs, instead of relying on optional names. + * + * @param server The server for which to generate a servercheck. + * @returns A valid Servercheck for `server`. + */ +function serverCheck(server: Server): Servercheck { + return { + adminState: server.status ?? "SERVER HAD NO STATUS", + cacheGroup: server.cachegroup ?? "SERVER HAD NO CACHE GROUP", + hostName: server.hostName ?? "SERVER HAD NO HOST NAME", + id: server.id as number, + profile: server.profile ?? "SERVER HAD NO PROFILE", + revalPending: server.revalPending, + type: server.type ?? "SERVER HAD NO TYPE", + updPending: server.updPending + }; +} + +/** + * ServerService exposes API functionality related to Servers. + */ +@Injectable() +export class ServerService { + + private readonly servers = new Array(); + + private readonly statuses = [ + { + description: "Sever is administrative down and does not receive traffic.", + id: 4, + lastUpdated: new Date(), + name: "ADMIN_DOWN" + }, + { + description: "Server is ignored by traffic router.", + id: 5, + lastUpdated: new Date(), + name: "CCR_IGNORE" + }, + { + description: "Server is Offline. Not active in any configuration.", + id: 1, + lastUpdated: new Date(), + name: "OFFLINE" + }, + { + description: "Server is online.", + id: 2, + lastUpdated: new Date(), + name: "ONLINE" + }, + { + description: "Pre Production. Not active in any configuration.", + id: 6, + lastUpdated: new Date(), + name: "PRE_PROD" + }, + { + description: "Server is online and reported in the health protocol.", + id: 3, + lastUpdated: new Date(), + name: "REPORTED" + } + ]; + + private idCounter = 1; + + public async getServers(idOrName: number | string): Promise; + public async getServers(): Promise>; + /** + * Retrieves servers from the API. + * + * @param idOrName Specify either the integral, unique identifier (number) of a specific Server to retrieve, or its hostname (string). + * @returns The requested server(s). + */ + public async getServers(idOrName?: number | string): Promise | Server> { + if (idOrName !== undefined) { + let server; + switch (typeof idOrName) { + case "number": + server = this.servers.filter(s=>s.id === idOrName)[0]; + if (server === undefined) { + throw new Error(`no such server: #${idOrName}`); + } + break; + case "string": + server = this.servers.filter(s=>s.hostName === idOrName)[0]; + if (server === undefined) { + throw new Error(`no such server: '${idOrName}'`); + } + break; + } + return server; + } + return this.servers; + } + + /** + * Creates a server. + * + * @param server The server to create. + * @returns The server as created and returned by the API. + */ + public async createServer(server: Server): Promise { + server.lastUpdated = new Date(); + server.id = ++this.idCounter; + this.servers.push(server); + return server; + } + + public async getServerChecks(): Promise; + public async getServerChecks(id: number): Promise; + /** + * Fetches server "check" stats from Traffic Ops. + * + * @param id If given, will return only the checks for the server with that ID. + * @todo Ideally this filter would be implemented server-side; the data set gets huge. + * @returns Serverchecks - or a single Servercheck if ID was given. + */ + public async getServerChecks(id?: number): Promise { + if (id !== undefined) { + const server = this.servers.filter(s=>s.id===id)[0]; + if (!server) { + throw new Error(`no such server: #${id}`); + } + return serverCheck(server); + } + return this.servers.map(serverCheck); + } + + public async getStatuses(idOrName: number | string): Promise; + public async getStatuses(): Promise>; + /** + * Retrieves Statuses from the API. + * + * @param idOrName An optional ID (number) or Name (string) used to fetch a single Status thereby identified. + * @returns The requested Status(es). + */ + public async getStatuses(idOrName?: number | string): Promise | Status> { + if (idOrName !== undefined) { + let status; + if (typeof(idOrName) === "number") { + status = this.statuses.filter(s=>s.id===idOrName)[0]; + } else { + status = this.statuses.filter(s=>s.name===idOrName)[0]; + } + if (!status) { + throw new Error(`no such Status: ${idOrName}`); + } + return status; + } + return this.statuses; + } + + /** + * Queues updates on a single server. + * + * @param server Either the server on which updates will be queued, or its integral, unique identifier. + * @returns The 'response' property of the TO server's response. See TO API docs. + */ + public async queueUpdates(server: number | Server): Promise<{serverId: number; action: "queue"}> { + let id: number; + if (typeof server === "number") { + id = server; + } else if (!server.id) { + throw new Error("server has no id"); + } else { + id = server.id; + } + + const srv = this.servers.filter(s=>s.id===id)[0]; + if (!srv) { + throw new Error(`no such Server: #${id}`); + } + + srv.updPending = true; + return {action: "queue", serverId: id}; + } + + /** + * Clears updates on a single server. + * + * @param server Either the server for which updates will be cleared, or its integral, unique identifier. + * @returns The 'response' property of the TO server's response. See TO API docs. + */ + public async clearUpdates(server: number | Server): Promise<{serverId: number; action: "dequeue"}> { + let id: number; + if (typeof server === "number") { + id = server; + } else if (!server.id) { + throw new Error("server has no id"); + } else { + id = server.id; + } + + const srv = this.servers.filter(s=>s.id===id)[0]; + if (!srv) { + throw new Error(`no such Server: #${id}`); + } + + srv.updPending = false; + return {action: "dequeue", serverId: id}; + } + + /** + * Updates a server's status. + * + * @param server Either the server that will have its status changed, or the integral, unique identifier thereof. + * @param statusName The name of the status to which to set the server. + * @param offlineReason The reason why the server was placed into a non-ONLINE or REPORTED status. + * @returns Nothing. + */ + public async updateStatus(server: number | Server, statusName: string, offlineReason?: string): Promise { + let id: number; + if (typeof server === "number") { + id = server; + } else if (!server.id) { + throw new Error("server has no id"); + } else { + id = server.id; + } + + const srv = this.servers.filter(s=>s.id===id)[0]; + if (!srv) { + throw new Error(`no such Server: #${id}`); + } + + const status = this.statuses.filter(s=>s.name===statusName)[0]; + if (!status) { + throw new Error(`no such Status: '${statusName}'`); + } + if (status.id === undefined) { + throw new Error(`Status with name '${statusName} has no ID`); + } + + srv.status = statusName; + srv.statusId = status.id; + srv.offlineReason = offlineReason ?? null; + } +} diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index ac5b0cb246..d7e7705a8b 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -17,10 +17,12 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; + +import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; +import { CacheGroupService, CDNService, ProfileService, TypeService } from "src/app/shared/api"; +import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; -import {CacheGroupService, CDNService, ProfileService, ServerService, TypeService} from "../../../shared/api"; -import {PhysicalLocationService} from "../../../shared/api/PhysicalLocationService"; import { ServerDetailsComponent } from "./server-details.component"; describe("ServerDetailsComponent", () => { @@ -40,9 +42,8 @@ describe("ServerDetailsComponent", () => { await TestBed.configureTestingModule({ declarations: [ ServerDetailsComponent ], - imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule ], + imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], providers: [ - { provide: ServerService, useValue: mockAPIService }, { provide: CacheGroupService, useValue: mockAPIService }, { provide: CDNService, useValue: mockAPIService }, { provide: TypeService, useValue: mockAPIService }, diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index 2eb2ceacb6..fe8cc5f580 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -17,9 +17,10 @@ import { ActivatedRoute, Router } from "@angular/router"; import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; -import { CacheGroupService, CDNService, ProfileService, ServerService, TypeService } from "src/app/shared/api"; +import { CacheGroupService, CDNService, ProfileService, TypeService } from "src/app/shared/api"; import { IP, IP_WITH_CIDR } from "src/app/utils"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; +import { ServerService } from "src/app/api/server.service"; /** * ServerDetailsComponent is the controller for a server's "details" page. diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts index 554ff81038..e0b021f332 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts @@ -18,8 +18,9 @@ import { RouterTestingModule } from "@angular/router/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; -import { ServerService, UserService } from "src/app/shared/api"; +import { UserService } from "src/app/shared/api"; import { defaultServer, Server } from "src/app/models"; +import { APITestingModule } from "src/app/api/testing"; import { augment, AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; @@ -33,9 +34,8 @@ describe("ServersTableComponent", () => { const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ declarations: [ ServersTableComponent, TpHeaderComponent ], - imports: [HttpClientModule, RouterTestingModule], + imports: [HttpClientModule, RouterTestingModule, APITestingModule], providers: [ - { provide: ServerService, useValue: mockAPIService }, { provide: UserService, useValue: mockAPIService }, { provide: CurrentUserService, useValue: mockCurrentUserService } ] diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts index 37616d61a6..9d49152f46 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts @@ -19,10 +19,10 @@ import { ITooltipParams } from "ag-grid-community"; import { BehaviorSubject } from "rxjs"; -import { Interface, Server } from "../../../models/server"; -import { ServerService } from "../../../shared/api"; -import { IPV4, serviceInterface } from "../../../utils"; -import { ContextMenuActionEvent, ContextMenuItem } from "../../../shared/generic-table/generic-table.component"; +import { ServerService } from "src/app/api"; +import { Interface, Server } from "src/app/models/server"; +import { IPV4, serviceInterface } from "src/app/utils"; +import { ContextMenuActionEvent, ContextMenuItem } from "src/app/shared/generic-table/generic-table.component"; /** * AugmentedServer has fields that give direct access to its service addresses without needing to recalculate them. diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts index 47fd1dcd21..3e88829661 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts @@ -13,9 +13,9 @@ */ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; -import {ServerService} from "../../../shared/api"; import { UpdateStatusComponent } from "./update-status.component"; describe("UpdateStatusComponent", () => { @@ -23,14 +23,9 @@ describe("UpdateStatusComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getServers", "getStatuses"]); - mockAPIService.getStatuses.and.returnValue(new Promise(r => r([]))); await TestBed.configureTestingModule({ declarations: [ UpdateStatusComponent ], - imports: [ HttpClientModule ], - providers: [ - { provide: ServerService, useValue: mockAPIService } - ] + imports: [ HttpClientModule, APITestingModule ], }) .compileComponents(); }); diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts index f2b091d0e6..dcb03b79dc 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts @@ -14,7 +14,7 @@ import { Component, EventEmitter, HostListener, Input, OnInit, Output } from "@angular/core"; import { FormControl } from "@angular/forms"; import { Server, Status } from "src/app/models"; -import { ServerService } from "src/app/shared/api"; +import { ServerService } from "src/app/api/server.service"; /** * UpdateStatusComponent is the controller for the "Update Server Status" dialog box. diff --git a/experimental/traffic-portal/src/app/shared/api/ProfileService.ts b/experimental/traffic-portal/src/app/shared/api/ProfileService.ts index 328cc57ce3..65894dd684 100644 --- a/experimental/traffic-portal/src/app/shared/api/ProfileService.ts +++ b/experimental/traffic-portal/src/app/shared/api/ProfileService.ts @@ -49,7 +49,7 @@ function profileMap(p: Profile): Profile { } /** - * ServerService exposes API functionality related to Servers. + * ProfileService exposes API functionality related to Profiles. */ @Injectable() export class ProfileService extends APIService { diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index 1bb3e2c9d5..1bf33b082a 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -17,6 +17,5 @@ export * from "./CDNService"; export * from "./DeliveryServiceService"; export * from "./InvalidationJobService"; export * from "./ProfileService"; -export * from "./ServerService"; export * from "./TypeService"; export * from "./UserService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 9e3d3f5a89..40d978f7e9 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -30,7 +30,8 @@ import { DeliveryServiceService, InvalidationJobService, ProfileService, - ServerService, TypeService, UserService + TypeService, + UserService } from "./api"; import {PhysicalLocationService} from "./api/PhysicalLocationService"; import {CurrentUserService} from "./currentUser/current-user.service"; @@ -82,7 +83,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- InvalidationJobService, PhysicalLocationService, ProfileService, - ServerService, TypeService, UserService ] From 3c72a2e0235baf88d480f85dba2473a63edf6342 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 19 Jan 2022 17:03:09 -0700 Subject: [PATCH 08/50] Fix table rendering broken due to context menu issues --- experimental/traffic-portal/src/app/api/server.service.ts | 2 +- .../shared/generic-table/generic-table.component.spec.ts | 6 +++--- .../src/app/shared/generic-table/generic-table.component.ts | 5 +---- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/experimental/traffic-portal/src/app/api/server.service.ts b/experimental/traffic-portal/src/app/api/server.service.ts index d68d144a74..73c7fcf91f 100644 --- a/experimental/traffic-portal/src/app/api/server.service.ts +++ b/experimental/traffic-portal/src/app/api/server.service.ts @@ -17,7 +17,7 @@ import { Injectable } from "@angular/core"; import { defaultServer, Server, Servercheck, Status } from "src/app/models"; -import { APIService } from "./base-apiservice.service"; +import { APIService } from "./base-api.service"; /** * Shared mapping for massaging Status requests. diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts index bcfa13a9cd..d464da331f 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts @@ -55,9 +55,9 @@ describe("GenericTableComponent", () => { expect(component.filter({} as RowNode)).toBeTrue(); }); - it("throws an error trying to check if a context menu item is disabled with no selection", () => { - expect(()=>component.isDisabled({action: "anything", name: "whatever"})).toThrow(); - expect(()=>component.isDisabled({action: "anything", disabled: ()=>false, name: "who cares"})).toThrow(); + it("always says a context menu item is disabled with no selection", () => { + expect(component.isDisabled({action: "anything", name: "whatever"})).toBeTrue(); + expect(component.isDisabled({action: "anything", disabled: ()=>false, name: "who cares"})).toBeTrue(); }); it("throws an error trying to emit a context menu action with no selection", ()=>{ diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts index 90b8410517..a598418ea4 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts @@ -513,10 +513,7 @@ export class GenericTableComponent implements OnInit, OnDestroy { * @returns Whether or not `a` should be disabled. */ public isDisabled(a: ContextMenuAction): boolean { - if (!this.selected) { - throw new Error("cannot check if a context menu is disabled for a selection when there is no selection"); - } - if (!a.multiRow && this.selectionCount > 1) { + if (!this.selected || (!a.multiRow && this.selectionCount > 1)) { return true; } if (a.disabled) { From 9d090fa128083ea80cc91a1f92b2a917260f880f Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 19 Jan 2022 17:25:35 -0700 Subject: [PATCH 09/50] Move the CDN service to the API module --- .../api/CDNService.ts => api/cdn.service.ts} | 18 ++--- .../traffic-portal/src/app/api/index.ts | 7 +- .../src/app/api/testing/cdn.service.ts | 67 +++++++++++++++++++ .../src/app/api/testing/index.ts | 9 ++- .../new-delivery-service.component.spec.ts | 11 +-- .../new-delivery-service.component.ts | 5 +- .../server-details.component.spec.ts | 10 +-- .../server-details.component.ts | 3 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 2 - 10 files changed, 101 insertions(+), 32 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/CDNService.ts => api/cdn.service.ts} (89%) create mode 100644 experimental/traffic-portal/src/app/api/testing/cdn.service.ts diff --git a/experimental/traffic-portal/src/app/shared/api/CDNService.ts b/experimental/traffic-portal/src/app/api/cdn.service.ts similarity index 89% rename from experimental/traffic-portal/src/app/shared/api/CDNService.ts rename to experimental/traffic-portal/src/app/api/cdn.service.ts index 50c85e5c68..612c8b3ad2 100644 --- a/experimental/traffic-portal/src/app/shared/api/CDNService.ts +++ b/experimental/traffic-portal/src/app/api/cdn.service.ts @@ -14,8 +14,8 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { CDN } from "../../models"; -import { APIService } from "./APIService"; +import type { CDN } from "src/app/models"; +import { APIService } from "./base-api.service"; /** @@ -23,6 +23,11 @@ import { APIService } from "./APIService"; */ @Injectable() export class CDNService extends APIService { + + constructor(http: HttpClient) { + super(http); + } + public async getCDNs(id: number): Promise; public async getCDNs(): Promise>; /** @@ -59,13 +64,4 @@ export class CDNService extends APIService { } ); } - - /** - * Injects the Angular HTTP client service into the parent constructor. - * - * @param http The Angular HTTP client service. - */ - constructor(http: HttpClient) { - super(http); - } } diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 7ff5b3f987..84c9d9c6c9 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -1,7 +1,9 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; +import { CDNService } from "./cdn.service"; import { ServerService } from "./server.service"; +export * from "./cdn.service"; export * from "./server.service"; /** @@ -12,6 +14,9 @@ export * from "./server.service"; imports: [ CommonModule ], - providers: [ServerService] + providers: [ + CDNService, + ServerService + ] }) export class APIModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/cdn.service.ts b/experimental/traffic-portal/src/app/api/testing/cdn.service.ts new file mode 100644 index 0000000000..3a390aa865 --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/cdn.service.ts @@ -0,0 +1,67 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import { Injectable } from "@angular/core"; + +import { CDN } from "src/app/models"; + +/** + * CDNService expose API functionality relating to CDNs. + */ +@Injectable() +export class CDNService { + + private readonly cdns = new Map([ + [ + "ALL", + { + dnssecEnabled: false, + domainName: "-", + id: 1, + lastUpdated: new Date(), + name: "ALL" + } + ], + [ + "test", + { + dnssecEnabled: false, + domainName: "mycdn.test.test", + id: 1, + lastUpdated: new Date(), + name: "test" + } + ] + ]); + + public async getCDNs(id: number): Promise; + public async getCDNs(): Promise>; + /** + * Gets one or all CDNs from Traffic Ops + * + * @param id The integral, unique identifier of a single CDN to be returned + * @returns Either a Map of CDN names to full CDN objects, or a single CDN, depending on whether `id` was + * passed. + * (In the event that `id` is passed but does not match any CDN, `null` will be emitted) + */ + public async getCDNs(id?: number): Promise | CDN> { + if (id !== undefined) { + const cdn = Array.from(this.cdns.values()).filter(c=>c.id===id)[0]; + if (!cdn) { + throw new Error(`no such CDN #${id}`); + } + return cdn; + } + return this.cdns; + } +} diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index a6f5d751b7..aaa338a013 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -1,8 +1,10 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { ServerService } from "../server.service"; +import { CDNService, ServerService } from ".."; import { ServerService as TestingServerService } from "./server.service"; +import { CDNService as TestingCDNService } from "./cdn.service"; +export * from "./cdn.service"; export * from "./server.service"; /** @@ -14,6 +16,9 @@ export * from "./server.service"; imports: [ CommonModule ], - providers: [{provide: ServerService, useClass: TestingServerService}] + providers: [ + {provide: CDNService, useClass: TestingCDNService}, + {provide: ServerService, useClass: TestingServerService} + ] }) export class APITestingModule { } diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts index 215705f818..74e7ab1185 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts @@ -20,15 +20,16 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MatButtonModule } from "@angular/material/button"; import { MatRadioModule } from "@angular/material/radio"; import { MatStepperModule } from "@angular/material/stepper"; -import {MatStepperHarness} from "@angular/material/stepper/testing"; -import {NoopAnimationsModule} from "@angular/platform-browser/animations"; +import { MatStepperHarness } from "@angular/material/stepper/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { RouterTestingModule } from "@angular/router/testing"; -import {CDNService, DeliveryServiceService, UserService} from "src/app/shared/api"; +import { APITestingModule } from "src/app/api/testing"; +import { DeliveryServiceService, UserService } from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { Protocol } from "../../models"; -import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; +import { TpHeaderComponent } from "../../shared/tp-header/tp-header.component"; import { NewDeliveryServiceComponent } from "./new-delivery-service.component"; @@ -55,6 +56,7 @@ describe("NewDeliveryServiceComponent", () => { TpHeaderComponent ], imports: [ + APITestingModule, FormsModule, HttpClientModule, ReactiveFormsModule, @@ -66,7 +68,6 @@ describe("NewDeliveryServiceComponent", () => { ], providers: [ {provide: DeliveryServiceService, useValue: mockAPIService}, - {provide: CDNService, useValue: mockAPIService}, {provide: UserService, useValue: mockAPIService}, { provide: CurrentUserService, useValue: mockCurrentUserService } ] diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts index 9c7a52919e..943cded8e6 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts @@ -16,7 +16,8 @@ import { FormControl } from "@angular/forms"; import type { MatStepper } from "@angular/material/stepper"; import { Router } from "@angular/router"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { CDNService } from "src/app/api"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { bypassable, CDN, @@ -27,7 +28,7 @@ import { Type } from "../../models"; import { User } from "../../models/user"; -import { CDNService, DeliveryServiceService } from "../../shared/api"; +import { DeliveryServiceService } from "../../shared/api"; /** * A regular expression that matches character strings that are illegal in `xml_id`s diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index d7e7705a8b..3d524ecfa6 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -20,7 +20,7 @@ import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; -import { CacheGroupService, CDNService, ProfileService, TypeService } from "src/app/shared/api"; +import { CacheGroupService, ProfileService, TypeService } from "src/app/shared/api"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerDetailsComponent } from "./server-details.component"; @@ -30,14 +30,11 @@ describe("ServerDetailsComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getServers", "getCacheGroups", "getCDNs", - "getProfiles", "getTypes", "getPhysicalLocations", "getStatuses", "getServerTypes"]); + const mockAPIService = jasmine.createSpyObj(["getCacheGroups", + "getProfiles", "getTypes", "getPhysicalLocations", "getServerTypes"]); mockAPIService.getCacheGroups.and.returnValue(new Promise(r => r([]))); - mockAPIService.getCDNs.and.returnValue(new Promise(r => r([]))); - mockAPIService.getStatuses.and.returnValue(new Promise(r => r([]))); mockAPIService.getProfiles.and.returnValue(new Promise(r => r([]))); mockAPIService.getPhysicalLocations.and.returnValues(new Promise(r => r([]))); - mockAPIService.getServers.and.returnValues(new Promise(r => r([]))); mockAPIService.getServerTypes.and.returnValues(new Promise(r => r([]))); await TestBed.configureTestingModule({ @@ -45,7 +42,6 @@ describe("ServerDetailsComponent", () => { imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], providers: [ { provide: CacheGroupService, useValue: mockAPIService }, - { provide: CDNService, useValue: mockAPIService }, { provide: TypeService, useValue: mockAPIService }, { provide: PhysicalLocationService, useValue: mockAPIService }, { provide: ProfileService, useValue: mockAPIService } diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index fe8cc5f580..c2bfff09d2 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -17,7 +17,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; -import { CacheGroupService, CDNService, ProfileService, TypeService } from "src/app/shared/api"; +import { CDNService } from "src/app/api"; +import { CacheGroupService, ProfileService, TypeService } from "src/app/shared/api"; import { IP, IP_WITH_CIDR } from "src/app/utils"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerService } from "src/app/api/server.service"; diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index 1bf33b082a..00f66f6b73 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -13,7 +13,6 @@ */ export * from "./CacheGroupService"; -export * from "./CDNService"; export * from "./DeliveryServiceService"; export * from "./InvalidationJobService"; export * from "./ProfileService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 40d978f7e9..706938cd10 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -26,7 +26,6 @@ import {LinechartDirective} from "./charts/linechart.directive"; import {AlertService} from "./alert/alert.service"; import { CacheGroupService, - CDNService, DeliveryServiceService, InvalidationJobService, ProfileService, @@ -77,7 +76,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- { multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor }, AlertService, CacheGroupService, - CDNService, CurrentUserService, DeliveryServiceService, InvalidationJobService, From 26ba5fd21b6ebadadcbbf940ed342de8346ff050 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 19 Jan 2022 17:53:16 -0700 Subject: [PATCH 10/50] Move the Cache Group service to the API module --- .../cache-group.service.ts} | 9 +- .../traffic-portal/src/app/api/index.ts | 3 + .../app/api/testing/cache-group.service.ts | 119 ++++++++++++++++++ .../src/app/api/testing/index.ts | 7 +- .../cache-group-table.component.spec.ts | 14 ++- .../cache-group-table.component.ts | 2 +- .../server-details.component.spec.ts | 7 +- .../server-details.component.ts | 4 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 2 - 10 files changed, 140 insertions(+), 28 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/CacheGroupService.ts => api/cache-group.service.ts} (92%) create mode 100644 experimental/traffic-portal/src/app/api/testing/cache-group.service.ts diff --git a/experimental/traffic-portal/src/app/shared/api/CacheGroupService.ts b/experimental/traffic-portal/src/app/api/cache-group.service.ts similarity index 92% rename from experimental/traffic-portal/src/app/shared/api/CacheGroupService.ts rename to experimental/traffic-portal/src/app/api/cache-group.service.ts index 04d91bff82..e69ca8618d 100644 --- a/experimental/traffic-portal/src/app/shared/api/CacheGroupService.ts +++ b/experimental/traffic-portal/src/app/api/cache-group.service.ts @@ -14,8 +14,8 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { CacheGroup } from "src/app/models"; -import { APIService } from "./APIService"; +import type { CacheGroup } from "src/app/models"; +import { APIService } from "./base-api.service"; /** @@ -90,11 +90,6 @@ export class CacheGroupService extends APIService { ); } - /** - * Injects the Angular HTTP client service into the parent constructor. - * - * @param http The Angular HTTP client service. - */ constructor(http: HttpClient) { super(http); } diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 84c9d9c6c9..ddb89d2cc0 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -2,7 +2,9 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; import { CDNService } from "./cdn.service"; import { ServerService } from "./server.service"; +import { CacheGroupService } from "./cache-group.service"; +export * from "./cache-group.service"; export * from "./cdn.service"; export * from "./server.service"; @@ -15,6 +17,7 @@ export * from "./server.service"; CommonModule ], providers: [ + CacheGroupService, CDNService, ServerService ] diff --git a/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts b/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts new file mode 100644 index 0000000000..6b93085a9a --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts @@ -0,0 +1,119 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import { Injectable } from "@angular/core"; + +import type { CacheGroup } from "src/app/models"; + + +/** + * CDNService expose API functionality relating to CDNs. + */ +@Injectable() +export class CacheGroupService { + + private readonly cacheGroups = [ + { + fallbackToClosest: true, + fallbacks: [], + id: 1, + latitude: 0, + localizationMethods: [], + longitude: 0, + name: "Mid", + parentCacheGroupID: null, + parentCacheGroupName: null, + secondaryParentCacheGroupID: null, + secondaryParentCacheGroupName: null, + shortName: "Mid", + typeId: 1, + typeName: "MID_LOC" + }, + { + fallbackToClosest: true, + fallbacks: [], + id: 2, + latitude: 0, + localizationMethods: [], + longitude: 0, + name: "Edge", + parentCacheGroupID: 1, + parentCacheGroupName: "Mid", + secondaryParentCacheGroupID: null, + secondaryParentCacheGroupName: null, + shortName: "Edge", + typeId: 2, + typeName: "EDGE_LOC" + }, + { + fallbackToClosest: true, + fallbacks: [], + id: 3, + latitude: 0, + localizationMethods: [], + longitude: 0, + name: "Origin", + parentCacheGroupID: null, + parentCacheGroupName: null, + secondaryParentCacheGroupID: null, + secondaryParentCacheGroupName: null, + shortName: "Origin", + typeId: 3, + typeName: "ORG_LOC" + }, + { + fallbackToClosest: true, + fallbacks: [], + id: 4, + latitude: 0, + localizationMethods: [], + longitude: 0, + name: "Other", + parentCacheGroupID: null, + parentCacheGroupName: null, + secondaryParentCacheGroupID: null, + secondaryParentCacheGroupName: null, + shortName: "Other", + typeId: 4, + typeName: "TC_LOC" + } + ]; + + public async getCacheGroups(idOrName: number | string): Promise; + public async getCacheGroups(): Promise>; + /** + * Gets one or all CDNs from Traffic Ops + * + * @param idOrName Optionally either the name or integral, unique identifier of a single Cache Group to be returned. + * @returns Either an Array of CacheGroup objects, or a single CacheGroup, depending on whether + * `idOrName` was passed. + * @throws {Error} In the event that `idOrName` is passed but does not match any CacheGroup. + */ + public async getCacheGroups(idOrName?: number | string): Promise | CacheGroup> { + if (idOrName !== undefined) { + let cacheGroup; + switch (typeof(idOrName)) { + case "string": + cacheGroup = this.cacheGroups.filter(cg=>cg.name===idOrName)[0]; + break; + case "number": + cacheGroup = this.cacheGroups.filter(cg=>cg.id===idOrName)[0]; + } + if (!cacheGroup) { + throw new Error(`no such Cache Group: ${idOrName}`); + } + return cacheGroup; + } + return this.cacheGroups; + } +} diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index aaa338a013..e81fe8e185 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -1,11 +1,9 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { CDNService, ServerService } from ".."; +import { CacheGroupService, CDNService, ServerService } from ".."; import { ServerService as TestingServerService } from "./server.service"; import { CDNService as TestingCDNService } from "./cdn.service"; - -export * from "./cdn.service"; -export * from "./server.service"; +import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; /** * The API Testing Module provides mock services that allow components to use @@ -17,6 +15,7 @@ export * from "./server.service"; CommonModule ], providers: [ + {provide: CacheGroupService, useClass: TestingCacheGroupService}, {provide: CDNService, useClass: TestingCDNService}, {provide: ServerService, useClass: TestingServerService} ] diff --git a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts index 6edfdbd81c..82649265fe 100644 --- a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts @@ -16,7 +16,8 @@ import { ComponentFixture, TestBed } from "@angular/core/testing"; import { ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; -import {CacheGroupService} from "../../../shared/api"; +import { APITestingModule } from "src/app/api/testing"; + import { CacheGroupTableComponent } from "./cache-group-table.component"; describe("CacheGroupTableComponent", () => { @@ -24,13 +25,14 @@ describe("CacheGroupTableComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getCacheGroups"]); await TestBed.configureTestingModule({ declarations: [ CacheGroupTableComponent ], - imports: [ReactiveFormsModule, HttpClientModule, RouterTestingModule], - providers: [ - { provide: CacheGroupService, useValue: mockAPIService } - ] + imports: [ + APITestingModule, + HttpClientModule, + ReactiveFormsModule, + RouterTestingModule + ], }) .compileComponents(); }); diff --git a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts index 89aa414c58..fab6f801a4 100644 --- a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts +++ b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts @@ -18,7 +18,7 @@ import { ActivatedRoute } from "@angular/router"; import { BehaviorSubject } from "rxjs"; import { CacheGroup } from "src/app/models/cache-groups"; -import { CacheGroupService } from "src/app/shared/api"; +import { CacheGroupService } from "src/app/api"; import { ContextMenuActionEvent, ContextMenuItem } from "../../../shared/generic-table/generic-table.component"; /** diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index 3d524ecfa6..25376d3156 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -20,7 +20,7 @@ import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; -import { CacheGroupService, ProfileService, TypeService } from "src/app/shared/api"; +import { ProfileService, TypeService } from "src/app/shared/api"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerDetailsComponent } from "./server-details.component"; @@ -30,9 +30,7 @@ describe("ServerDetailsComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getCacheGroups", - "getProfiles", "getTypes", "getPhysicalLocations", "getServerTypes"]); - mockAPIService.getCacheGroups.and.returnValue(new Promise(r => r([]))); + const mockAPIService = jasmine.createSpyObj(["getProfiles", "getTypes", "getPhysicalLocations", "getServerTypes"]); mockAPIService.getProfiles.and.returnValue(new Promise(r => r([]))); mockAPIService.getPhysicalLocations.and.returnValues(new Promise(r => r([]))); mockAPIService.getServerTypes.and.returnValues(new Promise(r => r([]))); @@ -41,7 +39,6 @@ describe("ServerDetailsComponent", () => { declarations: [ ServerDetailsComponent ], imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], providers: [ - { provide: CacheGroupService, useValue: mockAPIService }, { provide: TypeService, useValue: mockAPIService }, { provide: PhysicalLocationService, useValue: mockAPIService }, { provide: ProfileService, useValue: mockAPIService } diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index c2bfff09d2..2eb1938c94 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -17,8 +17,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; -import { CDNService } from "src/app/api"; -import { CacheGroupService, ProfileService, TypeService } from "src/app/shared/api"; +import { CacheGroupService, CDNService } from "src/app/api"; +import { ProfileService, TypeService } from "src/app/shared/api"; import { IP, IP_WITH_CIDR } from "src/app/utils"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerService } from "src/app/api/server.service"; diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index 00f66f6b73..a330c589d1 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -12,7 +12,6 @@ * limitations under the License. */ -export * from "./CacheGroupService"; export * from "./DeliveryServiceService"; export * from "./InvalidationJobService"; export * from "./ProfileService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 706938cd10..4c50c94f46 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -25,7 +25,6 @@ import {GenericTableComponent} from "./generic-table/generic-table.component"; import {LinechartDirective} from "./charts/linechart.directive"; import {AlertService} from "./alert/alert.service"; import { - CacheGroupService, DeliveryServiceService, InvalidationJobService, ProfileService, @@ -75,7 +74,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- { multi: true, provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor }, { multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor }, AlertService, - CacheGroupService, CurrentUserService, DeliveryServiceService, InvalidationJobService, From 2b9c6730e4d52268fd36a51116555958064b2b4f Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 19 Jan 2022 20:00:07 -0700 Subject: [PATCH 11/50] Move the Delivery Service service to the API module --- .../delivery-service.service.ts} | 4 +- .../traffic-portal/src/app/api/index.ts | 3 + .../api/testing/delivery-service.service.ts | 444 ++++++++++++++++++ .../src/app/api/testing/index.ts | 13 +- .../dashboard/dashboard.component.spec.ts | 23 +- .../app/core/dashboard/dashboard.component.ts | 8 +- .../deliveryservice.component.spec.ts | 102 +--- .../deliveryservice.component.ts | 2 +- .../core/ds-card/ds-card.component.spec.ts | 28 +- .../src/app/core/ds-card/ds-card.component.ts | 4 +- .../invalidation-jobs.component.spec.ts | 35 +- .../invalidation-jobs.component.ts | 5 +- .../new-delivery-service.component.spec.ts | 3 +- .../new-delivery-service.component.ts | 9 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 2 - 16 files changed, 508 insertions(+), 178 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/DeliveryServiceService.ts => api/delivery-service.service.ts} (99%) create mode 100644 experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts diff --git a/experimental/traffic-portal/src/app/shared/api/DeliveryServiceService.ts b/experimental/traffic-portal/src/app/api/delivery-service.service.ts similarity index 99% rename from experimental/traffic-portal/src/app/shared/api/DeliveryServiceService.ts rename to experimental/traffic-portal/src/app/api/delivery-service.service.ts index 1e966c204c..95a5efc5e7 100644 --- a/experimental/traffic-portal/src/app/shared/api/DeliveryServiceService.ts +++ b/experimental/traffic-portal/src/app/api/delivery-service.service.ts @@ -25,8 +25,8 @@ import { InvalidationJob, TPSData, Type -} from "../../models"; -import { APIService } from "./APIService"; +} from "src/app/models"; +import { APIService } from "./base-api.service"; /** * The type of a raw response returned from the API that has to be massaged diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index ddb89d2cc0..3ca5e47992 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -3,9 +3,11 @@ import { CommonModule } from "@angular/common"; import { CDNService } from "./cdn.service"; import { ServerService } from "./server.service"; import { CacheGroupService } from "./cache-group.service"; +import { DeliveryServiceService } from "./delivery-service.service"; export * from "./cache-group.service"; export * from "./cdn.service"; +export * from "./delivery-service.service"; export * from "./server.service"; /** @@ -19,6 +21,7 @@ export * from "./server.service"; providers: [ CacheGroupService, CDNService, + DeliveryServiceService, ServerService ] }) diff --git a/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts b/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts new file mode 100644 index 0000000000..57e0bca8de --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts @@ -0,0 +1,444 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import { Injectable } from "@angular/core"; + +import type { + DataPoint, + DataSetWithSummary, + DeliveryService, + DSCapacity, + DSHealth, + InvalidationJob, + TPSData, + Type +} from "src/app/models"; + +/** + * The type of a raw response returned from the API that has to be massaged + * into a DataSet. + */ +interface DataResponse { + series: { + name: string; + values: Array<[number, number | null]>; + }; + summary?: { + min: number; + max: number; + fifthPercentile: number; + ninetyFifthPercentile: number; + ninetyEightPercentile: number; + mean: number; + }; +} + +/** + * A random dataset (values [0-100]) generated by {@link generateDataSet}. + */ +interface GeneratedDataSet { + data: [number, number][]; + max: number; + mean: number; + min: number; +} + +/** + * Generates random bandwidth or tps data for presenting as API output in tests. + * + * @param start The start time of the data set. + * @param end The end time of the data set. + * @param step The amount of time within which to group data into points. + * @returns A generated data set, including some summary metrics. + */ +function generateDataSet(start: Date, end: Date, step: number): GeneratedDataSet { + const data = new Array<[number, number]>(); + const finish = end.valueOf(); + let min = Infinity; + let max = -Infinity; + let sum = 0; + for (let current = start.valueOf(); current < finish; current += step) { + const value = Math.random()*100; + if (value < min) { + min = value; + } + if (value > max) { + max = value; + } + sum += value; + data.push([current, value]); + } + return { + data, + max, + mean: sum / data.length, + min + }; +} + +/** + * DeliveryServiceService exposes API functionality related to Delivery Services. + */ +@Injectable() +export class DeliveryServiceService { + + private readonly deliveryServices = new Array(); + private idCounter = 0; + private readonly dsTypes = [ + { + description: "No Content Routing - arbitrary remap at the edge, no Traffic Router config", + id: 5, + lastUpdated: new Date(), + name: "ANY_MAP", + useInTable: "deliveryservice" + }, + { + description: "Client-Controlled Steering Delivery Service", + id: 6, + lastUpdated: new Date(), + name: "CLIENT_STEERING", + useInTable: "deliveryservice" + }, + { + description: "DNS Content Routing", + id: 7, + lastUpdated: new Date(), + name: "DNS", + useInTable: "deliveryservice" + }, + { + description: "DNS Content routing, RAM cache, Local", + id: 8, + lastUpdated: new Date(), + name: "DNS_LIVE", + useInTable: "deliveryservice" + }, + { + description: "DNS Content routing, RAM cache, National", + id: 9, + lastUpdated: new Date(), + name: "DNS_LIVE_NATNL", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content Routing", + id: 10, + lastUpdated: new Date(), + name: "HTTP", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content routing cache in RAM", + id: 11, + lastUpdated: new Date(), + name: "HTTP_LIVE", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content routing, RAM cache, National", + id: 12, + lastUpdated: new Date(), + name: "HTTP_LIVE_NATNL", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content Routing, no caching", + id: 13, + lastUpdated: new Date(), + name: "HTTP_NO_CACHE", + useInTable: "deliveryservice" + }, + { + description: "Steering Delivery Service", + id: 14, + lastUpdated: new Date(), + name: "STEERING", + useInTable: "deliveryservice" + } + ]; + + public async getDeliveryServices(id: string | number): Promise; + public async getDeliveryServices(): Promise>; + /** + * Gets a list of all visible Delivery Services + * + * @param id A unique identifier for a Delivery Service - either a numeric id or an "xml_id" + * @throws TypeError if ``id`` is not a proper type + * @returns An array of `DeliveryService` objects. + */ + public async getDeliveryServices(id?: string | number): Promise { + if (id !== undefined) { + let ds; + switch (typeof id) { + case "string": + ds = this.deliveryServices.filter(d=>d.xmlId === id)[0]; + break; + case "number": + ds = this.deliveryServices.filter(d=>d.id === id); + } + if (!ds) { + throw new Error(`no such Delivery Service: ${id}`); + } + return ds; + } + return this.deliveryServices; + } + + /** + * Creates a new Delivery Service + * + * @param ds The new Delivery Service object + * @returns A boolean value indicating the success of the operation + */ + public async createDeliveryService(ds: DeliveryService): Promise { + ds.id = ++this.idCounter; + ds.lastUpdated = new Date(); + this.deliveryServices.push(ds); + return true; + } + + /** + * Retrieves capacity statistics for the Delivery Service identified by a given, unique, + * integral value. + * + * @param d Either a {@link DeliveryService} or an integral, unique identifier of a Delivery Service + * @returns An object that hopefully has the right keys to represent capacity. + * @throws If `d` is a {@link DeliveryService} that has no (valid) id + */ + public async getDSCapacity(d: number | DeliveryService): Promise { + let id: number; + if (typeof d === "number") { + id = d; + } else { + d = d; + if (!d.id || d.id < 0) { + throw new Error("Delivery Service id must be defined!"); + } + id = d.id; + } + + const ds = this.deliveryServices.filter(service=>service.id === id)[0]; + if (!ds) { + throw new Error(`no such Delivery Service: #${id}`); + } + const val = ds.lastUpdated ? ds.lastUpdated.valueOf() : 100; + + return { + availablePercent: val %40, + maintenancePercent: val %40, + utilizedPercent: val %20 + }; + } + + /** + * Retrieves the Cache Group health of a Delivery Service identified by a given, unique, + * integral value. + * + * @param d The integral, unique identifier of a Delivery Service + * @returns A response from the health endpoint + */ + public async getDSHealth(d: number): Promise { + const ds = this.deliveryServices.filter(service => service.id === d)[0]; + if (!ds) { + throw new Error(`no such Delivery Service: #${d}`); + } + const val = ds.lastUpdated ? ds.lastUpdated.valueOf() : 100; + return { + totalOffline: val % 50, + totalOnline: 100-(val%50) + }; + } + + public async getDSKBPS(d: string, s: Date, e: Date, i: string, u: boolean, dataOnly: true): Promise>; + public async getDSKBPS(d: string, start: Date, end: Date, interval: string, useMids: boolean, dataOnly?: false): Promise; + /** + * Retrieves Delivery Service throughput statistics for a given time period, averaged over a given + * interval. + * + * @param d The `xml_id` of a Delivery Service + * @param start A date/time from which to start data collection + * @param end A date/time at which to end data collection + * @param interval A unit-suffixed interval over which data will be "binned" + * @param _ Unuzed - kept for compatibility with the "concrete" service. + * @param dataOnly Only returns the data series, not any supplementing meta info found in the API response + * @returns An Array of datapoint Arrays (length 2 containing a date string and data value) + */ + public async getDSKBPS( + d: string, + start: Date, + end: Date, + interval: string, + _: boolean, + dataOnly?: boolean + ): Promise | DataResponse> { + const ds = this.deliveryServices.filter(service=>service.xmlId === d)[0]; + if (!ds) { + throw new Error(`no such Delivery Service: ${d}`); + } + // Here we assume that `interval` is a number followed by 'm' for 'minutes'. + const step = parseInt(interval.slice(0, -1), 10)*60000; + + const {data, max, mean, min} = generateDataSet(start, end, step); + + if (dataOnly) { + return data.map(p=>({t: new Date(p[0]), y: p[1]})); + } + return { + series: { + name: `kbps.ds.${step / 60000}min`, + values: data + }, + summary: { + // TODO: these percentiles should technically be accurate + // (depending on the implementation of Math.random) but could + // probably be calculated. If that would ever matter. + fifthPercentile: 5, + max, + mean, + min, + ninetyEightPercentile: 98, + ninetyFifthPercentile: 95, + } + }; + } + + /** + * Gets total TPS data for a Delivery Service. To get TPS data broken down by HTTP status, use {@link getAllDSTPSData}. + * + * @param d The name (xmlid) of the Delivery Service for which TPS stats will be fetched + * @param start The desired start date/time of the data range (must not have nonzero milliseconds!) + * @param end The desired end date/time of the data range (must not have nonzero milliseconds!) + * @param interval A string that describes the interval across which to 'bucket' data e.g. '60s' + * @returns The requested DataResponse. + */ + public async getDSTPS( + d: string, + start: Date, + end: Date, + interval: string, + ): Promise { + const ds = this.deliveryServices.filter(service=>service.xmlId === d)[0]; + if (!ds) { + throw new Error(`no such Delivery Service: ${d}`); + } + // Here we assume that `interval` is a number followed by 'm' for 'minutes'. + const step = parseInt(interval.slice(0, -1), 10)*60000; + + const {data, max, mean, min} = generateDataSet(start, end, step); + + return { + series: { + name: `tps_total.ds.${step / 60000}min`, + values: data + }, + summary: { + // TODO: these percentiles should technically be accurate + // (depending on the implementation of Math.random) but could + // probably be calculated. If that would ever matter. + fifthPercentile: 5, + max, + mean, + min, + ninetyEightPercentile: 98, + ninetyFifthPercentile: 95, + } + }; + } + + /** + * Gets total TPS data for a Delivery Service, as well as TPS data by HTTP response type. + * + * @param d The name (xmlid) of the Delivery Service for which TPS stats will be fetched + * @param start The desired start date/time of the data range (must not have nonzero milliseconds!) + * @param end The desired end date/time of the data range (must not have nonzero milliseconds!) + * @param interval A string that describes the interval across which to 'bucket' data e.g. '60s' + * @returns The requested TPSData. + */ + public async getAllDSTPSData( + d: string, + start: Date, + end: Date, + interval: string, + ): Promise { + const ds = this.deliveryServices.filter(service=>service.xmlId === d)[0]; + if (!ds) { + throw new Error(`no such Delivery Service: ${d}`); + } + + // Here we assume that `interval` is a number followed by 'm' for 'minutes'. + const step = parseInt(interval.slice(0, -1), 10)*60000; + + const {data, max, mean, min} = generateDataSet(start, end, step); + const total = { + dataSet: { + data: data.map(p=>({t: new Date(p[0]), y: p[1]})), + label: "tps_total" + }, + fifthPercentile: 5, + max, + mean, + min, + ninetyEighthPercentile: 98, + ninetyFifthPercentile: 95 + }; + const mkDataSet = (label: string): DataSetWithSummary => ({ + dataSet: { + data: total.dataSet.data.map(p=>({t: p.t, y: p.y/4})), + label + }, + fifthPercentile: total.fifthPercentile / 4, + max: Math.random()*4 >= 3 ? total.max : total.max / 4, + mean: total.mean / 4, + min: Math.random()*4 >=3 ? total.min : (total.min + 7 > total.max ? total.min : total.min + 7) , + ninetyEighthPercentile: total.ninetyEighthPercentile / 4, + ninetyFifthPercentile: total.ninetyFifthPercentile / 4 + }); + + const success = mkDataSet("tps_2xx"); + const redirection = mkDataSet("tps_3xx"); + const clientError = mkDataSet("tps_4xx"); + const serverError = mkDataSet("tps_5xx"); + + return { + clientError, + redirection, + serverError, + success, + total, + }; + } + + /** + * This method is handled seperately from :js:method:`APIService.getTypes` because this information + * (should) never change, and therefore can be cached. This method makes an HTTP request iff the values are not already + * cached. + * + * @returns An array of all of the Type objects in Traffic Ops that refer specifically to Delivery Service + * types. + */ + public async getDSTypes(): Promise> { + return this.dsTypes; + } + + /** + * Creates a new content invalidation job. + * + * @todo Implement this when the Jobs Service is moved to the API module. + * + * @param job The content invalidation job to be created. + * @returns whether or not creation succeeded. + */ + public async createInvalidationJob(job: InvalidationJob): Promise { + return this.deliveryServices.findIndex(ds=>ds.xmlId === job.deliveryService) >= 0; + } +} diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index e81fe8e185..cae98d7014 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -1,9 +1,15 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { CacheGroupService, CDNService, ServerService } from ".."; -import { ServerService as TestingServerService } from "./server.service"; -import { CDNService as TestingCDNService } from "./cdn.service"; +import { + CacheGroupService, + CDNService, + DeliveryServiceService, + ServerService, +} from ".."; import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; +import { CDNService as TestingCDNService } from "./cdn.service"; +import { DeliveryServiceService as TestingDeliveryServiceService } from "./delivery-service.service"; +import { ServerService as TestingServerService } from "./server.service"; /** * The API Testing Module provides mock services that allow components to use @@ -17,6 +23,7 @@ import { CacheGroupService as TestingCacheGroupService } from "./cache-group.ser providers: [ {provide: CacheGroupService, useClass: TestingCacheGroupService}, {provide: CDNService, useClass: TestingCDNService}, + {provide: DeliveryServiceService, useClass: TestingDeliveryServiceService}, {provide: ServerService, useClass: TestingServerService} ] }) diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts index 3af217cd97..d032f25eff 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts @@ -15,16 +15,17 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; -import {DeliveryServiceService, UserService} from "src/app/shared/api"; - +import { APITestingModule } from "src/app/api/testing"; +import { DeliveryService } from "src/app/models"; +import { UserService } from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { LinechartDirective } from "../../shared/charts/linechart.directive"; -import { DeliveryService } from "../../models"; +import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { LoadingComponent } from "src/app/shared/loading/loading.component"; +import { AlertService } from "src/app/shared/alert/alert.service"; + import { DsCardComponent } from "../ds-card/ds-card.component"; -import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; -import {LoadingComponent} from "../../shared/loading/loading.component"; -import {AlertService} from "../../shared/alert/alert.service"; import { DashboardComponent } from "./dashboard.component"; describe("DashboardComponent", () => { @@ -32,12 +33,10 @@ describe("DashboardComponent", () => { let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - const mockAPIService = jasmine.createSpyObj(["getDeliveryServices"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"], {capabilities: new Set()}); const mockAlertService = jasmine.createSpyObj(["newAlert"]); - mockAPIService.getDeliveryServices.and.returnValue(new Promise(resolve=>resolve([]))); TestBed.configureTestingModule({ declarations: [ @@ -48,6 +47,7 @@ describe("DashboardComponent", () => { LinechartDirective ], imports: [ + APITestingModule, FormsModule, HttpClientModule, ReactiveFormsModule, @@ -55,9 +55,8 @@ describe("DashboardComponent", () => { ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }, - { provide: DeliveryServiceService, useValue: mockAPIService }, - { provide: UserService, useValue: mockAPIService }, - { provide: AlertService, useValue: mockAlertService } + { provide: AlertService, useValue: mockAlertService }, + { provide: UserService, useValue: mockCurrentUserService } ] }); TestBed.compileComponents(); diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts index c5e6f2328f..8ea4fbb18d 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts @@ -15,10 +15,10 @@ import { Component, OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; -import { DeliveryService } from "../../models"; -import { DeliveryServiceService } from "../../shared/api"; -import { orderBy, fuzzyScore } from "../../utils"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; +import { DeliveryServiceService } from "src/app/api"; +import type { DeliveryService } from "src/app/models"; +import { orderBy, fuzzyScore } from "src/app/utils"; /** * DashboardComponent is the controller for the dashboard, where a user sees all diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts index af3e6ed0d2..17ac8b70fa 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts @@ -16,15 +16,14 @@ import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; -import { of } from "rxjs"; - - +import { APITestingModule } from "src/app/api/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { LinechartDirective } from "../../shared/charts/linechart.directive"; -import { DeliveryService, GeoLimit, GeoProvider, TPSData } from "../../models"; -import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; -import {DeliveryServiceService, UserService} from "../../shared/api"; -import {AlertService} from "../../shared/alert/alert.service"; +import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; +// import { DeliveryService, GeoLimit, GeoProvider, TPSData } from "src/app/models"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { UserService } from "src/app/shared/api"; +import { AlertService } from "src/app/shared/alert/alert.service"; + import { DeliveryserviceComponent } from "./deliveryservice.component"; @@ -34,92 +33,9 @@ describe("DeliveryserviceComponent", () => { beforeEach(waitForAsync(() => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getDeliveryServices", "getDSKBPS", "getAllDSTPSData"]); + const mockAPIService = jasmine.createSpyObj(["getUsers"]); const mockAlertService = jasmine.createSpyObj(["newAlert"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); - mockAPIService.getDeliveryServices.and.returnValue(of({ - active: true, - anonymousBlockingEnabled: false, - cdnId: 0, - displayName: "test DS", - dscp: 0, - geoLimit: GeoLimit.NONE, - geoProvider: GeoProvider.MAX_MIND, - ipv6RoutingEnabled: true, - lastUpdated: new Date(), - logsEnabled: true, - longDesc: "A test Delivery Service for API mock-ups", - missLat: 0, - missLong: 0, - multiSiteOrigin: false, - regionalGeoBlocking: false, - routingName: "test-DS", - typeId: 0, - xmlId: "test-DS" - } as DeliveryService )); - mockAPIService.getDSKBPS.and.returnValue(of({series: {values: []}}), of({series: {values: []}})); - mockAPIService.getAllDSTPSData.and.returnValue(of({ - clientError: { - dataSet: { - data: [], - label: "" - }, - fifthPercentile: 0, - max: 0, - mean: 0, - min: 0, - ninetyEighthPercentile: 0, - ninetyFifthPercentile: 0 - }, - redirection: { - dataSet: { - data: [], - label: "" - }, - fifthPercentile: 0, - max: 0, - mean: 0, - min: 0, - ninetyEighthPercentile: 0, - ninetyFifthPercentile: 0 - }, - serverError: { - dataSet: { - data: [], - label: "" - }, - fifthPercentile: 0, - max: 0, - mean: 0, - min: 0, - ninetyEighthPercentile: 0, - ninetyFifthPercentile: 0 - }, - success: { - dataSet: { - data: [], - label: "" - }, - fifthPercentile: 0, - max: 0, - mean: 0, - min: 0, - ninetyEighthPercentile: 0, - ninetyFifthPercentile: 0, - }, - total: { - dataSet: { - data: [], - label: "" - }, - fifthPercentile: 0, - max: 0, - mean: 0, - min: 0, - ninetyEighthPercentile: 0, - ninetyFifthPercentile: 0, - } - } as TPSData)); TestBed.configureTestingModule({ declarations: [ @@ -128,13 +44,13 @@ describe("DeliveryserviceComponent", () => { LinechartDirective ], imports: [ + APITestingModule, FormsModule, HttpClientModule, ReactiveFormsModule, RouterTestingModule ], providers: [ - { provide: DeliveryServiceService, useValue: mockAPIService }, { provide: AlertService, useValue: mockAlertService }, { provide: CurrentUserService, useValue: mockCurrentUserService }, { provide: UserService, useValue: mockAPIService } diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts index 065a2a9a84..6bc83fcb22 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts @@ -18,8 +18,8 @@ import { faBroom } from "@fortawesome/free-solid-svg-icons"; import { Subject } from "rxjs"; +import { DeliveryServiceService } from "src/app/api"; import { DataPoint, DataSet, DeliveryService } from "../../models"; -import { DeliveryServiceService } from "../../shared/api"; import {AlertService} from "../../shared/alert/alert.service"; /** diff --git a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts index b5ec3301d1..301fdcf13d 100644 --- a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts @@ -15,13 +15,11 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; -import { of } from "rxjs"; +import { APITestingModule } from "src/app/api/testing"; +import type { DeliveryService } from "src/app/models"; +import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; +import { LoadingComponent } from "src/app/shared/loading/loading.component"; - -import { LinechartDirective } from "../../shared/charts/linechart.directive"; -import { DeliveryService } from "../../models"; -import {LoadingComponent} from "../../shared/loading/loading.component"; -import {DeliveryServiceService} from "../../shared/api"; import { DsCardComponent } from "./ds-card.component"; describe("DsCardComponent", () => { @@ -29,18 +27,6 @@ describe("DsCardComponent", () => { let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - // mock the API - const mockAPIService = jasmine.createSpyObj(["getDSKBPS", "getDSCapacity", "getDSHealth", "getDeliveryServices"]); - mockAPIService.getDSKBPS.and.returnValue(of([]), of([])); - mockAPIService.getDSCapacity.and.returnValue(of({ - availablePercent: 34, - maintenance: 42, - utilized: 24 - })); - mockAPIService.getDSHealth.and.returnValue(of({ - totalOffline: 20, - totalOnline: 80 - })); TestBed.configureTestingModule({ declarations: [ @@ -49,12 +35,10 @@ describe("DsCardComponent", () => { LinechartDirective ], imports: [ + APITestingModule, HttpClientModule, - RouterTestingModule + RouterTestingModule, ], - providers: [ - { provide: DeliveryServiceService, useValue: mockAPIService } - ] }); TestBed.compileComponents(); })); diff --git a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts index d65014d243..69dcdccff2 100644 --- a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts +++ b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts @@ -18,8 +18,8 @@ import { faInfoCircle } from "@fortawesome/free-solid-svg-icons"; import { Subject } from "rxjs"; -import { DataPoint, DataSet, DeliveryService, GeoProvider, protocolToString } from "../../models"; -import { DeliveryServiceService } from "../../shared/api"; +import { DeliveryServiceService } from "src/app/api"; +import { DataPoint, DataSet, DeliveryService, GeoProvider, protocolToString } from "src/app/models"; /** diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index 581ee8dbf6..0128486da0 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -18,13 +18,14 @@ import { RouterTestingModule } from "@angular/router/testing"; import { MatDialogModule } from "@angular/material/dialog"; import { of } from "rxjs"; -import {DeliveryServiceService, InvalidationJobService, UserService} from "src/app/shared/api"; - +import { APITestingModule } from "src/app/api/testing"; +import { InvalidationJobService, UserService} from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { CustomvalidityDirective } from "../../shared/validation/customvalidity.directive"; -import { DeliveryService, GeoLimit, GeoProvider, InvalidationJob, JobType } from "../../models"; -import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; +import { CustomvalidityDirective } from "src/app/shared/validation/customvalidity.directive"; +import { InvalidationJob, JobType } from "src/app/models"; +import {TpHeaderComponent} from "src/app/shared/tp-header/tp-header.component"; + import { InvalidationJobsComponent } from "./invalidation-jobs.component"; describe("InvalidationJobsComponent", () => { @@ -33,31 +34,11 @@ describe("InvalidationJobsComponent", () => { beforeEach(waitForAsync(() => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getInvalidationJobs", "getDeliveryServices"]); + const mockAPIService = jasmine.createSpyObj(["getInvalidationJobs"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); mockAPIService.getInvalidationJobs.and.returnValue(of({ startTime: new Date(), } as InvalidationJob)); - mockAPIService.getDeliveryServices.and.returnValue(of({ - active: true, - anonymousBlockingEnabled: false, - cdnId: 0, - displayName: "test DS", - dscp: 0, - geoLimit: GeoLimit.NONE, - geoProvider: GeoProvider.MAX_MIND, - ipv6RoutingEnabled: true, - lastUpdated: new Date(), - logsEnabled: true, - longDesc: "A test Delivery Service for API mock-ups", - missLat: 0, - missLong: 0, - multiSiteOrigin: false, - regionalGeoBlocking: false, - routingName: "test-DS", - typeId: 0, - xmlId: "test-DS" - } as DeliveryService)); TestBed.configureTestingModule({ declarations: [ @@ -66,6 +47,7 @@ describe("InvalidationJobsComponent", () => { CustomvalidityDirective ], imports: [ + APITestingModule, FormsModule, HttpClientModule, ReactiveFormsModule, @@ -74,7 +56,6 @@ describe("InvalidationJobsComponent", () => { ], providers: [ { provide: InvalidationJobService, useValue: mockAPIService }, - { provide: DeliveryServiceService, useValue: mockAPIService }, { provide: UserService, useValue: mockAPIService }, { provide: CurrentUserService, useValue: mockCurrentUserService } ] diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts index 9a26732b8d..9a9425e1c7 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts @@ -16,8 +16,9 @@ import { MatDialog } from "@angular/material/dialog"; import { ActivatedRoute } from "@angular/router"; import { faPlus, faTrash, faPencilAlt } from "@fortawesome/free-solid-svg-icons"; -import { defaultDeliveryService, DeliveryService, InvalidationJob } from "../../models"; -import { DeliveryServiceService, InvalidationJobService } from "../../shared/api"; +import { DeliveryServiceService } from "src/app/api"; +import { defaultDeliveryService, DeliveryService, InvalidationJob } from "src/app/models"; +import { InvalidationJobService } from "src/app/shared/api"; import { NewInvalidationJobDialogComponent } from "./new-invalidation-job-dialog/new-invalidation-job-dialog.component"; /** diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts index 74e7ab1185..22ffe23a7f 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts @@ -25,7 +25,7 @@ import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; -import { DeliveryServiceService, UserService } from "src/app/shared/api"; +import { UserService } from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { Protocol } from "../../models"; @@ -67,7 +67,6 @@ describe("NewDeliveryServiceComponent", () => { MatRadioModule ], providers: [ - {provide: DeliveryServiceService, useValue: mockAPIService}, {provide: UserService, useValue: mockAPIService}, { provide: CurrentUserService, useValue: mockCurrentUserService } ] diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts index 943cded8e6..e36112ad34 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts @@ -16,7 +16,7 @@ import { FormControl } from "@angular/forms"; import type { MatStepper } from "@angular/material/stepper"; import { Router } from "@angular/router"; -import { CDNService } from "src/app/api"; +import { CDNService, DeliveryServiceService } from "src/app/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { bypassable, @@ -25,10 +25,9 @@ import { DeliveryService, Protocol, protocolToString, - Type -} from "../../models"; -import { User } from "../../models/user"; -import { DeliveryServiceService } from "../../shared/api"; + Type, + User +} from "src/app/models"; /** * A regular expression that matches character strings that are illegal in `xml_id`s diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index a330c589d1..2bc392575d 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -12,7 +12,6 @@ * limitations under the License. */ -export * from "./DeliveryServiceService"; export * from "./InvalidationJobService"; export * from "./ProfileService"; export * from "./TypeService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 4c50c94f46..cd5dd73379 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -25,7 +25,6 @@ import {GenericTableComponent} from "./generic-table/generic-table.component"; import {LinechartDirective} from "./charts/linechart.directive"; import {AlertService} from "./alert/alert.service"; import { - DeliveryServiceService, InvalidationJobService, ProfileService, TypeService, @@ -75,7 +74,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- { multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor }, AlertService, CurrentUserService, - DeliveryServiceService, InvalidationJobService, PhysicalLocationService, ProfileService, From f11f5aba9df9ac6179f14db9b244a29e7685ded5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 01:38:49 -0700 Subject: [PATCH 12/50] Move the Type service to the API module --- experimental/traffic-portal/server.ts | 7 +- .../traffic-portal/src/app/api/index.ts | 7 +- .../src/app/api/testing/index.ts | 5 +- .../src/app/api/testing/type.service.ts | 186 ++++++++++++++++++ .../TypeService.ts => api/type.service.ts} | 4 +- .../traffic-portal/src/app/app.module.ts | 8 +- .../server-details.component.spec.ts | 6 +- .../server-details.component.ts | 4 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 2 - 10 files changed, 209 insertions(+), 21 deletions(-) create mode 100644 experimental/traffic-portal/src/app/api/testing/type.service.ts rename experimental/traffic-portal/src/app/{shared/api/TypeService.ts => api/type.service.ts} (96%) diff --git a/experimental/traffic-portal/server.ts b/experimental/traffic-portal/server.ts index b354564c33..972e2a3457 100644 --- a/experimental/traffic-portal/server.ts +++ b/experimental/traffic-portal/server.ts @@ -185,9 +185,10 @@ function run(): number { key, rejectUnauthorized: !config.insecure }, - server).listen(config.port, ()=> { - console.log(`Node Express server listening on port ${config.port}`); - }); + server + ).listen(config.port, ()=> { + console.log(`Node Express server listening on port ${config.port}`); + }); try { createRedirectServer( (req, res) => { diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 3ca5e47992..5df1664f57 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -1,13 +1,15 @@ import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; import { CDNService } from "./cdn.service"; -import { ServerService } from "./server.service"; import { CacheGroupService } from "./cache-group.service"; import { DeliveryServiceService } from "./delivery-service.service"; +import { ServerService } from "./server.service"; +import { TypeService } from "./type.service"; export * from "./cache-group.service"; export * from "./cdn.service"; export * from "./delivery-service.service"; +export * from "./type.service"; export * from "./server.service"; /** @@ -22,7 +24,8 @@ export * from "./server.service"; CacheGroupService, CDNService, DeliveryServiceService, - ServerService + ServerService, + TypeService, ] }) export class APIModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index cae98d7014..c4fac95542 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -5,11 +5,13 @@ import { CDNService, DeliveryServiceService, ServerService, + TypeService } from ".."; import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; import { CDNService as TestingCDNService } from "./cdn.service"; import { DeliveryServiceService as TestingDeliveryServiceService } from "./delivery-service.service"; import { ServerService as TestingServerService } from "./server.service"; +import { TypeService as TestingTypeService } from "./type.service"; /** * The API Testing Module provides mock services that allow components to use @@ -24,7 +26,8 @@ import { ServerService as TestingServerService } from "./server.service"; {provide: CacheGroupService, useClass: TestingCacheGroupService}, {provide: CDNService, useClass: TestingCDNService}, {provide: DeliveryServiceService, useClass: TestingDeliveryServiceService}, - {provide: ServerService, useClass: TestingServerService} + {provide: ServerService, useClass: TestingServerService}, + {provide: TypeService, useClass: TestingTypeService}, ] }) export class APITestingModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/type.service.ts b/experimental/traffic-portal/src/app/api/testing/type.service.ts new file mode 100644 index 0000000000..cc3e6c974b --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/type.service.ts @@ -0,0 +1,186 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import { Injectable } from "@angular/core"; + +import type { Type } from "src/app/models"; + +/** The allowed values for the 'useInTables' query parameter of GET requests to /types. */ +type UseInTable = "cachegroup" | +"server" | +"deliveryservice" | +"to_extension" | +"federation_resolver" | +"regex" | +"staticdnsentry" | +"steering_target"; + +/** + * TypeService exposes API functionality relating to Types. + */ +@Injectable() +export class TypeService { + + private readonly types = [ + { + description: "Mid Logical Location", + id: 1, + lastUpdated: new Date(), + name: "MID_LOC", + useInTable: "cachegroup" + }, + { + description: "Edge Logical Location", + id: 2, + lastUpdated: new Date(), + name: "EDGE_LOC", + useInTable: "cachegroup" + }, + { + description: "Origin Logical Site", + id: 3, + lastUpdated: new Date(), + name: "ORG_LOC", + useInTable: "cachegroup" + }, + { + description: "Traffic Control Component Location", + id: 4, + lastUpdated: new Date(), + name: "TC_LOC", + useInTable: "cachegroup" + }, + { + description: "Traffic Router Logical Location", + id: 15, + lastUpdated: new Date(), + name: "TR_LOC", + useInTable: "cachegroup" + }, + { + description: "No Content Routing - arbitrary remap at the edge, no Traffic Router config", + id: 5, + lastUpdated: new Date(), + name: "ANY_MAP", + useInTable: "deliveryservice" + }, + { + description: "Client-Controlled Steering Delivery Service", + id: 6, + lastUpdated: new Date(), + name: "CLIENT_STEERING", + useInTable: "deliveryservice" + }, + { + description: "DNS Content Routing", + id: 7, + lastUpdated: new Date(), + name: "DNS", + useInTable: "deliveryservice" + }, + { + description: "DNS Content routing, RAM cache, Local", + id: 8, + lastUpdated: new Date(), + name: "DNS_LIVE", + useInTable: "deliveryservice" + }, + { + description: "DNS Content routing, RAM cache, National", + id: 9, + lastUpdated: new Date(), + name: "DNS_LIVE_NATNL", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content Routing", + id: 10, + lastUpdated: new Date(), + name: "HTTP", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content routing cache in RAM", + id: 11, + lastUpdated: new Date(), + name: "HTTP_LIVE", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content routing, RAM cache, National", + id: 12, + lastUpdated: new Date(), + name: "HTTP_LIVE_NATNL", + useInTable: "deliveryservice" + }, + { + description: "HTTP Content Routing, no caching", + id: 13, + lastUpdated: new Date(), + name: "HTTP_NO_CACHE", + useInTable: "deliveryservice" + }, + { + description: "Steering Delivery Service", + id: 14, + lastUpdated: new Date(), + name: "STEERING", + useInTable: "deliveryservice" + } + ]; + + public async getTypes(idOrName: number | string): Promise; + public async getTypes(): Promise>; + /** + * Gets one or all Types from Traffic Ops + * + * @param idOrName Either the integral, unique identifier (number) or name (string) of a single Type to be returned. + * @returns The requested Type(s). + */ + public async getTypes(idOrName?: number | string): Promise> { + if (idOrName !== undefined) { + let type; + switch (typeof idOrName) { + case "string": + type = this.types.filter(t=>t.name === idOrName)[0]; + break; + case "number": + type = this.types.filter(t=>t.id === idOrName)[0]; + } + if (!type) { + throw new Error(`no such Type: ${idOrName}`); + } + return type; + } + return this.types; + } + + /** + * Gets all Types used by specific database table. + * + * @param useInTable The database table for which to retrieve Types. + * @returns The requested Types. + */ + public async getTypesInTable(useInTable: UseInTable): Promise> { + return this.types.filter(t=>t.useInTable === useInTable); + } + + /** + * Gets all Server Types. + * + * @returns All Types that have 'server' as their 'useInTable'. + */ + public async getServerTypes(): Promise> { + return this.getTypesInTable("server"); + } +} diff --git a/experimental/traffic-portal/src/app/shared/api/TypeService.ts b/experimental/traffic-portal/src/app/api/type.service.ts similarity index 96% rename from experimental/traffic-portal/src/app/shared/api/TypeService.ts rename to experimental/traffic-portal/src/app/api/type.service.ts index ee56d8919d..41723a5d57 100644 --- a/experimental/traffic-portal/src/app/shared/api/TypeService.ts +++ b/experimental/traffic-portal/src/app/api/type.service.ts @@ -14,8 +14,8 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { Type } from "../../models"; -import { APIService } from "./APIService"; +import type { Type } from "src/app/models"; +import { APIService } from "./base-api.service"; /** The allowed values for the 'useInTables' query parameter of GET requests to /types. */ type UseInTable = "cachegroup" | diff --git a/experimental/traffic-portal/src/app/app.module.ts b/experimental/traffic-portal/src/app/app.module.ts index 66e4f1d7cf..ae0fd9f516 100644 --- a/experimental/traffic-portal/src/app/app.module.ts +++ b/experimental/traffic-portal/src/app/app.module.ts @@ -24,13 +24,13 @@ import { BrowserModule } from "@angular/platform-browser"; import * as Chart from "chart.js"; // Routing, Components, Directives and Interceptors -import {BrowserAnimationsModule} from "@angular/platform-browser/animations"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import { AppRoutingModule } from "./app-routing.module"; import { AppComponent } from "./app.component"; import { LoginComponent } from "./login/login.component"; -import {AppUIModule} from "./app.ui.module"; -import {SharedModule} from "./shared/shared.module"; -import {AuthenticatedGuard} from "./guards/authenticated-guard.service"; +import { AppUIModule } from "./app.ui.module"; +import { SharedModule } from "./shared/shared.module"; +import { AuthenticatedGuard } from "./guards/authenticated-guard.service"; import { ResetPasswordDialogComponent } from "./login/reset-password-dialog/reset-password-dialog.component"; import { APIModule } from "./api"; diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index 25376d3156..e5613a03c3 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -20,7 +20,7 @@ import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; -import { ProfileService, TypeService } from "src/app/shared/api"; +import { ProfileService } from "src/app/shared/api"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerDetailsComponent } from "./server-details.component"; @@ -30,16 +30,14 @@ describe("ServerDetailsComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getProfiles", "getTypes", "getPhysicalLocations", "getServerTypes"]); + const mockAPIService = jasmine.createSpyObj(["getProfiles", "getPhysicalLocations"]); mockAPIService.getProfiles.and.returnValue(new Promise(r => r([]))); mockAPIService.getPhysicalLocations.and.returnValues(new Promise(r => r([]))); - mockAPIService.getServerTypes.and.returnValues(new Promise(r => r([]))); await TestBed.configureTestingModule({ declarations: [ ServerDetailsComponent ], imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], providers: [ - { provide: TypeService, useValue: mockAPIService }, { provide: PhysicalLocationService, useValue: mockAPIService }, { provide: ProfileService, useValue: mockAPIService } ] diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index 2eb1938c94..4b93b16576 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -17,8 +17,8 @@ import { ActivatedRoute, Router } from "@angular/router"; import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; -import { CacheGroupService, CDNService } from "src/app/api"; -import { ProfileService, TypeService } from "src/app/shared/api"; +import { CacheGroupService, CDNService, TypeService } from "src/app/api"; +import { ProfileService } from "src/app/shared/api"; import { IP, IP_WITH_CIDR } from "src/app/utils"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerService } from "src/app/api/server.service"; diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index 2bc392575d..50ba814293 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -14,5 +14,4 @@ export * from "./InvalidationJobService"; export * from "./ProfileService"; -export * from "./TypeService"; export * from "./UserService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index cd5dd73379..c063f0431f 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -27,7 +27,6 @@ import {AlertService} from "./alert/alert.service"; import { InvalidationJobService, ProfileService, - TypeService, UserService } from "./api"; import {PhysicalLocationService} from "./api/PhysicalLocationService"; @@ -77,7 +76,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- InvalidationJobService, PhysicalLocationService, ProfileService, - TypeService, UserService ] }) From 12ac684293414b9a8ddc22300e0956845b91410f Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 01:59:41 -0700 Subject: [PATCH 13/50] Move Profile service to the API module --- .../traffic-portal/src/app/api/index.ts | 3 + .../profile.service.ts} | 4 +- .../src/app/api/testing/index.ts | 3 + .../src/app/api/testing/profile.service.ts | 177 ++++++++++++++++++ .../server-details.component.spec.ts | 5 +- .../server-details.component.ts | 3 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 2 - 8 files changed, 187 insertions(+), 11 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/ProfileService.ts => api/profile.service.ts} (96%) create mode 100644 experimental/traffic-portal/src/app/api/testing/profile.service.ts diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 5df1664f57..f3ada473fd 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -3,12 +3,14 @@ import { CommonModule } from "@angular/common"; import { CDNService } from "./cdn.service"; import { CacheGroupService } from "./cache-group.service"; import { DeliveryServiceService } from "./delivery-service.service"; +import { ProfileService } from "./profile.service"; import { ServerService } from "./server.service"; import { TypeService } from "./type.service"; export * from "./cache-group.service"; export * from "./cdn.service"; export * from "./delivery-service.service"; +export * from "./profile.service"; export * from "./type.service"; export * from "./server.service"; @@ -24,6 +26,7 @@ export * from "./server.service"; CacheGroupService, CDNService, DeliveryServiceService, + ProfileService, ServerService, TypeService, ] diff --git a/experimental/traffic-portal/src/app/shared/api/ProfileService.ts b/experimental/traffic-portal/src/app/api/profile.service.ts similarity index 96% rename from experimental/traffic-portal/src/app/shared/api/ProfileService.ts rename to experimental/traffic-portal/src/app/api/profile.service.ts index 65894dd684..3e59b09549 100644 --- a/experimental/traffic-portal/src/app/shared/api/ProfileService.ts +++ b/experimental/traffic-portal/src/app/api/profile.service.ts @@ -15,9 +15,9 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { Parameter, Profile } from "../../models"; +import type { Parameter, Profile } from "src/app/models"; -import { APIService } from "./APIService"; +import { APIService } from "./base-api.service"; /** * Shared mapping function for converting Parameter 'lastUpdated' fields to actual dates. diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index c4fac95542..8a24354854 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -4,12 +4,14 @@ import { CacheGroupService, CDNService, DeliveryServiceService, + ProfileService, ServerService, TypeService } from ".."; import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; import { CDNService as TestingCDNService } from "./cdn.service"; import { DeliveryServiceService as TestingDeliveryServiceService } from "./delivery-service.service"; +import { ProfileService as TestingProfileService } from "./profile.service"; import { ServerService as TestingServerService } from "./server.service"; import { TypeService as TestingTypeService } from "./type.service"; @@ -26,6 +28,7 @@ import { TypeService as TestingTypeService } from "./type.service"; {provide: CacheGroupService, useClass: TestingCacheGroupService}, {provide: CDNService, useClass: TestingCDNService}, {provide: DeliveryServiceService, useClass: TestingDeliveryServiceService}, + {provide: ProfileService, useClass: TestingProfileService}, {provide: ServerService, useClass: TestingServerService}, {provide: TypeService, useClass: TestingTypeService}, ] diff --git a/experimental/traffic-portal/src/app/api/testing/profile.service.ts b/experimental/traffic-portal/src/app/api/testing/profile.service.ts new file mode 100644 index 0000000000..a84639214d --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/profile.service.ts @@ -0,0 +1,177 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { Injectable } from "@angular/core"; + +import { Profile, ProfileType } from "src/app/models"; + +/** + * ProfileService exposes API functionality related to Profiles. + */ +@Injectable() +export class ProfileService { + + private readonly profiles = [ + { + cdn: 1, + cdnName: "ALL", + description: "Global Traffic Ops profile, DO NOT DELETE", + id: 1, + lastUpdated: new Date(), + name: "GLOBAL", + params: [ + { + configFile: "global", + id: 1, + lastUpdated: null, + name: "tm.instance_name", + profiles: null, + secure: false, + value: "Traffic Ops CDN" + }, + { + configFile: "global", + id: 2, + lastUpdated: null, + name: "tm.toolname", + profiles: null, + secure: false, + value: "Traffic Ops" + }, + { + configFile: "regex_revalidate.config", + id: 3, + lastUpdated: null, + name: "maxRevalDurationDays", + profiles: null, + secure: false, + value: "90" + }, + { + configFile: "global", + id: 4, + lastUpdated: null, + name: "tm.url", + profiles: null, + secure: false, + value: "https://trafficops.infra.ciab.test:443/" + }, + { + configFile: "global", + id: 5, + lastUpdated: null, + name: "tm.instance_name", + profiles: null, + secure: false, + value: "CDN-In-A-Box" + }, + { + configFile: "CRConfig.json", + id: 6, + lastUpdated: null, + name: "geolocation.polling.url", + profiles: null, + secure: false, + value: "https://static.infra.ciab.test/GeoLite2-City.mmdb.gz" + }, + { + configFile: "CRConfig.json", + id: 7, + lastUpdated: null, + name: "geolocation6.polling.url", + profiles: null, + secure: false, + value: "https://static.infra.ciab.test/GeoLite2-City.mmdb.gz" + }, + { + configFile: "global", + id: 8, + lastUpdated: null, + name: "use_reval_pending", + profiles: null, + secure: false, + value: "1" + }, + { + configFile: "global", + id: 9, + lastUpdated: null, + name: "default_geo_miss_latitude", + profiles: null, + secure: false, + value: "0" + }, + { + configFile: "global", + id: 10, + lastUpdated: null, + name: "default_geo_miss_longitude", + profiles: null, + secure: false, + value: "-1" + } + ], + routingDisabled: false, + type: ProfileType.UNK_PROFILE + }, + { + cdn: 2, + cdnName: "test", + description: "Edge Cache - Apache Traffic Server", + id: 2, + lastUpdated: new Date(), + name: "EDGE_TIER_ATS_CACHE", + routingDisabled: false, + type: ProfileType.ATS_PROFILE + } + ]; + + public async getProfiles(idOrName: number | string): Promise; + public async getProfiles(): Promise>; + /** + * Retrieves Profiles from the API. + * + * @param idOrName Specify either the integral, unique identifier (number) of a specific Profile to retrieve, or its name (string). + * @returns The requested Profile(s). + */ + public async getProfiles(idOrName?: number | string): Promise | Profile> { + if (idOrName !== undefined) { + let profile; + switch (typeof idOrName) { + case "number": + profile = this.profiles.filter(p=>p.id === idOrName)[0]; + break; + case "string": + profile = this.profiles.filter(p=>p.name === idOrName)[0]; + } + if (!profile) { + throw new Error(`no such Profile: ${idOrName}`); + } + return profile; + } + + return this.profiles.map( + p => ({ + cdn: p.cdn, + cdnName: p.cdnName, + description: p.description, + id: p.id, + lastUpdated: p.lastUpdated, + name: p.name, + routingDisabled: p.routingDisabled, + type: p.type + }) + ); + } +} diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index e5613a03c3..9df04941c3 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -20,7 +20,6 @@ import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; -import { ProfileService } from "src/app/shared/api"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerDetailsComponent } from "./server-details.component"; @@ -30,8 +29,7 @@ describe("ServerDetailsComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getProfiles", "getPhysicalLocations"]); - mockAPIService.getProfiles.and.returnValue(new Promise(r => r([]))); + const mockAPIService = jasmine.createSpyObj(["getPhysicalLocations"]); mockAPIService.getPhysicalLocations.and.returnValues(new Promise(r => r([]))); await TestBed.configureTestingModule({ @@ -39,7 +37,6 @@ describe("ServerDetailsComponent", () => { imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], providers: [ { provide: PhysicalLocationService, useValue: mockAPIService }, - { provide: ProfileService, useValue: mockAPIService } ] }).compileComponents(); }); diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index 4b93b16576..ba2d7c7d38 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -17,8 +17,7 @@ import { ActivatedRoute, Router } from "@angular/router"; import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; -import { CacheGroupService, CDNService, TypeService } from "src/app/api"; -import { ProfileService } from "src/app/shared/api"; +import { CacheGroupService, CDNService, ProfileService, TypeService } from "src/app/api"; import { IP, IP_WITH_CIDR } from "src/app/utils"; import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerService } from "src/app/api/server.service"; diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index 50ba814293..c76a20958a 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -13,5 +13,4 @@ */ export * from "./InvalidationJobService"; -export * from "./ProfileService"; export * from "./UserService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index c063f0431f..01bbce13da 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -26,7 +26,6 @@ import {LinechartDirective} from "./charts/linechart.directive"; import {AlertService} from "./alert/alert.service"; import { InvalidationJobService, - ProfileService, UserService } from "./api"; import {PhysicalLocationService} from "./api/PhysicalLocationService"; @@ -75,7 +74,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- CurrentUserService, InvalidationJobService, PhysicalLocationService, - ProfileService, UserService ] }) From b350362fbbd6e9aca99fde46bc74696f839f1dd2 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 02:22:28 -0700 Subject: [PATCH 14/50] Move Invalidation Job service to the API module --- .../traffic-portal/src/app/api/index.ts | 3 + .../invalidation-job.service.ts} | 9 +- .../src/app/api/testing/index.ts | 3 + .../api/testing/invalidation-job.service.ts | 125 ++++++++++++++++++ .../invalidation-jobs.component.spec.ts | 12 +- .../invalidation-jobs.component.ts | 3 +- ...-invalidation-job-dialog.component.spec.ts | 8 +- .../new-invalidation-job-dialog.component.ts | 2 +- .../src/app/shared/api/index.ts | 1 - .../src/app/shared/shared.module.ts | 2 - 10 files changed, 142 insertions(+), 26 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/InvalidationJobService.ts => api/invalidation-job.service.ts} (92%) create mode 100644 experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index f3ada473fd..9a3a540fff 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -3,6 +3,7 @@ import { CommonModule } from "@angular/common"; import { CDNService } from "./cdn.service"; import { CacheGroupService } from "./cache-group.service"; import { DeliveryServiceService } from "./delivery-service.service"; +import { InvalidationJobService } from "./invalidation-job.service"; import { ProfileService } from "./profile.service"; import { ServerService } from "./server.service"; import { TypeService } from "./type.service"; @@ -10,6 +11,7 @@ import { TypeService } from "./type.service"; export * from "./cache-group.service"; export * from "./cdn.service"; export * from "./delivery-service.service"; +export * from "./invalidation-job.service"; export * from "./profile.service"; export * from "./type.service"; export * from "./server.service"; @@ -26,6 +28,7 @@ export * from "./server.service"; CacheGroupService, CDNService, DeliveryServiceService, + InvalidationJobService, ProfileService, ServerService, TypeService, diff --git a/experimental/traffic-portal/src/app/shared/api/InvalidationJobService.ts b/experimental/traffic-portal/src/app/api/invalidation-job.service.ts similarity index 92% rename from experimental/traffic-portal/src/app/shared/api/InvalidationJobService.ts rename to experimental/traffic-portal/src/app/api/invalidation-job.service.ts index c9ab60399b..78cb306100 100644 --- a/experimental/traffic-portal/src/app/shared/api/InvalidationJobService.ts +++ b/experimental/traffic-portal/src/app/api/invalidation-job.service.ts @@ -15,9 +15,9 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { DeliveryService, InvalidationJob, NewInvalidationJob, User } from "../../models"; +import type { DeliveryService, InvalidationJob, NewInvalidationJob, User } from "src/app/models"; -import { APIService } from "./APIService"; +import { APIService } from "./base-api.service"; /** * JobOpts defines the options that can be passed to getInvalidationJobs. @@ -41,11 +41,6 @@ interface JobOpts { @Injectable() export class InvalidationJobService extends APIService { - /** - * Injects the Angular HTTP client service into the parent constructor. - * - * @param http The Angular HTTP client service. - */ constructor(http: HttpClient) { super(http); } diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index 8a24354854..6932c8f50a 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -4,6 +4,7 @@ import { CacheGroupService, CDNService, DeliveryServiceService, + InvalidationJobService, ProfileService, ServerService, TypeService @@ -11,6 +12,7 @@ import { import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; import { CDNService as TestingCDNService } from "./cdn.service"; import { DeliveryServiceService as TestingDeliveryServiceService } from "./delivery-service.service"; +import { InvalidationJobService as TestingInvalidationJobService } from "./invalidation-job.service"; import { ProfileService as TestingProfileService } from "./profile.service"; import { ServerService as TestingServerService } from "./server.service"; import { TypeService as TestingTypeService } from "./type.service"; @@ -28,6 +30,7 @@ import { TypeService as TestingTypeService } from "./type.service"; {provide: CacheGroupService, useClass: TestingCacheGroupService}, {provide: CDNService, useClass: TestingCDNService}, {provide: DeliveryServiceService, useClass: TestingDeliveryServiceService}, + {provide: InvalidationJobService, useClass: TestingInvalidationJobService}, {provide: ProfileService, useClass: TestingProfileService}, {provide: ServerService, useClass: TestingServerService}, {provide: TypeService, useClass: TestingTypeService}, diff --git a/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts b/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts new file mode 100644 index 0000000000..42667bdf11 --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts @@ -0,0 +1,125 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { Injectable } from "@angular/core"; + +import { DeliveryService, InvalidationJob, JobType, NewInvalidationJob, User } from "src/app/models"; + +/** + * JobOpts defines the options that can be passed to getInvalidationJobs. + */ +interface JobOpts { + /** return only the Jobs that operate on this Delivery Service */ + deliveryService?: DeliveryService; + /** return only the Jobs that operate on the Delivery Service with this ID */ + dsID?: number; + /** return only the Job that has this ID */ + id?: number; + /** return only the Jobs that were created by this user */ + user?: User; + /** return only the Jobs that were created by the user that has this ID */ + userId?: number; +} + +/** + * InvalidationJobService exposes API functionality related to Content Invalidation Jobs. + */ +@Injectable() +export class InvalidationJobService { + + private readonly jobs = new Array(); + private idCounter = 0; + + /** + * Fetches all invalidation jobs that match the passed criteria. + * + * @param opts Optional identifiers for the requested Jobs. + * @returns The request Jobs. + */ + public async getInvalidationJobs(opts?: JobOpts): Promise> { + let ret = this.jobs; + if (opts) { + if (opts.id) { + ret = ret.filter(j=>j.id===opts.id); + } + if (opts.dsID) { + // TODO: implement this + throw new Error("filtering by dsID not implemented in testing services"); + } + if (opts.userId) { + // TODO: implement this + throw new Error("filtering by userId not implemented in testing services"); + } + if (opts.deliveryService && opts.deliveryService.xmlId) { + ret = ret.filter(j=>j.deliveryService === opts.deliveryService?.xmlId); + } + if (opts.user) { + ret = ret.filter(j=>j.createdBy === opts.user?.username); + } + } + return ret; + } + + /** + * Creates an Invalidation Job. + * + * @param job The Job to create. + * @returns whether or not creation succeeded. + */ + public async createInvalidationJob(job: NewInvalidationJob): Promise { + if (typeof job.deliveryService === "number") { + throw new Error("creating Jobs by Delivery Service ID is not implemented in testing services; use the XMLID"); + } + this.jobs.push({ + // Yes, this is ill-formed. + assetUrl: job.regex, + createdBy: "test-admin", + deliveryService: job.deliveryService, + id: ++this.idCounter, + keyword: JobType.PURGE, + parameters: typeof job.ttl === "string" ? job.ttl : `${job.ttl}h`, + startTime: job.startTime instanceof Date ? job.startTime : new Date(job.startTime) + }); + return true; + } + + /** + * Updates a Job by replacing it with a new definition. + * + * @param job The new definition of the Job. + * @returns The edited Job as returned by the server. + */ + public async updateInvalidationJob(job: InvalidationJob): Promise { + const idx = this.jobs.findIndex(j=>j.id===job.id); + if (idx < 0) { + throw new Error(`no such Job: #${job.id}`); + } + this.jobs[idx] = job; + return job; + } + + /** + * Deletes a Job. + * + * @param id The ID of the Job to delete. + * @returns The deleted Job. + */ + public async deleteInvalidationJob(id: number): Promise { + const idx = this.jobs.findIndex(j=>j.id===id); + if (idx < 0) { + throw new Error(`no such Job: #${id}`); + } + return this.jobs.splice(idx, 1)[0]; + } +} diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index 0128486da0..1931d754a0 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -17,13 +17,11 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; import { MatDialogModule } from "@angular/material/dialog"; -import { of } from "rxjs"; - import { APITestingModule } from "src/app/api/testing"; -import { InvalidationJobService, UserService} from "src/app/shared/api"; +import { UserService} from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { CustomvalidityDirective } from "src/app/shared/validation/customvalidity.directive"; -import { InvalidationJob, JobType } from "src/app/models"; +import { JobType } from "src/app/models"; import {TpHeaderComponent} from "src/app/shared/tp-header/tp-header.component"; import { InvalidationJobsComponent } from "./invalidation-jobs.component"; @@ -34,11 +32,8 @@ describe("InvalidationJobsComponent", () => { beforeEach(waitForAsync(() => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getInvalidationJobs"]); + const mockAPIService = jasmine.createSpyObj(["getUsers"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); - mockAPIService.getInvalidationJobs.and.returnValue(of({ - startTime: new Date(), - } as InvalidationJob)); TestBed.configureTestingModule({ declarations: [ @@ -55,7 +50,6 @@ describe("InvalidationJobsComponent", () => { MatDialogModule ], providers: [ - { provide: InvalidationJobService, useValue: mockAPIService }, { provide: UserService, useValue: mockAPIService }, { provide: CurrentUserService, useValue: mockCurrentUserService } ] diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts index 9a9425e1c7..35f38aa784 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts @@ -16,9 +16,8 @@ import { MatDialog } from "@angular/material/dialog"; import { ActivatedRoute } from "@angular/router"; import { faPlus, faTrash, faPencilAlt } from "@fortawesome/free-solid-svg-icons"; -import { DeliveryServiceService } from "src/app/api"; +import { DeliveryServiceService, InvalidationJobService } from "src/app/api"; import { defaultDeliveryService, DeliveryService, InvalidationJob } from "src/app/models"; -import { InvalidationJobService } from "src/app/shared/api"; import { NewInvalidationJobDialogComponent } from "./new-invalidation-job-dialog/new-invalidation-job-dialog.component"; /** diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts index 9975728e3e..ef07ed7ebd 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts @@ -15,7 +15,8 @@ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog"; -import {InvalidationJobService} from "../../../shared/api"; +import { APITestingModule } from "src/app/api/testing"; + import { NewInvalidationJobDialogComponent, sanitizedRegExpString, timeStringFromDate } from "./new-invalidation-job-dialog.component"; describe("NewInvalidationJobDialogComponent", () => { @@ -23,19 +24,18 @@ describe("NewInvalidationJobDialogComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getInvalidationJobs"]); await TestBed.configureTestingModule({ declarations: [ NewInvalidationJobDialogComponent ], imports: [ MatDialogModule, - HttpClientModule + HttpClientModule, + APITestingModule ], providers: [ {provide: MatDialogRef, useValue: {close: (): void => { console.log("dialog closed"); }}}, {provide: MAT_DIALOG_DATA, useValue: {dsID: -1}}, - { provide: InvalidationJobService, useValue: mockAPIService} ] }).compileComponents(); }); diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts index 5a7dd70957..ad915d2f0a 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts @@ -16,8 +16,8 @@ import { FormControl } from "@angular/forms"; import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog"; import { Subject } from "rxjs"; +import { InvalidationJobService } from "src/app/api"; import type { InvalidationJob } from "src/app/models"; -import { InvalidationJobService } from "src/app/shared/api"; /** * Gets the time part of a Date as a string. diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts index c76a20958a..1f23a1ec1c 100644 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ b/experimental/traffic-portal/src/app/shared/api/index.ts @@ -12,5 +12,4 @@ * limitations under the License. */ -export * from "./InvalidationJobService"; export * from "./UserService"; diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 01bbce13da..b4858b8a02 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -25,7 +25,6 @@ import {GenericTableComponent} from "./generic-table/generic-table.component"; import {LinechartDirective} from "./charts/linechart.directive"; import {AlertService} from "./alert/alert.service"; import { - InvalidationJobService, UserService } from "./api"; import {PhysicalLocationService} from "./api/PhysicalLocationService"; @@ -72,7 +71,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- { multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor }, AlertService, CurrentUserService, - InvalidationJobService, PhysicalLocationService, UserService ] From b9cc9a4deeb60b88fb9a36e8721cfeff18e1310b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 09:40:14 -0700 Subject: [PATCH 15/50] Move User service to the API module --- .../traffic-portal/src/app/api/index.ts | 5 +- .../src/app/api/testing/index.ts | 5 +- .../src/app/api/testing/user.service.ts | 258 ++++++++++++++++++ .../UserService.ts => api/user.service.ts} | 12 +- .../currentuser/currentuser.component.spec.ts | 17 +- .../core/currentuser/currentuser.component.ts | 7 +- .../update-password-dialog.component.spec.ts | 6 +- .../dashboard/dashboard.component.spec.ts | 6 +- .../deliveryservice.component.spec.ts | 7 +- .../invalidation-jobs.component.spec.ts | 5 +- .../new-delivery-service.component.spec.ts | 15 +- .../servers-table.component.spec.ts | 4 - .../app/core/users/users.component.spec.ts | 12 +- .../src/app/core/users/users.component.ts | 6 +- .../reset-password-dialog.component.spec.ts | 9 +- .../reset-password-dialog.component.ts | 3 +- .../traffic-portal/src/app/models/user.ts | 20 +- .../src/app/shared/api/index.ts | 15 - .../currentUser/current-user.service.spec.ts | 16 +- .../currentUser/current-user.service.ts | 7 +- .../src/app/shared/shared.module.ts | 4 - .../tp-header/tp-header.component.spec.ts | 7 +- .../shared/tp-header/tp-header.component.ts | 9 +- 23 files changed, 329 insertions(+), 126 deletions(-) create mode 100644 experimental/traffic-portal/src/app/api/testing/user.service.ts rename experimental/traffic-portal/src/app/{shared/api/UserService.ts => api/user.service.ts} (97%) delete mode 100644 experimental/traffic-portal/src/app/shared/api/index.ts diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 9a3a540fff..7f1289849b 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -7,14 +7,16 @@ import { InvalidationJobService } from "./invalidation-job.service"; import { ProfileService } from "./profile.service"; import { ServerService } from "./server.service"; import { TypeService } from "./type.service"; +import { UserService } from "./user.service"; export * from "./cache-group.service"; export * from "./cdn.service"; export * from "./delivery-service.service"; export * from "./invalidation-job.service"; export * from "./profile.service"; -export * from "./type.service"; export * from "./server.service"; +export * from "./type.service"; +export * from "./user.service"; /** * The API Module contains all logic used to access the Traffic Ops API. @@ -32,6 +34,7 @@ export * from "./server.service"; ProfileService, ServerService, TypeService, + UserService, ] }) export class APIModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index 6932c8f50a..17ed88f926 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -7,7 +7,8 @@ import { InvalidationJobService, ProfileService, ServerService, - TypeService + TypeService, + UserService } from ".."; import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; import { CDNService as TestingCDNService } from "./cdn.service"; @@ -16,6 +17,7 @@ import { InvalidationJobService as TestingInvalidationJobService } from "./inval import { ProfileService as TestingProfileService } from "./profile.service"; import { ServerService as TestingServerService } from "./server.service"; import { TypeService as TestingTypeService } from "./type.service"; +import { UserService as TestingUserService } from "./user.service"; /** * The API Testing Module provides mock services that allow components to use @@ -34,6 +36,7 @@ import { TypeService as TestingTypeService } from "./type.service"; {provide: ProfileService, useClass: TestingProfileService}, {provide: ServerService, useClass: TestingServerService}, {provide: TypeService, useClass: TestingTypeService}, + {provide: UserService, useClass: TestingUserService} ] }) export class APITestingModule { } diff --git a/experimental/traffic-portal/src/app/api/testing/user.service.ts b/experimental/traffic-portal/src/app/api/testing/user.service.ts new file mode 100644 index 0000000000..04fc774d04 --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/user.service.ts @@ -0,0 +1,258 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +import { HttpResponse } from "@angular/common/http"; +import { Injectable } from "@angular/core"; + +import type { Role, User, Capability, CurrentUser } from "../../models/user"; + +/** + * UserService exposes API functionality related to Users, Roles and Capabilities. + */ +@Injectable() +export class UserService { + + private testAdminUsername = "test-admin"; + private readonly testAdminPassword = "twelve12!"; + private readonly users: Array = [ + { + addressLine1: null, + addressLine2: null, + city: null, + company: null, + country: null, + email: "test@adm.in", + fullName: "Test Admin", + gid: null, + id: 1, + lastUpdated: new Date(), + localUser: true, + newUser: false, + phoneNumber: null, + postalCode: null, + publicSshKey: null, + role: 1, + roleName: "admin", + stateOrProvince: null, + tenant: "root", + tenantId: 1, + uid: null, + username: "test-admin" + } + ]; + private readonly roles = [ + { + capabilities: [ + "ALL", + "PARAMETER-SECURE:READ" + ], + description: "Has access to everything - cannot be modified or deleted", + id: 1, + lastUpdated: new Date(), + name: "admin", + privLevel: 30 + } + ]; + private readonly capabilities = [ + { + description: "unknown - comes from a Permission", + lastUpdated: new Date(), + name: "ALL" + }, + { + description: "unknown - comes from a Permission", + lastUpdated: new Date(), + name: "PARAMETER-SECURE:READ" + } + ]; + + private readonly tokens = new Map(); + + /** + * Performs authentication with the Traffic Ops server. + * + * Note that in the testing environment, this gives back more information + * than the concrete service in the event of a token authentication error. + * + * Also note that the value of the "current user" is unaffected by any calls + * to login (in the testing environment). + * + * @param uOrT The username to be used for authentication, if `p` is + * provided. If `p` is **not** provided, then this is used as a token. + * @param p The password of user `u` + * @returns The entire HTTP response on success, or `null` on failure. + */ + public async login(uOrT: string, p?: string): Promise | null> { + if (p !== undefined && (uOrT !== "test-admin" || p !== this.testAdminPassword)) { + throw new Error("Invalid username or password."); + } + const email = this.tokens.get(uOrT); + if (email === undefined) { + throw new Error(`token '${uOrT}' did not match any set token for any user`); + } + const user = this.users.find(u=>u.email === email); + if (!user) { + throw new Error(`email '${email}' associated with token '${uOrT}' did not belong to any User`); + } + this.tokens.delete(uOrT); + return new HttpResponse({body: {alerts: [{level: "success", text: "Successfully logged in."}]}}); + } + + /** + * Ends the current user's session - but does *not* affect the + * CurrentUserService's user data, which must be separately cleared. + * + * Note that in the testing environment this has no affect on the value of + * the "current user". + * + * @returns The entire HTTP response on succes, or `null` on failure. + */ + public async logout(): Promise | null> { + return new HttpResponse({body: {alerts: [{level: "success", text: "You are logged out."}]}}); + } + + /** + * Fetches the current user from Traffic Ops. + * + * @returns A `User` object representing the current user. + */ + public async getCurrentUser(): Promise { + let user = this.users.filter(u=>u.username === this.testAdminUsername)[0]; + if (user) { + return user; + } + console.warn("stored admin username not found in stored users: from now on the current user will be (more or less) random"); + user = this.users[0]; + if (!user) { + throw new Error("no users exist"); + } + return user; + } + + /** + * Updates the current user to match the one passed in. + * + * @param user Unused. This method does nothing in the testing environment yet. + * @returns whether or not the request was successful. + */ + public async updateCurrentUser(user: CurrentUser): Promise { + const storedUser = this.users.findIndex(u=>u.id === user.id); + if (storedUser < 0) { + console.error(`no such User: #${user.id}`); + return false; + } + this.testAdminUsername = user.username; + this.users[storedUser] = user; + this.users[storedUser].lastUpdated = new Date(); + return true; + } + + public async getUsers(nameOrID: string | number): Promise; + public async getUsers(): Promise>; + /** + * Gets an array of all users in Traffic Ops. + * + * @param nameOrID If given, returns only the User with the given username (string) or ID (number). + * @returns An Array of User objects - or a single User object if 'nameOrID' was given. + */ + public async getUsers(nameOrID?: string | number): Promise | User> { + if (nameOrID) { + let user; + switch (typeof nameOrID) { + case "string": + user = this.users.filter(u=>u.username === nameOrID)[0]; + break; + case "number": + user = this.users.filter(u=>u.id === nameOrID)[0]; + } + if (!user) { + throw new Error(`no such User: ${nameOrID}`); + } + return user; + } + return this.users; + } + + /** Fetches the Role with the given ID. */ + public async getRoles (nameOrID: number | string): Promise; + /** Fetches all Roles. */ + public async getRoles (): Promise>; + /** + * Fetches one or all Roles from Traffic Ops. + * + * @param nameOrID Optionally, the name or integral, unique identifier of a single Role which will be fetched + * @throws {TypeError} When called with an improper argument. + * @returns Either an Array of Roles, or a single Role, depending on whether + * `name`/`id` was passed + */ + public async getRoles(nameOrID?: string | number): Promise | Role> { + if (nameOrID !== undefined) { + let role; + switch (typeof nameOrID) { + case "string": + role = this.roles.find(r=>r.name === nameOrID); + break; + case "number": + role = this.roles.find(r=>r.id === nameOrID); + } + if (!role) { + throw new Error(`no such Role: ${nameOrID}`); + } + return role; + } + return this.roles; + } + + /** Fetches the User Capability (Permission) with the given name. */ + public async getCapabilities (name: string): Promise; + /** Fetches all User Capabilities (Permissions). */ + public async getCapabilities (): Promise>; + /** + * Fetches one or all Capabilities from Traffic Ops. + * + * @deprecated "Capabilities" are deprecated in favor of Permissions. + * "Capabilities" are removed from API v4 and later. + * + * @param name Optionally, the name of a single Capability which will be fetched + * @throws {TypeError} When called with an improper argument. + * @returns Either an Array of Capabilities, or a single Capability, + * depending on whether `name`/`id` was passed + */ + public async getCapabilities(name?: string): Promise | Capability> { + if (name) { + const cap = this.capabilities.find(c=>c.name === name); + if (!cap) { + throw new Error(`no such Capability: ${name}`); + } + return cap; + } + return this.capabilities; + } + + /** + * Requests a password reset for a user. + * + * @param email The email of the user for whom to reset a password. + */ + public async resetPassword(email: string): Promise { + if (!this.users.some(u=>u.email === email)) { + console.error(`no User exists with email '${email}' - TO doesn't expose that information with an error, so neither will we`); + return; + } + const token = (Math.random() + 1).toString(36).substring(2); + console.log("setting token", token, "for email", email); + this.tokens.set(token, email); + } + +} diff --git a/experimental/traffic-portal/src/app/shared/api/UserService.ts b/experimental/traffic-portal/src/app/api/user.service.ts similarity index 97% rename from experimental/traffic-portal/src/app/shared/api/UserService.ts rename to experimental/traffic-portal/src/app/api/user.service.ts index 022035118e..99c8cd74e3 100644 --- a/experimental/traffic-portal/src/app/shared/api/UserService.ts +++ b/experimental/traffic-portal/src/app/api/user.service.ts @@ -15,9 +15,9 @@ import { HttpClient, HttpResponse } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { Role, User, Capability, CurrentUser, newCurrentUser } from "../../models/user"; +import { Role, User, Capability, CurrentUser, newCurrentUser } from "src/app/models"; -import { APIService } from "./APIService"; +import { APIService } from "./base-api.service"; /** * UserService exposes API functionality related to Users, Roles and Capabilities. @@ -25,11 +25,6 @@ import { APIService } from "./APIService"; @Injectable() export class UserService extends APIService { - /** - * Injects the Angular HTTP client service into the parent constructor. - * - * @param http The Angular HTTP client service. - */ constructor(http: HttpClient) { super(http); } @@ -209,6 +204,9 @@ export class UserService extends APIService { /** * Fetches one or all Capabilities from Traffic Ops. * + * @deprecated "Capabilities" are deprecated in favor of Permissions. + * "Capabilities" are removed from API v4 and later. + * * @param name Optionally, the name of a single Capability which will be fetched * @throws {TypeError} When called with an improper argument. * @returns Either an Array of Capabilities, or a single Capability, diff --git a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts index 369aeccfe0..d619e5d0c0 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts @@ -16,11 +16,11 @@ import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { MatDialogModule } from "@angular/material/dialog"; import { RouterTestingModule } from "@angular/router/testing"; -import { UserService } from "src/app/shared/api"; - +import { APITestingModule } from "src/app/api/testing"; +import { newCurrentUser } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { newCurrentUser } from "../../models"; -import {TpHeaderComponent} from "../../shared/tp-header/tp-header.component"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; + import { CurrentuserComponent } from "./currentuser.component"; describe("CurrentuserComponent", () => { @@ -28,15 +28,8 @@ describe("CurrentuserComponent", () => { let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - const mockAPIService = jasmine.createSpyObj(["getRoles", "getCurrentUser"]); const mockCurrentUserService = jasmine.createSpyObj(["getCurrentUser", "getCapabilities", "getLoggedIn", "setUser", "hasPermission", "logout", "updateCurrentUser", "login", "logout"]); - mockAPIService.getRoles.and.returnValue(new Promise(resolve => resolve([]))); - mockAPIService.getCurrentUser.and.returnValue(new Promise(resolve => resolve({ - id: 0, - newUser: false, - username: "test" - }))); TestBed.configureTestingModule({ declarations: [ @@ -44,12 +37,12 @@ describe("CurrentuserComponent", () => { TpHeaderComponent ], imports: [ + APITestingModule, HttpClientModule, RouterTestingModule, MatDialogModule ], providers: [ - { provide: UserService, useValue: mockAPIService}, { provide: CurrentUserService, useValue: mockCurrentUserService}, ] }); diff --git a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts index 820c096338..90866f745b 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts @@ -15,10 +15,11 @@ import { Component, OnInit } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { ActivatedRoute, Router } from "@angular/router"; import { faEdit } from "@fortawesome/free-solid-svg-icons"; -import { UserService } from "src/app/shared/api"; -import { CurrentUser } from "src/app/models"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { UserService } from "src/app/api"; +import type { CurrentUser } from "src/app/models"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; + import { UpdatePasswordDialogComponent } from "./update-password-dialog/update-password-dialog.component"; /** diff --git a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts index 7c31dfc6f4..334f5c8456 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts @@ -15,9 +15,10 @@ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MatDialogModule, MatDialogRef } from "@angular/material/dialog"; import { RouterTestingModule } from "@angular/router/testing"; +import { APITestingModule } from "src/app/api/testing"; + import { User } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { UserService } from "src/app/shared/api"; import { UpdatePasswordDialogComponent } from "./update-password-dialog.component"; @@ -37,13 +38,12 @@ describe("UpdatePasswordDialogComponent", () => { updated = false; await TestBed.configureTestingModule({ declarations: [ UpdatePasswordDialogComponent ], - imports: [ HttpClientModule, MatDialogModule, RouterTestingModule ], + imports: [ APITestingModule, HttpClientModule, MatDialogModule, RouterTestingModule ], providers: [ {provide: MatDialogRef, useValue: {close: (upd?: true): void => { dialogOpen = false; updated = upd ?? false; }}}, - {provide: UserService, useValue: mockAPIService}, {provide: CurrentUserService, useValue: mockAPIService} ] }).compileComponents(); diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts index d032f25eff..b5854b3f13 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts @@ -18,7 +18,6 @@ import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; import { DeliveryService } from "src/app/models"; -import { UserService } from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; @@ -36,8 +35,6 @@ describe("DashboardComponent", () => { const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"], {capabilities: new Set()}); - const mockAlertService = jasmine.createSpyObj(["newAlert"]); - TestBed.configureTestingModule({ declarations: [ DashboardComponent, @@ -55,8 +52,7 @@ describe("DashboardComponent", () => { ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }, - { provide: AlertService, useValue: mockAlertService }, - { provide: UserService, useValue: mockCurrentUserService } + AlertService, ] }); TestBed.compileComponents(); diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts index 17ac8b70fa..d1f789e0ae 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts @@ -19,9 +19,7 @@ import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; -// import { DeliveryService, GeoLimit, GeoProvider, TPSData } from "src/app/models"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; -import { UserService } from "src/app/shared/api"; import { AlertService } from "src/app/shared/alert/alert.service"; import { DeliveryserviceComponent } from "./deliveryservice.component"; @@ -33,8 +31,6 @@ describe("DeliveryserviceComponent", () => { beforeEach(waitForAsync(() => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getUsers"]); - const mockAlertService = jasmine.createSpyObj(["newAlert"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ @@ -51,9 +47,8 @@ describe("DeliveryserviceComponent", () => { RouterTestingModule ], providers: [ - { provide: AlertService, useValue: mockAlertService }, + AlertService, { provide: CurrentUserService, useValue: mockCurrentUserService }, - { provide: UserService, useValue: mockAPIService } ] }); TestBed.compileComponents(); diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index 1931d754a0..ce8ed7b701 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -18,11 +18,10 @@ import { RouterTestingModule } from "@angular/router/testing"; import { MatDialogModule } from "@angular/material/dialog"; import { APITestingModule } from "src/app/api/testing"; -import { UserService} from "src/app/shared/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { CustomvalidityDirective } from "src/app/shared/validation/customvalidity.directive"; import { JobType } from "src/app/models"; -import {TpHeaderComponent} from "src/app/shared/tp-header/tp-header.component"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; import { InvalidationJobsComponent } from "./invalidation-jobs.component"; @@ -32,7 +31,6 @@ describe("InvalidationJobsComponent", () => { beforeEach(waitForAsync(() => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getUsers"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ @@ -50,7 +48,6 @@ describe("InvalidationJobsComponent", () => { MatDialogModule ], providers: [ - { provide: UserService, useValue: mockAPIService }, { provide: CurrentUserService, useValue: mockCurrentUserService } ] }); diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts index 22ffe23a7f..9f27520853 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts @@ -25,11 +25,10 @@ import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; -import { UserService } from "src/app/shared/api"; - import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { Protocol } from "../../models"; -import { TpHeaderComponent } from "../../shared/tp-header/tp-header.component"; +import { Protocol } from "src/app/models"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; + import { NewDeliveryServiceComponent } from "./new-delivery-service.component"; @@ -40,15 +39,8 @@ describe("NewDeliveryServiceComponent", () => { beforeEach(async () => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getRoles", "getCurrentUser"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); mockCurrentUserService.updateCurrentUser.and.returnValue(new Promise(r => r(false))); - mockAPIService.getRoles.and.returnValue(new Promise(resolve => resolve([]))); - mockAPIService.getCurrentUser.and.returnValue(new Promise(resolve => resolve({ - id: 0, - newUser: false, - username: "test" - }))); await TestBed.configureTestingModule({ declarations: [ @@ -67,7 +59,6 @@ describe("NewDeliveryServiceComponent", () => { MatRadioModule ], providers: [ - {provide: UserService, useValue: mockAPIService}, { provide: CurrentUserService, useValue: mockCurrentUserService } ] }).compileComponents(); diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts index e0b021f332..701c91d60f 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts @@ -18,7 +18,6 @@ import { RouterTestingModule } from "@angular/router/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; -import { UserService } from "src/app/shared/api"; import { defaultServer, Server } from "src/app/models"; import { APITestingModule } from "src/app/api/testing"; import { augment, AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; @@ -29,14 +28,11 @@ describe("ServersTableComponent", () => { let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - const mockAPIService = jasmine.createSpyObj(["getServers", "getUsers"]); - mockAPIService.getServers.and.returnValue(new Promise(r => r([]))); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ declarations: [ ServersTableComponent, TpHeaderComponent ], imports: [HttpClientModule, RouterTestingModule, APITestingModule], providers: [ - { provide: UserService, useValue: mockAPIService }, { provide: CurrentUserService, useValue: mockCurrentUserService } ] }) diff --git a/experimental/traffic-portal/src/app/core/users/users.component.spec.ts b/experimental/traffic-portal/src/app/core/users/users.component.spec.ts index 54851ab366..13e2e95dca 100644 --- a/experimental/traffic-portal/src/app/core/users/users.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/users/users.component.spec.ts @@ -20,7 +20,7 @@ import { CurrentUserService } from "src/app/shared/currentUser/current-user.serv import type { User } from "src/app/models"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; import { LoadingComponent } from "src/app/shared/loading/loading.component"; -import { UserService } from "src/app/shared/api"; +import { APITestingModule } from "src/app/api/testing"; import { UsersComponent } from "./users.component"; describe("UsersComponent", () => { @@ -29,14 +29,6 @@ describe("UsersComponent", () => { beforeEach(waitForAsync(() => { // mock the API - const mockAPIService = jasmine.createSpyObj(["getUsers", "getRoles", "getCurrentUser"]); - mockAPIService.getUsers.and.returnValue(new Promise(resolve => resolve([]))); - mockAPIService.getRoles.and.returnValue(new Promise(resolve => resolve([]))); - mockAPIService.getCurrentUser.and.returnValue(new Promise(resolve => resolve({ - id: 0, - newUser: false, - username: "test" - } as User))); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); mockCurrentUserService.updateCurrentUser.and.returnValue(new Promise(r => r(false))); @@ -47,13 +39,13 @@ describe("UsersComponent", () => { TpHeaderComponent, ], imports: [ + APITestingModule, FormsModule, HttpClientModule, ReactiveFormsModule, RouterTestingModule ], providers: [ - { provide: UserService, useValue: mockAPIService }, { provide: CurrentUserService, useValue: mockCurrentUserService } ] }); diff --git a/experimental/traffic-portal/src/app/core/users/users.component.ts b/experimental/traffic-portal/src/app/core/users/users.component.ts index e4fe876b62..e4cf623026 100644 --- a/experimental/traffic-portal/src/app/core/users/users.component.ts +++ b/experimental/traffic-portal/src/app/core/users/users.component.ts @@ -16,10 +16,10 @@ import { FormControl } from "@angular/forms"; import { BehaviorSubject, Observable } from "rxjs"; +import { UserService } from "src/app/api"; +import type { Role, User } from "src/app/models"; +import { orderBy } from "src/app/utils"; import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; -import { Role, User } from "../../models"; -import { UserService } from "../../shared/api"; -import { orderBy } from "../../utils"; /** * UsersComponent is the controller for the "users" page. diff --git a/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts b/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts index b564fd128c..73244882ff 100644 --- a/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts +++ b/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts @@ -15,7 +15,7 @@ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MatDialogRef } from "@angular/material/dialog"; -import { UserService } from "src/app/shared/api/UserService"; +import { APITestingModule } from "src/app/api/testing"; import { ResetPasswordDialogComponent } from "./reset-password-dialog.component"; @@ -24,17 +24,18 @@ describe("ResetPasswordDialogComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); await TestBed.configureTestingModule({ declarations: [ ResetPasswordDialogComponent ], - imports: [HttpClientModule], + imports: [ + APITestingModule, + HttpClientModule + ], providers: [ // The controller doesn't pass any arguments or check the return // value of `close` - this literally needs to do nothing but be // callable. // eslint-disable-next-line @typescript-eslint/no-empty-function { provide: MatDialogRef, useValue: {close: (): void => {}} }, - { provide: UserService, useValue: mockCurrentUserService } ] }) .compileComponents(); diff --git a/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.ts b/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.ts index 6e7be99722..c82c5e5149 100644 --- a/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.ts +++ b/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.ts @@ -13,7 +13,8 @@ */ import { Component } from "@angular/core"; import { MatDialogRef } from "@angular/material/dialog"; -import { UserService } from "src/app/shared/api"; + +import { UserService } from "src/app/api"; /** * The controller for the "reset password" dialog. diff --git a/experimental/traffic-portal/src/app/models/user.ts b/experimental/traffic-portal/src/app/models/user.ts index 85535e8bb8..af142f5b1c 100644 --- a/experimental/traffic-portal/src/app/models/user.ts +++ b/experimental/traffic-portal/src/app/models/user.ts @@ -25,23 +25,23 @@ export interface User { /** The company for which the user works. */ company?: string | null; /** A confirmation field for the user's password - this has no known effect, but we set it anyway on password update. */ - confirmLocalPasswd?: string; + confirmLocalPasswd?: string | null; /** The country in which the user lives/is based. */ country?: string | null; /** The user's email address. */ - email?: string; + email?: string | null; /** The user's full name. */ - fullName?: string; + fullName?: string | null; /** legacy field with no purpose. */ - gid?: number; + gid?: number | null; /** An integral, unique identifier for the user. */ id: number; /** The date/time at which the user was last updated. */ - lastUpdated?: Date; + lastUpdated?: Date | null; /** The user's password - this should only be populated on update, and only if updating the password. */ - localPasswd?: string; + localPasswd?: string | null; /** legacy field with no purpose. */ - localUser?: boolean; + localUser?: boolean | null; /** * Whether (false) or not (true) the user has reset their password after * registration. @@ -56,15 +56,15 @@ export interface User { /** The integral, unique identifier of the Role the user has. */ role?: number; /** The user's Role. */ - rolename?: string; + rolename?: string | null; /** The state or province within which the user lives/is based. */ stateOrProvince?: string | null; /** The Tenant to which the user belongs. */ - tenant?: string; + tenant?: string | null; /** An integral, unique identifier for the Tenant to which the user belongs. */ tenantId?: number; /** legacy field with no purpose. */ - uid?: number; + uid?: number | null; /** The user's username. */ username: string; } diff --git a/experimental/traffic-portal/src/app/shared/api/index.ts b/experimental/traffic-portal/src/app/shared/api/index.ts deleted file mode 100644 index 1f23a1ec1c..0000000000 --- a/experimental/traffic-portal/src/app/shared/api/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -export * from "./UserService"; diff --git a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts index 098b13edfe..2184d12dfb 100644 --- a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts +++ b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts @@ -13,9 +13,10 @@ */ import { TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; -import {UserService} from "src/app/shared/api"; -import {newCurrentUser, User} from "src/app/models"; -import { LoginComponent } from "../../login/login.component"; + +import { APITestingModule } from "src/app/api/testing"; +import { newCurrentUser, User } from "src/app/models"; +import { LoginComponent } from "src/app/login/login.component"; import { CurrentUserService } from "./current-user.service"; @@ -23,16 +24,17 @@ describe("CurrentUserService", () => { let service: CurrentUserService; beforeEach(() => { - const mockAPIService = jasmine.createSpyObj(["getRoles", "updateCurrentUser", "getCurrentUser", "saveCurrentUser"]); + const mockAPIService = jasmine.createSpyObj(["updateCurrentUser", "getCurrentUser", "saveCurrentUser"]); mockAPIService.getCurrentUser.and.returnValue(new Promise(resolve => resolve( {id: 1, newUser: false, role: 1, username: "name"} ))); - mockAPIService.getRoles.and.returnValue(new Promise(resolve => resolve([]))); TestBed.configureTestingModule({ - imports: [RouterTestingModule.withRoutes([{component: LoginComponent, path: "login"}])], + imports: [ + APITestingModule, + RouterTestingModule.withRoutes([{component: LoginComponent, path: "login"}]) + ], providers: [ CurrentUserService, - {provide: UserService, useValue: mockAPIService} ] }); service = TestBed.inject(CurrentUserService); diff --git a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts index 88cb8bcbe5..8f3260ba69 100644 --- a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts +++ b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts @@ -11,10 +11,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {EventEmitter, Injectable} from "@angular/core"; +import { EventEmitter, Injectable } from "@angular/core"; import { Router } from "@angular/router"; -import {UserService} from "src/app/shared/api"; -import { Capability, CurrentUser } from "../../models"; + +import { UserService } from "src/app/api"; +import type { Capability, CurrentUser } from "src/app/models"; /** * This service keeps track of the currently authenticated user. diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index b4858b8a02..0f2adfc331 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -24,9 +24,6 @@ import {TpHeaderComponent} from "./tp-header/tp-header.component"; import {GenericTableComponent} from "./generic-table/generic-table.component"; import {LinechartDirective} from "./charts/linechart.directive"; import {AlertService} from "./alert/alert.service"; -import { - UserService -} from "./api"; import {PhysicalLocationService} from "./api/PhysicalLocationService"; import {CurrentUserService} from "./currentUser/current-user.service"; import {CustomvalidityDirective} from "./validation/customvalidity.directive"; @@ -72,7 +69,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- AlertService, CurrentUserService, PhysicalLocationService, - UserService ] }) export class SharedModule { } diff --git a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts index afdf3346ef..36954b3102 100644 --- a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts @@ -15,8 +15,9 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; +import { APITestingModule } from "src/app/api/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import {UserService} from "../api"; + import { TpHeaderComponent } from "./tp-header.component"; describe("TpHeaderComponent", () => { @@ -24,14 +25,12 @@ describe("TpHeaderComponent", () => { let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - const mockAPIService = jasmine.createSpyObj(["getUsers"]); const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ declarations: [ TpHeaderComponent ], - imports: [ HttpClientModule, RouterTestingModule ], + imports: [ APITestingModule, HttpClientModule, RouterTestingModule ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }, - { provide: UserService, useValue: mockAPIService} ] }) .compileComponents(); diff --git a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts index 7ccece7bef..b12b8c9a8b 100644 --- a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts +++ b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts @@ -12,8 +12,8 @@ * limitations under the License. */ import { Component, Input, OnInit } from "@angular/core"; -import { UserService } from "src/app/shared/api"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { UserService } from "src/app/api"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; /** * TpHeaderComponent is the controller for the standard Traffic Portal header. @@ -30,11 +30,6 @@ export class TpHeaderComponent implements OnInit { */ public permissions = new Set(); - /** - * Holds a continuous subscription for the current user's permissions, in case they change. - */ - // private permissionSubscription: Subscription | undefined; - /** * The title to be used in the header. * From 3536e35289c28f6a8516c9548cb9c9260d97a6e7 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 09:50:32 -0700 Subject: [PATCH 16/50] Move Physical Location service to the API module --- .../traffic-portal/src/app/api/index.ts | 3 + .../physical-location.service.ts} | 9 +- .../src/app/api/testing/index.ts | 3 + .../api/testing/physical-location.service.ts | 67 +++++++ .../server-details.component.spec.ts | 7 - .../server-details.component.ts | 4 +- .../src/app/shared/api/APIService.ts | 167 ------------------ .../src/app/shared/shared.module.ts | 36 ++-- 8 files changed, 94 insertions(+), 202 deletions(-) rename experimental/traffic-portal/src/app/{shared/api/PhysicalLocationService.ts => api/physical-location.service.ts} (88%) create mode 100644 experimental/traffic-portal/src/app/api/testing/physical-location.service.ts delete mode 100644 experimental/traffic-portal/src/app/shared/api/APIService.ts diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 7f1289849b..79212239d0 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -4,6 +4,7 @@ import { CDNService } from "./cdn.service"; import { CacheGroupService } from "./cache-group.service"; import { DeliveryServiceService } from "./delivery-service.service"; import { InvalidationJobService } from "./invalidation-job.service"; +import { PhysicalLocationService } from "./physical-location.service"; import { ProfileService } from "./profile.service"; import { ServerService } from "./server.service"; import { TypeService } from "./type.service"; @@ -13,6 +14,7 @@ export * from "./cache-group.service"; export * from "./cdn.service"; export * from "./delivery-service.service"; export * from "./invalidation-job.service"; +export * from "./physical-location.service"; export * from "./profile.service"; export * from "./server.service"; export * from "./type.service"; @@ -31,6 +33,7 @@ export * from "./user.service"; CDNService, DeliveryServiceService, InvalidationJobService, + PhysicalLocationService, ProfileService, ServerService, TypeService, diff --git a/experimental/traffic-portal/src/app/shared/api/PhysicalLocationService.ts b/experimental/traffic-portal/src/app/api/physical-location.service.ts similarity index 88% rename from experimental/traffic-portal/src/app/shared/api/PhysicalLocationService.ts rename to experimental/traffic-portal/src/app/api/physical-location.service.ts index f5ad89de97..7a1aa055c9 100644 --- a/experimental/traffic-portal/src/app/shared/api/PhysicalLocationService.ts +++ b/experimental/traffic-portal/src/app/api/physical-location.service.ts @@ -14,8 +14,8 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import { PhysicalLocation } from "../../models"; -import { APIService } from "./APIService"; +import type { PhysicalLocation } from "src/app/models"; +import { APIService } from "./base-api.service"; /** * PhysicalLocationService exposes API functionality relating to PhysicalLocations. @@ -51,11 +51,6 @@ export class PhysicalLocationService extends APIService { return prom; } - /** - * Injects the Angular HTTP client service into the parent constructor. - * - * @param http The Angular HTTP client service. - */ constructor(http: HttpClient) { super(http); } diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index 17ed88f926..4cad4aaddf 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -5,6 +5,7 @@ import { CDNService, DeliveryServiceService, InvalidationJobService, + PhysicalLocationService, ProfileService, ServerService, TypeService, @@ -14,6 +15,7 @@ import { CacheGroupService as TestingCacheGroupService } from "./cache-group.ser import { CDNService as TestingCDNService } from "./cdn.service"; import { DeliveryServiceService as TestingDeliveryServiceService } from "./delivery-service.service"; import { InvalidationJobService as TestingInvalidationJobService } from "./invalidation-job.service"; +import { PhysicalLocationService as TestingPhysicalLocationService } from "./physical-location.service"; import { ProfileService as TestingProfileService } from "./profile.service"; import { ServerService as TestingServerService } from "./server.service"; import { TypeService as TestingTypeService } from "./type.service"; @@ -33,6 +35,7 @@ import { UserService as TestingUserService } from "./user.service"; {provide: CDNService, useClass: TestingCDNService}, {provide: DeliveryServiceService, useClass: TestingDeliveryServiceService}, {provide: InvalidationJobService, useClass: TestingInvalidationJobService}, + {provide: PhysicalLocationService, useClass: TestingPhysicalLocationService}, {provide: ProfileService, useClass: TestingProfileService}, {provide: ServerService, useClass: TestingServerService}, {provide: TypeService, useClass: TestingTypeService}, diff --git a/experimental/traffic-portal/src/app/api/testing/physical-location.service.ts b/experimental/traffic-portal/src/app/api/testing/physical-location.service.ts new file mode 100644 index 0000000000..d3fc5179fa --- /dev/null +++ b/experimental/traffic-portal/src/app/api/testing/physical-location.service.ts @@ -0,0 +1,67 @@ +/* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +import { Injectable } from "@angular/core"; + +import type { PhysicalLocation } from "src/app/models"; + +/** + * PhysicalLocationService exposes API functionality relating to PhysicalLocations. + */ +@Injectable() +export class PhysicalLocationService { + private readonly locs = [ + { + address: "1600 Pennsylvania Avenue NW", + city: "Washington", + comments: "", + email: "", + id: 1, + lastUpdated: new Date(), + name: "test", + phone: "", + poc: "", + region: "Washington, D.C", + regionId: 1, + shortName: "test", + state: "DC", + zip: "20500" + } + ]; + + public async getPhysicalLocations(idOrName: number | string): Promise; + public async getPhysicalLocations(): Promise>; + /** + * Gets one or all PhysicalLocations from Traffic Ops + * + * @param idOrName Either the integral, unique identifier (number) or name (string) of a single PhysicalLocation to be returned. + * @returns The requested PhysicalLocation(s). + */ + public async getPhysicalLocations(idOrName?: number | string): Promise> { + if (idOrName !== undefined) { + let loc; + switch (typeof idOrName) { + case "string": + loc = this.locs.find(l=>l.name === idOrName); + break; + case "number": + loc = this.locs.find(l=>l.id === idOrName); + } + if (!loc) { + throw new Error(`no such Physical Location: ${idOrName}`); + } + return loc; + } + return this.locs; + } +} diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index 9df04941c3..7b46dc254d 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -20,7 +20,6 @@ import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; -import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerDetailsComponent } from "./server-details.component"; @@ -29,15 +28,9 @@ describe("ServerDetailsComponent", () => { let fixture: ComponentFixture; beforeEach(async () => { - const mockAPIService = jasmine.createSpyObj(["getPhysicalLocations"]); - mockAPIService.getPhysicalLocations.and.returnValues(new Promise(r => r([]))); - await TestBed.configureTestingModule({ declarations: [ ServerDetailsComponent ], imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], - providers: [ - { provide: PhysicalLocationService, useValue: mockAPIService }, - ] }).compileComponents(); }); diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index ba2d7c7d38..12a2d30aa3 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -16,10 +16,10 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; + import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; -import { CacheGroupService, CDNService, ProfileService, TypeService } from "src/app/api"; +import { CacheGroupService, CDNService, PhysicalLocationService, ProfileService, TypeService } from "src/app/api"; import { IP, IP_WITH_CIDR } from "src/app/utils"; -import { PhysicalLocationService } from "src/app/shared/api/PhysicalLocationService"; import { ServerService } from "src/app/api/server.service"; /** diff --git a/experimental/traffic-portal/src/app/shared/api/APIService.ts b/experimental/traffic-portal/src/app/shared/api/APIService.ts deleted file mode 100644 index 076ac3a93f..0000000000 --- a/experimental/traffic-portal/src/app/shared/api/APIService.ts +++ /dev/null @@ -1,167 +0,0 @@ -/* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -import { HttpClient, HttpHeaders } from "@angular/common/http"; - -import { Observable } from "rxjs"; -import { map } from "rxjs/operators"; - -import { environment } from "../../../environments/environment"; - -/** - * This is the base class from which all other API classes inherit. - */ -export class APIService { - /** - * The API version used by the service(s) - this will be overridden by the - * environment if a different API version is therein found. - */ - public apiVersion = "2.0"; - - /** - * Sends an HTTP DELETE request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected delete(path: string, data?: object, params?: Record): Observable { - return this.do("delete", path, data, params); - } - - /** - * Sends an HTTP GET request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected get(path: string, data?: object, params?: Record): Observable { - return this.do("get", path, data, params); - } - - /** - * Sends an HTTP HEAD request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected head(path: string, data?: object, params?: Record): Observable { - return this.do("head", path, data, params); - } - - /** - * Sends an HTTP OPTIONS request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected options(path: string, data?: object, params?: Record): Observable { - return this.do("options", path, data, params); - } - - /** - * Sends an HTTP PATCH request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected patch(path: string, data?: object, params?: Record): Observable { - return this.do("patch", path, data, params); - } - - /** - * Sends an HTTP POST request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected post(path: string, data?: object, params?: Record): Observable { - return this.do("post", path, data, params); - } - - /** - * Sends an HTTP PUT request to the API. - * - * @param path The request path. - * @param data Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected put(path: string, data?: object, params?: Record): Observable { - return this.do("put", path, data, params); - } - - /** - * Sends an HTTP request to the API. - * - * @param method The HTTP request method to use, e.g. "GET". - * @param path The request path. - * @param body Optional request body (will be JSON.stringify'd). - * @param params Option query parameters to send in the request. - * @returns An Observable that emits the server response. - */ - protected do(method: string, path: string, body?: object, params?: Record): Observable { - - const options = { - body, - params, - ...this.defaultOptions - }; - // TODO pass alerts to the alert service - // (TODO create the alert service) - return this.http.request<{response: T}>(method, `/api/${this.apiVersion}/${path.replace(/^\/+/, "")}`, options).pipe(map( - r => { - if (!r.body) { - throw new Error(`${method} ${path} returned no response body - ${r.status} ${r.statusText}`); - } - return r.body.response; - } - )); - } - - /** - * These are the default options sent in HttpClient methods - if subclasses - * make raw requests, they are encouraged to extend this rather than duplicate - * it. - */ - protected readonly defaultOptions = { - // This is part of the HTTP spec. I can't - and shouldn't - change it. - // eslint-disable-next-line @typescript-eslint/naming-convention - headers: new HttpHeaders({"Content-Type": "application/json"}), - observe: "response" as "response", - responseType: "json" as "json", - }; - - /** - * Constructs the service and sets the API version based on the execution environment. - * - * @param http The Angular HTTP client service. - */ - constructor(protected readonly http: HttpClient) { - if (environment.apiVersion) { - this.apiVersion = environment.apiVersion; - } - } -} diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index 0f2adfc331..cd34a17bf7 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -12,26 +12,25 @@ * limitations under the License. */ import { NgModule } from "@angular/core"; -import {HTTP_INTERCEPTORS} from "@angular/common/http"; -import {CommonModule} from "@angular/common"; -import {RouterModule} from "@angular/router"; -import {AppUIModule} from "../app.ui.module"; -import {AlertComponent} from "./alert/alert.component"; -import {ErrorInterceptor} from "./interceptor/error.interceptor"; -import {AlertInterceptor} from "./interceptor/alerts.interceptor"; -import {LoadingComponent} from "./loading/loading.component"; -import {TpHeaderComponent} from "./tp-header/tp-header.component"; -import {GenericTableComponent} from "./generic-table/generic-table.component"; -import {LinechartDirective} from "./charts/linechart.directive"; -import {AlertService} from "./alert/alert.service"; -import {PhysicalLocationService} from "./api/PhysicalLocationService"; -import {CurrentUserService} from "./currentUser/current-user.service"; -import {CustomvalidityDirective} from "./validation/customvalidity.directive"; -import {SSHCellRendererComponent} from "./table-components/ssh-cell-renderer/ssh-cell-renderer.component"; -import {UpdateCellRendererComponent} from "./table-components/update-cell-renderer/update-cell-renderer.component"; -import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean-filter.component"; +import { HTTP_INTERCEPTORS } from "@angular/common/http"; +import { CommonModule } from "@angular/common"; +import { RouterModule } from "@angular/router"; +import { AppUIModule } from "src/app/app.ui.module"; +import { AlertComponent } from "./alert/alert.component"; +import { AlertInterceptor } from "./interceptor/alerts.interceptor"; +import { AlertService } from "./alert/alert.service"; +import { BooleanFilterComponent } from "./table-components/boolean-filter/boolean-filter.component"; +import { CurrentUserService } from "./currentUser/current-user.service"; +import { CustomvalidityDirective } from "./validation/customvalidity.directive"; +import { ErrorInterceptor } from "./interceptor/error.interceptor"; +import { GenericTableComponent } from "./generic-table/generic-table.component"; +import { LinechartDirective } from "./charts/linechart.directive"; +import { LoadingComponent } from "./loading/loading.component"; +import { SSHCellRendererComponent } from "./table-components/ssh-cell-renderer/ssh-cell-renderer.component"; +import { TpHeaderComponent } from "./tp-header/tp-header.component"; +import { UpdateCellRendererComponent } from "./table-components/update-cell-renderer/update-cell-renderer.component"; /** * SharedModule contains common code that modules can import independently. @@ -68,7 +67,6 @@ import {BooleanFilterComponent} from "./table-components/boolean-filter/boolean- { multi: true, provide: HTTP_INTERCEPTORS, useClass: AlertInterceptor }, AlertService, CurrentUserService, - PhysicalLocationService, ] }) export class SharedModule { } From 3e3b10d873e743d4bbdd3a43efc462b5c5cdf079 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 11:10:57 -0700 Subject: [PATCH 17/50] Upgrade to TypeScript 4.5 --- experimental/traffic-portal/package-lock.json | 1926 +++++------------ experimental/traffic-portal/package.json | 8 +- .../src/app/models/models.spec.ts | 2 +- 3 files changed, 529 insertions(+), 1407 deletions(-) diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index 1295b864c9..fe1f87df9e 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -25,15 +25,15 @@ } }, "@angular-devkit/build-angular": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.3.tgz", - "integrity": "sha512-C5Qv8aGmpGbETG4Mawly/5LnkRwfJAzANL5BtYJn8ZaDlZKCkhvAaRXHpm4Mdqg5idACAT8hgYqPQvqyEBaVDA==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.4.tgz", + "integrity": "sha512-MTvlUCb02J4ODXDsnit4N0PR9PkpKeSYpTPueaSBuWTBeP3dvMPZQabvb3C5QT/5yUzBiXQZq11QYx3Gui4StA==", "dev": true, "requires": { "@ampproject/remapping": "1.0.2", - "@angular-devkit/architect": "0.1301.3", - "@angular-devkit/build-webpack": "0.1301.3", - "@angular-devkit/core": "13.1.3", + "@angular-devkit/architect": "0.1301.4", + "@angular-devkit/build-webpack": "0.1301.4", + "@angular-devkit/core": "13.1.4", "@babel/core": "7.16.0", "@babel/generator": "7.16.0", "@babel/helper-annotate-as-pure": "7.16.0", @@ -44,7 +44,7 @@ "@babel/runtime": "7.16.3", "@babel/template": "7.16.0", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.1.3", + "@ngtools/webpack": "13.1.4", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", @@ -75,7 +75,7 @@ "postcss": "8.4.4", "postcss-import": "14.0.2", "postcss-loader": "6.2.1", - "postcss-preset-env": "6.7.0", + "postcss-preset-env": "7.2.3", "regenerator-runtime": "0.13.9", "resolve-url-loader": "4.0.0", "rxjs": "6.6.7", @@ -97,6 +97,30 @@ "webpack-subresource-integrity": "5.0.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1301.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.4.tgz", + "integrity": "sha512-p6G8CEMnE+gYwxRyEttj3QGsuNJ3Kusi7iwBIzWyf2RpJSdGzXdwUEiRGg6iS0YHFr06/ZFfAWfnM2DQvNm4TA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.1.4", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.4.tgz", + "integrity": "sha512-225Gjy4iVxh5Jo9njJnaG75M/Dt95UW+dEPCGWKV5E/++7UUlXlo9sNWq8x2vJm2nhtsPkpnXNOt4pW1mIDwqQ==", + "dev": true, + "requires": { + "ajv": "8.8.2", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, "@babel/core": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", @@ -125,6 +149,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -137,6 +167,14 @@ "@babel/types": "^7.16.0", "jsesc": "^2.5.1", "source-map": "^0.5.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 + } } }, "@babel/runtime": { @@ -273,16 +311,10 @@ "source-map-js": "^1.0.1" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, "source-map-support": { @@ -315,13 +347,39 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1301.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.3.tgz", - "integrity": "sha512-FFwKdhq5n0lrqkiJRZoWKy21gERtvupkk0BpIVPTbRqyiqB2htiGM995uBBjpeDngytDLx+BwPFipVfQ+WIi9w==", + "version": "0.1301.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.4.tgz", + "integrity": "sha512-IcC3Y5WhreIV0uT90ITqJVgRqFjGwH72hftwLxkslaX+FJDcL36mhsNdyN66BJiuX7R85xUxHq3PEb9cZrllJA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1301.3", + "@angular-devkit/architect": "0.1301.4", "rxjs": "6.6.7" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1301.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.4.tgz", + "integrity": "sha512-p6G8CEMnE+gYwxRyEttj3QGsuNJ3Kusi7iwBIzWyf2RpJSdGzXdwUEiRGg6iS0YHFr06/ZFfAWfnM2DQvNm4TA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.1.4", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.4.tgz", + "integrity": "sha512-225Gjy4iVxh5Jo9njJnaG75M/Dt95UW+dEPCGWKV5E/++7UUlXlo9sNWq8x2vJm2nhtsPkpnXNOt4pW1mIDwqQ==", + "dev": true, + "requires": { + "ajv": "8.8.2", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + } } }, "@angular-devkit/core": { @@ -704,9 +762,9 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", - "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", @@ -823,9 +881,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -834,9 +892,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -851,9 +909,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -862,7 +920,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -924,9 +982,9 @@ } }, "@babel/helper-define-polyfill-provider": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", - "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", @@ -1271,9 +1329,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -1282,9 +1340,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -1299,9 +1357,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -1310,7 +1368,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1548,12 +1606,12 @@ } }, "@babel/plugin-proposal-private-methods": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", - "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" } }, @@ -1891,9 +1949,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -1902,9 +1960,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -1919,9 +1977,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -1930,7 +1988,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2075,9 +2133,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2086,9 +2144,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -2248,9 +2306,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2259,9 +2317,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -2276,9 +2334,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -2287,7 +2345,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2422,9 +2480,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2433,9 +2491,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -2450,9 +2508,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -2461,7 +2519,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2597,9 +2655,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2608,9 +2666,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -2625,9 +2683,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -2636,7 +2694,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2769,9 +2827,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2780,9 +2838,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -2797,9 +2855,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -2808,7 +2866,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -2956,9 +3014,9 @@ "dev": true }, "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", @@ -2967,9 +3025,9 @@ } }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", + "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", "dev": true }, "@babel/template": { @@ -2984,9 +3042,9 @@ } }, "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", "dev": true, "requires": { "@babel/code-frame": "^7.16.7", @@ -2995,7 +3053,7 @@ "@babel/helper-function-name": "^7.16.7", "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", + "@babel/parser": "^7.16.10", "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" @@ -3321,12 +3379,6 @@ "to-fast-properties": "^2.0.0" } }, - "@csstools/convert-colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", - "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", - "dev": true - }, "@discoveryjs/json-ext": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", @@ -3497,9 +3549,9 @@ "dev": true }, "@ngtools/webpack": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.3.tgz", - "integrity": "sha512-6Pf52IbChm/dFuegfv0smeBTW2moi0Gdkyjgk/7VWqE6hN35m+YGrCh+XnPp1POJwOKxhAByhV9zs6NWxrK1vA==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.4.tgz", + "integrity": "sha512-s8gzjG2nYHawFhlkHMkQWYrocHkBI1nF6T9K/oCSTIsq6kvTv//Ahno2VdBSgVq8uMnpv1TymvX0nFC4Dgn1HA==", "dev": true }, "@nguniversal/common": { @@ -3948,9 +4000,9 @@ "dev": true }, "@types/eslint": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", - "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.0.tgz", + "integrity": "sha512-JUYa/5JwoqikCy7O7jKtuNe9Z4ZZt615G+1EKfaDGSNEpzaA2OwbV/G1v08Oa7fd1XzlFoSCvt9ePl9/6FyAug==", "dev": true, "requires": { "@types/estree": "*", @@ -4091,56 +4143,20 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", - "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-XXVKnMsq2fuu9K2KsIxPUGqb6xAImz8MEChClbXmE3VbveFtBUU5bzM6IPVWqzyADIgdkS2Ws/6Xo7W2TeZWjQ==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.4.0", - "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/type-utils": "5.10.0", + "@typescript-eslint/utils": "5.10.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", "regexpp": "^3.2.0", "semver": "^7.3.5", "tsutils": "^3.21.0" - }, - "dependencies": { - "@typescript-eslint/experimental-utils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", - "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", - "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0", - "debug": "^4.3.2", - "globby": "^11.0.4", - "is-glob": "^4.0.3", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - } - } } }, "@typescript-eslint/experimental-utils": { @@ -4180,31 +4196,31 @@ } }, "@typescript-eslint/parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", - "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.0.tgz", + "integrity": "sha512-pJB2CCeHWtwOAeIxv8CHVGJhI5FNyJAIpx5Pt72YkK3QfEzt6qAlXZuyaBmyfOdM62qU0rbxJzNToPTVeJGrQw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", "debug": "^4.3.2" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", - "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -4215,23 +4231,34 @@ } }, "@typescript-eslint/scope-manager": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", - "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.0.tgz", + "integrity": "sha512-tgNgUgb4MhqK6DoKn3RBhyZ9aJga7EQrw+2/OiDk5hKf3pTVZWyqBi7ukP+Z0iEEDMF5FDa64LqODzlfE4O/Dg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0" + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true } } }, + "@typescript-eslint/type-utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.0.tgz", + "integrity": "sha512-TzlyTmufJO5V886N+hTJBGIfnjQDQ32rJYxPaeiyWKdjsv2Ld5l8cbS7pxim4DeNs62fKzRSt8Q14Evs4JnZyQ==", + "dev": true, + "requires": { + "@typescript-eslint/utils": "5.10.0", + "debug": "^4.3.2", + "tsutils": "^3.21.0" + } + }, "@typescript-eslint/types": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.0.tgz", @@ -4265,20 +4292,57 @@ } } }, + "@typescript-eslint/utils": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.0.tgz", + "integrity": "sha512-IGYwlt1CVcFoE2ueW4/ioEwybR60RAdGeiJX/iDAw0t5w0wK3S7QncDwpmsM70nKgGTuVchEWB8lwZwHqPAWRg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.0", + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/typescript-estree": "5.10.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.0.tgz", + "integrity": "sha512-x+7e5IqfwLwsxTdliHRtlIYkgdtYXzE0CkFeV6ytAqq431ZyxCFzNMNR5sr3WOlIG/ihVZr9K/y71VHTF/DUQA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.10.0", + "@typescript-eslint/visitor-keys": "5.10.0", + "debug": "^4.3.2", + "globby": "^11.0.4", + "is-glob": "^4.0.3", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + } + } + } + }, "@typescript-eslint/visitor-keys": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", - "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.0.tgz", + "integrity": "sha512-GMxj0K1uyrFLPKASLmZzCuSddmjZVbVj3Ouy5QVuIGKZopxvOr24JsS7gruz6C3GExE01mublZ3mIBOaon9zuQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/types": "5.10.0", "eslint-visitor-keys": "^3.0.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.0.tgz", + "integrity": "sha512-wUljCgkqHsMZbw60IbOqT/puLfyqqD5PquGiBo1u1IS3PLxdi3RDGlyf032IJyh+eQoGhz9kzhtZa+VC4eWTlQ==", "dev": true } } @@ -4791,40 +4855,42 @@ "dev": true }, "autoprefixer": { - "version": "9.8.8", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", - "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz", + "integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==", "dev": true, "requires": { - "browserslist": "^4.12.0", - "caniuse-lite": "^1.0.30001109", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001297", + "fraction.js": "^4.1.2", "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "picocolors": "^0.2.1", - "postcss": "^7.0.32", - "postcss-value-parser": "^4.1.0" + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" }, "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "caniuse-lite": { + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", + "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", "dev": true } } @@ -4904,13 +4970,13 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", - "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", "dev": true, "requires": { "@babel/compat-data": "^7.13.11", - "@babel/helper-define-polyfill-provider": "^0.3.0", + "@babel/helper-define-polyfill-provider": "^0.3.1", "semver": "^6.1.1" }, "dependencies": { @@ -4933,12 +4999,12 @@ } }, "babel-plugin-polyfill-regenerator": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", - "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0" + "@babel/helper-define-polyfill-provider": "^0.3.1" } }, "balanced-match": { @@ -5689,15 +5755,15 @@ } }, "globby": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", - "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", "dev": true, "requires": { "array-union": "^3.0.1", "dir-glob": "^3.0.1", "fast-glob": "^3.2.7", - "ignore": "^5.1.8", + "ignore": "^5.1.9", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -5729,9 +5795,9 @@ "dev": true }, "core-js-compat": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", - "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", + "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", "dev": true, "requires": { "browserslist": "^4.19.1", @@ -5752,15 +5818,15 @@ } }, "caniuse-lite": { - "version": "1.0.30001299", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001299.tgz", - "integrity": "sha512-iujN4+x7QzqA2NCSrS5VUy+4gLmRd4xv6vbBBsmfVqTx8bLAD8097euLqQgKxSVLvxjSDcvF1T/i9ocgnUFexw==", + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", "dev": true }, "electron-to-chromium": { - "version": "1.4.44", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.44.tgz", - "integrity": "sha512-tHGWiUUmY7GABK8+DNcr474cnZDTzD8x1736SlDosVH8+/vRJeqfaIBAEHFtMjddz/0T4rKKYsxEc8BwQRdBpw==", + "version": "1.4.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", + "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", "dev": true }, "semver": { @@ -5895,87 +5961,21 @@ } }, "css-blank-pseudo": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", - "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.2.tgz", + "integrity": "sha512-hOb1LFjRR+8ocA071xUSmg5VslJ8NGo/I2qpUpdeAYyBVCgupS5O8SEVo4SxEMYyFBNodBkzG3T1iqW9HCXxew==", "dev": true, "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.8" } }, "css-has-pseudo": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", - "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.3.tgz", + "integrity": "sha512-0gDYWEKaGacwxCqvQ3Ypg6wGdD1AztbMm5h1JsactG2hP2eiflj808QITmuWBpE7sjSEVrAlZhPTVd/nNMj/hQ==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^5.0.0-rc.4" - }, - "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 - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } + "postcss-selector-parser": "^6.0.8" } }, "css-loader": { @@ -5995,37 +5995,10 @@ } }, "css-prefers-color-scheme": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", - "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.2.tgz", + "integrity": "sha512-gv0KQBEM+q/XdoKyznovq3KW7ocO7k+FhPP+hQR1MenJdu0uPGS6IZa9PzlbqBeS6XcZJNAoqoFxlAUW461CrA==", + "dev": true }, "css-select": { "version": "4.1.3", @@ -6064,9 +6037,9 @@ } }, "cssdb": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", - "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", "dev": true }, "cssesc": { @@ -7557,12 +7530,6 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "flatten": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", - "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", - "dev": true - }, "follow-redirects": { "version": "1.14.7", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", @@ -7590,6 +7557,12 @@ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, + "fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "dev": true + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -8148,12 +8121,6 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", - "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -9834,12 +9801,6 @@ "boolbase": "^1.0.0" } }, - "num2fraction": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", - "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", - "dev": true - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", @@ -10410,612 +10371,129 @@ } }, "postcss-attribute-case-insensitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", - "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", "dev": true, "requires": { - "postcss": "^7.0.2", "postcss-selector-parser": "^6.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } } }, "postcss-color-functional-notation": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", - "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.1.tgz", + "integrity": "sha512-62OBIXCjRXpQZcFOYIXwXBlpAVWrYk8ek1rcjvMING4Q2cf0ipyN9qT+BhHA6HmftGSEnFQu2qgKO3gMscl3Rw==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-color-gray": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", - "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "postcss-color-hex-alpha": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.2.tgz", + "integrity": "sha512-gyx8RgqSmGVK156NAdKcsfkY3KPGHhKqvHTL3hhveFrBBToguKFzhyiuk3cljH6L4fJ0Kv+JENuPXs1Wij27Zw==", "dev": true, "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-color-hex-alpha": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", - "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", "dev": true, "requires": { - "postcss": "^7.0.14", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-color-mod-function": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", - "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true + }, + "postcss-custom-properties": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.3.tgz", + "integrity": "sha512-rtu3otIeY532PnEuuBrIIe+N+pcdbX/7JMZfrcL09wc78YayrHw5E8UkDfvnlOhEUrI4ptCuzXQfj+Or6spbGA==", "dev": true, "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-color-rebeccapurple": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", - "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.4" } }, - "postcss-custom-media": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", - "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "postcss-dir-pseudo-class": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.3.tgz", + "integrity": "sha512-qiPm+CNAlgXiMf0J5IbBBEXA9l/Q5HGsNGkL3znIwT2ZFRLGY9U2fTUpa4lqCUXQOxaLimpacHeQC80BD2qbDw==", "dev": true, "requires": { - "postcss": "^7.0.14" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.8" } }, - "postcss-custom-properties": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", - "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "postcss-double-position-gradients": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.0.4.tgz", + "integrity": "sha512-qz+s5vhKJlsHw8HjSs+HVk2QGFdRyC68KGRQGX3i+GcnUjhWhXQEmCXW6siOJkZ1giu0ddPwSO6I6JdVVVPoog==", "dev": true, "requires": { - "postcss": "^7.0.17", - "postcss-values-parser": "^2.0.1" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, - "postcss-custom-selectors": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", - "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "postcss-env-function": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.4.tgz", + "integrity": "sha512-0ltahRTPtXSIlEZFv7zIvdEib7HN0ZbUQxrxIKn8KbiRyhALo854I/CggU5lyZe6ZBvSTJ6Al2vkZecI2OhneQ==", "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 - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-dir-pseudo-class": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", - "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", - "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 - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, - "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 - } - } - }, - "postcss-double-position-gradients": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", - "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", - "dev": true, - "requires": { - "postcss": "^7.0.5", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } - }, - "postcss-env-function": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", - "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", - "dev": true, - "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-focus-visible": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", - "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.3.tgz", + "integrity": "sha512-ozOsg+L1U8S+rxSHnJJiET6dNLyADcPHhEarhhtCI9DBLGOPG/2i4ddVoFch9LzrBgb8uDaaRI4nuid2OM82ZA==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.8" } }, "postcss-focus-within": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", - "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.3.tgz", + "integrity": "sha512-fk9y2uFS6/Kpp7/A9Hz9Z4rlFQ8+tzgBcQCXAFSrXFGAbKx+4ZZOmmfHuYjCOMegPWoz0pnC6fNzi8j7Xyqp5Q==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.8" } }, "postcss-font-variant": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", - "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true }, "postcss-gap-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", - "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.2.tgz", + "integrity": "sha512-EaMy/pbxtQnKDsnbEjdqlkCkROTQZzolcLKgIE+3b7EuJfJydH55cZeHfm+MtIezXRqhR80VKgaztO/vHq94Fw==", + "dev": true }, "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", - "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.4.tgz", + "integrity": "sha512-BlEo9gSTj66lXjRNByvkMK9dEdEGFXRfGjKRi9fo8s0/P3oEk74cAoonl/utiM50E2OPVb/XSu+lWvdW4KtE/Q==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-import": { @@ -11030,71 +10508,18 @@ } }, "postcss-initial": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", - "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true }, "postcss-lab-function": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", - "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.0.3.tgz", + "integrity": "sha512-MH4tymWmefdZQ7uVG/4icfLjAQmH6o2NRYyVh2mKoB4RXJp9PjsyhZwhH4ouaCQHvg+qJVj3RzeAR1EQpIlXZA==", "dev": true, "requires": { - "@csstools/convert-colors": "^1.4.0", - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-loader": { @@ -11109,70 +10534,16 @@ } }, "postcss-logical": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", - "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.3.tgz", + "integrity": "sha512-P5NcHWYrif0vK8rgOy/T87vg0WRIj3HSknrvp1wzDbiBeoDPVmiVRmkown2eSQdpPveat/MC1ess5uhzZFVnqQ==", + "dev": true }, "postcss-media-minmax": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", - "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true }, "postcss-modules-extract-imports": { "version": "3.0.0", @@ -11193,380 +10564,148 @@ }, "postcss-modules-scope": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-nesting": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", - "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", - "dev": true, - "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" } }, - "postcss-overflow-shorthand": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", - "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "icss-utils": "^5.0.0" } }, - "postcss-page-break": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", - "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "postcss-nesting": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.2.tgz", + "integrity": "sha512-dJGmgmsvpzKoVMtDMQQG/T6FSqs6kDtUDirIfl4KnjMCiY9/ETX8jdKyCd20swSRAbUYkaBKV20pxkzxoOXLqQ==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.8" } }, + "postcss-overflow-shorthand": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.2.tgz", + "integrity": "sha512-odBMVt6PTX7jOE9UNvmnLrFzA9pXS44Jd5shFGGtSHY80QCuJF+14McSy0iavZggRZ9Oj//C9vOKQmexvyEJMg==", + "dev": true + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true + }, "postcss-place": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", - "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.3.tgz", + "integrity": "sha512-tDQ3m+GYoOar+KoQgj+pwPAvGHAp/Sby6vrFiyrELrMKQJ4AejL0NcS0mm296OKKYA2SRg9ism/hlT/OLhBrdQ==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-values-parser": "^2.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-value-parser": "^4.2.0" } }, "postcss-preset-env": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", - "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", - "dev": true, - "requires": { - "autoprefixer": "^9.6.1", - "browserslist": "^4.6.4", - "caniuse-lite": "^1.0.30000981", - "css-blank-pseudo": "^0.1.4", - "css-has-pseudo": "^0.10.0", - "css-prefers-color-scheme": "^3.1.1", - "cssdb": "^4.4.0", - "postcss": "^7.0.17", - "postcss-attribute-case-insensitive": "^4.0.1", - "postcss-color-functional-notation": "^2.0.1", - "postcss-color-gray": "^5.0.0", - "postcss-color-hex-alpha": "^5.0.3", - "postcss-color-mod-function": "^3.0.3", - "postcss-color-rebeccapurple": "^4.0.1", - "postcss-custom-media": "^7.0.8", - "postcss-custom-properties": "^8.0.11", - "postcss-custom-selectors": "^5.1.2", - "postcss-dir-pseudo-class": "^5.0.0", - "postcss-double-position-gradients": "^1.0.0", - "postcss-env-function": "^2.0.2", - "postcss-focus-visible": "^4.0.0", - "postcss-focus-within": "^3.0.0", - "postcss-font-variant": "^4.0.0", - "postcss-gap-properties": "^2.0.0", - "postcss-image-set-function": "^3.0.1", - "postcss-initial": "^3.0.0", - "postcss-lab-function": "^2.0.1", - "postcss-logical": "^3.0.0", - "postcss-media-minmax": "^4.0.0", - "postcss-nesting": "^7.0.0", - "postcss-overflow-shorthand": "^2.0.0", - "postcss-page-break": "^2.0.0", - "postcss-place": "^4.0.1", - "postcss-pseudo-class-any-link": "^6.0.0", - "postcss-replace-overflow-wrap": "^3.0.0", - "postcss-selector-matches": "^4.0.0", - "postcss-selector-not": "^4.0.0" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } - }, - "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==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", "dev": true, "requires": { - "postcss": "^7.0.2", - "postcss-selector-parser": "^5.0.0-rc.3" + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" }, "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 - }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dev": true, "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.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" - } + "caniuse-lite": { + "version": "1.0.30001300", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", + "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "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==", + "electron-to-chromium": { + "version": "1.4.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", + "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", "dev": true } } }, - "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-pseudo-class-any-link": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.0.2.tgz", + "integrity": "sha512-CG35J1COUH7OOBgpw5O+0koOLUd5N4vUGKUqSAuIe4GiuLHWU96Pqp+UPC8QITTd12zYAFx76pV7qWT/0Aj/TA==", "dev": true, "requires": { - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "postcss-selector-parser": "^6.0.8" } }, - "postcss-selector-matches": { + "postcss-replace-overflow-wrap": { "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": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } - } + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "postcss": "^7.0.2" - }, - "dependencies": { - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.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 - } + "balanced-match": "^1.0.0" } }, "postcss-selector-parser": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", - "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz", + "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -11579,17 +10718,6 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, - "postcss-values-parser": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", - "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", - "dev": true, - "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11988,9 +11116,9 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", - "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", + "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -13330,9 +12458,9 @@ "dev": true }, "typescript": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", - "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", "dev": true }, "ua-parser-js": { @@ -13381,12 +12509,6 @@ "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", "dev": true }, - "uniq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", - "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", - "dev": true - }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index 44a24ebc22..d8ff23e1d4 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -53,7 +53,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "~13.1.3", + "@angular-devkit/build-angular": "^13.1.4", "@angular-eslint/builder": "13.0.1", "@angular-eslint/eslint-plugin": "13.0.1", "@angular-eslint/eslint-plugin-template": "13.0.1", @@ -67,8 +67,8 @@ "@types/jasmine": "~3.6.0", "@types/jasminewd2": "~2.0.3", "@types/node": "^14.17.34", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", + "@typescript-eslint/eslint-plugin": "^5.10.0", + "@typescript-eslint/parser": "^5.10.0", "codelyzer": "^6.0.0", "eslint": "^8.2.0", "eslint-plugin-import": "^2.25.3", @@ -82,6 +82,6 @@ "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", "ts-node": "~8.3.0", - "typescript": "~4.4.4" + "typescript": "^4.5.4" } } diff --git a/experimental/traffic-portal/src/app/models/models.spec.ts b/experimental/traffic-portal/src/app/models/models.spec.ts index 38aa79adb2..0425e14a58 100644 --- a/experimental/traffic-portal/src/app/models/models.spec.ts +++ b/experimental/traffic-portal/src/app/models/models.spec.ts @@ -23,7 +23,7 @@ import { RangeRequestHandling, rangeRequestHandlingToString } from "./deliveryservice"; -import { checkMap, Servercheck } from "./server"; +import { checkMap, type Servercheck } from "./server"; describe("Cache Group utilities", () => { it("converts localization methods to human-readable strings", () => { From eeff7f930ce975f47cfde159091a64c461aa09b3 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 12:48:29 -0700 Subject: [PATCH 18/50] Enforce consistent import group ordering and also putting newlines between import groups and alphabetization within groups finally, importing from "../../**/*" is no longer allowed. --- experimental/traffic-portal/.eslintrc.json | 80 ++++++++++++++++++- .../src/app/api/base-api.service.ts | 1 - .../src/app/api/cache-group.service.ts | 2 +- .../traffic-portal/src/app/api/cdn.service.ts | 2 +- .../src/app/api/delivery-service.service.ts | 1 + .../traffic-portal/src/app/api/index.ts | 5 +- .../src/app/api/physical-location.service.ts | 1 + .../app/api/testing/cache-group.service.ts | 1 - .../src/app/api/testing/index.ts | 4 +- .../src/app/api/testing/server.service.ts | 2 +- .../src/app/api/testing/user.service.ts | 2 +- .../src/app/api/type.service.ts | 1 + .../src/app/app-routing.module.ts | 8 +- .../src/app/app.component.spec.ts | 3 +- .../traffic-portal/src/app/app.module.ts | 8 +- .../traffic-portal/src/app/app.ui.module.ts | 32 ++++---- .../cache-group-table.component.ts | 6 +- .../src/app/core/core.module.ts | 37 ++++----- .../update-password-dialog.component.spec.ts | 2 +- .../update-password-dialog.component.ts | 2 +- .../dashboard/dashboard.component.spec.ts | 7 +- .../app/core/dashboard/dashboard.component.ts | 4 +- .../deliveryservice.component.spec.ts | 5 +- .../deliveryservice.component.ts | 7 +- .../src/app/core/ds-card/ds-card.component.ts | 5 +- .../invalidation-jobs.component.spec.ts | 6 +- .../invalidation-jobs.component.ts | 1 + .../new-delivery-service.component.spec.ts | 7 +- .../new-delivery-service.component.ts | 2 +- .../server-details.component.ts | 6 +- .../servers-table.component.spec.ts | 6 +- .../servers-table/servers-table.component.ts | 3 +- .../update-status.component.spec.ts | 1 + .../update-status/update-status.component.ts | 5 +- .../app/core/users/users.component.spec.ts | 7 +- .../src/app/core/users/users.component.ts | 4 +- .../app/guards/authenticated-guard.service.ts | 7 +- .../app/guards/authentication.guard.spec.ts | 1 + .../src/app/login/login.component.spec.ts | 3 +- .../src/app/login/login.component.ts | 5 +- .../traffic-portal/src/app/models/user.ts | 1 - .../app/shared/alert/alert.component.spec.ts | 17 ++-- .../src/app/shared/alert/alert.component.ts | 2 +- .../src/app/shared/alert/alert.service.ts | 5 +- .../shared/charts/linechart.directive.spec.ts | 2 + .../app/shared/charts/linechart.directive.ts | 8 +- .../currentUser/current-user.service.spec.ts | 2 +- .../generic-table/generic-table.component.ts | 19 +++-- .../shared/interceptor/alerts.interceptor.ts | 10 +-- .../shared/interceptor/error.interceptor.ts | 10 +-- .../src/app/shared/shared.module.ts | 16 ++-- .../ssh-cell-renderer.component.spec.ts | 1 + .../ssh-cell-renderer.component.ts | 3 +- .../shared/tp-header/tp-header.component.ts | 1 + .../validation/customvalidity.directive.ts | 1 - experimental/traffic-portal/src/polyfills.ts | 1 - 56 files changed, 240 insertions(+), 151 deletions(-) diff --git a/experimental/traffic-portal/.eslintrc.json b/experimental/traffic-portal/.eslintrc.json index 2b5f878df7..fe345f549f 100644 --- a/experimental/traffic-portal/.eslintrc.json +++ b/experimental/traffic-portal/.eslintrc.json @@ -200,6 +200,8 @@ "error" ], "@typescript-eslint/typedef": "off", + "jsdoc/no-types": "error", + "jsdoc/require-description": "error", "jsdoc/require-jsdoc": [ "error", { @@ -217,7 +219,8 @@ }, "checkConstructors": false, "checkGetters": true, - "checkSetters": true + "checkSetters": true, + "enableFixer": false } ], "@typescript-eslint/unbound-method": "error", @@ -232,7 +235,61 @@ "1tbs" ], "class-methods-use-this": "off", - "import/order": "error", + "import/export": "error", + "import/first": "error", + "import/newline-after-import": "error", + "import/no-cycle": [ + "error", + { + "ignoreExternal": true + } + ], + "import/no-self-import": "error", + "import/no-useless-path-segments": [ + "error", + { + "commonjs": true, + "noUselessIndex": true + } + ], + "import/order": [ + "error", + { + "alphabetize": {"order": "asc"}, + "groups": [ + "builtin", + "external", + "internal", + "parent", + "sibling" + ], + "pathGroups": [ + { + "group": "builtin", + "pattern": "zone.js/**/*", + "position": "before" + }, + { + "group": "external", + "pattern": "(@(angular|fortawesome)|chart.js|rxjs)*/**/*", + "position": "before" + }, + { + "group": "internal", + "pattern": "src/**/*" + } + ], + "pathGroupsExcludedImportTypes": [ + "zone.js/**/*", + "@angular*/**/*", + "@fortawesome*/**/*", + "chart.js", + "rxjs" + ], + "newlines-between": "always", + "warnOnUnassignedImports": true + } + ], "linebreak-style": [ "error", "unix" @@ -249,8 +306,27 @@ "capIsConstructor": false } ], + "no-multiple-empty-lines": [ + "error", + { + "max": 1, + "maxBOF": 0, + "maxEOF": 0 + } + ], "no-new-func": "error", "no-redeclare": "off", + "no-restricted-imports": [ + "error", + { + "patterns": [ + { + "message": "Going up more than one directory for an import is overly complex; use an import path that starts with 'src/' instead", + "group": ["../../*"] + } + ] + } + ], "no-return-await": "error", "no-sparse-arrays": "error", "no-template-curly-in-string": "error", diff --git a/experimental/traffic-portal/src/app/api/base-api.service.ts b/experimental/traffic-portal/src/app/api/base-api.service.ts index 2f536bb2cc..7d811cfa78 100644 --- a/experimental/traffic-portal/src/app/api/base-api.service.ts +++ b/experimental/traffic-portal/src/app/api/base-api.service.ts @@ -13,7 +13,6 @@ */ import { HttpClient, HttpHeaders } from "@angular/common/http"; - import type { Observable } from "rxjs"; import { map } from "rxjs/operators"; diff --git a/experimental/traffic-portal/src/app/api/cache-group.service.ts b/experimental/traffic-portal/src/app/api/cache-group.service.ts index e69ca8618d..f7f0f6cea7 100644 --- a/experimental/traffic-portal/src/app/api/cache-group.service.ts +++ b/experimental/traffic-portal/src/app/api/cache-group.service.ts @@ -15,8 +15,8 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import type { CacheGroup } from "src/app/models"; -import { APIService } from "./base-api.service"; +import { APIService } from "./base-api.service"; /** * CDNService expose API functionality relating to CDNs. diff --git a/experimental/traffic-portal/src/app/api/cdn.service.ts b/experimental/traffic-portal/src/app/api/cdn.service.ts index 612c8b3ad2..8e27c0da85 100644 --- a/experimental/traffic-portal/src/app/api/cdn.service.ts +++ b/experimental/traffic-portal/src/app/api/cdn.service.ts @@ -15,8 +15,8 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import type { CDN } from "src/app/models"; -import { APIService } from "./base-api.service"; +import { APIService } from "./base-api.service"; /** * CDNService expose API functionality relating to CDNs. diff --git a/experimental/traffic-portal/src/app/api/delivery-service.service.ts b/experimental/traffic-portal/src/app/api/delivery-service.service.ts index 95a5efc5e7..db9032d3e6 100644 --- a/experimental/traffic-portal/src/app/api/delivery-service.service.ts +++ b/experimental/traffic-portal/src/app/api/delivery-service.service.ts @@ -26,6 +26,7 @@ import { TPSData, Type } from "src/app/models"; + import { APIService } from "./base-api.service"; /** diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 79212239d0..3ba2648147 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -1,7 +1,8 @@ -import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; -import { CDNService } from "./cdn.service"; +import { NgModule } from "@angular/core"; + import { CacheGroupService } from "./cache-group.service"; +import { CDNService } from "./cdn.service"; import { DeliveryServiceService } from "./delivery-service.service"; import { InvalidationJobService } from "./invalidation-job.service"; import { PhysicalLocationService } from "./physical-location.service"; diff --git a/experimental/traffic-portal/src/app/api/physical-location.service.ts b/experimental/traffic-portal/src/app/api/physical-location.service.ts index 7a1aa055c9..8f0c0b2c85 100644 --- a/experimental/traffic-portal/src/app/api/physical-location.service.ts +++ b/experimental/traffic-portal/src/app/api/physical-location.service.ts @@ -15,6 +15,7 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import type { PhysicalLocation } from "src/app/models"; + import { APIService } from "./base-api.service"; /** diff --git a/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts b/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts index 6b93085a9a..4e44136b9e 100644 --- a/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/cache-group.service.ts @@ -15,7 +15,6 @@ import { Injectable } from "@angular/core"; import type { CacheGroup } from "src/app/models"; - /** * CDNService expose API functionality relating to CDNs. */ diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index 4cad4aaddf..64469a1556 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -1,5 +1,6 @@ -import { NgModule } from "@angular/core"; import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; + import { CacheGroupService, CDNService, @@ -11,6 +12,7 @@ import { TypeService, UserService } from ".."; + import { CacheGroupService as TestingCacheGroupService } from "./cache-group.service"; import { CDNService as TestingCDNService } from "./cdn.service"; import { DeliveryServiceService as TestingDeliveryServiceService } from "./delivery-service.service"; diff --git a/experimental/traffic-portal/src/app/api/testing/server.service.ts b/experimental/traffic-portal/src/app/api/testing/server.service.ts index 969f30cad5..63bddea94b 100644 --- a/experimental/traffic-portal/src/app/api/testing/server.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/server.service.ts @@ -14,7 +14,7 @@ import { Injectable } from "@angular/core"; -import type { Server, Servercheck, Status } from "../../models"; +import type { Server, Servercheck, Status } from "src/app/models"; /** * Generates a `Servercheck` for a given `server`. diff --git a/experimental/traffic-portal/src/app/api/testing/user.service.ts b/experimental/traffic-portal/src/app/api/testing/user.service.ts index 04fc774d04..cc6e1d354e 100644 --- a/experimental/traffic-portal/src/app/api/testing/user.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/user.service.ts @@ -15,7 +15,7 @@ import { HttpResponse } from "@angular/common/http"; import { Injectable } from "@angular/core"; -import type { Role, User, Capability, CurrentUser } from "../../models/user"; +import type { Role, User, Capability, CurrentUser } from "src/app/models"; /** * UserService exposes API functionality related to Users, Roles and Capabilities. diff --git a/experimental/traffic-portal/src/app/api/type.service.ts b/experimental/traffic-portal/src/app/api/type.service.ts index 41723a5d57..94c8e26c16 100644 --- a/experimental/traffic-portal/src/app/api/type.service.ts +++ b/experimental/traffic-portal/src/app/api/type.service.ts @@ -15,6 +15,7 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import type { Type } from "src/app/models"; + import { APIService } from "./base-api.service"; /** The allowed values for the 'useInTables' query parameter of GET requests to /types. */ diff --git a/experimental/traffic-portal/src/app/app-routing.module.ts b/experimental/traffic-portal/src/app/app-routing.module.ts index 8abeebd8c4..1ec60f83a7 100644 --- a/experimental/traffic-portal/src/app/app-routing.module.ts +++ b/experimental/traffic-portal/src/app/app-routing.module.ts @@ -11,11 +11,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {NgModule} from "@angular/core"; -import {RouterModule, Routes} from "@angular/router"; +import { NgModule } from "@angular/core"; +import { RouterModule, Routes } from "@angular/router"; -import {LoginComponent} from "./login/login.component"; -import {AuthenticatedGuard} from "./guards/authenticated-guard.service"; +import { AuthenticatedGuard } from "./guards/authenticated-guard.service"; +import { LoginComponent } from "./login/login.component"; const routes: Routes = [ {component: LoginComponent, path: "login"}, diff --git a/experimental/traffic-portal/src/app/app.component.spec.ts b/experimental/traffic-portal/src/app/app.component.spec.ts index e462fd4f7d..5ebcda1f0d 100644 --- a/experimental/traffic-portal/src/app/app.component.spec.ts +++ b/experimental/traffic-portal/src/app/app.component.spec.ts @@ -14,10 +14,11 @@ import { HttpClientModule } from "@angular/common/http"; import { TestBed, waitForAsync } from "@angular/core/testing"; -import { RouterTestingModule } from "@angular/router/testing"; import { MatSnackBarModule } from "@angular/material/snack-bar"; +import { RouterTestingModule } from "@angular/router/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; + import { AppComponent } from "./app.component"; describe("AppComponent", () => { diff --git a/experimental/traffic-portal/src/app/app.module.ts b/experimental/traffic-portal/src/app/app.module.ts index ae0fd9f516..d7a4db709a 100644 --- a/experimental/traffic-portal/src/app/app.module.ts +++ b/experimental/traffic-portal/src/app/app.module.ts @@ -21,18 +21,18 @@ import { HttpClientModule } from "@angular/common/http"; import { NgModule } from "@angular/core"; import { BrowserModule } from "@angular/platform-browser"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; import * as Chart from "chart.js"; // Routing, Components, Directives and Interceptors -import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { APIModule } from "./api"; import { AppRoutingModule } from "./app-routing.module"; import { AppComponent } from "./app.component"; -import { LoginComponent } from "./login/login.component"; import { AppUIModule } from "./app.ui.module"; -import { SharedModule } from "./shared/shared.module"; import { AuthenticatedGuard } from "./guards/authenticated-guard.service"; +import { LoginComponent } from "./login/login.component"; import { ResetPasswordDialogComponent } from "./login/reset-password-dialog/reset-password-dialog.component"; -import { APIModule } from "./api"; +import { SharedModule } from "./shared/shared.module"; // TODO: Figure out the actual typing here. Chart.plugins.register({ diff --git a/experimental/traffic-portal/src/app/app.ui.module.ts b/experimental/traffic-portal/src/app/app.ui.module.ts index 35db382553..dcbe17b9ae 100644 --- a/experimental/traffic-portal/src/app/app.ui.module.ts +++ b/experimental/traffic-portal/src/app/app.ui.module.ts @@ -13,23 +13,23 @@ */ import { NgModule } from "@angular/core"; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { MatButtonModule } from "@angular/material/button"; +import { MatButtonToggleModule } from "@angular/material/button-toggle"; +import { MatCardModule } from "@angular/material/card"; +import { MatNativeDateModule } from "@angular/material/core"; +import { MatDatepickerModule } from "@angular/material/datepicker"; +import { MatDialogModule } from "@angular/material/dialog"; +import { MatDividerModule } from "@angular/material/divider"; +import { MatExpansionModule } from "@angular/material/expansion"; +import { MatInputModule } from "@angular/material/input"; +import { MatListModule } from "@angular/material/list"; +import { MatRadioModule } from "@angular/material/radio"; +import { MatSnackBarModule } from "@angular/material/snack-bar"; +import { MatStepperModule } from "@angular/material/stepper"; +import { MatToolbarModule } from "@angular/material/toolbar"; +import { FontAwesomeModule } from "@fortawesome/angular-fontawesome"; import { AgGridModule } from "ag-grid-angular"; -import {FormsModule, ReactiveFormsModule} from "@angular/forms"; -import {FontAwesomeModule} from "@fortawesome/angular-fontawesome"; -import {MatButtonModule} from "@angular/material/button"; -import {MatCardModule} from "@angular/material/card"; -import {MatDividerModule} from "@angular/material/divider"; -import {MatInputModule} from "@angular/material/input"; -import {MatListModule} from "@angular/material/list"; -import {MatRadioModule} from "@angular/material/radio"; -import {MatSnackBarModule} from "@angular/material/snack-bar"; -import {MatStepperModule} from "@angular/material/stepper"; -import {MatNativeDateModule} from "@angular/material/core"; -import {MatDialogModule} from "@angular/material/dialog"; -import {MatDatepickerModule} from "@angular/material/datepicker"; -import {MatToolbarModule} from "@angular/material/toolbar"; -import {MatExpansionModule} from "@angular/material/expansion"; -import {MatButtonToggleModule} from "@angular/material/button-toggle"; /** * AppUIModule is the Angular Module that contains the ui dependencies of diff --git a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts index fab6f801a4..9d4dc1be35 100644 --- a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts +++ b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts @@ -12,14 +12,14 @@ * limitations under the License. */ -import { Component, OnInit } from "@angular/core"; +import { Component, type OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute } from "@angular/router"; import { BehaviorSubject } from "rxjs"; -import { CacheGroup } from "src/app/models/cache-groups"; import { CacheGroupService } from "src/app/api"; -import { ContextMenuActionEvent, ContextMenuItem } from "../../../shared/generic-table/generic-table.component"; +import type { CacheGroup } from "src/app/models"; +import type { ContextMenuActionEvent, ContextMenuItem } from "src/app/shared/generic-table/generic-table.component"; /** * CacheGroupTableComponent is the controller for the "Cache Groups" table. diff --git a/experimental/traffic-portal/src/app/core/core.module.ts b/experimental/traffic-portal/src/app/core/core.module.ts index 9f74e963e0..8f6f2517a2 100644 --- a/experimental/traffic-portal/src/app/core/core.module.ts +++ b/experimental/traffic-portal/src/app/core/core.module.ts @@ -11,26 +11,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; -import {RouterModule, Routes} from "@angular/router"; -import {CommonModule} from "@angular/common"; -import {AppUIModule} from "../app.ui.module"; -import {SharedModule} from "../shared/shared.module"; -import {AuthenticatedGuard} from "../guards/authenticated-guard.service"; -import {InvalidationJobsComponent} from "./invalidation-jobs/invalidation-jobs.component"; -import {UsersComponent} from "./users/users.component"; -import {ServerDetailsComponent} from "./servers/server-details/server-details.component"; -import {ServersTableComponent} from "./servers/servers-table/servers-table.component"; -import {UpdateStatusComponent} from "./servers/update-status/update-status.component"; -import {DeliveryserviceComponent} from "./deliveryservice/deliveryservice.component"; -import {NewDeliveryServiceComponent} from "./new-delivery-service/new-delivery-service.component"; -import {DashboardComponent} from "./dashboard/dashboard.component"; -import {CacheGroupTableComponent} from "./cache-groups/cache-group-table/cache-group-table.component"; -import {CurrentuserComponent} from "./currentuser/currentuser.component"; -import {UpdatePasswordDialogComponent} from "./currentuser/update-password-dialog/update-password-dialog.component"; -import {DsCardComponent} from "./ds-card/ds-card.component"; -import {NewInvalidationJobDialogComponent} from "./invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component"; +import { RouterModule, Routes } from "@angular/router"; +import { AppUIModule } from "../app.ui.module"; +import { AuthenticatedGuard } from "../guards/authenticated-guard.service"; +import { SharedModule } from "../shared/shared.module"; + +import { CacheGroupTableComponent } from "./cache-groups/cache-group-table/cache-group-table.component"; +import { CurrentuserComponent } from "./currentuser/currentuser.component"; +import { UpdatePasswordDialogComponent } from "./currentuser/update-password-dialog/update-password-dialog.component"; +import { DashboardComponent } from "./dashboard/dashboard.component"; +import { DeliveryserviceComponent } from "./deliveryservice/deliveryservice.component"; +import { DsCardComponent } from "./ds-card/ds-card.component"; +import { InvalidationJobsComponent } from "./invalidation-jobs/invalidation-jobs.component"; +import { NewInvalidationJobDialogComponent } from "./invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component"; +import { NewDeliveryServiceComponent } from "./new-delivery-service/new-delivery-service.component"; +import { ServerDetailsComponent } from "./servers/server-details/server-details.component"; +import { ServersTableComponent } from "./servers/servers-table/servers-table.component"; +import { UpdateStatusComponent } from "./servers/update-status/update-status.component"; +import { UsersComponent } from "./users/users.component"; const routes: Routes = [ { canActivate: [AuthenticatedGuard], component: DashboardComponent, path: "" }, diff --git a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts index 334f5c8456..b89cfcf2ca 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.spec.ts @@ -15,8 +15,8 @@ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { MatDialogModule, MatDialogRef } from "@angular/material/dialog"; import { RouterTestingModule } from "@angular/router/testing"; -import { APITestingModule } from "src/app/api/testing"; +import { APITestingModule } from "src/app/api/testing"; import { User } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; diff --git a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.ts b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.ts index 048aea4c68..e4ef2eb469 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/update-password-dialog/update-password-dialog.component.ts @@ -15,7 +15,7 @@ import { Component } from "@angular/core"; import { MatDialogRef } from "@angular/material/dialog"; import { Subject } from "rxjs"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; /** * This is the controller for the "Update Password" dialog box/form. diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts index b5854b3f13..1e0abbf0e0 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts @@ -18,13 +18,14 @@ import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; import { DeliveryService } from "src/app/models"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; +import { AlertService } from "src/app/shared/alert/alert.service"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; -import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { LoadingComponent } from "src/app/shared/loading/loading.component"; -import { AlertService } from "src/app/shared/alert/alert.service"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; import { DsCardComponent } from "../ds-card/ds-card.component"; + import { DashboardComponent } from "./dashboard.component"; describe("DashboardComponent", () => { diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts index 8ea4fbb18d..ae50051c10 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts @@ -15,10 +15,10 @@ import { Component, OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { DeliveryServiceService } from "src/app/api"; import type { DeliveryService } from "src/app/models"; -import { orderBy, fuzzyScore } from "src/app/utils"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; +import { orderBy, fuzzyScore } from "src/app/utils/index"; /** * DashboardComponent is the controller for the dashboard, where a user sees all diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts index d1f789e0ae..eaa053c856 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts @@ -17,14 +17,13 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; +import { AlertService } from "src/app/shared/alert/alert.service"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; -import { AlertService } from "src/app/shared/alert/alert.service"; import { DeliveryserviceComponent } from "./deliveryservice.component"; - describe("DeliveryserviceComponent", () => { let component: DeliveryserviceComponent; let fixture: ComponentFixture; diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts index 6bc83fcb22..9519d22e93 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts @@ -11,16 +11,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, OnInit } from "@angular/core"; +import { Component, type OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute } from "@angular/router"; import { faBroom } from "@fortawesome/free-solid-svg-icons"; - import { Subject } from "rxjs"; import { DeliveryServiceService } from "src/app/api"; -import { DataPoint, DataSet, DeliveryService } from "../../models"; -import {AlertService} from "../../shared/alert/alert.service"; +import type { DataPoint, DataSet, DeliveryService } from "src/app/models"; +import { AlertService } from "src/app/shared/alert/alert.service"; /** * DeliveryserviceComponent is the controller for a single Delivery Service's diff --git a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts index 69dcdccff2..15d646eeed 100644 --- a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts +++ b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts @@ -11,17 +11,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, Input, OnInit } from "@angular/core"; import { trigger, style, animate, transition } from "@angular/animations"; - +import { Component, Input, OnInit } from "@angular/core"; import { faInfoCircle } from "@fortawesome/free-solid-svg-icons"; - import { Subject } from "rxjs"; import { DeliveryServiceService } from "src/app/api"; import { DataPoint, DataSet, DeliveryService, GeoProvider, protocolToString } from "src/app/models"; - /** * DsCardComponent is a component for displaying information about a Delivery * Service in an expand-able card. diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index ce8ed7b701..7e8938cbc9 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -14,14 +14,14 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { RouterTestingModule } from "@angular/router/testing"; import { MatDialogModule } from "@angular/material/dialog"; +import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; -import { CustomvalidityDirective } from "src/app/shared/validation/customvalidity.directive"; import { JobType } from "src/app/models"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { CustomvalidityDirective } from "src/app/shared/validation/customvalidity.directive"; import { InvalidationJobsComponent } from "./invalidation-jobs.component"; diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts index 35f38aa784..60910e585c 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts @@ -18,6 +18,7 @@ import { faPlus, faTrash, faPencilAlt } from "@fortawesome/free-solid-svg-icons" import { DeliveryServiceService, InvalidationJobService } from "src/app/api"; import { defaultDeliveryService, DeliveryService, InvalidationJob } from "src/app/models"; + import { NewInvalidationJobDialogComponent } from "./new-invalidation-job-dialog/new-invalidation-job-dialog.component"; /** diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts index 9f27520853..bc555cbd4a 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts @@ -12,8 +12,8 @@ * limitations under the License. */ -import {HarnessLoader, parallel} from "@angular/cdk/testing"; -import {TestbedHarnessEnvironment} from "@angular/cdk/testing/testbed"; +import { HarnessLoader, parallel } from "@angular/cdk/testing"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; @@ -25,13 +25,12 @@ import { NoopAnimationsModule } from "@angular/platform-browser/animations"; import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { Protocol } from "src/app/models"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; import { NewDeliveryServiceComponent } from "./new-delivery-service.component"; - describe("NewDeliveryServiceComponent", () => { let component: NewDeliveryServiceComponent; let fixture: ComponentFixture; diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts index e36112ad34..8df2a1c55a 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts @@ -17,7 +17,6 @@ import type { MatStepper } from "@angular/material/stepper"; import { Router } from "@angular/router"; import { CDNService, DeliveryServiceService } from "src/app/api"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { bypassable, CDN, @@ -28,6 +27,7 @@ import { Type, User } from "src/app/models"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; /** * A regular expression that matches character strings that are illegal in `xml_id`s diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts index 12a2d30aa3..1b015f7a02 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.ts @@ -14,13 +14,13 @@ import { Component, OnInit } from "@angular/core"; import { ActivatedRoute, Router } from "@angular/router"; -import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; import { faClock as hollowClock } from "@fortawesome/free-regular-svg-icons"; +import { faClock, faMinus, faPlus, faToggleOff, faToggleOn, IconDefinition } from "@fortawesome/free-solid-svg-icons"; -import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; import { CacheGroupService, CDNService, PhysicalLocationService, ProfileService, TypeService } from "src/app/api"; -import { IP, IP_WITH_CIDR } from "src/app/utils"; import { ServerService } from "src/app/api/server.service"; +import { CacheGroup, CDN, DUMMY_SERVER, Interface, PhysicalLocation, Profile, Server, Status, Type } from "src/app/models"; +import { IP, IP_WITH_CIDR } from "src/app/utils"; /** * ServerDetailsComponent is the controller for a server's "details" page. diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts index 701c91d60f..e9712a5c40 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts @@ -16,12 +16,12 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; +import { APITestingModule } from "src/app/api/testing"; +import { defaultServer, Server } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; -import { defaultServer, Server } from "src/app/models"; -import { APITestingModule } from "src/app/api/testing"; -import { augment, AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; +import { augment, AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; describe("ServersTableComponent", () => { let component: ServersTableComponent; diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts index 9d49152f46..1fbd75a4a2 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts @@ -16,13 +16,12 @@ import { Component, OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; import { ITooltipParams } from "ag-grid-community"; - import { BehaviorSubject } from "rxjs"; import { ServerService } from "src/app/api"; import { Interface, Server } from "src/app/models/server"; -import { IPV4, serviceInterface } from "src/app/utils"; import { ContextMenuActionEvent, ContextMenuItem } from "src/app/shared/generic-table/generic-table.component"; +import { IPV4, serviceInterface } from "src/app/utils"; /** * AugmentedServer has fields that give direct access to its service addresses without needing to recalculate them. diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts index 3e88829661..f3336ee6d8 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts @@ -13,6 +13,7 @@ */ import { HttpClientModule } from "@angular/common/http"; import { ComponentFixture, TestBed } from "@angular/core/testing"; + import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts index dcb03b79dc..dd0bafe651 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts @@ -11,10 +11,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, EventEmitter, HostListener, Input, OnInit, Output } from "@angular/core"; +import { Component, EventEmitter, HostListener, Input, type OnInit, Output } from "@angular/core"; import { FormControl } from "@angular/forms"; -import { Server, Status } from "src/app/models"; + import { ServerService } from "src/app/api/server.service"; +import type { Server, Status } from "src/app/models"; /** * UpdateStatusComponent is the controller for the "Update Server Status" dialog box. diff --git a/experimental/traffic-portal/src/app/core/users/users.component.spec.ts b/experimental/traffic-portal/src/app/core/users/users.component.spec.ts index 13e2e95dca..159542d21f 100644 --- a/experimental/traffic-portal/src/app/core/users/users.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/users/users.component.spec.ts @@ -16,11 +16,12 @@ import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; -import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; +import { APITestingModule } from "src/app/api/testing"; import type { User } from "src/app/models"; -import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { LoadingComponent } from "src/app/shared/loading/loading.component"; -import { APITestingModule } from "src/app/api/testing"; +import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; + import { UsersComponent } from "./users.component"; describe("UsersComponent", () => { diff --git a/experimental/traffic-portal/src/app/core/users/users.component.ts b/experimental/traffic-portal/src/app/core/users/users.component.ts index e4cf623026..ca44219ac5 100644 --- a/experimental/traffic-portal/src/app/core/users/users.component.ts +++ b/experimental/traffic-portal/src/app/core/users/users.component.ts @@ -13,13 +13,12 @@ */ import { Component, OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; - import { BehaviorSubject, Observable } from "rxjs"; import { UserService } from "src/app/api"; import type { Role, User } from "src/app/models"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { orderBy } from "src/app/utils"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; /** * UsersComponent is the controller for the "users" page. @@ -49,7 +48,6 @@ export class UsersComponent implements OnInit { /** Maps role IDs to role Names. */ public rolesMap: Observable>; - /** * Constructor. */ diff --git a/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts b/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts index c98a02166f..a966c87fec 100644 --- a/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts +++ b/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts @@ -11,9 +11,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {Injectable} from "@angular/core"; -import {CanActivate, CanLoad } from "@angular/router"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { Injectable } from "@angular/core"; +import { CanActivate, CanLoad } from "@angular/router"; + +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; /** * AuthenticationGuard ensures that the user is logged in. diff --git a/experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts b/experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts index 3d1dda8d95..8d627f98fe 100644 --- a/experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts +++ b/experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts @@ -14,6 +14,7 @@ import { TestBed } from "@angular/core/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; + import { AuthenticatedGuard } from "./authenticated-guard.service"; describe("AuthenticationGuard", () => { diff --git a/experimental/traffic-portal/src/app/login/login.component.spec.ts b/experimental/traffic-portal/src/app/login/login.component.spec.ts index cddf246501..ca89735d42 100644 --- a/experimental/traffic-portal/src/app/login/login.component.spec.ts +++ b/experimental/traffic-portal/src/app/login/login.component.spec.ts @@ -17,7 +17,8 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MatDialogModule } from "@angular/material/dialog"; import { RouterTestingModule } from "@angular/router/testing"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; + import { LoginComponent } from "./login.component"; describe("LoginComponent", () => { diff --git a/experimental/traffic-portal/src/app/login/login.component.ts b/experimental/traffic-portal/src/app/login/login.component.ts index a1ec238260..b888b30a7a 100644 --- a/experimental/traffic-portal/src/app/login/login.component.ts +++ b/experimental/traffic-portal/src/app/login/login.component.ts @@ -15,9 +15,10 @@ import { Component, OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { MatDialog } from "@angular/material/dialog"; import { Router, ActivatedRoute } from "@angular/router"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; -import { ResetPasswordDialogComponent } from "./reset-password-dialog/reset-password-dialog.component"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; + +import { ResetPasswordDialogComponent } from "./reset-password-dialog/reset-password-dialog.component"; /** * LoginComponent is the controller for the user login form. diff --git a/experimental/traffic-portal/src/app/models/user.ts b/experimental/traffic-portal/src/app/models/user.ts index af142f5b1c..4f2dc052b9 100644 --- a/experimental/traffic-portal/src/app/models/user.ts +++ b/experimental/traffic-portal/src/app/models/user.ts @@ -134,7 +134,6 @@ export function newCurrentUser(): CurrentUser { }; } - /** * Represents a role that a user may have */ diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts b/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts index f42b2b60bd..2b8a9777be 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts @@ -11,16 +11,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {TestBed, ComponentFixture} from "@angular/core/testing"; -import {TestbedHarnessEnvironment} from "@angular/cdk/testing/testbed"; -import {MatSnackBarHarness} from "@angular/material/snack-bar/testing"; -import {HarnessLoader} from "@angular/cdk/testing"; -import {MatSnackBarModule} from "@angular/material/snack-bar"; -import {NoopAnimationsModule} from "@angular/platform-browser/animations"; +import { HarnessLoader } from "@angular/cdk/testing"; +import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; +import { TestBed, ComponentFixture } from "@angular/core/testing"; +import { MatSnackBarModule } from "@angular/material/snack-bar"; +import { MatSnackBarHarness} from "@angular/material/snack-bar/testing"; +import { NoopAnimationsModule } from "@angular/platform-browser/animations"; + +import type { AlertLevel } from "src/app/models"; -import { AlertLevel } from "../../models/alert.model"; -import { AlertService } from "./alert.service"; import { AlertComponent } from "./alert.component"; +import { AlertService } from "./alert.service"; describe("AlertComponent", () => { let component: AlertComponent; diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.component.ts b/experimental/traffic-portal/src/app/shared/alert/alert.component.ts index 9a2e6c5751..f0b977967f 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.component.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.component.ts @@ -11,8 +11,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { MatSnackBar } from "@angular/material/snack-bar"; import { Component, OnDestroy } from "@angular/core"; +import { MatSnackBar } from "@angular/material/snack-bar"; import { Subscription } from "rxjs"; import { AlertService } from "./alert.service"; diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.service.ts b/experimental/traffic-portal/src/app/shared/alert/alert.service.ts index 6c4f415224..ebf36bdd9a 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.service.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.service.ts @@ -12,10 +12,9 @@ * limitations under the License. */ import { Injectable } from "@angular/core"; +import { BehaviorSubject, type Observable } from "rxjs"; -import { BehaviorSubject, Observable } from "rxjs"; - -import { Alert, AlertLevel } from "../../models/alert.model"; +import type { Alert, AlertLevel } from "src/app/models/alert.model"; /** * This class is responsible for populating an alerts Observable that can be diff --git a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts index cf523e4ce0..004c8ce216 100644 --- a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts +++ b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts @@ -13,7 +13,9 @@ */ import { ElementRef } from "@angular/core"; import { BehaviorSubject } from "rxjs"; + import type { DataSet } from "src/app/models"; + import { LinechartDirective } from "./linechart.directive"; describe("LinechartDirective", () => { diff --git a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts index e8d2999b1a..c43c385972 100644 --- a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts +++ b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts @@ -11,13 +11,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from "@angular/core"; - -import { from, Observable, Subscription } from "rxjs"; +import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from "@angular/core"; import { Chart } from "chart.js"; // TODO: use plotly instead for WebGL-capabale browsers? +import { from, Observable, Subscription } from "rxjs"; -import { DataSet } from "../../models/data"; +import type { DataSet } from "src/app/models/data"; /** * LinechartDirective decorates canvases by creating a rendering context for @@ -152,7 +151,6 @@ export class LinechartDirective implements AfterViewInit, OnDestroy { } } - /** * Loads a new Chart. * diff --git a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts index 2184d12dfb..66f203731a 100644 --- a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts +++ b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts @@ -15,8 +15,8 @@ import { TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; import { APITestingModule } from "src/app/api/testing"; -import { newCurrentUser, User } from "src/app/models"; import { LoginComponent } from "src/app/login/login.component"; +import { newCurrentUser, User } from "src/app/models"; import { CurrentUserService } from "./current-user.service"; diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts index a598418ea4..27591248ea 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts @@ -12,10 +12,19 @@ * limitations under the License. */ -import { Component, ElementRef, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output, ViewChild } from "@angular/core"; +import { + Component, + type ElementRef, + EventEmitter, + HostListener, + Input, + type OnDestroy, + type OnInit, + Output, + ViewChild +} from "@angular/core"; import { Router } from "@angular/router"; -import { BehaviorSubject, Subscription } from "rxjs"; - +import { faCaretDown, faColumns, faDownload } from "@fortawesome/free-solid-svg-icons"; import type { CellContextMenuEvent, ColDef, @@ -29,9 +38,10 @@ import type { ITooltipParams, RowNode } from "ag-grid-community"; -import {faCaretDown, faColumns, faDownload} from "@fortawesome/free-solid-svg-icons"; +import { BehaviorSubject, Subscription } from "rxjs"; import { fuzzyScore } from "src/app/utils"; + import { BooleanFilterComponent } from "../table-components/boolean-filter/boolean-filter.component"; import { SSHCellRendererComponent } from "../table-components/ssh-cell-renderer/ssh-cell-renderer.component"; import { UpdateCellRendererComponent } from "../table-components/update-cell-renderer/update-cell-renderer.component"; @@ -571,7 +581,6 @@ export class GenericTableComponent implements OnInit, OnDestroy { this.gridAPI.exportDataAsCsv(params); } - /** * Select or de-select all rows. * diff --git a/experimental/traffic-portal/src/app/shared/interceptor/alerts.interceptor.ts b/experimental/traffic-portal/src/app/shared/interceptor/alerts.interceptor.ts index af321ce50c..93e045621e 100644 --- a/experimental/traffic-portal/src/app/shared/interceptor/alerts.interceptor.ts +++ b/experimental/traffic-portal/src/app/shared/interceptor/alerts.interceptor.ts @@ -11,14 +11,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from "@angular/common/http"; +import type { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from "@angular/common/http"; import { Injectable } from "@angular/core"; - -import { Observable } from "rxjs"; +import type { Observable } from "rxjs"; import { tap } from "rxjs/operators"; -import {AlertService} from "../alert/alert.service"; -import {Alert} from "../../models/alert.model"; +import type { Alert } from "src/app/models/alert.model"; + +import { AlertService } from "../alert/alert.service"; /** * This class intercepts any and all alerts contained in API responses and diff --git a/experimental/traffic-portal/src/app/shared/interceptor/error.interceptor.ts b/experimental/traffic-portal/src/app/shared/interceptor/error.interceptor.ts index b178562da4..3d303386a4 100644 --- a/experimental/traffic-portal/src/app/shared/interceptor/error.interceptor.ts +++ b/experimental/traffic-portal/src/app/shared/interceptor/error.interceptor.ts @@ -11,15 +11,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse } from "@angular/common/http"; +import { type HttpRequest, type HttpHandler, type HttpEvent, type HttpInterceptor, HttpErrorResponse } from "@angular/common/http"; import { Injectable } from "@angular/core"; import { Router } from "@angular/router"; - -import { Observable, throwError } from "rxjs"; +import { type Observable, throwError } from "rxjs"; import { catchError } from "rxjs/operators"; -import {AlertService} from "../alert/alert.service"; -import {Alert} from "../../models/alert.model"; +import type { Alert } from "src/app/models"; + +import { AlertService } from "../alert/alert.service"; /** * This class intercepts any and all HTTP error responses and checks for diff --git a/experimental/traffic-portal/src/app/shared/shared.module.ts b/experimental/traffic-portal/src/app/shared/shared.module.ts index cd34a17bf7..0dd82f485d 100644 --- a/experimental/traffic-portal/src/app/shared/shared.module.ts +++ b/experimental/traffic-portal/src/app/shared/shared.module.ts @@ -11,26 +11,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { NgModule } from "@angular/core"; -import { HTTP_INTERCEPTORS } from "@angular/common/http"; import { CommonModule } from "@angular/common"; +import { HTTP_INTERCEPTORS } from "@angular/common/http"; +import { NgModule } from "@angular/core"; import { RouterModule } from "@angular/router"; import { AppUIModule } from "src/app/app.ui.module"; import { AlertComponent } from "./alert/alert.component"; -import { AlertInterceptor } from "./interceptor/alerts.interceptor"; import { AlertService } from "./alert/alert.service"; -import { BooleanFilterComponent } from "./table-components/boolean-filter/boolean-filter.component"; +import { LinechartDirective } from "./charts/linechart.directive"; import { CurrentUserService } from "./currentUser/current-user.service"; -import { CustomvalidityDirective } from "./validation/customvalidity.directive"; -import { ErrorInterceptor } from "./interceptor/error.interceptor"; import { GenericTableComponent } from "./generic-table/generic-table.component"; -import { LinechartDirective } from "./charts/linechart.directive"; +import { AlertInterceptor } from "./interceptor/alerts.interceptor"; +import { ErrorInterceptor } from "./interceptor/error.interceptor"; import { LoadingComponent } from "./loading/loading.component"; +import { BooleanFilterComponent } from "./table-components/boolean-filter/boolean-filter.component"; import { SSHCellRendererComponent } from "./table-components/ssh-cell-renderer/ssh-cell-renderer.component"; -import { TpHeaderComponent } from "./tp-header/tp-header.component"; import { UpdateCellRendererComponent } from "./table-components/update-cell-renderer/update-cell-renderer.component"; +import { TpHeaderComponent } from "./tp-header/tp-header.component"; +import { CustomvalidityDirective } from "./validation/customvalidity.directive"; /** * SharedModule contains common code that modules can import independently. diff --git a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts index 2204f74896..fda89b5a26 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts @@ -17,6 +17,7 @@ import { RouterTestingModule } from "@angular/router/testing"; import type { ICellRendererParams } from "ag-grid-community"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; + import { SSHCellRendererComponent } from "./ssh-cell-renderer.component"; describe("SshCellRendererComponent", () => { diff --git a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.ts b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.ts index 63f1bbcfd6..98d702cf62 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.ts @@ -14,11 +14,10 @@ import { Component } from "@angular/core"; import { DomSanitizer, SafeUrl } from "@angular/platform-browser"; - import { ICellRendererAngularComp } from "ag-grid-angular"; import { ICellRendererParams } from "ag-grid-community"; -import {CurrentUserService} from "src/app/shared/currentUser/current-user.service"; +import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; /** * SSHCellRendererComponent is an AG-Grid cell renderer that provides ssh:// links as content. diff --git a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts index b12b8c9a8b..e3c62bf2d7 100644 --- a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts +++ b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts @@ -12,6 +12,7 @@ * limitations under the License. */ import { Component, Input, OnInit } from "@angular/core"; + import { UserService } from "src/app/api"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; diff --git a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts index ad45decc5e..c5dcae7deb 100644 --- a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts +++ b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts @@ -12,7 +12,6 @@ * limitations under the License. */ import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from "@angular/core"; - import type { Observable, Subscription } from "rxjs"; /** diff --git a/experimental/traffic-portal/src/polyfills.ts b/experimental/traffic-portal/src/polyfills.ts index c91088563f..baad992240 100644 --- a/experimental/traffic-portal/src/polyfills.ts +++ b/experimental/traffic-portal/src/polyfills.ts @@ -61,7 +61,6 @@ */ import "zone.js/dist/zone"; // Included with Angular CLI. - /*************************************************************************************************** * APPLICATION IMPORTS */ From afaa8f4feea3dd50b37834c6f1f0d8e27b1830ea Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 12:52:37 -0700 Subject: [PATCH 19/50] Add code-coverage scripts --- experimental/traffic-portal/package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index d8ff23e1d4..5a5748f94d 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -17,7 +17,9 @@ "start": "ng serve", "build": "ng build", "test": "ng test", + "coverage": "ng test --code-coverage", "test:ci": "ng test --watch=false --browsers=ChromeHeadlessCustom", + "coverage:ci": "ng test --code-coverage --watch=false --browsers=ChromeHeadlessCustom", "lint": "ng lint", "e2e": "ng e2e", "dev:ssr": "ng run traffic-portal:serve-ssr", From 961fef96444caa3d0b85dee16e38c9dc48208cf5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 13:32:48 -0700 Subject: [PATCH 20/50] Omit API code and associated testing mock services from code coverage reports --- experimental/traffic-portal/angular.json | 1 + 1 file changed, 1 insertion(+) diff --git a/experimental/traffic-portal/angular.json b/experimental/traffic-portal/angular.json index c031f7d36b..e8f3f7a875 100644 --- a/experimental/traffic-portal/angular.json +++ b/experimental/traffic-portal/angular.json @@ -96,6 +96,7 @@ "builder": "@angular-devkit/build-angular:karma", "options": { "main": "src/test.ts", + "codeCoverageExclude": ["src/app/api/**/*"], "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", From 6d350233e4688109ddb573704e11441d6c1f13de Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 14:31:05 -0700 Subject: [PATCH 21/50] Remove unused and untested utility function --- .../src/app/core/core.module.ts | 31 ++++++----- .../src/app/utils/file-utils.ts | 55 ------------------- .../traffic-portal/src/app/utils/index.ts | 1 - 3 files changed, 18 insertions(+), 69 deletions(-) delete mode 100644 experimental/traffic-portal/src/app/utils/file-utils.ts diff --git a/experimental/traffic-portal/src/app/core/core.module.ts b/experimental/traffic-portal/src/app/core/core.module.ts index 8f6f2517a2..b0efd11c37 100644 --- a/experimental/traffic-portal/src/app/core/core.module.ts +++ b/experimental/traffic-portal/src/app/core/core.module.ts @@ -1,16 +1,21 @@ -/* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ +/** + * @module src/app/core + * The "Core" module consists of all TP functionality and components that aren't + * needed/useful until the user is authenticated. + * + * @license Apache-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; import { RouterModule, Routes } from "@angular/router"; diff --git a/experimental/traffic-portal/src/app/utils/file-utils.ts b/experimental/traffic-portal/src/app/utils/file-utils.ts deleted file mode 100644 index abeb8fe040..0000000000 --- a/experimental/traffic-portal/src/app/utils/file-utils.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ - -/** - * Causes the browser to initiate a download - * - * @param content Should be a File, data Blob, raw data string, or some arbitrary object. Arbitrary objects will be - * converted to JSON via JSON.stringify. - * @param filename Will be the name of the file to download. If not given and the {@link content} is not a File, - * will default to 'download'. - * @param type The MIME type of the download - used as a hint for file extensions. If not given and {@link content} - * is not a File or Blob, this will default to 'text/plain' for strings, and 'application/json' for all others. - */ -export function download(content: Blob | File | string | unknown, filename?: string, type?: string): void { - if (content instanceof File) { - const url = URL.createObjectURL(content); - window.location.assign(url); - URL.revokeObjectURL(url); - return; - } - - let f: File; - if (!filename) { - filename = "download"; - } - - if (content instanceof Blob) { - f = new File([content], filename); - } else if (typeof(content) === "string") { - if (!type) { - type = "text/plain"; - } - f = new File([content], filename, {type}); - } else { - if (!type) { - type = "application/json"; - } - f = new File([JSON.stringify(content)], filename, {type}); - } - - const exportURL = URL.createObjectURL(f); - window.location.assign(exportURL); - URL.revokeObjectURL(exportURL); -} diff --git a/experimental/traffic-portal/src/app/utils/index.ts b/experimental/traffic-portal/src/app/utils/index.ts index cbb7485794..652a3e4112 100644 --- a/experimental/traffic-portal/src/app/utils/index.ts +++ b/experimental/traffic-portal/src/app/utils/index.ts @@ -13,6 +13,5 @@ */ export * from "./order-by"; -export * from "./file-utils"; export * from "./fuzzy"; export * from "./ip"; From 977ebf81b4914e0f92fe04144be51f13a6d58243 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 14:31:28 -0700 Subject: [PATCH 22/50] Add typedoc documentation generation --- experimental/traffic-portal/package-lock.json | 48 +++++++++++++++++++ experimental/traffic-portal/package.json | 2 + 2 files changed, 50 insertions(+) diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index fe1f87df9e..1669e63edd 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -9263,6 +9263,12 @@ "yallist": "^4.0.0" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", @@ -9338,6 +9344,12 @@ } } }, + "marked": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", + "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -11749,6 +11761,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shiki": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", + "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", + "dev": true, + "requires": { + "jsonc-parser": "^3.0.0", + "vscode-oniguruma": "^1.6.1", + "vscode-textmate": "5.2.0" + } + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -12457,6 +12480,19 @@ "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", "dev": true }, + "typedoc": { + "version": "0.22.11", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", + "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", + "dev": true, + "requires": { + "glob": "^7.2.0", + "lunr": "^2.3.9", + "marked": "^4.0.10", + "minimatch": "^3.0.4", + "shiki": "^0.10.0" + } + }, "typescript": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", @@ -12619,6 +12655,18 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "vscode-oniguruma": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", + "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", + "dev": true + }, + "vscode-textmate": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", + "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", + "dev": true + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index 5a5748f94d..d32c02389c 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -14,6 +14,7 @@ "engineStrict": true, "scripts": { "ng": "ng", + "doc": "find ./src/ -name '*.ts' | grep -v 'spec.ts' | xargs typedoc --includeVersion --entryPoints", "start": "ng serve", "build": "ng build", "test": "ng test", @@ -84,6 +85,7 @@ "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", "ts-node": "~8.3.0", + "typedoc": "^0.22.11", "typescript": "^4.5.4" } } From cdd1aff806fa25a71e4cfbca47c462e31a9a681e Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 15:51:43 -0700 Subject: [PATCH 23/50] Expand test coverage of customvalidity directive (to 100%) Also the tests revealed a shortcoming of the directive where it failed to properly implement the behavior of the browser-native `HTMLObjectElement.setCustomValidity` where passing an empty string marked the customError part of its validity state as non-erroneous. --- .../customvalidity.directive.spec.ts | 122 +++++++++++++++++- .../validation/customvalidity.directive.ts | 10 +- 2 files changed, 123 insertions(+), 9 deletions(-) diff --git a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.spec.ts b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.spec.ts index dee4e6a16f..93faa2ece7 100644 --- a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.spec.ts +++ b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.spec.ts @@ -11,13 +11,133 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ElementRef } from "@angular/core"; +import { Component, type DebugElement, ElementRef } from "@angular/core"; +import { type ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; +import { BehaviorSubject } from "rxjs"; import { CustomvalidityDirective } from "./customvalidity.directive"; +/** + * This component is used to exercise all the ways the Customvalidity directive + * can be used. + */ +@Component({ + template: ` + + + + + + + + + + + + + + + + ` +}) +class TestComponent { + public validity = new BehaviorSubject(""); +} + describe("CustomvalidityDirective", () => { + let fixture: ComponentFixture; + let customInputs: Array; + let normalInput: DebugElement; + + beforeEach(() => { + fixture = TestBed.configureTestingModule({ + declarations: [ CustomvalidityDirective, TestComponent ] + }).createComponent(TestComponent); + + fixture.detectChanges(); + + customInputs = fixture.debugElement.queryAll(By.directive(CustomvalidityDirective)); + normalInput = fixture.debugElement.query(By.css("#no-directive-applied")); + }); + it("should create an instance", () => { const directive = new CustomvalidityDirective(new ElementRef(document.createElement("input"))); expect(directive).toBeTruthy(); }); + + it("binds to only the elements with its directive", () => { + expect(customInputs.length).toBe(14); + expect(normalInput).toBeTruthy(); + expect(normalInput.properties.customvalidity).toBeUndefined(); + }); + + it("updates input validity when the input emits a change", () => { + for (const input of customInputs) { + const rawInput = input.nativeElement as HTMLInputElement; + expect(rawInput.willValidate).toBeTrue(); + expect(rawInput.validationMessage).toBe(""); + const {customError, valid} = rawInput.validity; + expect(customError).toBeFalse(); + expect(valid).toBeTrue(); + expect(rawInput.reportValidity()).toBeTrue(); + } + let rawNormalInput = normalInput.nativeElement as HTMLInputElement; + expect(rawNormalInput.willValidate).toBeTrue(); + expect(rawNormalInput.validationMessage).toBe(""); + expect(rawNormalInput.validity.customError).toBeFalse(); + expect(rawNormalInput.validity.valid).toBeTrue(); + expect(rawNormalInput.reportValidity()).toBeTrue(); + + const customMessage = "my custom validity error message"; + fixture.componentInstance.validity.next(customMessage); + fixture.detectChanges(); + + for (const input of customInputs) { + const rawInput = input.nativeElement as HTMLInputElement; + expect(rawInput.willValidate).toBeTrue(); + expect(rawInput.validationMessage).toBe(customMessage); + const {customError, valid} = rawInput.validity; + expect(customError).toBeTrue(); + expect(valid).toBeFalse(); + expect(rawInput.reportValidity()).toBeFalse(); + } + + rawNormalInput = normalInput.nativeElement as HTMLInputElement; + expect(rawNormalInput.willValidate).toBeTrue(); + expect(rawNormalInput.validationMessage).toBe(""); + expect(rawNormalInput.validity.customError).toBeFalse(); + expect(rawNormalInput.validity.valid).toBeTrue(); + expect(rawNormalInput.reportValidity()).toBeTrue(); + + fixture.componentInstance.validity.next(""); + fixture.detectChanges(); + + for (const input of customInputs) { + const rawInput = input.nativeElement as HTMLInputElement; + expect(rawInput.willValidate).toBeTrue(); + expect(rawInput.validationMessage).toBe(""); + const {customError, valid} = rawInput.validity; + expect(customError).toBeFalse(); + expect(valid).toBeTrue(); + expect(rawInput.reportValidity()).toBeTrue(); + } + rawNormalInput = normalInput.nativeElement as HTMLInputElement; + expect(rawNormalInput.willValidate).toBeTrue(); + expect(rawNormalInput.validationMessage).toBe(""); + expect(rawNormalInput.validity.customError).toBeFalse(); + expect(rawNormalInput.validity.valid).toBeTrue(); + expect(rawNormalInput.reportValidity()).toBeTrue(); + }); + + it("clears validity on input", () => { + fixture.componentInstance.validity.next("invalid"); + + for (const input of customInputs) { + const rawInput = input.nativeElement as HTMLInputElement; + expect(rawInput.validity.valid).toBeFalse(); + rawInput.dispatchEvent(new InputEvent("input", {data: "some text"})); + expect(rawInput.validity.valid).toBeTrue(); + } + }); }); diff --git a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts index c5dcae7deb..d11f380124 100644 --- a/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts +++ b/experimental/traffic-portal/src/app/shared/validation/customvalidity.directive.ts @@ -39,20 +39,14 @@ export class CustomvalidityDirective implements AfterViewInit, OnDestroy { /** Initializes the validity state of the element. */ public ngAfterViewInit(): void { - if (!this.element.nativeElement) { - console.warn("Use of DOM directive in non-DOM context!"); - return; - } - this.subscription = this.customvalidity.subscribe( s => { if (s) { this.element.nativeElement.setCustomValidity(s); this.element.nativeElement.reportValidity(); + } else { + this.element.nativeElement.setCustomValidity(""); } - }, - e => { - console.error(e); } ); this.element.nativeElement.addEventListener("input", () => this.element.nativeElement.setCustomValidity("")); From 8c39d7efab36268c4d27e7c479fd401edb9b5498 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 16:15:10 -0700 Subject: [PATCH 24/50] Expand test coverage of tp-header component (to 100%) Also made the header's `logout` method asynchronous for ease of use. --- .../tp-header/tp-header.component.spec.ts | 22 +++++++++++++++++-- .../shared/tp-header/tp-header.component.ts | 14 +++++------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts index 36954b3102..689d6eb546 100644 --- a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.spec.ts @@ -15,6 +15,7 @@ import { HttpClientModule } from "@angular/common/http"; import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; +import { UserService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; @@ -23,17 +24,18 @@ import { TpHeaderComponent } from "./tp-header.component"; describe("TpHeaderComponent", () => { let component: TpHeaderComponent; let fixture: ComponentFixture; + let logOutSpy: jasmine.Spy; beforeEach(waitForAsync(() => { const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); + logOutSpy = mockCurrentUserService.logout; TestBed.configureTestingModule({ declarations: [ TpHeaderComponent ], imports: [ APITestingModule, HttpClientModule, RouterTestingModule ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }, ] - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { @@ -46,6 +48,22 @@ describe("TpHeaderComponent", () => { expect(component).toBeTruthy(); }); + it("logs the user out", async () => { + expect(logOutSpy).not.toHaveBeenCalled(); + await component.logout(); + expect(logOutSpy).toHaveBeenCalled(); + }); + + it("clears front-end user data even if server-side logout fails", async () => { + const userService = TestBed.inject(UserService); + const userSpy = spyOn(userService, "logout"); + userSpy.and.returnValue(new Promise(r=>r(null))); + expect(userSpy).not.toHaveBeenCalled(); + await component.logout(); + expect(userSpy).toHaveBeenCalled(); + expect(logOutSpy).toHaveBeenCalled(); + }); + afterAll(() => { try{ TestBed.resetTestingModule(); diff --git a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts index e3c62bf2d7..19ccfdc949 100644 --- a/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts +++ b/experimental/traffic-portal/src/app/shared/tp-header/tp-header.component.ts @@ -51,14 +51,10 @@ export class TpHeaderComponent implements OnInit { * Handles when the user clicks the "Logout" button by using the API to * invalidate their session before redirecting them to the login page. */ - public logout(): void { - this.api.logout().then( - r => { - if (!r) { - console.warn("Failed to log out - clearing user data anyway!"); - } - this.auth.logout(); - } - ); + public async logout(): Promise { + if (!(await this.api.logout())) { + console.warn("Failed to log out - clearing user data anyway!"); + } + this.auth.logout(); } } From 9e37b87bdfe8421b09d737421f510b71edffb0e4 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 17:04:57 -0700 Subject: [PATCH 25/50] Expand test coverage of SSH Cell-Renderer component (to 100%) --- .../ssh-cell-renderer.component.spec.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts index fda89b5a26..8913b3009e 100644 --- a/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/table-components/ssh-cell-renderer/ssh-cell-renderer.component.spec.ts @@ -12,7 +12,7 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { waitForAsync, type ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; import type { ICellRendererParams } from "ag-grid-community"; @@ -25,14 +25,17 @@ describe("SshCellRendererComponent", () => { let fixture: ComponentFixture; beforeEach(waitForAsync(() => { - const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); - mockCurrentUserService.updateCurrentUser.and.returnValue(new Promise(r => r(false))); + const mockCurrentUserService = jasmine.createSpyObj( + ["updateCurrentUser", "login", "logout"], + {currentUser: {username: "test-admin"}} + ); + mockCurrentUserService.updateCurrentUser.and.returnValue(new Promise(r => r(true))); + TestBed.configureTestingModule({ declarations: [ SSHCellRendererComponent ], imports: [HttpClientModule, RouterTestingModule], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService} ] - }) - .compileComponents(); + }).compileComponents(); })); beforeEach(() => { From f07f06f2e2570211d568c7e526a9a350e7460798 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 20 Jan 2022 17:08:13 -0700 Subject: [PATCH 26/50] Use a type-aware linting rule for disallowing duplicate imports --- experimental/traffic-portal/.eslintrc.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/experimental/traffic-portal/.eslintrc.json b/experimental/traffic-portal/.eslintrc.json index fe345f549f..53a020112b 100644 --- a/experimental/traffic-portal/.eslintrc.json +++ b/experimental/traffic-portal/.eslintrc.json @@ -80,6 +80,7 @@ ], "@typescript-eslint/consistent-type-assertions": "error", "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/consistent-type-imports": "warn", "@typescript-eslint/dot-notation": "error", "@typescript-eslint/explicit-function-return-type": "error", "@typescript-eslint/explicit-member-accessibility": [ @@ -161,6 +162,7 @@ "allowWithDecorator": true } ], + "@typescript-eslint/no-duplicate-imports": ["error"], "@typescript-eslint/no-dynamic-delete": "error", "@typescript-eslint/no-floating-promises": "off", "@typescript-eslint/no-inferrable-types": [ @@ -296,7 +298,7 @@ ], "no-bitwise": "off", "no-duplicate-case": "error", - "no-duplicate-imports": "error", + "no-duplicate-imports": "off", "no-else-return": "error", "no-empty": "error", "no-extra-bind": "error", From 2764641ca4c98700b2ebc51d0521a6a95384dd0a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 03:08:22 -0700 Subject: [PATCH 27/50] Expand test coverage of the Generic Table component --- .../server-details.component.spec.ts | 1 + .../servers-table/servers-table.component.ts | 8 +- .../generic-table.component.spec.ts | 298 +++++++++++++++++- .../generic-table/generic-table.component.ts | 46 +-- 4 files changed, 306 insertions(+), 47 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index 7b46dc254d..e167c970e1 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -38,6 +38,7 @@ describe("ServerDetailsComponent", () => { fixture = TestBed.createComponent(ServerDetailsComponent); component = fixture.componentInstance; component.server = {...defaultServer}; + component.server.interfaces = []; fixture.detectChanges(); }); diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts index 1fbd75a4a2..8d10d220e2 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts @@ -12,15 +12,15 @@ * limitations under the License. */ -import { Component, OnInit } from "@angular/core"; +import { Component, type OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; -import { ITooltipParams } from "ag-grid-community"; +import type { ITooltipParams } from "ag-grid-community"; import { BehaviorSubject } from "rxjs"; import { ServerService } from "src/app/api"; -import { Interface, Server } from "src/app/models/server"; -import { ContextMenuActionEvent, ContextMenuItem } from "src/app/shared/generic-table/generic-table.component"; +import type { Interface, Server } from "src/app/models"; +import type { ContextMenuActionEvent, ContextMenuItem } from "src/app/shared/generic-table/generic-table.component"; import { IPV4, serviceInterface } from "src/app/utils"; /** diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts index d464da331f..6f9f979736 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.spec.ts @@ -12,18 +12,131 @@ * limitations under the License. */ -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; import { AgGridModule } from "ag-grid-angular"; -import type { RowNode } from "ag-grid-community"; +import type { CellContextMenuEvent, ColDef, GridApi, RowNode, ValueGetterParams } from "ag-grid-community"; +import { BehaviorSubject } from "rxjs"; -import { GenericTableComponent } from "./generic-table.component"; +import { type ContextMenuAction, GenericTableComponent } from "./generic-table.component"; + +/** + * TestData is the type of a row of data for the generic table component tests. + */ +interface TestData { + bigIntProp: bigint; + boolProp: boolean; + complexProp: Record; + id: number; + lastUpdated: Date; + name: string; + propWithNoCol: unknown; + regExpProp: RegExp; + urlProp: URL; + weirdProp: unknown; +} + +/** + * Generates some testing data for the generic table. This avoids reference + * re-use and pollution. + * + * @returns Some testing data. + */ +function testingData(): Array { + return [ + { + bigIntProp: BigInt(2), + boolProp: true, + complexProp: { + properties: "and values", + some: "other" + }, + id: 1, + lastUpdated: new Date(), + name: "test item", + propWithNoCol: "this property is never rendered because there is no column definition for it", + regExpProp: /\.{1000}/g, + urlProp: new URL("https://localhost"), + weirdProp: null + }, + { + bigIntProp: BigInt(4), + boolProp: false, + complexProp: { + properties: "and values", + some: "other" + }, + id: 2, + lastUpdated: new Date(), + name: "test item 2", + propWithNoCol: "see above", + regExpProp: /^$/, + urlProp: new URL("http://apache.org/path?query#frag"), + weirdProp: Symbol() + } + ]; +} + +/** + * Generates column definitions for data generated by {@link testingData}. This + * avoids reference re-use and pollution. + * + * @returns Some testing columns. + */ +function testingCols(): Array { + return [ + { + field: "boolProp", + headerName: "Boolean Property", + hide: false + }, + { + field: "complexProp", + headerName: "Complex Property", + valueGetter: (p: ValueGetterParams): string => JSON.stringify(p.data.complexProp) + }, + { + field: "id", + filter: "agNumberColumnFilter", + headerName: "ID", + hide: false + }, + { + field: "lastUpdated", + filter: "agDateColumnFilter", + headerName: "Last Updated", + hide: true + }, + { + field: "name", + headerName: "Name", + hide: false + }, + { + field: "regExpProp", + headerName: "Regular Expression Property", + hide: false + }, + { + field: "urlProp", + headerName: "URL Property", + hide: false + }, + { + field: "weirdProp", + headerName: "Weird Property", + valueGetter: "weird", + } + ]; +} describe("GenericTableComponent", () => { let component: GenericTableComponent; let fixture: ComponentFixture>; + let fuzzySearch: BehaviorSubject; beforeEach(async () => { + fuzzySearch = new BehaviorSubject(""); await TestBed.configureTestingModule({ declarations: [ GenericTableComponent, @@ -37,6 +150,15 @@ describe("GenericTableComponent", () => { fixture = TestBed.createComponent>(GenericTableComponent); component = fixture.componentInstance; + component.fuzzySearch = fuzzySearch; + component.contextMenuItems = [ + { + action: "test", + name: "Test" + } + ]; + component.data = testingData(); + component.cols = testingCols(); fixture.detectChanges(); }); @@ -65,4 +187,174 @@ describe("GenericTableComponent", () => { expect(()=>component.emitContextMenuAction("anything", true, new MouseEvent("click"))).toThrow(); expect(()=>component.emitContextMenuAction("anything", undefined, new MouseEvent("click"))).toThrow(); }); + + it("opens the context menu on contextmenu events and closes when the user clicks outside of it or on a menu item", () => { + expect(component.data.length).toBeGreaterThan(1); + expect(component.showContextMenu).toBeFalse(); + component.onCellContextMenu({} as CellContextMenuEvent); + expect(component.showContextMenu).toBeFalse(); + + const oldItems = [...component.contextMenuItems]; + component.contextMenuItems = []; + fixture.detectChanges(); + component.onCellContextMenu({ + event: new MouseEvent("contextmenu"), + } as unknown as CellContextMenuEvent); + expect(component.showContextMenu).toBeFalse(); + + component.toggleMenu(new Event("click")); + expect(component.showContextMenu).toBeFalse(); + + component.contextMenuItems = oldItems; + fixture.detectChanges(); + component.onCellContextMenu({ + event: new MouseEvent("contextmenu") + } as unknown as CellContextMenuEvent); + expect(component.showContextMenu).toBeTrue(); + + component.clickOutside(new MouseEvent("click")); + expect(component.showContextMenu).toBeFalse(); + + component.onCellContextMenu({ + event: new MouseEvent("contextmenu") + } as unknown as CellContextMenuEvent); + expect(component.showContextMenu).toBeTrue(); + component.selected = component.data[0]; + component.emitContextMenuAction("some action", false, new MouseEvent("click")); + expect(component.showContextMenu).toBeFalse(); + }); + + it("(de)selects all rows", async () => { + await fixture.whenStable(); + component.selectAll(); + expect(component.selectionCount).toBe(component.data.length); + for (let i = 0; i < component.selectionCount; ++i) { + expect(component.fullSelection[i]).toEqual(component.data[i]); + } + component.selectAll(true); + expect(component.selectionCount).toBe(0); + expect(component.fullSelection.length).toBe(0); + }); + + it("exposes its columns", async () => { + await fixture.whenStable(); + expect( + component.columns.map(c=>c.getDefinition()) + ).toEqual( + component.cols.map(c=>({... component.gridOptions.defaultColDef, ...c})) + ); + }); + + it("knows if it should filter", () => { + expect(component.shouldFilter()).toBeTrue(); + component.fuzzySearch = undefined; + expect(component.shouldFilter()).toBeFalse(); + }); + + it("fuzzy filters", async () => { + await fixture.whenStable(); + fuzzySearch.next(""); + component.toggleVisibility("lastUpdated"); + const api = component.gridOptions.api; + if (!api) { + return fail("api not set after rendering is complete"); + } + + const rows = api.getRenderedNodes(); + for (const row of rows) { + expect(component.filter(row)).toBeTrue(); + } + + fuzzySearch.next("test item 2"); + for (const row of rows) { + expect(component.filter(row)).toBe(row.data.name === "test item 2"); + } + + const now = new Date(); + const val = `${now.getFullYear()}`; + fuzzySearch.next(val); + for (const row of rows) { + expect(component.filter(row)).toBeTrue(); + } + + fuzzySearch.next("this property is never rendered because there is no column definition for it"); + for (const row of rows) { + expect(component.filter(row)).toBeFalse(); + } + + component.fuzzySearch = undefined; + for (const row of rows) { + expect(component.filter(row)).toBeTrue(); + } + }); + + it("doesn't panic when columns are requested before ag-grid loads", () => { + expect(()=>component.columns).not.toThrow(); + }); + + it("toggles column visibility", async () => { + await fixture.whenStable(); + for (const col of component.columns) { + if (!col.isVisible()) { + component.toggleVisibility(col.getId()); + } + } + + for (const col of component.columns) { + expect(col.isVisible()).toBeTrue(); + component.toggleVisibility(col.getId()); + expect(col.isVisible()).toBeFalse(); + } + + component.toggleVisibility("not a real column ID"); + for (const col of component.columns) { + expect(col.isVisible()).toBeFalse(); + component.toggleVisibility(col.getId()); + } + component.toggleVisibility("not a real column ID"); + for (const col of component.columns) { + expect(col.isVisible()).toBeTrue(); + } + }); + + it("prevents default on Events", () => { + const e = new Event("doesn't matter", {cancelable: true}); + expect(e.defaultPrevented).toBeFalse(); + component.preventDefault(e); + expect(e.defaultPrevented).toBeTrue(); + }); + + it("triggers a download of CSV data properly", async () => { + component.selected = {}; + await fixture.whenStable(); + const spy = spyOn(component.gridOptions.api as GridApi, "exportDataAsCsv"); + component.download(); + expect(spy).toHaveBeenCalledWith({onlySelected: false}); + component.context = "test-context"; + component.download(); + expect(spy).toHaveBeenCalledWith({fileName: "test-context.csv", onlySelected: false}); + }); + + it("checks if a menu action is disabled", async () => { + let action: ContextMenuAction = {action: "do something", name: "Do Something"}; + expect(component.isDisabled(action)).toBeTrue(); + component.selected = {}; + await fixture.whenStable(); + expect(component.isDisabled(action)).toBeFalse(); + + action.disabled = (): boolean => true; + expect(component.isDisabled(action)).toBeTrue(); + + action.disabled = (): boolean => false; + expect(component.isDisabled(action)).toBeFalse(); + + action = { + ...action, + multiRow: true + }; + expect(component.isDisabled(action)).toBeFalse(); + + action.disabled = (): boolean => true; + expect(component.isDisabled(action)).toBeTrue(); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts index 27591248ea..2b9f40db45 100644 --- a/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts +++ b/experimental/traffic-portal/src/app/shared/generic-table/generic-table.component.ts @@ -38,7 +38,7 @@ import type { ITooltipParams, RowNode } from "ag-grid-community"; -import { BehaviorSubject, Subscription } from "rxjs"; +import type { BehaviorSubject, Subscription } from "rxjs"; import { fuzzyScore } from "src/app/utils"; @@ -93,7 +93,7 @@ interface ContextMenuMultiAction { } /** ContextMenuActions represent an action that can be taken in a context menu. */ -type ContextMenuAction = ContextMenuSingleAction | ContextMenuMultiAction; +export type ContextMenuAction = ContextMenuSingleAction | ContextMenuMultiAction; /** ContextMenuLinks represent a link within a context menu. They aren't templated, so currently have limited uses. */ interface ContextMenuLink { @@ -152,7 +152,7 @@ export class GenericTableComponent implements OnInit, OnDestroy { } /** Holds a reference to the context menu which is used to calculate its size. */ - @ViewChild("contextmenu") public contextmenu: ElementRef | null = null; + @ViewChild("contextmenu") public contextmenu!: ElementRef; /** * This event handler listens to click events anywhere, since if you're clicking outside @@ -176,7 +176,7 @@ export class GenericTableComponent implements OnInit, OnDestroy { /** Options to pass into the AG-Grid object. */ public gridOptions: GridOptions; /** Holds a reference to the AG-Grid API (once it has been initialized) */ - private gridAPI: GridApi | undefined; + private gridAPI!: GridApi; /** Holds a reference to the AG-Grid Column API (once it has been initialized) */ public columnAPI: ColumnApi | undefined; @@ -209,9 +209,6 @@ export class GenericTableComponent implements OnInit, OnDestroy { * The number of currently selected rows (-1 if the grid is not initialized). */ public get selectionCount(): number { - if (!this.gridAPI) { - return -1; - } return this.gridAPI.getSelectedRows().length; } @@ -219,9 +216,6 @@ export class GenericTableComponent implements OnInit, OnDestroy { * All currently selected rows. */ public get fullSelection(): Array { - if (!this.gridAPI) { - return []; - } return this.gridAPI.getSelectedRows(); } @@ -322,23 +316,6 @@ export class GenericTableComponent implements OnInit, OnDestroy { } catch (e) { console.error("Failure to load stored sort state:", e); } - - // try { - // $scope.quickSearch = localStorage.getItem(tableName + "_quick_search"); - // $scope.gridOptions.api.setQuickFilter($scope.quickSearch); - // } catch (e) { - // console.error("Failure to load stored quick search:", e); - // } - - // try { - // const ps = localStorage.getItem(tableName + "_page_size"); - // if (ps && ps > 0) { - // $scope.pageSize = Number(ps); - // $scope.gridOptions.api.paginationSetPageSize($scope.pageSize); - // } - // } catch (e) { - // console.error("Failure to load stored page size:", e); - // } } /** When sorting changes, stores the sorting state if a context was provided. */ @@ -503,7 +480,6 @@ export class GenericTableComponent implements OnInit, OnDestroy { this.menuStyle.bottom = "unset"; this.menuStyle.right = "unset"; const boundingRect = this.contextmenu.nativeElement.getBoundingClientRect(); - // const boundingRect = (document.getElementById("context-menu") as HTMLMenuElement).getBoundingClientRect(); if (boundingRect.bottom > window.innerHeight){ this.menuStyle.bottom = `${window.innerHeight - params.event.clientY}px`; @@ -565,11 +541,6 @@ export class GenericTableComponent implements OnInit, OnDestroy { * Downloads the table data as a CSV file. */ public download(): void { - if (!this.gridAPI) { - console.error("Cannot download: no grid API handle"); - return; - } - const params: CsvExportParams = { onlySelected: this.gridAPI.getSelectedNodes().length > 0, }; @@ -587,15 +558,10 @@ export class GenericTableComponent implements OnInit, OnDestroy { * @param de If given and true, de-selects all rows. Otherwise all rows will be selected. */ public selectAll(de?: boolean): void { - if (!this.gridAPI) { - console.error("Cannot (de-)select: no grid API handle"); - return; - } - if (de) { this.gridAPI.deselectAll(); - } else { - this.gridAPI.selectAllFiltered(); + return; } + this.gridAPI.selectAllFiltered(); } } From 7fcebe60c1ebecd2f49429acd5c2a3be12b7d45c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 08:48:02 -0700 Subject: [PATCH 28/50] Expand test coverage of the Current User service also simplified some asynchronous logic, and removed an unused, unnecessary method --- .../src/app/api/testing/user.service.ts | 16 ++- .../currentUser/current-user.service.spec.ts | 109 +++++++++++++----- .../currentUser/current-user.service.ts | 29 ++--- 3 files changed, 102 insertions(+), 52 deletions(-) diff --git a/experimental/traffic-portal/src/app/api/testing/user.service.ts b/experimental/traffic-portal/src/app/api/testing/user.service.ts index cc6e1d354e..6ade23e84c 100644 --- a/experimental/traffic-portal/src/app/api/testing/user.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/user.service.ts @@ -94,19 +94,25 @@ export class UserService { * @returns The entire HTTP response on success, or `null` on failure. */ public async login(uOrT: string, p?: string): Promise | null> { - if (p !== undefined && (uOrT !== "test-admin" || p !== this.testAdminPassword)) { - throw new Error("Invalid username or password."); + if (p !== undefined) { + if (uOrT !== this.testAdminUsername || p !== this.testAdminPassword) { + console.error("Invalid username or password."); + return null; + } + return new HttpResponse({body: {alerts: [{level: "success", text: "Successfully logged in."}]}, status: 200}); } const email = this.tokens.get(uOrT); if (email === undefined) { - throw new Error(`token '${uOrT}' did not match any set token for any user`); + console.error(`token '${uOrT}' did not match any set token for any user`); + return null; } const user = this.users.find(u=>u.email === email); if (!user) { - throw new Error(`email '${email}' associated with token '${uOrT}' did not belong to any User`); + console.error(`email '${email}' associated with token '${uOrT}' did not belong to any User`); + return null; } this.tokens.delete(uOrT); - return new HttpResponse({body: {alerts: [{level: "success", text: "Successfully logged in."}]}}); + return new HttpResponse({body: {alerts: [{level: "success", text: "Successfully logged in."}]}, status: 200}); } /** diff --git a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts index 66f203731a..e201e98bcb 100644 --- a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts +++ b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.spec.ts @@ -11,17 +11,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { TestBed } from "@angular/core/testing"; +import { Location } from "@angular/common"; +import { fakeAsync, TestBed, tick } from "@angular/core/testing"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; +import { UserService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; import { LoginComponent } from "src/app/login/login.component"; -import { newCurrentUser, User } from "src/app/models"; +import { newCurrentUser, type User } from "src/app/models"; import { CurrentUserService } from "./current-user.service"; describe("CurrentUserService", () => { let service: CurrentUserService; + let router: Router; + let location: Location; beforeEach(() => { const mockAPIService = jasmine.createSpyObj(["updateCurrentUser", "getCurrentUser", "saveCurrentUser"]); @@ -38,6 +43,9 @@ describe("CurrentUserService", () => { ] }); service = TestBed.inject(CurrentUserService); + router = TestBed.inject(Router); + location = TestBed.inject(Location); + router.initialNavigation(); }); it("should be created", () => { @@ -111,41 +119,90 @@ describe("CurrentUserService", () => { ); const u = service.currentUser; - expect(u).not.toBeNull(); - if (u !== null) { - expect(u.addressLine1).toBeNull(); - expect(u.addressLine2).toBeNull(); - expect(u.city).toBeNull(); - expect(u.company).toBeNull(); - expect(u.country).toBeNull(); - expect(u.email).toBe("different email"); - expect(u.fullName).toBe("different full name"); - expect(u.gid).toBeNull(); - expect(u.id).toEqual(9001); - expect(u.lastUpdated).toEqual(new Date(upd.getTime()+1000)); - expect(u.localUser).toBeFalse(); - expect(u.newUser).toBeTrue(); - expect(u.phoneNumber).toBeNull(); - expect(u.postalCode).toBeNull(); - expect(u.publicSshKey).toBeNull(); - expect(u.role).toEqual(2); - expect(u.roleName).toBe("different role name"); - expect(u.stateOrProvince).toBeNull(); - expect(u.tenant).toBe("different tenant"); - expect(u.tenantId).toEqual(1); - expect(u.uid).toBeNull(); - expect(u.username).toBe("test"); + if (u === null) { + return fail("user is null after being set"); } + expect(u).toEqual({ + addressLine1: null, + addressLine2: null, + city: null, + company: null, + country: null, + email: "different email", + fullName: "different full name", + gid: null, + id: 9001, + lastUpdated: new Date(upd.getTime()+1000), + localUser: false, + newUser: true, + phoneNumber: null, + postalCode: null, + publicSshKey: null, + role: 2, + roleName: "different role name", + stateOrProvince: null, + tenant: "different tenant", + tenantId: 1, + uid: null, + username: "test", + }); }); it("should update user permissions properly", () => { service.setUser(newCurrentUser(), new Set(["a different permission"])); + expect(service.hasPermission("a different permission")).toBeTrue(); service.logout(); + expect(service.hasPermission("a different permission")).toBeFalse(); service.setUser(newCurrentUser(), new Set(["a permission"])); expect(service.capabilities.has("a permission")).toBeTrue(); expect(service.hasPermission("a permission")).toBeTrue(); expect(service.capabilities.has("a different permission")).toBeFalse(); expect(service.hasPermission("a different permission")).toBeFalse(); + service.setUser(newCurrentUser(), [{description: "", name: "a permission"}]); + expect(service.capabilities.has("a permission")).toBeTrue(); + expect(service.hasPermission("a permission")).toBeTrue(); + expect(service.capabilities.has("a different permission")).toBeFalse(); + expect(service.hasPermission("a different permission")).toBeFalse(); + }); + + it("fetches the current user when appropriate", async () => { + const spy = spyOn(service, "updateCurrentUser").and.returnValue(new Promise(r=>r(true))); + service.setUser(newCurrentUser(), []); + expect(await service.fetchCurrentUser()).toBeTrue(); + expect(spy).not.toHaveBeenCalled(); + + service.logout(); + expect(await service.fetchCurrentUser()).toBeTrue(); + expect(spy).toHaveBeenCalled(); }); + it("logs users in", async () => { + expect(await service.login("test-admin", "twelve12!")).toBeTrue(); + expect(await service.login("test-admin", "a misspelled password")).toBeFalse(); + expect(await service.login("there's no token that includes apostrophes")).toBeFalse(); + }); + + it("logs users out", fakeAsync(() => { + service.logout(); + tick(); + expect(location.path()).toBe("/login"); + expect(service.currentUser).toBeNull(); + + service.setUser(newCurrentUser(), new Set(["perm"])); + expect(service.currentUser).toBeTruthy(); + expect(service.hasPermission("perm")).toBeTrue(); + + service.logout(true); + tick(); + expect(location.path()).toBe(`/login?returnUrl=${encodeURIComponent("/core")}`); + expect(service.currentUser).toBeNull(); + expect(service.hasPermission("perm")).toBeFalse(); + })); + + it("submits a request to update the current user", () => { + const spy = spyOn(TestBed.inject(UserService), "updateCurrentUser"); + expect(spy).not.toHaveBeenCalled(); + service.saveCurrentUser(newCurrentUser()); + expect(spy).toHaveBeenCalled(); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts index 8f3260ba69..390ad67a2a 100644 --- a/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts +++ b/experimental/traffic-portal/src/app/shared/currentUser/current-user.service.ts @@ -30,7 +30,7 @@ export class CurrentUserService { /** Makes updateCurrentUser able to be called from multiple places without regard to order */ private updatingUserPromise: Promise | null = null; /** To allow downstream code to stay up to date with the current user */ - public userChanged: EventEmitter = new EventEmitter(); + public userChanged = new EventEmitter(); /** The currently authenticated user - or `null` if not authenticated. */ private user: CurrentUser | null = null; /** The Permissions afforded to the currently authenticated user. */ @@ -60,8 +60,8 @@ export class CurrentUserService { * @returns A promise containing the value indicating the success of the update */ public async fetchCurrentUser(): Promise { - if(this.currentUser !== null){ - return new Promise(resolve => resolve(true)); + if (this.currentUser !== null){ + return true; } return this.updateCurrentUser(); } @@ -111,14 +111,11 @@ export class CurrentUserService { * @returns An observable that emits whether or not login succeeded. */ public async login(uOrT: string, p?: string): Promise { - return this.api.login(uOrT, p).then( - async resp => { - if (resp && resp.status === 200) { - return this.updateCurrentUser(); - } - return false; - } - ); + const resp = await this.api.login(uOrT, p); + if (resp && resp.status === 200) { + return this.updateCurrentUser(); + } + return false; } /** @@ -161,16 +158,6 @@ export class CurrentUserService { queryParams.returnUrl = "/core"; } } - console.log("query params:", queryParams); this.router.navigate(["/login"], {queryParams}); } - - /** - * Requests a password reset for a user. - * - * @param email The email of the user for whom to reset a password. - */ - public async resetPassword(email: string): Promise { - await this.api.resetPassword(email); - } } From 03d4903d846c89ae8762d097dd480c9666d40f34 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 09:03:13 -0700 Subject: [PATCH 29/50] (Slightly) Expand test coverage of Line Chart directive Also collapse two overlapping checks into one --- .../app/shared/charts/linechart.directive.spec.ts | 7 ++++++- .../src/app/shared/charts/linechart.directive.ts | 14 +++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts index 004c8ce216..5e88b18514 100644 --- a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts +++ b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.spec.ts @@ -20,9 +20,10 @@ import { LinechartDirective } from "./linechart.directive"; describe("LinechartDirective", () => { let directive: LinechartDirective; - const dataSets = new BehaviorSubject|null>(null); + let dataSets: BehaviorSubject | null>; beforeEach(()=>{ + dataSets = new BehaviorSubject|null>(null); directive = new LinechartDirective(new ElementRef(document.createElement("canvas"))); directive.chartDataSets = dataSets; directive.ngAfterViewInit(); @@ -43,4 +44,8 @@ describe("LinechartDirective", () => { dataSets.next([{data: [{x: 1, y: 2}, {x: 2, y: 4}], label: "label"}, null]); dataSets.next(null); }); + + it("handles errors in the data stream", () => { + dataSets.error(new Error("some kind of problem with the server")); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts index c43c385972..2871b1e5a3 100644 --- a/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts +++ b/experimental/traffic-portal/src/app/shared/charts/linechart.directive.ts @@ -12,9 +12,9 @@ * limitations under the License. */ -import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from "@angular/core"; +import { type AfterViewInit, Directive, ElementRef, Input, type OnDestroy } from "@angular/core"; import { Chart } from "chart.js"; // TODO: use plotly instead for WebGL-capabale browsers? -import { from, Observable, Subscription } from "rxjs"; +import { from, type Observable, type Subscription } from "rxjs"; import type { DataSet } from "src/app/models/data"; @@ -54,22 +54,14 @@ export class LinechartDirective implements AfterViewInit, OnDestroy { /** Chart.js configuration options. */ private opts: Chart.ChartConfiguration = {}; - /** - * Constructor. - */ constructor(private readonly element: ElementRef) { } /** * Initializes the chart using the input data. */ public ngAfterViewInit(): void { - if (this.element.nativeElement === null) { - console.warn("Use of DOM directive in non-DOM context!"); - return; - } - if (!(this.element.nativeElement instanceof HTMLCanvasElement)) { - throw new Error("[linechart] Directive can only be used on a canvas!"); + throw new Error("[linechart] Directive can only be used on a canvas in a context where DOM access is allowed"); } const ctx = this.element.nativeElement.getContext("2d", {alpha: false}); From 561e97d2d399743279a0a0eb104e3a35570298ba Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 10:21:32 -0700 Subject: [PATCH 30/50] Expand test coverage of the Reset Password Dialog component (to 100%) --- .../reset-password-dialog.component.spec.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts b/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts index 73244882ff..1fe9746e2f 100644 --- a/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts +++ b/experimental/traffic-portal/src/app/login/reset-password-dialog/reset-password-dialog.component.spec.ts @@ -12,9 +12,10 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed } from "@angular/core/testing"; import { MatDialogRef } from "@angular/material/dialog"; +import { UserService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; import { ResetPasswordDialogComponent } from "./reset-password-dialog.component"; @@ -50,4 +51,11 @@ describe("ResetPasswordDialogComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("submits a password reset request", () => { + const spy = spyOn(TestBed.inject(UserService), "resetPassword"); + expect(spy).not.toHaveBeenCalled(); + component.submit(new SubmitEvent("submit")); + expect(spy).toHaveBeenCalled(); + }); }); From 1187028f96f4884f225ad35991c3f3fe1c1adaa7 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 11:56:52 -0700 Subject: [PATCH 31/50] Expand test coverage of the Login component (to 100%) --- .../src/app/login/login.component.spec.ts | 103 +++++++++++++++--- 1 file changed, 85 insertions(+), 18 deletions(-) diff --git a/experimental/traffic-portal/src/app/login/login.component.spec.ts b/experimental/traffic-portal/src/app/login/login.component.spec.ts index ca89735d42..f4638b03c8 100644 --- a/experimental/traffic-portal/src/app/login/login.component.spec.ts +++ b/experimental/traffic-portal/src/app/login/login.component.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/unbound-method */ /* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -12,9 +13,10 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { MatDialogModule } from "@angular/material/dialog"; +import { MatDialog, MatDialogModule } from "@angular/material/dialog"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; @@ -24,9 +26,28 @@ import { LoginComponent } from "./login.component"; describe("LoginComponent", () => { let component: LoginComponent; let fixture: ComponentFixture; + let mockCurrentUserService: jasmine.SpyObj; + let dialogSpy: jasmine.Spy; + let router: Router; + + beforeEach(() => { + mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); + mockCurrentUserService.login.and.callFake(async (u, p)=>u === "test-admin" && p === "twelve12!"); + mockCurrentUserService.login.withArgs("tok").and.returnValue(new Promise(r=>r(true))); + mockCurrentUserService.login.withArgs("badToken").and.callFake( + async () => { + throw new Error("bad token"); + } + ); + mockCurrentUserService.login.withArgs("server error", "twelve12!").and.callFake( + async () => { + throw new Error("some kind of server error occurred"); + } + ); + + const dialog = jasmine.createSpyObj(["open"]); + dialogSpy = dialog.open; - beforeEach(waitForAsync(() => { - const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ declarations: [ LoginComponent ], imports: [ @@ -34,20 +55,27 @@ describe("LoginComponent", () => { MatDialogModule, HttpClientModule, ReactiveFormsModule, - RouterTestingModule, + RouterTestingModule.withRoutes([ + {component: LoginComponent, path: "login"}, + // This obviously isn't how this actually works, but we + // don't care about testing anything on that page, so this + // will do fine. + {component: LoginComponent, path: "core/me"} + ]), ], - providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }] - }) - .compileComponents(); - })); - - beforeEach(async () => { + providers: [ + { provide: CurrentUserService, useValue: mockCurrentUserService }, + { provide: MatDialog, useValue: dialog} + ] + }).compileComponents(); fixture = TestBed.createComponent(LoginComponent); component = fixture.componentInstance; + router = TestBed.inject(Router); + router.initialNavigation(); fixture.detectChanges(); }); - it("should exist", async () => { + it("should exist", () => { try{ expect(component).toBeTruthy(); } catch (e) { @@ -55,11 +83,50 @@ describe("LoginComponent", () => { } }); - afterAll(async () => { - try{ - TestBed.resetTestingModule(); - } catch (e) { - console.error("error in LoginComponent afterAll:", e); - } + it("submits a login request", () => { + expect(mockCurrentUserService.login).not.toHaveBeenCalled(); + component.submitLogin(); + expect(mockCurrentUserService.login).toHaveBeenCalled(); + component.u.setValue("test-admin"); + component.p.setValue("twelve12!"); + component.submitLogin(); + expect(mockCurrentUserService.login).toHaveBeenCalledTimes(2); + component.u.setValue("server error"); + component.submitLogin(); + expect(mockCurrentUserService.login).toHaveBeenCalledTimes(3); }); + + it("opens the password reset dialog", () => { + expect(dialogSpy).not.toHaveBeenCalled(); + component.resetPassword(); + expect(dialogSpy).toHaveBeenCalled(); + }); + + it("redirects to the user edit page on token login", fakeAsync(() => { + router.navigate(["/login"], {queryParams: {token: "tok"}}); + tick(); + expect(router.url).toBe("/login?token=tok"); + expect(mockCurrentUserService.login).not.toHaveBeenCalled(); + + // need to re-run this to pick up the token; simulates component + // initialization. + component.ngOnInit(); + tick(); + expect(mockCurrentUserService.login).toHaveBeenCalled(); + expect(router.navigated).toBeTrue(); + const [path, query] = router.url.split("?"); + expect(path).toBe("/core/me"); + const kvps = query.split("&"); + expect(kvps.length).toBe(2); + expect(kvps).toContain("edit=true"); + expect(kvps).toContain("updatePassword=true"); + + router.navigate(["/login"], {queryParams: {token: "badToken"}}); + tick(); + expect(router.url).toBe("/login?token=badToken"); + component.ngOnInit(); + tick(); + expect(mockCurrentUserService.login).toHaveBeenCalledTimes(2); + expect(router.url).toBe("/login?token=badToken"); + })); }); From cc7a0c3e52c4fd6917c730950a08dec728ad14b2 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 12:23:59 -0700 Subject: [PATCH 32/50] Expand test coverage of the Authenticated Guard service (to 100%) --- .../app/guards/authenticated-guard.service.ts | 2 +- ...rd.spec.ts => authenticated.guard.spec.ts} | 23 +++++++++++++++---- .../app/shared/alert/alert.component.spec.ts | 4 ++-- 3 files changed, 21 insertions(+), 8 deletions(-) rename experimental/traffic-portal/src/app/guards/{authentication.guard.spec.ts => authenticated.guard.spec.ts} (63%) diff --git a/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts b/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts index a966c87fec..c985a4319f 100644 --- a/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts +++ b/experimental/traffic-portal/src/app/guards/authenticated-guard.service.ts @@ -12,7 +12,7 @@ * limitations under the License. */ import { Injectable } from "@angular/core"; -import { CanActivate, CanLoad } from "@angular/router"; +import type { CanActivate, CanLoad } from "@angular/router"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; diff --git a/experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts b/experimental/traffic-portal/src/app/guards/authenticated.guard.spec.ts similarity index 63% rename from experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts rename to experimental/traffic-portal/src/app/guards/authenticated.guard.spec.ts index 8d627f98fe..5a85a97493 100644 --- a/experimental/traffic-portal/src/app/guards/authentication.guard.spec.ts +++ b/experimental/traffic-portal/src/app/guards/authenticated.guard.spec.ts @@ -17,24 +17,37 @@ import { CurrentUserService } from "src/app/shared/currentUser/current-user.serv import { AuthenticatedGuard } from "./authenticated-guard.service"; -describe("AuthenticationGuard", () => { +describe("AuthenticatedGuard", () => { let guard: AuthenticatedGuard; + let mockCurrentUserService: jasmine.SpyObj; + let authPasses: boolean; beforeEach(() => { - const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); + mockCurrentUserService = jasmine.createSpyObj(["fetchCurrentUser"]); + mockCurrentUserService.fetchCurrentUser.and.callFake(async ()=>authPasses); TestBed.configureTestingModule({ providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }, AuthenticatedGuard ] }); - }); - - beforeEach(() => { + authPasses = true; guard = TestBed.inject(AuthenticatedGuard); }); it("should be created", () => { expect(guard).toBeTruthy(); }); + + it("checks activation criteria", async () => { + expect(await guard.canActivate()).toBeTrue(); + authPasses = false; + expect(await guard.canActivate()).toBeFalse(); + }); + + it("checks load criteria", async () => { + expect(await guard.canLoad()).toBeTrue(); + authPasses = false; + expect(await guard.canLoad()).toBeFalse(); + }); }); diff --git a/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts b/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts index 2b8a9777be..89374edce0 100644 --- a/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts +++ b/experimental/traffic-portal/src/app/shared/alert/alert.component.spec.ts @@ -11,9 +11,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { HarnessLoader } from "@angular/cdk/testing"; +import type { HarnessLoader } from "@angular/cdk/testing"; import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; -import { TestBed, ComponentFixture } from "@angular/core/testing"; +import { TestBed, type ComponentFixture } from "@angular/core/testing"; import { MatSnackBarModule } from "@angular/material/snack-bar"; import { MatSnackBarHarness} from "@angular/material/snack-bar/testing"; import { NoopAnimationsModule } from "@angular/platform-browser/animations"; From 8617c0fd9fc8e00000286c9af8f0467cfe2b369d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 13:26:11 -0700 Subject: [PATCH 33/50] Expand test coverage of the Update Status component This also helped me fix a bug - the component was unable to successfully update any server's or servers' status(es) because it was passing a Status ID instead of a Name. Also made the submit handler async because that's much easier to deal with. --- .../src/app/api/testing/server.service.ts | 4 +- .../update-status.component.spec.ts | 61 ++++++++++++++++--- .../update-status/update-status.component.ts | 24 ++++---- 3 files changed, 67 insertions(+), 22 deletions(-) diff --git a/experimental/traffic-portal/src/app/api/testing/server.service.ts b/experimental/traffic-portal/src/app/api/testing/server.service.ts index 63bddea94b..e5cc127d0a 100644 --- a/experimental/traffic-portal/src/app/api/testing/server.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/server.service.ts @@ -242,12 +242,12 @@ export class ServerService { id = server.id; } - const srv = this.servers.filter(s=>s.id===id)[0]; + const srv = this.servers.find(s=>s.id===id); if (!srv) { throw new Error(`no such Server: #${id}`); } - const status = this.statuses.filter(s=>s.name===statusName)[0]; + const status = this.statuses.find(s=>s.name===statusName); if (!status) { throw new Error(`no such Status: '${statusName}'`); } diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts index f3336ee6d8..bd14d52c4b 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.spec.ts @@ -12,8 +12,9 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed } from "@angular/core/testing"; +import { ServerService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; @@ -23,15 +24,11 @@ describe("UpdateStatusComponent", () => { let component: UpdateStatusComponent; let fixture: ComponentFixture; - beforeEach(async () => { - await TestBed.configureTestingModule({ + beforeEach(() => { + TestBed.configureTestingModule({ declarations: [ UpdateStatusComponent ], imports: [ HttpClientModule, APITestingModule ], - }) - .compileComponents(); - }); - - beforeEach(() => { + }).compileComponents(); fixture = TestBed.createComponent(UpdateStatusComponent); component = fixture.componentInstance; fixture.detectChanges(); @@ -85,5 +82,53 @@ describe("UpdateStatusComponent", () => { expect(spy).toHaveBeenCalled(); component.closeOnEscape(new KeyboardEvent("keydown", {code: "Escape"})); expect(spy).toHaveBeenCalledTimes(2); + component.closeOnEscape(new KeyboardEvent("keydown", {code: "Esc"})); + expect(spy).toHaveBeenCalledTimes(3); + }); + + it("knows if the user-selected status is an 'offline' status", () => { + expect(component.statusControl.value).toBeNull(); + expect(component.isOffline).toBeFalse(); + + component.statusControl.setValue(undefined); + expect(component.isOffline).toBeFalse(); + + component.statusControl.setValue({name: "OFFLINE"}); + expect(component.isOffline).toBeTrue(); + + component.statusControl.setValue({name: "some weird custom status"}); + expect(component.isOffline).toBeTrue(); + + component.statusControl.setValue({name: "ONLINE"}); + expect(component.isOffline).toBeFalse(); + + component.statusControl.setValue({name: "REPORTED"}); + expect(component.isOffline).toBeFalse(); + }); + + it("submits a request to update each server", async () => { + let isDone = true; + const spy = jasmine.createSpy("doneSubscription", (v: boolean): void => { + expect(v).toBe(isDone); + }); + component.done.subscribe(spy); + + const service = TestBed.inject(ServerService); + component.statusControl.setValue((await service.getStatuses()).find(s=>s.name==="ONLINE")); + + const srv = await service.createServer({...defaultServer}); + component.servers = [srv]; + await component.submit(new SubmitEvent("submit")); + expect(spy).toHaveBeenCalled(); + + isDone = true; + component.statusControl.setValue((await service.getStatuses()).find(s=>s.name==="OFFLINE")); + await component.submit(new SubmitEvent("submit")); + expect(spy).toHaveBeenCalledTimes(2); + + isDone = false; + component.statusControl.setValue({name: "no such status"}); + await component.submit(new SubmitEvent("submit")); + expect(spy).toHaveBeenCalledTimes(3); }); }); diff --git a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts index dd0bafe651..a6346ee949 100644 --- a/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/update-status/update-status.component.ts @@ -106,24 +106,24 @@ export class UpdateStatusComponent implements OnInit { * * @param e The submission event. */ - public submit(e: Event): void { + public async submit(e: Event): Promise { e.preventDefault(); e.stopPropagation(); let observables; if (this.isOffline) { - observables = this.servers.map(async x=>this.api.updateStatus(x, this.statusControl.value.id, this.offlineReasonControl.value)); + observables = this.servers.map( + async x=>this.api.updateStatus(x, this.statusControl.value.name, this.offlineReasonControl.value) + ); } else { - observables = this.servers.map(async x=>this.api.updateStatus(x, this.statusControl.value.id)); + observables = this.servers.map(async x=>this.api.updateStatus(x, this.statusControl.value.name)); + } + try { + await Promise.all(observables); + this.done.emit(true); + } catch (err) { + console.error("something went wrong trying to update", this.serverName, "servers:", err); + this.done.emit(false); } - Promise.all(observables).then( - () => { - this.done.emit(true); - }, - err => { - console.error("something went wrong trying to update", this.serverName, "servers:", err); - this.done.emit(false); - } - ); } /** From 8645cdf4e0ade1c8e7567179bbba3ff514065a49 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 21 Jan 2022 16:07:24 -0700 Subject: [PATCH 34/50] Expand test coverage of the Servers Table component I also simplified a couple of methods by making them asynchronous --- .../src/app/core/core.module.ts | 2 +- .../servers-table.component.spec.ts | 115 ++++++++++++++++-- .../servers-table/servers-table.component.ts | 39 +++--- 3 files changed, 120 insertions(+), 36 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/core.module.ts b/experimental/traffic-portal/src/app/core/core.module.ts index b0efd11c37..f93cd6ffd7 100644 --- a/experimental/traffic-portal/src/app/core/core.module.ts +++ b/experimental/traffic-portal/src/app/core/core.module.ts @@ -18,7 +18,7 @@ */ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; -import { RouterModule, Routes } from "@angular/router"; +import { RouterModule, type Routes } from "@angular/router"; import { AppUIModule } from "../app.ui.module"; import { AuthenticatedGuard } from "../guards/authenticated-guard.service"; diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts index e9712a5c40..6f60e59cc9 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.spec.ts @@ -13,36 +13,44 @@ */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; +import { ServerService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; -import { defaultServer, Server } from "src/app/models"; +import { defaultServer, type Server } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; -import { augment, AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; +import { augment, type AugmentedServer, serverIsCache, ServersTableComponent } from "./servers-table.component"; describe("ServersTableComponent", () => { let component: ServersTableComponent; let fixture: ComponentFixture; + let router: Router; - beforeEach(waitForAsync(() => { + beforeEach(() => { const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); TestBed.configureTestingModule({ declarations: [ ServersTableComponent, TpHeaderComponent ], - imports: [HttpClientModule, RouterTestingModule, APITestingModule], + imports: [ + HttpClientModule, + RouterTestingModule.withRoutes([ + {component: ServersTableComponent, path: ""}, + {component: ServersTableComponent, path: "core/server/:id"} + ]), + APITestingModule + ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService } ] - }) - .compileComponents(); - })); - - beforeEach(() => { + }).compileComponents(); fixture = TestBed.createComponent(ServersTableComponent); component = fixture.componentInstance; fixture.detectChanges(); + router = TestBed.inject(Router); + router.initialNavigation(); }); it("should create", () => { @@ -141,4 +149,91 @@ describe("ServersTableComponent", () => { expect(a.ipv4Address).toBe("192.0.2.2"); expect(a.ipv6Address).toBe("2001::3"); }); + + it("loads the 'search' query string parameter as the text for the fuzzy search box", fakeAsync(() => { + expect(component.fuzzControl.value).toBe(""); + router.navigate(["/"], {queryParams: {search: "testquest"}}); + component.ngOnInit(); + tick(); + expect(component.fuzzControl.value).toBe("testquest"); + })); + + it("propagates changes to the search box to the subscription input of the generic table", () => { + const spy = jasmine.createSpy("fuzzySubscription", (v) => { + expect(v).toBe("testquest"); + }); + component.fuzzySubject.subscribe(spy); + component.fuzzControl.setValue("testquest"); + component.updateURL(); + expect(spy).toHaveBeenCalled(); + }); + + it("reloads servers when one or more servers' statuses are updated", async () => { + const service = TestBed.inject(ServerService); + await service.createServer({...defaultServer}); + component.ngOnInit(); + const servers = await component.servers; + if (!servers) { + return fail("servers table has no servers even though I just created one"); + } + + component.changeStatusOpen = true; + component.changeStatusServers = [servers[0]]; + component.servers = new Promise(r=>r([])); + component.statusUpdated(false); + expect(component.changeStatusOpen).toBeFalse(); + expect(component.changeStatusServers.length).toBe(0); + expect((await component.servers).length).toBe(0); + + component.changeStatusOpen = true; + component.changeStatusServers = [servers[0]]; + component.statusUpdated(true); + expect(component.changeStatusOpen).toBeFalse(); + expect(component.changeStatusServers.length).toBe(0); + expect((await component.servers).length).toBeGreaterThan(0); + }); + + it("handles its context menu actions", fakeAsync(() => { + const augmentFields = {ipv4Address: "192.0.2.0", ipv6Address: "2001::1"}; + const server = {...defaultServer, id: 9001, type: "EDGE", ...augmentFields}; + + component.handleContextMenu({action: "viewDetails", data: server}); + tick(); + expect(router.url).toBe("/core/server/9001"); + expectAsync(component.handleContextMenu({action: "viewDetails", data: [server]})).toBeRejected(); + + component.changeStatusOpen = false; + component.changeStatusServers = []; + component.handleContextMenu({action: "updateStatus", data: server}); + expect(component.changeStatusOpen).toBeTrue(); + expect(component.changeStatusServers).toEqual([server]); + + component.changeStatusOpen = false; + component.changeStatusServers = []; + component.handleContextMenu({action: "updateStatus", data: [server]}); + expect(component.changeStatusOpen).toBeTrue(); + expect(component.changeStatusServers).toEqual([server]); + + const service = TestBed.inject(ServerService); + const queueSpy = spyOn(service, "queueUpdates"); + const clearSpy = spyOn(service, "clearUpdates"); + expect(queueSpy).not.toHaveBeenCalled(); + expect(clearSpy).not.toHaveBeenCalled(); + + component.handleContextMenu({action: "queue", data: server}); + expect(queueSpy).toHaveBeenCalledTimes(1); + expect(clearSpy).not.toHaveBeenCalled(); + + component.handleContextMenu({action: "queue", data: [server, server]}); + expect(queueSpy).toHaveBeenCalledTimes(3); + + component.handleContextMenu({action: "dequeue", data: server}); + expect(queueSpy).toHaveBeenCalledTimes(3); + expect(clearSpy).toHaveBeenCalledTimes(1); + + component.handleContextMenu({action: "dequeue", data: [server, server]}); + expect(clearSpy).toHaveBeenCalledTimes(3); + + expectAsync(component.handleContextMenu({action: "not a real action", data: []})).toBeRejected(); + })); }); diff --git a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts index 8d10d220e2..74543adf0b 100644 --- a/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts +++ b/experimental/traffic-portal/src/app/core/servers/servers-table/servers-table.component.ts @@ -357,13 +357,8 @@ export class ServersTableComponent implements OnInit { } /** Reloads the servers table data. */ - private reloadServers(): void { - this.servers = this.api.getServers().then(x=>x.map(augment)).catch( - e => { - console.error("Failed to reload servers:", e); - return []; - } - ); + private async reloadServers(): Promise { + this.servers = this.api.getServers().then(ss=>ss.map(augment)); } /** Update the URL's 'search' query parameter for the user's search input. */ @@ -376,37 +371,31 @@ export class ServersTableComponent implements OnInit { * * @param action The emitted context menu action event. */ - public handleContextMenu(action: ContextMenuActionEvent): void { - let observables; + public async handleContextMenu(action: ContextMenuActionEvent): Promise { switch (action.action) { case "viewDetails": - this.router.navigate(["/core/server", (action.data as AugmentedServer).id]); + if (action.data instanceof Array) { + throw new Error("'viewDetails' is a single-row action, but was called with multiple rows"); + } + this.router.navigate(["/core/server", action.data.id]); break; case "updateStatus": - console.log("'Update Status' clicked - not yet implemented"); this.changeStatusServers = action.data instanceof Array ? action.data : [action.data]; this.changeStatusOpen = true; break; case "queue": - observables = (action.data as Array).map(async s=>this.api.queueUpdates(s)); - Promise.all(observables).then( - () => { - this.reloadServers(); - } - ); + const queueServers = action.data instanceof Array ? action.data : [action.data]; + await Promise.all(queueServers.map(async s=>this.api.queueUpdates(s))); + await this.reloadServers(); break; case "dequeue": - observables = (action.data as Array).map(async s=>this.api.clearUpdates(s)); - Promise.all(observables).then( - () => { - this.reloadServers(); - } - ); + const dequeueServers = action.data instanceof Array ? action.data : [action.data]; + await Promise.all(dequeueServers.map(async s=>this.api.clearUpdates(s))); + await this.reloadServers(); break; default: - console.error("unknown context menu item clicked:", action.action); + throw new Error(`unknown context menu item clicked: ${action.action}`); } - console.log(action.action, "triggered with data:", action.data); } /** From 48997ac58095d5a1c4de88ad1fad78ac195346f3 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 24 Jan 2022 09:05:36 -0700 Subject: [PATCH 35/50] Expand test coverage of the Server Details component --- .../server-details.component.spec.ts | 49 ++++++++++++++++--- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts index e167c970e1..e46d617650 100644 --- a/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/servers/server-details/server-details.component.spec.ts @@ -13,11 +13,12 @@ */ import { HttpClientModule } from "@angular/common/http"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, fakeAsync, TestBed, tick } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; import { faToggleOff, faToggleOn } from "@fortawesome/free-solid-svg-icons"; +import { ServerService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; import { defaultServer } from "src/app/models"; @@ -30,15 +31,21 @@ describe("ServerDetailsComponent", () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ ServerDetailsComponent ], - imports: [ HttpClientModule, RouterTestingModule, FormsModule, ReactiveFormsModule, APITestingModule ], + imports: [ + HttpClientModule, + RouterTestingModule.withRoutes([ + {component: ServerDetailsComponent, path: "server/:id"}, + {component: ServerDetailsComponent, path: "server/new"} + ]), + FormsModule, + ReactiveFormsModule, + APITestingModule + ], }).compileComponents(); - }); - - beforeEach(() => { fixture = TestBed.createComponent(ServerDetailsComponent); + const service = TestBed.inject(ServerService); component = fixture.componentInstance; - component.server = {...defaultServer}; - component.server.interfaces = []; + component.server = await service.createServer({...defaultServer, interfaces: []}); fixture.detectChanges(); }); @@ -98,4 +105,32 @@ describe("ServerDetailsComponent", () => { s.type = "RASCAL"; expect(component.isCache()).toBeFalse(); }); + + it("submits a server creation request", fakeAsync(() => { + const service = TestBed.inject(ServerService); + const spy = spyOn(service, "createServer"); + spy.and.callThrough(); + expect(spy).not.toHaveBeenCalled(); + component.isNew = true; + + component.submit(new Event("submit")); + tick(); + expect(component.isNew).toBeFalse(); + expect(component.server.id).toBeDefined(); + expect(component.title).toContain("Server #"); + })); + + it("opens the 'change status' dialog", () => { + expect(component.changeStatusDialogOpen).toBeFalse(); + component.changeStatus(new MouseEvent("click")); + expect(component.changeStatusDialogOpen).toBeTrue(); + component.isNew = true; + expect(()=>component.changeStatus(new MouseEvent("click"))).toThrow(); + }); + + it("closes the 'change status' dialog when done", () => { + component.changeStatusDialogOpen = true; + component.doneUpdatingStatus(true); + expect(component.changeStatusDialogOpen).toBeFalse(); + }); }); From d84aadd6782d752d0c995b4df7e11e21535caf74 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 24 Jan 2022 16:27:27 -0700 Subject: [PATCH 36/50] Expand test coverage of the New Delivery Service component --- .../src/app/api/testing/cdn.service.ts | 2 +- .../src/app/core/ds-card/ds-card.component.ts | 1 + .../new-delivery-service.component.spec.ts | 104 ++++++++-- .../new-delivery-service.component.ts | 187 +++++++++--------- .../src/app/models/deliveryservice.ts | 3 +- 5 files changed, 182 insertions(+), 115 deletions(-) diff --git a/experimental/traffic-portal/src/app/api/testing/cdn.service.ts b/experimental/traffic-portal/src/app/api/testing/cdn.service.ts index 3a390aa865..31930bab2e 100644 --- a/experimental/traffic-portal/src/app/api/testing/cdn.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/cdn.service.ts @@ -37,7 +37,7 @@ export class CDNService { { dnssecEnabled: false, domainName: "mycdn.test.test", - id: 1, + id: 2, lastUpdated: new Date(), name: "test" } diff --git a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts index 15d646eeed..a387e8920f 100644 --- a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts +++ b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts @@ -137,6 +137,7 @@ export class DsCardComponent implements OnInit { multiSiteOrigin: false, regionalGeoBlocking: false, routingName: "", + tenantId: 1, typeId: -1, xmlId: "-1" }; diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts index bc555cbd4a..a9d30bbe9f 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.spec.ts @@ -12,10 +12,10 @@ * limitations under the License. */ -import { HarnessLoader, parallel } from "@angular/cdk/testing"; +import { type HarnessLoader, parallel } from "@angular/cdk/testing"; import { TestbedHarnessEnvironment } from "@angular/cdk/testing/testbed"; import { HttpClientModule } from "@angular/common/http"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MatButtonModule } from "@angular/material/button"; import { MatRadioModule } from "@angular/material/radio"; @@ -38,8 +38,11 @@ describe("NewDeliveryServiceComponent", () => { beforeEach(async () => { // mock the API - const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); - mockCurrentUserService.updateCurrentUser.and.returnValue(new Promise(r => r(false))); + const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"], {currentUser: { + tenant: "root", + tenantId: 1 + }}); + mockCurrentUserService.updateCurrentUser.and.returnValue(new Promise(r => r(true))); await TestBed.configureTestingModule({ declarations: [ @@ -75,7 +78,10 @@ describe("NewDeliveryServiceComponent", () => { it("should parse Origin URLs properly", async () => { component.originURL.setValue("http://some.domain.test:9001/a/check/path/here"); + component.activeImmediately.setValue(true); + component.activeImmediately.markAsDirty(); component.setOriginURL(); + expect(component.deliveryService.active).toBeTrue(); expect(component.deliveryService.orgServerFqdn).toEqual("http://some.domain.test:9001", "http://some.domain.test:9001"); expect(component.deliveryService.checkPath).toEqual("/a/check/path/here", "/a/check/path/here"); expect(component.deliveryService.displayName).toEqual( @@ -94,7 +100,9 @@ describe("NewDeliveryServiceComponent", () => { // check other protocol setting component.originURL.setValue("https://test.test"); + component.activeImmediately.setValue(false); component.setOriginURL(); + expect(component.deliveryService.active).toBeFalse(); expect(component.deliveryService.protocol).toEqual(Protocol.HTTP_TO_HTTPS, "HTTP_TO_HTTPS"); }); @@ -122,19 +130,87 @@ describe("NewDeliveryServiceComponent", () => { } }); - // it('should set infrastructure info properly', () => { - // component.step = 2; - // component.cdnObject.setValue({ name: 'testCDN', id: 1 } as CDN); - // component.dsType.setValue({ name: 'testType', id: 1 } as Type); - // }); + it("should set infrastructure info properly for HTTP Delivery Services", () => { + component.cdnObject.setValue({id: 2, name: "test"}); + component.dsType.setValue({id: 10, name: "HTTP"}); + component.dsType.markAsDirty(); + component.protocol.setValue(Protocol.HTTPS); + component.protocol.markAsDirty(); + component.disableIPv6.setValue(true); + component.disableIPv6.markAsDirty(); + const bypass = "https://some-other.ds.mycdn.test"; + component.bypassLoc.setValue(bypass); + component.bypassLoc.markAsDirty(); + component.setInfrastructureInformation(); + expect(component.deliveryService.type).toBe("HTTP"); + expect(component.deliveryService.typeId).toBe(10); + expect(component.deliveryService.cdnId).toBe(2); + expect(component.deliveryService.cdnName).toBe("test"); + expect(component.deliveryService.protocol).toBe(Protocol.HTTPS); + expect(component.deliveryService.ipv6RoutingEnabled).toBeFalse(); + expect(component.deliveryService.httpBypassFqdn).toBe(bypass); + expect(component.deliveryService.dnsBypassCname).toBeUndefined(); + expect(component.deliveryService.dnsBypassIp6).toBeUndefined(); + expect(component.deliveryService.dnsBypassIp).toBeUndefined(); + }); + + it("should set infrastructure info properly for DNS Delivery Services", () => { + component.cdnObject.setValue({id: 2, name: "test"}); + component.dsType.setValue({id: 7, name: "DNS"}); + component.dsType.markAsDirty(); + component.protocol.setValue(Protocol.HTTP); + component.protocol.markAsDirty(); + component.disableIPv6.setValue(true); + component.disableIPv6.markAsDirty(); + let bypass = "some-other.ds.mycdn.test"; + component.bypassLoc.setValue(bypass); + component.bypassLoc.markAsDirty(); + component.setInfrastructureInformation(); + expect(component.deliveryService.type).toBe("DNS"); + expect(component.deliveryService.typeId).toBe(7); + expect(component.deliveryService.cdnId).toBe(2); + expect(component.deliveryService.cdnName).toBe("test"); + expect(component.deliveryService.protocol).toBe(Protocol.HTTP); + expect(component.deliveryService.ipv6RoutingEnabled).toBeFalse(); + expect(component.deliveryService.httpBypassFqdn).toBeUndefined(); + expect(component.deliveryService.dnsBypassCname).toBe(bypass); + expect(component.deliveryService.dnsBypassIp6).toBeUndefined(); + expect(component.deliveryService.dnsBypassIp).toBeUndefined(); + + bypass = "2001::abc"; + component.bypassLoc.setValue(bypass); + component.setInfrastructureInformation(); + expect(component.deliveryService.dnsBypassIp6).toBe(bypass); + + bypass = "192.0.2.1"; + component.bypassLoc.setValue(bypass); + component.setInfrastructureInformation(); + expect(component.deliveryService.dnsBypassIp).toBe(bypass); + }); it("should match hostnames", async () => { const invalidHostnames: Array = ["h.", "h-", "h-.o", "-h.o"]; - invalidHostnames.forEach((invalidHostname: string) => void expect(() => component.setDNSBypass(invalidHostname)).toThrow()); + for (const invalidHostname of invalidHostnames) { + expect(() => component.setDNSBypass(invalidHostname)).toThrow(); + } const validHostnames: Array = ["h", "h.o.s.T.n.a.m.e", "h-O-------s.tNaMe"]; - expect(() => validHostnames.forEach((hostname: string) => { - component.setDNSBypass(hostname); - expect(component.deliveryService.dnsBypassCname).toBe(hostname); - })).not.toThrow(); + expect(() => validHostnames.forEach( + hostname => { + component.setDNSBypass(hostname); + expect(component.deliveryService.dnsBypassCname).toBe(hostname); + } + )).not.toThrow(); + }); + + it("goes to the previous step", async () => { + const stepper = await loader.getHarness(MatStepperHarness); + const steps = await stepper.getSteps(); + expect(await steps[0].isSelected()).toBeTrue(); + await steps[1].select(); + expect(await steps[0].isSelected()).toBeFalse(); + expect(await steps[1].isSelected()).toBeTrue(); + component.previous(); + expect(await steps[0].isSelected()).toBeTrue(); + expect(await steps[1].isSelected()).toBeFalse(); }); }); diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts index 8df2a1c55a..1fdc4c87ab 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts @@ -11,7 +11,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, OnInit, ViewChild } from "@angular/core"; +import { DOCUMENT } from "@angular/common"; +import { Component, type OnInit, ViewChild, Inject } from "@angular/core"; import { FormControl } from "@angular/forms"; import type { MatStepper } from "@angular/material/stepper"; import { Router } from "@angular/router"; @@ -19,13 +20,13 @@ import { Router } from "@angular/router"; import { CDNService, DeliveryServiceService } from "src/app/api"; import { bypassable, - CDN, + type CDN, defaultDeliveryService, - DeliveryService, + type DeliveryService, Protocol, protocolToString, - Type, - User + type Type, + type User } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; @@ -48,7 +49,7 @@ const VALID_IPV4 = /^(1\d\d|2[0-4]\d|25[0-5]|\d\d?)(\.(1\d\d|2[0-4]\d|25[0-5]|\d * A regular expression that matches IPv6 addresses * This is huge and ugly, but there's no JS built-in for address parsing afaik. */ -const VALID_IPV6 = /^((((((([\da-fA-F]{1,4})):){6})((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|((::((([\da-fA-F]{1,4})):){5})((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|((((([\da-fA-F]{1,4}))):((([\da-fA-F]{1,4})):){4})((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|(((((([\da-fA-F]{1,4})):){0,1}(([\da-fA-F]{1,4}))):((([\da-fA-F]{1,4})):){3})((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|(((((([\da-fA-F]{1,4})):){0,2}(([\da-fA-F]{1,4}))):((([\da-fA-F]{1,4})):){2})((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|(((((([\da-fA-F]{1,4})):){0,3}(([\da-fA-F]{1,4}))):(([\da-fA-F]{1,4})):)((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|(((((([\da-fA-F]{1,4})):){0,4}(([\da-fA-F]{1,4}))):)((((([\da-fA-F]{1,4})):(([\da-fA-F]{1,4})))|(((((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d]))\.){3}((25[0-5]|([1-9]|1[\d]|2[0-4])?[\d])))))))|(((((([\da-fA-F]{1,4})):){0,5}(([\da-fA-F]{1,4}))):)(([\da-fA-F]{1,4})))|(((((([\da-fA-F]{1,4})):){0,6}(([\da-fA-F]{1,4}))):))))$/; +const VALID_IPV6 = /^(?:(?:[a-fA-F\d]{1,4}:){7}(?:[a-fA-F\d]{1,4}|:)|(?:[a-fA-F\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-fA-F\d]{1,4}|:)|(?:[a-fA-F\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,2}|:)|(?:[a-fA-F\d]{1,4}:){4}(?:(?::[a-fA-F\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,3}|:)|(?:[a-fA-F\d]{1,4}:){3}(?:(?::[a-fA-F\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,4}|:)|(?:[a-fA-F\d]{1,4}:){2}(?:(?::[a-fA-F\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,5}|:)|(?:[a-fA-F\d]{1,4}:){1}(?:(?::[a-fA-F\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-fA-F\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$/; /* eslint-enable */ /** * A regular expression that matches a valid hostname @@ -114,82 +115,73 @@ export class NewDeliveryServiceComponent implements OnInit { public bypassable = bypassable; /** - * A reference to the stepper used in the form - this is never actually - * undefined, but the value is set by the decorator, so to satisfy the - * compiler we need to mark it as optional. + * A reference to the stepper used in the form. */ - @ViewChild("stepper") public stepper?: MatStepper; + @ViewChild("stepper") public stepper!: MatStepper; - /** - * Constructor. - */ constructor( private readonly dsAPI: DeliveryServiceService, private readonly cdnAPI: CDNService, private readonly auth: CurrentUserService, - private readonly router: Router + private readonly router: Router, + @Inject(DOCUMENT) private readonly document: Document ) { } /** * Initializes all of the extra data needed to construct a Delivery Service * (types, cdns, etc). */ - public ngOnInit(): void { - this.auth.updateCurrentUser().then( success => { - if (!success || this.auth.currentUser === null) { - return; - } - this.deliveryService.tenant = this.auth.currentUser.tenant; - this.deliveryService.tenantId = this.auth.currentUser.tenantId; - this.dsAPI.getDSTypes().then( - (types: Array) => { - this.dsTypes = types; - for (const t of types) { - if (t.name === "HTTP") { - this.deliveryService.type = t.name; - this.deliveryService.typeId = t.id; - this.dsType.setValue(t); - break; - } + public async ngOnInit(): Promise { + const success = await this.auth.updateCurrentUser(); + if (!success || this.auth.currentUser === null) { + return; + } + + this.deliveryService.tenant = this.auth.currentUser.tenant; + this.deliveryService.tenantId = this.auth.currentUser.tenantId; + const typeP = this.dsAPI.getDSTypes().then( + (types: Array) => { + this.dsTypes = types; + for (const t of types) { + if (t.name === "HTTP") { + this.deliveryService.type = t.name; + this.deliveryService.typeId = t.id; + this.dsType.setValue(t); + break; } } - ); - if (!this.auth.currentUser || !this.auth.currentUser.tenantId) { - console.error("Cannot set default CDN - user has no tenant"); - return; } - this.dsAPI.getDeliveryServices().then( - d => { - const cdnsInUse = new Map(); - for (const ds of d) { - if (ds.tenantId === undefined) { - console.warn("Delivery Service has no tenant:", ds); - continue; - } - if (ds.tenantId === (this.auth.currentUser as User).tenantId) { - const usedCDNs = cdnsInUse.get(ds.tenantId); - if (!usedCDNs) { - cdnsInUse.set(ds.tenantId, 1); - } else { - cdnsInUse.set(ds.tenantId, usedCDNs + 1); - } + ); + if (!this.auth.currentUser || !this.auth.currentUser.tenantId) { + console.error("Cannot set default CDN - user has no tenant"); + return typeP; + } + const dsP = this.dsAPI.getDeliveryServices().then( + d => { + const cdnsInUse = new Map(); + for (const ds of d) { + if (ds.tenantId === (this.auth.currentUser as User).tenantId) { + const usedCDNs = cdnsInUse.get(ds.tenantId); + if (!usedCDNs) { + cdnsInUse.set(ds.tenantId, 1); + } else { + cdnsInUse.set(ds.tenantId, usedCDNs + 1); } } - - let most = 0; - let mostId = -1; - cdnsInUse.forEach( (v: number, k: number) => { - if (v > most) { - most = v; - mostId = k; - } - }); - - this.setDefaultCDN(mostId); } - ); - }); + let most = -Infinity; + let mostId = -1; + cdnsInUse.forEach( (v: number, k: number) => { + if (v > most) { + most = v; + mostId = k; + } + }); + this.setDefaultCDN(mostId); + } + ); + await Promise.all([typeP, dsP]); } /** @@ -201,47 +193,44 @@ export class NewDeliveryServiceComponent implements OnInit { * which case it should be `-1` and the selected CDN will be the first CDN * in lexigraphical order by name. */ - private setDefaultCDN(id: number): void { - this.cdnAPI.getCDNs().then( - cdns => { - if (!cdns) { - console.warn("No CDNs found in the API"); - return; - } - this.cdns = new Array(); - let def: CDN | null = null; - cdns.forEach( (c: CDN) => { - - // this is a special, magic-value CDN that can't have any DSes - if (c.name !== "ALL") { - this.cdns.push(c); - if (id > 0) { - if (c.id === id) { - def = c; - } - } else if (!def || c.name < def.name) { - def = c; - } + private async setDefaultCDN(id: number): Promise { + const cdns = await this.cdnAPI.getCDNs(); + if (!cdns) { + throw new Error("no CDNs found in the API"); + } + this.cdns = []; + let def; + for (const [name, cdn] of cdns) { + // this is a special, magic-value CDN that can't have any DSes + if (name !== "ALL") { + this.cdns.push(cdn); + if (id > 0) { + if (cdn.id === id) { + def = cdn; } - }); - if (!def) { - def = this.cdns[0]; + } else if (!def || cdn.name < def.name) { + def = cdn; } - this.deliveryService.cdnId = def.id; - this.deliveryService.cdnName = def.name; - this.cdnObject.setValue(def); } - ); + } + if (this.cdns.length < 1) { + throw new Error("the only CDN is 'ALL', which cannot be used for Delivery Services"); + } + + if (!def) { + def = this.cdns[0]; + } + this.deliveryService.cdnId = def.id; + this.deliveryService.cdnName = def.name; + this.cdnObject.setValue(def); } /** * When a user submits their origin URL, this parses that out into the * related DS fields. - * - * @param stepper The stepper controlling the form flow - used to advance to the next step. */ public setOriginURL(): void { - const parser = document.createElement("a"); + const parser = this.document.createElement("a"); parser.href = this.originURL.value; this.deliveryService.orgServerFqdn = parser.origin; if (parser.pathname) { @@ -269,7 +258,7 @@ export class NewDeliveryServiceComponent implements OnInit { this.deliveryService.displayName = `Delivery Service for ${parser.hostname}`; this.displayName.setValue(this.deliveryService.displayName); - this.stepper?.next(); + this.stepper.next(); } /** @@ -287,7 +276,7 @@ export class NewDeliveryServiceComponent implements OnInit { // According to https://stackoverflow.com/questions/39642547/is-it-possible-to-get-native-element-for-formcontrol // this could instead be implemented with a Directive, but that doesn't really seem like // any less of a hack to me. - const nativeDisplayNameElement = document.getElementById("displayName") as HTMLInputElement; + const nativeDisplayNameElement = this.document.getElementById("displayName") as HTMLInputElement; nativeDisplayNameElement.setCustomValidity( "Failed to create a unique key from Delivery Service name. Try using less special characters." ); @@ -301,7 +290,7 @@ export class NewDeliveryServiceComponent implements OnInit { if (this.infoURL.value) { this.deliveryService.infoUrl = this.infoURL.value; } - this.stepper?.next(); + this.stepper.next(); } /** @@ -335,7 +324,7 @@ export class NewDeliveryServiceComponent implements OnInit { this.setDNSBypass(this.bypassLoc.value); } catch (e) { console.error(e); - const nativeBypassElement = document.getElementById("bypass-loc") as HTMLInputElement; + const nativeBypassElement = this.document.getElementById("bypass-loc") as HTMLInputElement; nativeBypassElement.setCustomValidity(e instanceof Error ? e.message : String(e)); nativeBypassElement.reportValidity(); nativeBypassElement.value = ""; @@ -384,6 +373,6 @@ export class NewDeliveryServiceComponent implements OnInit { * Allows a user to return to the previous step. */ public previous(): void { - this.stepper?.previous(); + this.stepper.previous(); } } diff --git a/experimental/traffic-portal/src/app/models/deliveryservice.ts b/experimental/traffic-portal/src/app/models/deliveryservice.ts index ed13df7cb1..78e027dbd8 100644 --- a/experimental/traffic-portal/src/app/models/deliveryservice.ts +++ b/experimental/traffic-portal/src/app/models/deliveryservice.ts @@ -357,7 +357,7 @@ export interface DeliveryService { * An integral, unique identifier for the Tenant to whom this Delivery * Service belongs. */ - tenantId?: number; + tenantId: number; /** * HTTP headers that should be logged from client requests by Traffic * Router. @@ -395,6 +395,7 @@ export const defaultDeliveryService: DeliveryService ={ rangeRequestHandling: RangeRequestHandling.NONE, regionalGeoBlocking: false, routingName: "cdn", + tenantId: 1, typeId: -1, xmlId: "" }; From dcf9831b323b5b5de04f2ead33f056b3f50c4259 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 26 Jan 2022 17:28:26 -0700 Subject: [PATCH 37/50] Switch DS and Job creation methods to return what they created --- .../src/app/api/delivery-service.service.ts | 25 ++++++++--------- .../src/app/api/invalidation-job.service.ts | 7 ++--- .../api/testing/delivery-service.service.ts | 4 +-- .../api/testing/invalidation-job.service.ts | 28 ++++++++++++++----- .../new-delivery-service.component.ts | 8 ++---- 5 files changed, 38 insertions(+), 34 deletions(-) diff --git a/experimental/traffic-portal/src/app/api/delivery-service.service.ts b/experimental/traffic-portal/src/app/api/delivery-service.service.ts index db9032d3e6..59f1be0c7a 100644 --- a/experimental/traffic-portal/src/app/api/delivery-service.service.ts +++ b/experimental/traffic-portal/src/app/api/delivery-service.service.ts @@ -15,16 +15,16 @@ import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import { - DataPoint, - DataSet, - DataSetWithSummary, + type DataPoint, + type DataSet, + type DataSetWithSummary, defaultDeliveryService, - DeliveryService, - DSCapacity, - DSHealth, - InvalidationJob, - TPSData, - Type + type DeliveryService, + type DSCapacity, + type DSHealth, + type InvalidationJob, + type TPSData, + type Type } from "src/app/models"; import { APIService } from "./base-api.service"; @@ -212,12 +212,9 @@ export class DeliveryServiceService extends APIService { * @param ds The new Delivery Service object * @returns A boolean value indicating the success of the operation */ - public async createDeliveryService(ds: DeliveryService): Promise { + public async createDeliveryService(ds: DeliveryService): Promise { const path = "deliveryservices"; - return this.post(path, ds).toPromise().then( - () => true, - () => false - ); + return this.post(path, ds).toPromise(); } /** diff --git a/experimental/traffic-portal/src/app/api/invalidation-job.service.ts b/experimental/traffic-portal/src/app/api/invalidation-job.service.ts index 78cb306100..46196b91fe 100644 --- a/experimental/traffic-portal/src/app/api/invalidation-job.service.ts +++ b/experimental/traffic-portal/src/app/api/invalidation-job.service.ts @@ -95,12 +95,9 @@ export class InvalidationJobService extends APIService { * @param job The Job to create. * @returns whether or not creation succeeded. */ - public async createInvalidationJob(job: NewInvalidationJob): Promise { + public async createInvalidationJob(job: NewInvalidationJob): Promise { const path = "jobs"; - return this.post(path, job).toPromise().then( - () => true, - () => false - ); + return this.post(path, job).toPromise(); } /** diff --git a/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts b/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts index 57e0bca8de..dbdbb84512 100644 --- a/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/delivery-service.service.ts @@ -200,11 +200,11 @@ export class DeliveryServiceService { * @param ds The new Delivery Service object * @returns A boolean value indicating the success of the operation */ - public async createDeliveryService(ds: DeliveryService): Promise { + public async createDeliveryService(ds: DeliveryService): Promise { ds.id = ++this.idCounter; ds.lastUpdated = new Date(); this.deliveryServices.push(ds); - return true; + return ds; } /** diff --git a/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts b/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts index 42667bdf11..b04d748e75 100644 --- a/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts @@ -14,7 +14,11 @@ import { Injectable } from "@angular/core"; -import { DeliveryService, InvalidationJob, JobType, NewInvalidationJob, User } from "src/app/models"; +import { type DeliveryService, type InvalidationJob, JobType, type NewInvalidationJob, type User } from "src/app/models"; + +// This needs to be imported from above, because that's how the services are +// specified in `providers`. +import { DeliveryServiceService } from ".."; /** * JobOpts defines the options that can be passed to getInvalidationJobs. @@ -41,6 +45,8 @@ export class InvalidationJobService { private readonly jobs = new Array(); private idCounter = 0; + constructor(private readonly dsService: DeliveryServiceService) {} + /** * Fetches all invalidation jobs that match the passed criteria. * @@ -77,21 +83,29 @@ export class InvalidationJobService { * @param job The Job to create. * @returns whether or not creation succeeded. */ - public async createInvalidationJob(job: NewInvalidationJob): Promise { + public async createInvalidationJob(job: NewInvalidationJob): Promise { + let deliveryService; if (typeof job.deliveryService === "number") { - throw new Error("creating Jobs by Delivery Service ID is not implemented in testing services; use the XMLID"); + const ds = (await this.dsService.getDeliveryServices()).find(d=>d.id === job.deliveryService); + if (!ds) { + throw new Error(`no such Delivery Service: #${job.deliveryService}`); + } + deliveryService = ds.xmlId; + } else { + deliveryService = job.deliveryService; } - this.jobs.push({ + const ret = { // Yes, this is ill-formed. assetUrl: job.regex, createdBy: "test-admin", - deliveryService: job.deliveryService, + deliveryService, id: ++this.idCounter, keyword: JobType.PURGE, parameters: typeof job.ttl === "string" ? job.ttl : `${job.ttl}h`, startTime: job.startTime instanceof Date ? job.startTime : new Date(job.startTime) - }); - return true; + }; + this.jobs.push(ret); + return ret; } /** diff --git a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts index 1fdc4c87ab..d8d330cca3 100644 --- a/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts +++ b/experimental/traffic-portal/src/app/core/new-delivery-service/new-delivery-service.component.ts @@ -340,12 +340,8 @@ export class NewDeliveryServiceComponent implements OnInit { this.dsAPI.createDeliveryService(this.deliveryService).then( v => { - if (v) { - console.log("New Delivery Service '%s' created", this.deliveryService.displayName); - this.router.navigate(["/"], {queryParams: {search: encodeURIComponent(this.deliveryService.displayName)}}); - } else { - console.error("Failed to create deliveryService: ", this.deliveryService); - } + console.log("New Delivery Service '%s' created", v.displayName); + this.router.navigate(["/"], {queryParams: {search: encodeURIComponent(v.displayName)}}); } ); } From c62cf09700d5ce680c4bdf19f83051f598ce8975 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 26 Jan 2022 17:29:00 -0700 Subject: [PATCH 38/50] Expand test coverage of the New Invalidation Job Dialog component --- ...-invalidation-job-dialog.component.spec.ts | 150 +++++++++++++++++- .../new-invalidation-job-dialog.component.ts | 28 ++-- 2 files changed, 154 insertions(+), 24 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts index ef07ed7ebd..32da5bf961 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.spec.ts @@ -12,9 +12,10 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, tick, fakeAsync } from "@angular/core/testing"; import { MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from "@angular/material/dialog"; +import { DeliveryServiceService, InvalidationJobService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; import { NewInvalidationJobDialogComponent, sanitizedRegExpString, timeStringFromDate } from "./new-invalidation-job-dialog.component"; @@ -22,8 +23,15 @@ import { NewInvalidationJobDialogComponent, sanitizedRegExpString, timeStringFro describe("NewInvalidationJobDialogComponent", () => { let component: NewInvalidationJobDialogComponent; let fixture: ComponentFixture; + const dialogRef = { + close: jasmine.createSpy("dialog 'close' method", (): void => console.log("dialog closed")) + }; + const dialogData = { + dsID: -1 + }; beforeEach(async () => { + dialogRef.close = jasmine.createSpy("dialog 'close' method", (): void => console.log("dialog closed")); await TestBed.configureTestingModule({ declarations: [ NewInvalidationJobDialogComponent ], imports: [ @@ -32,23 +40,153 @@ describe("NewInvalidationJobDialogComponent", () => { APITestingModule ], providers: [ - {provide: MatDialogRef, useValue: {close: (): void => { - console.log("dialog closed"); - }}}, - {provide: MAT_DIALOG_DATA, useValue: {dsID: -1}}, + {provide: MatDialogRef, useValue: dialogRef}, + {provide: MAT_DIALOG_DATA, useValue: dialogData}, ] }).compileComponents(); + const service = TestBed.inject(DeliveryServiceService); + // TODO: These are never cleaned up (because the DS service doesn't have + // a method for DS deletion) + const ds = await service.createDeliveryService({ + active: true, + anonymousBlockingEnabled: false, + cdnId: 2, + cdnName: "test", + displayName: "Test DS", + dscp: 1, + geoLimit: 0, + geoProvider: 0, + ipv6RoutingEnabled: true, + logsEnabled: true, + longDesc: "A DS for testing", + missLat: 0, + missLong: 0, + multiSiteOrigin: false, + regionalGeoBlocking: false, + routingName: "test", + tenant: "root", + tenantId: 1, + type: "HTTP", + typeId: 10, + xmlId: "test-ds", + }); + if (ds.id === undefined) { + return fail("created Delivery Service had no ID"); + } + dialogData.dsID = ds.id; + + fixture = TestBed.createComponent(NewInvalidationJobDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); }); - beforeEach(() => { + it("should create", () => { + expect(component).toBeTruthy(); + }); + + it("closes the dialog", () => { + expect(dialogRef.close).not.toHaveBeenCalled(); + component.cancel(); + expect(dialogRef.close).toHaveBeenCalled(); + }); + + it("submits requests to create new Jobs, then closes the dialog", fakeAsync(() => { + expect(dialogRef.close).not.toHaveBeenCalled(); + component.onSubmit(new SubmitEvent("submit")); + tick(); + expect(dialogRef.close).toHaveBeenCalled(); + const service = TestBed.inject(InvalidationJobService); + expectAsync((async (): Promise => { + for (const j of await service.getInvalidationJobs()) { + await service.deleteInvalidationJob(j.id); + } + return true; + })()).toBeResolvedTo(true); + })); + + it("updates the minimum starting time according to a newly selected starting date", () => { + component.startDate = new Date(); + component.startMin = new Date(); + component.dateChange(); + expect(component.startMinTime).toBe(timeStringFromDate(component.startMin)); + component.startDate.setDate(component.startDate.getDate()+1); + component.dateChange(); + expect(component.startMinTime).toBe("00:00"); + }); + + it("doesn't try to create the job when the regexp isn't valid", fakeAsync(() => { + component.regexp.setValue("+\\y"); + component.onSubmit(new SubmitEvent("submit")); + tick(); + expect(dialogRef.close).not.toHaveBeenCalled(); + })); +}); + +describe("NewInvalidationJobDialogComponent - editing", () => { + let component: NewInvalidationJobDialogComponent; + let fixture: ComponentFixture; + const dialogRef = { + close: jasmine.createSpy("dialog 'close' method", (): void => console.log("dialog closed")) + }; + const dialogData = { + dsID: -1, + job: { + assetUrl: "https://some-url.test/followed/by/a/p\\.attern\\.\\b", + id: -1, + parameters: "TTL:178", + startTime: new Date(0) + } + }; + + beforeEach(async () => { + dialogRef.close = jasmine.createSpy("dialog 'close' method", (): void => console.log("dialog closed")); + await TestBed.configureTestingModule({ + declarations: [ NewInvalidationJobDialogComponent ], + imports: [ + MatDialogModule, + HttpClientModule, + APITestingModule + ], + providers: [ + {provide: MatDialogRef, useValue: dialogRef}, + {provide: MAT_DIALOG_DATA, useValue: dialogData}, + ] + }).compileComponents(); + + const service = TestBed.inject(InvalidationJobService); + const now = new Date(); + const job = await service.createInvalidationJob({ + deliveryService: "test-xmlid", + regex: "/", + startTime: new Date(now.setDate(now.getDate()+1)), + ttl: 178 + }); + if (job.id === undefined) { + return fail("created Content Invalidation Job had no ID"); + } + dialogData.job = job; + fixture = TestBed.createComponent(NewInvalidationJobDialogComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + afterEach(async ()=>{ + const service = TestBed.inject(InvalidationJobService); + await service.deleteInvalidationJob(dialogData.job.id); + expect((await service.getInvalidationJobs()).length).toBe(0); + }); + it("should create", () => { expect(component).toBeTruthy(); }); + + it("submits requests to create new Jobs, then closes the dialog", fakeAsync(() => { + expect(dialogRef.close).not.toHaveBeenCalled(); + component.onSubmit(new SubmitEvent("submit")); + tick(); + expect(dialogRef.close).toHaveBeenCalled(); + })); }); describe("NewInvalidationJobDialogComponent utility functions", () => { diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts index ad915d2f0a..7287700c66 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/new-invalidation-job-dialog/new-invalidation-job-dialog.component.ts @@ -104,7 +104,7 @@ export class NewInvalidationJobDialogComponent { this.startMinTime = startTime; this.startTime.setValue(startTime); this.ttl.setValue(parseInt(this.job.parameters.split(":")[1], 10)); - const regexp = this.job.assetUrl.split("/").slice(3).join("/") || "/"; + const regexp = this.job.assetUrl.split("/", 4).slice(3).join("/") || "/"; this.regexp.setValue(regexp); } else { this.startDate.setDate(this.startDate.getDate()+1); @@ -162,7 +162,7 @@ export class NewInvalidationJobDialogComponent { * * @param event The form submission event, which must be .preventDefault'd. */ - public onSubmit(event: Event): void { + public async onSubmit(event: Event): Promise { event.preventDefault(); event.stopPropagation(); @@ -170,8 +170,7 @@ export class NewInvalidationJobDialogComponent { try { re = new RegExp(this.regexp.value); } catch (err) { - this.regexpIsValid.next(`Must be a valid regular expression! (${err})`); - return; + return this.regexpIsValid.next(`Must be a valid regular expression! (${err instanceof Error ? err.message : err})`); } const startTime = new Date(this.startDate); @@ -180,8 +179,7 @@ export class NewInvalidationJobDialogComponent { startTime.setMinutes(minutes); if (this.job) { - this.editJob(this.job, re, startTime); - return; + return this.editJob(this.job, re, startTime); } const job = { @@ -191,18 +189,12 @@ export class NewInvalidationJobDialogComponent { ttl: this.ttl.value }; - this.jobAPI.createInvalidationJob(job).then( - r => { - if (r) { - this.dialogRef.close(true); - } else { - console.warn("failure"); - } - }, - err => { - console.error("error: ", err); - } - ); + try { + await this.jobAPI.createInvalidationJob(job); + this.dialogRef.close(true); + } catch (err) { + console.error("error: ", err); + } } /** From c8702670051e2c3a22fc2216fe6aa5bd8c2f1b12 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 26 Jan 2022 19:33:14 -0700 Subject: [PATCH 39/50] Expand test coverage of the Invalidation Jobs component --- .../invalidation-jobs.component.spec.ts | 84 +++++++++++++++---- .../invalidation-jobs.component.ts | 4 +- 2 files changed, 69 insertions(+), 19 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts index 7e8938cbc9..46f09e84ae 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.spec.ts @@ -12,13 +12,16 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { MatDialogModule } from "@angular/material/dialog"; +import { MatDialog, MatDialogModule } from "@angular/material/dialog"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; +import { type Observable, of } from "rxjs"; +import { DeliveryServiceService, InvalidationJobService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; -import { JobType } from "src/app/models"; +import { defaultDeliveryService, type InvalidationJob, JobType } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; import { CustomvalidityDirective } from "src/app/shared/validation/customvalidity.directive"; @@ -28,12 +31,14 @@ import { InvalidationJobsComponent } from "./invalidation-jobs.component"; describe("InvalidationJobsComponent", () => { let component: InvalidationJobsComponent; let fixture: ComponentFixture; + let router: Router; + let job: InvalidationJob; - beforeEach(waitForAsync(() => { + beforeEach(async () => { // mock the API const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); - TestBed.configureTestingModule({ + await TestBed.configureTestingModule({ declarations: [ InvalidationJobsComponent, TpHeaderComponent, @@ -44,23 +49,47 @@ describe("InvalidationJobsComponent", () => { FormsModule, HttpClientModule, ReactiveFormsModule, - RouterTestingModule, + RouterTestingModule.withRoutes([ + {component: InvalidationJobsComponent, path: "deliveryservice/:id/invalidation-jobs"} + ]), MatDialogModule ], providers: [ - { provide: CurrentUserService, useValue: mockCurrentUserService } + { provide: CurrentUserService, useValue: mockCurrentUserService }, + { provide: MatDialog, useValue: {open: (): {afterClosed: () => Observable} => ({ + afterClosed: () => of(true) + })}} ] - }); + }).compileComponents(); + + const dsService = TestBed.inject(DeliveryServiceService); + const ds = await dsService.createDeliveryService({...defaultDeliveryService}); - TestBed.compileComponents(); - })); + router = TestBed.inject(Router); + router.initialNavigation(); + const navigated = await router.navigate(["/deliveryservice", ds.id, "invalidation-jobs"]); + if (!navigated) { + return fail("navigation failed"); + } + expect(router.url).toBe(`/deliveryservice/${ds.id}/invalidation-jobs`); + + const jobService = TestBed.inject(InvalidationJobService); + job = await jobService.createInvalidationJob({ + deliveryService: ds.xmlId, + regex: "/", + startTime: new Date(), + ttl: 178 + }); - beforeEach(() => { fixture = TestBed.createComponent(InvalidationJobsComponent); component = fixture.componentInstance; fixture.detectChanges(); }); + afterEach(async ()=> { + await expectAsync(component.deleteJob(job.id)).toBeResolved(); + }); + it("should create", () => { expect(component).toBeTruthy(); }); @@ -84,11 +113,32 @@ describe("InvalidationJobsComponent", () => { expect(component.isInProgress(j)).toBeFalse(); }); - afterAll(() => { - try{ - TestBed.resetTestingModule(); - } catch (e) { - console.error("error in InvalidationJobsComponent afterAll:", e); - } + it("calculates end dates", () => { + const j = { + assetUrl: "doesn't matter", + createdBy: "also doesn't matter", + deliveryService: "doesn't matter either", + id: -1, + keyword: JobType.PURGE, + parameters: "", + startTime: new Date(0), + }; + expect(()=>component.endDate(j)).toThrow(); + + j.parameters = "TTL"; + expect(()=>component.endDate(j)).toThrow(); + + j.parameters = "TTL:not a number"; + expect(()=>component.endDate(j)).toThrow(); + + const expected = new Date(0); + expected.setHours(expected.getHours()+178); + j.parameters = "TTL:178h"; + expect(component.endDate(j)).toEqual(expected); + }); + + it("opens the create/edit dialog", () => { + component.editJob(job); + component.newJob(); }); }); diff --git a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts index 60910e585c..72f49e9f6f 100644 --- a/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts +++ b/experimental/traffic-portal/src/app/core/invalidation-jobs/invalidation-jobs.component.ts @@ -11,13 +11,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, OnInit } from "@angular/core"; +import { Component, type OnInit } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { ActivatedRoute } from "@angular/router"; import { faPlus, faTrash, faPencilAlt } from "@fortawesome/free-solid-svg-icons"; import { DeliveryServiceService, InvalidationJobService } from "src/app/api"; -import { defaultDeliveryService, DeliveryService, InvalidationJob } from "src/app/models"; +import { defaultDeliveryService, type DeliveryService, type InvalidationJob } from "src/app/models"; import { NewInvalidationJobDialogComponent } from "./new-invalidation-job-dialog/new-invalidation-job-dialog.component"; From ab59099046dc256b54b43daa8ee1a8d927c85d7e Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 26 Jan 2022 19:47:16 -0700 Subject: [PATCH 40/50] Expand test coverage of the App Component (to 100%) --- .../src/app/app.component.spec.ts | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/experimental/traffic-portal/src/app/app.component.spec.ts b/experimental/traffic-portal/src/app/app.component.spec.ts index 5ebcda1f0d..5df03a66b5 100644 --- a/experimental/traffic-portal/src/app/app.component.spec.ts +++ b/experimental/traffic-portal/src/app/app.component.spec.ts @@ -13,39 +13,54 @@ */ import { HttpClientModule } from "@angular/common/http"; -import { TestBed, waitForAsync } from "@angular/core/testing"; +import { fakeAsync, TestBed, tick } from "@angular/core/testing"; import { MatSnackBarModule } from "@angular/material/snack-bar"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; +import { of } from "rxjs"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { AppComponent } from "./app.component"; describe("AppComponent", () => { - beforeEach(waitForAsync(() => { - const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); + let component: AppComponent; + let mockCurrentUserService: jasmine.SpyObj; + + beforeEach(() => { + mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"], {userChanged: of(null)}); TestBed.configureTestingModule({ declarations: [ AppComponent ], imports: [ HttpClientModule, - RouterTestingModule, + RouterTestingModule.withRoutes([{component: AppComponent, path: "login"}]), MatSnackBarModule ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }] }).compileComponents(); - })); + const fixture = TestBed.createComponent(AppComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); it("should create the app", () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app).toBeTruthy(); + expect(component).toBeTruthy(); }); it("should have as title 'Traffic Portal'", () => { - const fixture = TestBed.createComponent(AppComponent); - const app = fixture.componentInstance; - expect(app.title).toEqual("Traffic Portal"); + expect(component.title).toEqual("Traffic Portal"); }); + + it("logs out", fakeAsync(() => { + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(mockCurrentUserService.logout).not.toHaveBeenCalled(); + component.logout(); + tick(); + // eslint-disable-next-line @typescript-eslint/unbound-method + expect(mockCurrentUserService.logout).toHaveBeenCalled(); + const router = TestBed.inject(Router); + expect(router.url).toBe("/login"); + })); }); From e541fd3d509b10e034e8376180d1094f4fe552ac Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 27 Jan 2022 11:08:45 -0700 Subject: [PATCH 41/50] Expand test coverage of the Current User component (to 100%) Also updated the actual component to use an async method to handle form submission, for ease-of-use. --- .../api/testing/invalidation-job.service.ts | 4 +- .../currentuser/currentuser.component.spec.ts | 139 +++++++++++++++--- .../core/currentuser/currentuser.component.ts | 35 ++--- 3 files changed, 134 insertions(+), 44 deletions(-) diff --git a/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts b/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts index b04d748e75..4c19f7aa38 100644 --- a/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts +++ b/experimental/traffic-portal/src/app/api/testing/invalidation-job.service.ts @@ -60,8 +60,8 @@ export class InvalidationJobService { ret = ret.filter(j=>j.id===opts.id); } if (opts.dsID) { - // TODO: implement this - throw new Error("filtering by dsID not implemented in testing services"); + const ds = await this.dsService.getDeliveryServices(opts.dsID); + ret = ret.filter(j=>j.deliveryService === ds.xmlId); } if (opts.userId) { // TODO: implement this diff --git a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts index d619e5d0c0..256604cf65 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.spec.ts @@ -12,12 +12,15 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; -import { MatDialogModule } from "@angular/material/dialog"; +import { type ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; +import { MatDialog, MatDialogModule } from "@angular/material/dialog"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; +import { Subject } from "rxjs"; +import { UserService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; -import { newCurrentUser } from "src/app/models"; +import type { CurrentUser } from "src/app/models"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; import { TpHeaderComponent } from "src/app/shared/tp-header/tp-header.component"; @@ -26,10 +29,21 @@ import { CurrentuserComponent } from "./currentuser.component"; describe("CurrentuserComponent", () => { let component: CurrentuserComponent; let fixture: ComponentFixture; + let dialogClose: Subject; + let updateSpy: jasmine.Spy; + let updateSucceeded: boolean; + let currentUser: null | CurrentUser = null; + let api: UserService; - beforeEach(waitForAsync(() => { - const mockCurrentUserService = jasmine.createSpyObj(["getCurrentUser", "getCapabilities", - "getLoggedIn", "setUser", "hasPermission", "logout", "updateCurrentUser", "login", "logout"]); + beforeEach(fakeAsync(() => { + updateSucceeded = false; + updateSpy = jasmine.createSpy("CurrentUserService's `updateCurrentuser` method", async () => { + currentUser = await api.getCurrentUser(); + return updateSucceeded; + }); + updateSpy.and.callThrough(); + + dialogClose = new Subject(); TestBed.configureTestingModule({ declarations: [ @@ -39,33 +53,116 @@ describe("CurrentuserComponent", () => { imports: [ APITestingModule, HttpClientModule, - RouterTestingModule, + RouterTestingModule.withRoutes([{component: CurrentuserComponent, path: ""}]), MatDialogModule ], providers: [ - { provide: CurrentUserService, useValue: mockCurrentUserService}, + { + provide: CurrentUserService, + useValue: { + get currentUser(): CurrentUser | null { + return currentUser; + }, + updateCurrentUser: async (): Promise => updateSpy() + } + }, + { + provide: MatDialog, + useValue: { + open: (): {afterClosed: () => Subject} => ({ + afterClosed: () => dialogClose + }) + } + } ] }); TestBed.compileComponents(); - })); - - beforeEach(() => { + api = TestBed.inject(UserService); + api.getCurrentUser().then( + u => { + currentUser = u; + } + ); + tick(); fixture = TestBed.createComponent(CurrentuserComponent); component = fixture.componentInstance; - component.currentUser = newCurrentUser(); + TestBed.inject(Router).initialNavigation(); fixture.detectChanges(); - }); + tick(); + })); - it("should create", () => { - component.currentUser = newCurrentUser(); + it("should create", fakeAsync(() => { + updateSucceeded = true; expect(component).toBeTruthy(); + component.currentUser = null; + component.ngOnInit(); + tick(); + expect(updateSpy).toHaveBeenCalled(); + expect(component.currentUser).not.toBeNull(); + })); + + it("toggles editing mode", () => { + expect(component.editMode).toBeFalse(); + expect(component.editUser).toBeNull(); + component.edit(); + expect(component.editMode).toBeTrue(); + expect(component.editUser).toEqual(component.currentUser); + component.cancelEdit(); + expect(component.editMode).toBeFalse(); + component.currentUser = null; + expect(()=>component.edit()).toThrow(); + expect(()=>component.cancelEdit()).toThrow(); }); - afterAll(() => { - try{ - TestBed.resetTestingModule(); - } catch (e) { - console.error("error in CurrentUserComponent afterAll:", e); + it("sets edit mode from query parameters", fakeAsync(()=>{ + const router = TestBed.inject(Router); + router.navigate(["."], {queryParams: {edit: true}}); + tick(); + component.ngOnInit(); + expect(component.editMode).toBeTrue(); + router.navigate(["."], {queryParams: {edit: true, updatePassword: true}}); + tick(); + component.ngOnInit(); + expect(component.editMode).toBeTrue(); + tick(); + expect(router.url).toContain("edit=true"); + expect(router.url).toContain("updatePassword=true"); + dialogClose.next(void undefined); + tick(); + expect(router.url).toBe("/?edit=true"); + })); + + it("submits user update requests", fakeAsync(()=>{ + if (component.currentUser === null) { + return fail("component initialized with null current User"); } - }); + + expectAsync(component.submitEdit(new Event("submit"))).toBeRejected(); + + component.editUser = { + ...component.currentUser, + confirmLocalPasswd: "not undefined", + localPasswd: "not undefined", + }; + component.submitEdit(new Event("submit")); + tick(); + + expect(updateSpy).toHaveBeenCalledTimes(1); + expect(component.currentUser.localPasswd).toBeUndefined(); + expect(component.currentUser.confirmLocalPasswd).toBeUndefined(); + expect(component.editUser.confirmLocalPasswd).toBeUndefined(); + expect(component.editUser.localPasswd).toBeUndefined(); + + updateSucceeded = true; + component.submitEdit(new Event("submit")); + tick(); + + expect(updateSpy).toHaveBeenCalledTimes(2); + + component.editUser.id = -1; + component.submitEdit(new Event("submit")); + tick(); + + expect(updateSpy).toHaveBeenCalledTimes(2); + })); }); diff --git a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts index 90866f745b..92ffce55b5 100644 --- a/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts +++ b/experimental/traffic-portal/src/app/core/currentuser/currentuser.component.ts @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, OnInit } from "@angular/core"; +import { Component, type OnInit } from "@angular/core"; import { MatDialog } from "@angular/material/dialog"; import { ActivatedRoute, Router } from "@angular/router"; import { faEdit } from "@fortawesome/free-solid-svg-icons"; @@ -88,8 +88,7 @@ export class CurrentuserComponent implements OnInit { */ public edit(): void { if (!this.currentUser) { - console.error("cannot edit null user"); - return; + throw new Error("cannot edit null user"); } this.editUser = {...this.currentUser}; this.editing = true; @@ -126,7 +125,7 @@ export class CurrentuserComponent implements OnInit { * * @param e The form submittal event. */ - public submitEdit(e: Event): void { + public async submitEdit(e: Event): Promise { e.preventDefault(); e.stopPropagation(); if (this.editUser === null) { @@ -137,23 +136,17 @@ export class CurrentuserComponent implements OnInit { this.editUser.localPasswd = undefined; this.editUser.confirmLocalPasswd = undefined; - this.api.updateCurrentUser(this.editUser).then( - success => { - if (success) { - this.auth.updateCurrentUser().then( - updated => { - if (!updated) { - console.warn("Failed to fetch current user after successful update"); - } - this.currentUser = this.auth.currentUser; - this.cancelEdit(); - } - ); - } else { - console.warn("Editing the current user failed"); - this.cancelEdit(); - } + const success = await this.api.updateCurrentUser(this.editUser); + if (success) { + const updated = await this.auth.updateCurrentUser(); + if (!updated) { + console.warn("Failed to fetch current user after successful update"); } - ); + this.currentUser = this.auth.currentUser; + this.cancelEdit(); + } else { + console.warn("Editing the current user failed"); + this.cancelEdit(); + } } } From 4c37015eed363d5d69328346239b00f23fd29d8d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 27 Jan 2022 16:19:20 -0700 Subject: [PATCH 42/50] Expand test coverage of the DS Card component This also uncovered a bug in rendering HTTP_ONLY protocol strings, which is now fixed. --- .../core/ds-card/ds-card.component.spec.ts | 49 ++++++++++++------- .../src/app/core/ds-card/ds-card.component.ts | 26 +++++----- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts index 301fdcf13d..27f7dc396e 100644 --- a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.spec.ts @@ -12,11 +12,12 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { RouterTestingModule } from "@angular/router/testing"; +import { DeliveryServiceService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; -import type { DeliveryService } from "src/app/models"; +import { Protocol, protocolToString, defaultDeliveryService } from "src/app/models"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; import { LoadingComponent } from "src/app/shared/loading/loading.component"; @@ -25,10 +26,10 @@ import { DsCardComponent } from "./ds-card.component"; describe("DsCardComponent", () => { let component: DsCardComponent; let fixture: ComponentFixture; + let api: DeliveryServiceService; - beforeEach(waitForAsync(() => { - - TestBed.configureTestingModule({ + beforeEach(async () => { + await TestBed.configureTestingModule({ declarations: [ DsCardComponent, LoadingComponent, @@ -39,14 +40,11 @@ describe("DsCardComponent", () => { HttpClientModule, RouterTestingModule, ], - }); - TestBed.compileComponents(); - })); - - beforeEach(() => { + }).compileComponents(); + api = TestBed.inject(DeliveryServiceService); fixture = TestBed.createComponent(DsCardComponent); component = fixture.componentInstance; - component.deliveryService = {xmlId: "test-ds"} as DeliveryService; + component.deliveryService = await api.createDeliveryService({...defaultDeliveryService}); fixture.detectChanges(); }); @@ -54,11 +52,28 @@ describe("DsCardComponent", () => { expect(component).toBeTruthy(); }); - afterAll(() => { - try{ - TestBed.resetTestingModule(); - } catch (e) { - console.error("error in DSCardComponent afterAll:", e); - } + it("renders protocol strings", () => { + expect(component.protocolString).toBe(""); + + component.deliveryService.protocol = Protocol.HTTP; + expect(component.protocolString).toBe(protocolToString(component.deliveryService.protocol)); + component.deliveryService.protocol = Protocol.HTTPS; + expect(component.protocolString).toBe(protocolToString(component.deliveryService.protocol)); + component.deliveryService.protocol = Protocol.HTTP_TO_HTTPS; + expect(component.protocolString).toBe(protocolToString(component.deliveryService.protocol)); + component.deliveryService.protocol = Protocol.HTTP_AND_HTTPS; + expect(component.protocolString).toBe(protocolToString(component.deliveryService.protocol)); }); + + it("toggles its open state, and loads its data", fakeAsync(() => { + expect(component.open).toBeFalse(); + component.toggle(); + tick(); + expect(component.open).toBeTrue(); + expect(component.graphDataLoaded).toBeTrue(); + component.toggle(); + tick(); + expect(component.open).toBeFalse(); + expect(component.graphDataLoaded).toBeFalse(); + })); }); diff --git a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts index a387e8920f..3e0da712b7 100644 --- a/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts +++ b/experimental/traffic-portal/src/app/core/ds-card/ds-card.component.ts @@ -12,12 +12,18 @@ * limitations under the License. */ import { trigger, style, animate, transition } from "@angular/animations"; -import { Component, Input, OnInit } from "@angular/core"; +import { Component, Input, type OnInit } from "@angular/core"; import { faInfoCircle } from "@fortawesome/free-solid-svg-icons"; import { Subject } from "rxjs"; import { DeliveryServiceService } from "src/app/api"; -import { DataPoint, DataSet, DeliveryService, GeoProvider, protocolToString } from "src/app/models"; +import { + type DataPoint, + type DataSet, + type DeliveryService, + GeoProvider, + protocolToString +} from "src/app/models"; /** * DsCardComponent is a component for displaying information about a Delivery @@ -56,18 +62,19 @@ export class DsCardComponent implements OnInit { * The date to use as the 'current' date/time - the end of the date/time * range for the chart data. * - * The default is the time of the component's creation. + * If either `now` or `today` is not given, `now` will be set to the moment + * of the component's creation, and `today` will be based on that. */ - @Input() public now: Date = new Date(); + @Input() public now!: Date; /** * The date to use as the 'beginning of the current day' - the start of the * date/time range for the chart data. * - * The default is the time of the component's creation (which is the same - * as'now', so you really ought to specify!) + * If either `now` or `today` is not given, `now` will be set to the moment + * of the component's creation, and `today` will be based on that. */ - @Input() public today: Date = new Date(); + @Input() public today!: Date; /** * The number of cache servers available to serve traffic in this Delivery @@ -111,15 +118,12 @@ export class DsCardComponent implements OnInit { /** The Protocol of the Delivery Service as a string. */ public get protocolString(): string { - if (this.deliveryService.protocol) { + if (this.deliveryService.protocol !== undefined) { return protocolToString(this.deliveryService.protocol); } return ""; } - /** - * Constructor. - */ constructor(private readonly dsAPI: DeliveryServiceService) { this.deliveryService = { active: true, From 9ed60ed2437817eaef0e06f5bedc5d17c9bd433d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 27 Jan 2022 17:02:30 -0700 Subject: [PATCH 43/50] Expand test coverage of the Delivery Service component Also got rid of an unused property --- .../deliveryservice.component.spec.ts | 42 ++++++++++++------- .../deliveryservice.component.ts | 17 +++----- 2 files changed, 34 insertions(+), 25 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts index eaa053c856..67b4dfbe2c 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.spec.ts @@ -12,11 +12,13 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; +import { DeliveryServiceService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; +import { defaultDeliveryService } from "src/app/models"; import { AlertService } from "src/app/shared/alert/alert.service"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; @@ -28,11 +30,11 @@ describe("DeliveryserviceComponent", () => { let component: DeliveryserviceComponent; let fixture: ComponentFixture; - beforeEach(waitForAsync(() => { + beforeEach(async () => { // mock the API const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"]); - TestBed.configureTestingModule({ + await TestBed.configureTestingModule({ declarations: [ DeliveryserviceComponent, TpHeaderComponent, @@ -49,13 +51,13 @@ describe("DeliveryserviceComponent", () => { AlertService, { provide: CurrentUserService, useValue: mockCurrentUserService }, ] - }); - TestBed.compileComponents(); - })); + }).compileComponents(); + const dsService = TestBed.inject(DeliveryServiceService); + const ds = await dsService.createDeliveryService({...defaultDeliveryService}); - beforeEach(() => { fixture = TestBed.createComponent(DeliveryserviceComponent); component = fixture.componentInstance; + component.deliveryservice = ds; fixture.detectChanges(); }); @@ -63,11 +65,23 @@ describe("DeliveryserviceComponent", () => { expect(component).toBeTruthy(); }); - afterAll(() => { - try{ - TestBed.resetTestingModule(); - } catch (e) { - console.error("error in DeliveryServiceComponent afterAll:", e); - } - }); + it("loads TPS and bandwidth data charts", fakeAsync(() => { + component.toDate.setValue("2022-01-01"); + component.fromDate.setValue("2022-01-01"); + component.toTime.setValue("00:00"); + component.fromTime.setValue("00:20"); + component.newDateRange(); + tick(); + expectAsync(component.bandwidthData.toPromise().then( + ds => { + expect(ds.length).toBe(1); + } + )).toBeResolved(); + expectAsync(component.tpsChartData.toPromise().then( + ds => { + expect(ds.length).toBe(5); + } + )).toBeResolved(); + })); + }); diff --git a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts index 9519d22e93..1054c31aab 100644 --- a/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts +++ b/experimental/traffic-portal/src/app/core/deliveryservice/deliveryservice.component.ts @@ -35,9 +35,6 @@ export class DeliveryserviceComponent implements OnInit { /** The Delivery Service described by this component. */ public deliveryservice = {} as DeliveryService; - /** A map of the names of charts to whether or not they've been loaded. */ - public loaded = new Map([["main", false], ["bandwidth", false]]); - /** Data for the bandwidth chart. */ public bandwidthData = new Subject<[DataSet]>(); @@ -87,7 +84,6 @@ export class DeliveryserviceComponent implements OnInit { private readonly api: DeliveryServiceService, private readonly alerts: AlertService ) { - this.bandwidthData = new Subject<[DataSet]>(); this.bandwidthData.next([{ backgroundColor: "#BA3C57", borderColor: "#BA3C57", @@ -103,12 +99,6 @@ export class DeliveryserviceComponent implements OnInit { * fetching data. */ public ngOnInit(): void { - const DSID = this.route.snapshot.paramMap.get("id"); - if (!DSID) { - console.error("Missing route 'id' parameter"); - return; - } - this.to.setUTCMilliseconds(0); this.from = new Date(this.to.getFullYear(), this.to.getMonth(), this.to.getDate()); @@ -122,10 +112,15 @@ export class DeliveryserviceComponent implements OnInit { const timeStr = String(this.to.getHours()).padStart(2, "0").concat(":", String(this.to.getMinutes()).padStart(2, "0")); this.toTime = new FormControl(timeStr); + const DSID = this.route.snapshot.paramMap.get("id"); + if (!DSID) { + console.error("Missing route 'id' parameter"); + return; + } + this.api.getDeliveryServices(parseInt(DSID, 10)).then( d => { this.deliveryservice = d; - this.loaded.set("main", true); this.loadBandwidth(); this.loadTPS(); } From 74780ceea89aa352ae956134692e0a9b0158a10d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 27 Jan 2022 17:47:33 -0700 Subject: [PATCH 44/50] Expand Dashboard component test coverage --- .../dashboard/dashboard.component.spec.ts | 77 ++++++++++++------- .../app/core/dashboard/dashboard.component.ts | 12 +-- 2 files changed, 58 insertions(+), 31 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts index 1e0abbf0e0..48787a5d62 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.spec.ts @@ -12,12 +12,14 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { waitForAsync, ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, fakeAsync, tick } from "@angular/core/testing"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { Router } from "@angular/router"; import { RouterTestingModule } from "@angular/router/testing"; +import { DeliveryServiceService } from "src/app/api"; import { APITestingModule } from "src/app/api/testing"; -import { DeliveryService } from "src/app/models"; +import { defaultDeliveryService } from "src/app/models"; import { AlertService } from "src/app/shared/alert/alert.service"; import { LinechartDirective } from "src/app/shared/charts/linechart.directive"; import { CurrentUserService } from "src/app/shared/currentUser/current-user.service"; @@ -31,12 +33,13 @@ import { DashboardComponent } from "./dashboard.component"; describe("DashboardComponent", () => { let component: DashboardComponent; let fixture: ComponentFixture; + let router: Router; - beforeEach(waitForAsync(() => { + beforeEach(async () => { const mockCurrentUserService = jasmine.createSpyObj(["updateCurrentUser", "login", "logout"], {capabilities: new Set()}); - TestBed.configureTestingModule({ + await TestBed.configureTestingModule({ declarations: [ DashboardComponent, DsCardComponent, @@ -49,27 +52,35 @@ describe("DashboardComponent", () => { FormsModule, HttpClientModule, ReactiveFormsModule, - RouterTestingModule + RouterTestingModule.withRoutes([ + {component: DashboardComponent, path: ""} + ]) ], providers: [ { provide: CurrentUserService, useValue: mockCurrentUserService }, AlertService, ] - }); - TestBed.compileComponents(); - })); + }).compileComponents(); + const service = TestBed.inject(DeliveryServiceService); + const dss = [ + await service.createDeliveryService({ + ...defaultDeliveryService, + displayName: "FIZZbuzz", + xmlId: "fizz-buzz" + }), + await service.createDeliveryService({ + ...defaultDeliveryService, + displayName: "fooBAR", + xmlId: "foo-bar" + }) + ]; + + router = TestBed.inject(Router); + router.initialNavigation(); - beforeEach(() => { fixture = TestBed.createComponent(DashboardComponent); component = fixture.componentInstance; - component.deliveryServices = [ - { - displayName: "FIZZbuzz" - } as DeliveryService, - { - displayName: "fooBAR" - } as DeliveryService - ]; + component.deliveryServices = dss; fixture.detectChanges(); }); @@ -77,15 +88,29 @@ describe("DashboardComponent", () => { expect(component).toBeTruthy(); }); - it('sets the "search" query parameter', () => { - expect(true).toBeTruthy(); - }); + it('sets the "search" query parameter', fakeAsync(() => { + expect(router.url).toBe("/"); + component.fuzzControl.setValue("query"); + component.updateURL(new Event("")); + tick(); + expect(router.url).toBe("/?search=query"); + component.fuzzControl.setValue(""); + component.updateURL(new Event("")); + tick(); + expect(router.url).toBe("/"); + })); + + it("filters Delivery Services", () => { + expect(component.fuzzControl.value).toBe(""); + expect(component.filteredDSes).toEqual(component.deliveryServices); + + component.fuzzControl.setValue("fz"); + expect(component.filteredDSes.map(d=>d.displayName)).toEqual(["FIZZbuzz"]); + + component.fuzzControl.setValue("aoeu"); + expect(component.filteredDSes).toEqual([]); - afterAll(() => { - try{ - TestBed.resetTestingModule(); - } catch (e) { - console.error("error in DashboardComponent afterAll:", e); - } + component.fuzzControl.setValue("fb"); + expect(component.filteredDSes.map(d=>d.displayName)).toEqual(["fooBAR", "FIZZbuzz"]); }); }); diff --git a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts index ae50051c10..ec6e1df900 100644 --- a/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts +++ b/experimental/traffic-portal/src/app/core/dashboard/dashboard.component.ts @@ -11,7 +11,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, OnInit } from "@angular/core"; +import { Component, type OnInit } from "@angular/core"; import { FormControl } from "@angular/forms"; import { ActivatedRoute, Router } from "@angular/router"; @@ -39,10 +39,12 @@ export class DashboardComponent implements OnInit { * The set of Delivery Services filtered according to the search box text. */ public get filteredDSes(): DeliveryService[] { - if (!this.deliveryServices) { - return []; - } - return this.deliveryServices.map(x => [x, fuzzyScore(x.displayName, this.fuzzControl.value)]).filter(x => x[1] !== Infinity).sort( + return this.deliveryServices.map( + x => [ + x, + fuzzyScore(x.displayName.toLocaleLowerCase(), this.fuzzControl.value.toLocaleLowerCase()) + ] + ).filter(x => x[1] !== Infinity).sort( (a, b) => { if (a[1] > b[1]) { return 1; From 437ac4e9aef66dc7a13b5ee66f76680a311ec672 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 28 Jan 2022 08:29:45 -0700 Subject: [PATCH 45/50] Expand test coverage of the Cache Groups Table component --- .../cache-group-table.component.spec.ts | 18 ++++++++++++------ .../cache-group-table.component.ts | 11 +++-------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts index 82649265fe..1cd320a450 100644 --- a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts +++ b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.spec.ts @@ -12,7 +12,7 @@ * limitations under the License. */ import { HttpClientModule } from "@angular/common/http"; -import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { type ComponentFixture, TestBed, fakeAsync } from "@angular/core/testing"; import { ReactiveFormsModule } from "@angular/forms"; import { RouterTestingModule } from "@angular/router/testing"; @@ -33,11 +33,7 @@ describe("CacheGroupTableComponent", () => { ReactiveFormsModule, RouterTestingModule ], - }) - .compileComponents(); - }); - - beforeEach(() => { + }).compileComponents(); fixture = TestBed.createComponent(CacheGroupTableComponent); component = fixture.componentInstance; fixture.detectChanges(); @@ -46,4 +42,14 @@ describe("CacheGroupTableComponent", () => { it("should create", () => { expect(component).toBeTruthy(); }); + + it("emits the search box value", fakeAsync(() => { + component.fuzzControl.setValue("query"); + component.updateURL(); + expectAsync(component.fuzzySubject.toPromise()).toBeResolvedTo("query"); + })); + + it("doesn't throw errors when handling context menu events", () => { + expect(()=>component.handleContextMenu({action: "something", data: []})).not.toThrow(); + }); }); diff --git a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts index 9d4dc1be35..44b2d93332 100644 --- a/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts +++ b/experimental/traffic-portal/src/app/core/cache-groups/cache-group-table/cache-group-table.component.ts @@ -133,9 +133,6 @@ export class CacheGroupTableComponent implements OnInit { /** Form controller for the user search input. */ public fuzzControl: FormControl = new FormControl(""); - /** - * Constructor. - */ constructor(private readonly api: CacheGroupService, private readonly route: ActivatedRoute) { this.fuzzySubject = new BehaviorSubject(""); this.cacheGroups = this.api.getCacheGroups(); @@ -143,16 +140,14 @@ export class CacheGroupTableComponent implements OnInit { /** Initializes table data, loading it from Traffic Ops. */ public ngOnInit(): void { - this.route.queryParamMap.toPromise().then( + this.route.queryParamMap.subscribe( m => { const search = m.get("search"); if (search) { this.fuzzControl.setValue(decodeURIComponent(search)); - this.fuzzySubject.next(search); - this.fuzzySubject.next(this.fuzzControl.value); + this.updateURL(); } - } - ).catch( + }, e => { console.error("Failed to get query parameters:", e); } From b6092938accdf78fec97c4419ae5da0e6ba31c96 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 28 Jan 2022 08:32:24 -0700 Subject: [PATCH 46/50] npm audit fix --- experimental/traffic-portal/package-lock.json | 1374 ++++++++++------- experimental/traffic-portal/package.json | 2 +- 2 files changed, 789 insertions(+), 587 deletions(-) diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index 1669e63edd..ee4d55ce89 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -5,12 +5,12 @@ "requires": true, "dependencies": { "@ampproject/remapping": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.2.tgz", - "integrity": "sha512-SncaVxs+E3EdoA9xJgHfWPxZfowAgeIsd71VpqCKP6KNKm6s7zSqqvUc70UpKUFsrV3dAmy6qxHoIj5NG+3DiA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "1.0.0", + "@jridgewell/resolve-uri": "^3.0.3", "sourcemap-codec": "1.4.8" } }, @@ -25,38 +25,38 @@ } }, "@angular-devkit/build-angular": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.4.tgz", - "integrity": "sha512-MTvlUCb02J4ODXDsnit4N0PR9PkpKeSYpTPueaSBuWTBeP3dvMPZQabvb3C5QT/5yUzBiXQZq11QYx3Gui4StA==", - "dev": true, - "requires": { - "@ampproject/remapping": "1.0.2", - "@angular-devkit/architect": "0.1301.4", - "@angular-devkit/build-webpack": "0.1301.4", - "@angular-devkit/core": "13.1.4", - "@babel/core": "7.16.0", - "@babel/generator": "7.16.0", - "@babel/helper-annotate-as-pure": "7.16.0", - "@babel/plugin-proposal-async-generator-functions": "7.16.4", - "@babel/plugin-transform-async-to-generator": "7.16.0", - "@babel/plugin-transform-runtime": "7.16.4", - "@babel/preset-env": "7.16.4", - "@babel/runtime": "7.16.3", - "@babel/template": "7.16.0", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.0.tgz", + "integrity": "sha512-cHnm/P7uKJjKh2BCN8gnnd240J5z3IesQyRAx88kFSlL5sKCGyGoAYKAjU585/lllIXjtFXSR/S2d/cHg8ShKw==", + "dev": true, + "requires": { + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1302.0", + "@angular-devkit/build-webpack": "0.1302.0", + "@angular-devkit/core": "13.2.0", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.1.4", + "@ngtools/webpack": "13.2.0", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", "cacache": "15.3.0", "circular-dependency-plugin": "5.2.2", - "copy-webpack-plugin": "10.0.0", - "core-js": "3.19.3", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", "critters": "0.0.16", "css-loader": "6.5.1", - "esbuild": "0.14.11", - "esbuild-wasm": "0.14.11", + "esbuild": "0.14.14", + "esbuild-wasm": "0.14.14", "glob": "7.2.0", "https-proxy-agent": "5.0.0", "inquirer": "8.2.0", @@ -66,54 +66,54 @@ "less-loader": "10.2.0", "license-webpack-plugin": "4.0.0", "loader-utils": "3.2.0", - "mini-css-extract-plugin": "2.4.5", + "mini-css-extract-plugin": "2.5.3", "minimatch": "3.0.4", "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.1.0", - "postcss": "8.4.4", + "piscina": "3.2.0", + "postcss": "8.4.5", "postcss-import": "14.0.2", "postcss-loader": "6.2.1", "postcss-preset-env": "7.2.3", "regenerator-runtime": "0.13.9", - "resolve-url-loader": "4.0.0", + "resolve-url-loader": "5.0.0", "rxjs": "6.6.7", - "sass": "1.44.0", + "sass": "1.49.0", "sass-loader": "12.4.0", "semver": "7.3.5", - "source-map-loader": "3.0.0", + "source-map-loader": "3.0.1", "source-map-support": "0.5.21", - "stylus": "0.55.0", + "stylus": "0.56.0", "stylus-loader": "6.2.0", "terser": "5.10.0", "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.65.0", - "webpack-dev-middleware": "5.2.2", - "webpack-dev-server": "4.6.0", + "webpack": "5.67.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", - "webpack-subresource-integrity": "5.0.0" + "webpack-subresource-integrity": "5.1.0" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1301.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.4.tgz", - "integrity": "sha512-p6G8CEMnE+gYwxRyEttj3QGsuNJ3Kusi7iwBIzWyf2RpJSdGzXdwUEiRGg6iS0YHFr06/ZFfAWfnM2DQvNm4TA==", + "version": "0.1302.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.0.tgz", + "integrity": "sha512-1CmVYvxyfvK/khTcDJwwXibm/z4upM2j5SDpwuIdaLx21E4oQPmHn+U/quT/jE5VI1zfZi2vfvIaSXn9XQzMiQ==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.4", + "@angular-devkit/core": "13.2.0", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.4.tgz", - "integrity": "sha512-225Gjy4iVxh5Jo9njJnaG75M/Dt95UW+dEPCGWKV5E/++7UUlXlo9sNWq8x2vJm2nhtsPkpnXNOt4pW1mIDwqQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.0.tgz", + "integrity": "sha512-5+aV2W2QUazySMKusBuT2pi2qsXWpTHJG2x62mKGAy0lxzwG8l3if+WP3Uh85SQS+zqlHeKxEbmm9zNn8ZrzFg==", "dev": true, "requires": { - "ajv": "8.8.2", + "ajv": "8.9.0", "ajv-formats": "2.1.1", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", @@ -121,21 +121,30 @@ "source-map": "0.7.3" } }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, "@babel/core": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", - "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-compilation-targets": "^7.16.0", - "@babel/helper-module-transforms": "^7.16.0", - "@babel/helpers": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -159,12 +168,12 @@ } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dev": true, "requires": { - "@babel/types": "^7.16.0", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -177,24 +186,196 @@ } } }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "dev": true + }, "@babel/runtime": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", - "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dev": true, "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" } }, "ansi-styles": { @@ -206,16 +387,6 @@ "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", @@ -237,6 +408,18 @@ "parse5-htmlparser2-tree-adapter": "^6.0.1", "postcss": "^8.3.7", "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "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" + } + } } }, "css-select": { @@ -262,30 +445,30 @@ } }, "esbuild": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.11.tgz", - "integrity": "sha512-xZvPtVj6yecnDeFb3KjjCM6i7B5TCAQZT77kkW/CpXTMnd6VLnRPKrUB1XHI1pSq6a4Zcy3BGueQ8VljqjDGCg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.14.tgz", + "integrity": "sha512-aiK4ddv+uui0k52OqSHu4xxu+SzOim7Rlz4i25pMEiC8rlnGU0HJ9r+ZMfdWL5bzifg+nhnn7x4NSWTeehYblg==", "dev": true, "optional": true, "requires": { - "esbuild-android-arm64": "0.14.11", - "esbuild-darwin-64": "0.14.11", - "esbuild-darwin-arm64": "0.14.11", - "esbuild-freebsd-64": "0.14.11", - "esbuild-freebsd-arm64": "0.14.11", - "esbuild-linux-32": "0.14.11", - "esbuild-linux-64": "0.14.11", - "esbuild-linux-arm": "0.14.11", - "esbuild-linux-arm64": "0.14.11", - "esbuild-linux-mips64le": "0.14.11", - "esbuild-linux-ppc64le": "0.14.11", - "esbuild-linux-s390x": "0.14.11", - "esbuild-netbsd-64": "0.14.11", - "esbuild-openbsd-64": "0.14.11", - "esbuild-sunos-64": "0.14.11", - "esbuild-windows-32": "0.14.11", - "esbuild-windows-64": "0.14.11", - "esbuild-windows-arm64": "0.14.11" + "esbuild-android-arm64": "0.14.14", + "esbuild-darwin-64": "0.14.14", + "esbuild-darwin-arm64": "0.14.14", + "esbuild-freebsd-64": "0.14.14", + "esbuild-freebsd-arm64": "0.14.14", + "esbuild-linux-32": "0.14.14", + "esbuild-linux-64": "0.14.14", + "esbuild-linux-arm": "0.14.14", + "esbuild-linux-arm64": "0.14.14", + "esbuild-linux-mips64le": "0.14.14", + "esbuild-linux-ppc64le": "0.14.14", + "esbuild-linux-s390x": "0.14.14", + "esbuild-netbsd-64": "0.14.14", + "esbuild-openbsd-64": "0.14.14", + "esbuild-sunos-64": "0.14.14", + "esbuild-windows-32": "0.14.14", + "esbuild-windows-64": "0.14.14", + "esbuild-windows-arm64": "0.14.14" } }, "has-flag": { @@ -301,9 +484,9 @@ "dev": true }, "postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", "dev": true, "requires": { "nanoid": "^3.1.30", @@ -347,38 +530,50 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1301.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.4.tgz", - "integrity": "sha512-IcC3Y5WhreIV0uT90ITqJVgRqFjGwH72hftwLxkslaX+FJDcL36mhsNdyN66BJiuX7R85xUxHq3PEb9cZrllJA==", + "version": "0.1302.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.0.tgz", + "integrity": "sha512-x5BLdobF7c7j4W8frJuKM73ZYvPygjPN8vq1iKhsEraClqJG8cLiDwLEEFcrzIfmCHTX1o1o75sWC0FNln2LfQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1301.4", + "@angular-devkit/architect": "0.1302.0", "rxjs": "6.6.7" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1301.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.4.tgz", - "integrity": "sha512-p6G8CEMnE+gYwxRyEttj3QGsuNJ3Kusi7iwBIzWyf2RpJSdGzXdwUEiRGg6iS0YHFr06/ZFfAWfnM2DQvNm4TA==", + "version": "0.1302.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.0.tgz", + "integrity": "sha512-1CmVYvxyfvK/khTcDJwwXibm/z4upM2j5SDpwuIdaLx21E4oQPmHn+U/quT/jE5VI1zfZi2vfvIaSXn9XQzMiQ==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.4", + "@angular-devkit/core": "13.2.0", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.4.tgz", - "integrity": "sha512-225Gjy4iVxh5Jo9njJnaG75M/Dt95UW+dEPCGWKV5E/++7UUlXlo9sNWq8x2vJm2nhtsPkpnXNOt4pW1mIDwqQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.0.tgz", + "integrity": "sha512-5+aV2W2QUazySMKusBuT2pi2qsXWpTHJG2x62mKGAy0lxzwG8l3if+WP3Uh85SQS+zqlHeKxEbmm9zNn8ZrzFg==", "dev": true, "requires": { - "ajv": "8.8.2", + "ajv": "8.9.0", "ajv-formats": "2.1.1", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" } + }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } } } }, @@ -705,12 +900,30 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dev": true, "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-builder-binary-assignment-operator-visitor": { @@ -796,15 +1009,6 @@ "source-map": "^0.5.0" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-function-name": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", @@ -892,9 +1096,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -952,33 +1156,6 @@ "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^4.7.1" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-define-polyfill-provider": { @@ -1174,15 +1351,6 @@ "@babel/types": "^7.16.8" }, "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", @@ -1340,9 +1508,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -1454,13 +1622,13 @@ } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", - "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", "@babel/plugin-syntax-async-generators": "^7.8.4" } }, @@ -1625,33 +1793,6 @@ "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true - }, - "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-proposal-unicode-property-regex": { @@ -1800,14 +1941,41 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", - "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-remap-async-to-generator": "^7.16.0" + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-block-scoped-functions": { @@ -1864,15 +2032,6 @@ "source-map": "^0.5.0" } }, - "@babel/helper-annotate-as-pure": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", - "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } - }, "@babel/helper-function-name": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", @@ -1960,9 +2119,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -2144,9 +2303,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -2317,9 +2476,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -2491,9 +2650,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -2666,9 +2825,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -2838,9 +2997,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -3025,9 +3184,9 @@ } }, "@babel/parser": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.10.tgz", - "integrity": "sha512-Sm/S9Or6nN8uiFsQU1yodyDW3MWXQhFeqzMPM+t8MJjM+pLsnFVxFZzkpXKvUXh+Gz9cbMoYYs484+Jw/NTEFQ==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true }, "@babel/template": { @@ -3114,19 +3273,44 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", - "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", "semver": "^6.3.0" }, "dependencies": { + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3201,32 +3385,32 @@ } }, "@babel/preset-env": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", - "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-async-generator-functions": "^7.16.4", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-class-static-block": "^7.16.0", - "@babel/plugin-proposal-dynamic-import": "^7.16.0", - "@babel/plugin-proposal-export-namespace-from": "^7.16.0", - "@babel/plugin-proposal-json-strings": "^7.16.0", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-object-rest-spread": "^7.16.0", - "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-proposal-private-property-in-object": "^7.16.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", @@ -3241,47 +3425,87 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.16.0", - "@babel/plugin-transform-async-to-generator": "^7.16.0", - "@babel/plugin-transform-block-scoped-functions": "^7.16.0", - "@babel/plugin-transform-block-scoping": "^7.16.0", - "@babel/plugin-transform-classes": "^7.16.0", - "@babel/plugin-transform-computed-properties": "^7.16.0", - "@babel/plugin-transform-destructuring": "^7.16.0", - "@babel/plugin-transform-dotall-regex": "^7.16.0", - "@babel/plugin-transform-duplicate-keys": "^7.16.0", - "@babel/plugin-transform-exponentiation-operator": "^7.16.0", - "@babel/plugin-transform-for-of": "^7.16.0", - "@babel/plugin-transform-function-name": "^7.16.0", - "@babel/plugin-transform-literals": "^7.16.0", - "@babel/plugin-transform-member-expression-literals": "^7.16.0", - "@babel/plugin-transform-modules-amd": "^7.16.0", - "@babel/plugin-transform-modules-commonjs": "^7.16.0", - "@babel/plugin-transform-modules-systemjs": "^7.16.0", - "@babel/plugin-transform-modules-umd": "^7.16.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", - "@babel/plugin-transform-new-target": "^7.16.0", - "@babel/plugin-transform-object-super": "^7.16.0", - "@babel/plugin-transform-parameters": "^7.16.3", - "@babel/plugin-transform-property-literals": "^7.16.0", - "@babel/plugin-transform-regenerator": "^7.16.0", - "@babel/plugin-transform-reserved-words": "^7.16.0", - "@babel/plugin-transform-shorthand-properties": "^7.16.0", - "@babel/plugin-transform-spread": "^7.16.0", - "@babel/plugin-transform-sticky-regex": "^7.16.0", - "@babel/plugin-transform-template-literals": "^7.16.0", - "@babel/plugin-transform-typeof-symbol": "^7.16.0", - "@babel/plugin-transform-unicode-escapes": "^7.16.0", - "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.16.0", + "@babel/types": "^7.16.8", "babel-plugin-polyfill-corejs2": "^0.3.0", - "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", "babel-plugin-polyfill-regenerator": "^0.3.0", - "core-js-compat": "^3.19.1", + "core-js-compat": "^3.20.2", "semver": "^6.3.0" }, "dependencies": { + "@babel/compat-data": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "dev": true + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3543,15 +3767,15 @@ "dev": true }, "@jridgewell/resolve-uri": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", - "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.3.tgz", + "integrity": "sha512-fuIOnc81C5iRNevb/XPiM8Khp9bVjreydRQ37rt0C/dY0PAW1DRvEM3WrKX/5rStS5lbgwS0FCgqSndh9tvK5w==", "dev": true }, "@ngtools/webpack": { - "version": "13.1.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.4.tgz", - "integrity": "sha512-s8gzjG2nYHawFhlkHMkQWYrocHkBI1nF6T9K/oCSTIsq6kvTv//Ahno2VdBSgVq8uMnpv1TymvX0nFC4Dgn1HA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.0.tgz", + "integrity": "sha512-dQKPsEsST/HSBYtC75E0ARI1zVsW65h/NYzcAwtOd8DKFmlj8EZMqKC4KwcJ/EKlwR1PN12nBZhuQ1HUVH8Vtg==", "dev": true }, "@nguniversal/common": { @@ -3963,6 +4187,15 @@ "@types/node": "*" } }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/chart.js": { "version": "2.9.34", "resolved": "https://registry.npmjs.org/@types/chart.js/-/chart.js-2.9.34.tgz", @@ -3987,6 +4220,16 @@ "@types/node": "*" } }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -4000,9 +4243,9 @@ "dev": true }, "@types/eslint": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.0.tgz", - "integrity": "sha512-JUYa/5JwoqikCy7O7jKtuNe9Z4ZZt615G+1EKfaDGSNEpzaA2OwbV/G1v08Oa7fd1XzlFoSCvt9ePl9/6FyAug==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.1.tgz", + "integrity": "sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==", "dev": true, "requires": { "@types/estree": "*", @@ -4132,6 +4375,15 @@ "integrity": "sha512-OFUilxQg+rWL2FMxtmIgCkUDlJB6pskkpvmew7yeXfzzsOBb5rc+y2+DjHm+r3r1ZPPcJefK3DveNSYWGiy68g==", "dev": true }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/serve-static": { "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", @@ -4142,6 +4394,24 @@ "@types/node": "*" } }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.0.tgz", @@ -4882,15 +5152,15 @@ } }, "caniuse-lite": { - "version": "1.0.30001300", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", - "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "version": "1.0.30001303", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz", + "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==", "dev": true }, "electron-to-chromium": { - "version": "1.4.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", - "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", + "version": "1.4.56", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", + "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", "dev": true } } @@ -4989,13 +5259,13 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", - "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", + "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.0", - "core-js-compat": "^3.18.0" + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.20.0" } }, "babel-plugin-polyfill-regenerator": { @@ -5708,18 +5978,18 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, "copy-anything": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", - "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", "dev": true, "requires": { - "is-what": "^3.12.0" + "is-what": "^3.14.1" } }, "copy-webpack-plugin": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.0.0.tgz", - "integrity": "sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", "dev": true, "requires": { "fast-glob": "^3.2.7", @@ -5789,9 +6059,9 @@ } }, "core-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", - "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==", + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", "dev": true }, "core-js-compat": { @@ -5818,15 +6088,15 @@ } }, "caniuse-lite": { - "version": "1.0.30001300", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", - "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "version": "1.0.30001303", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz", + "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==", "dev": true }, "electron-to-chromium": { - "version": "1.4.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", - "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", + "version": "1.4.56", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", + "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", "dev": true }, "semver": { @@ -6099,12 +6369,6 @@ "whatwg-url": "^10.0.0" } }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, "debug": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", @@ -6603,134 +6867,134 @@ } }, "esbuild-android-arm64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.11.tgz", - "integrity": "sha512-6iHjgvMnC/SzDH8TefL+/3lgCjYWwAd1LixYfmz/TBPbDQlxcuSkX0yiQgcJB9k+ibZ54yjVXziIwGdlc+6WNw==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.14.tgz", + "integrity": "sha512-be/Uw6DdpQiPfula1J4bdmA+wtZ6T3BRCZsDMFB5X+k0Gp8TIh9UvmAcqvKNnbRAafSaXG3jPCeXxDKqnc8hFQ==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.11.tgz", - "integrity": "sha512-olq84ikh6TiBcrs3FnM4eR5VPPlcJcdW8BnUz/lNoEWYifYQ+Po5DuYV1oz1CTFMw4k6bQIZl8T3yxL+ZT2uvQ==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.14.tgz", + "integrity": "sha512-BEexYmjWafcISK8cT6O98E3TfcLuZL8DKuubry6G54n2+bD4GkoRD6HYUOnCkfl2p7jodA+s4369IjSFSWjtHg==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.11.tgz", - "integrity": "sha512-Jj0ieWLREPBYr/TZJrb2GFH8PVzDqiQWavo1pOFFShrcmHWDBDrlDxPzEZ67NF/Un3t6sNNmeI1TUS/fe1xARg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.14.tgz", + "integrity": "sha512-tnBKm41pDOB1GtZ8q/w26gZlLLRzVmP8fdsduYjvM+yFD7E2DLG4KbPAqFMWm4Md9B+DitBglP57FY7AznxbTg==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.11.tgz", - "integrity": "sha512-C5sT3/XIztxxz/zwDjPRHyzj/NJFOnakAanXuyfLDwhwupKPd76/PPHHyJx6Po6NI6PomgVp/zi6GRB8PfrOTA==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.14.tgz", + "integrity": "sha512-Q9Rx6sgArOHalQtNwAaIzJ6dnQ8A+I7f/RsQsdkS3JrdzmnlFo8JEVofTmwVQLoIop7OKUqIVOGP4PoQcwfVMA==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.11.tgz", - "integrity": "sha512-y3Llu4wbs0bk4cwjsdAtVOesXb6JkdfZDLKMt+v1U3tOEPBdSu6w8796VTksJgPfqvpX22JmPLClls0h5p+L9w==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.14.tgz", + "integrity": "sha512-TJvq0OpLM7BkTczlyPIphcvnwrQwQDG1HqxzoYePWn26SMUAlt6wrLnEvxdbXAvNvDLVzG83kA+JimjK7aRNBA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.11.tgz", - "integrity": "sha512-Cg3nVsxArjyLke9EuwictFF3Sva+UlDTwHIuIyx8qpxRYAOUTmxr2LzYrhHyTcGOleLGXUXYsnUVwKqnKAgkcg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.14.tgz", + "integrity": "sha512-h/CrK9Baimt5VRbu8gqibWV7e1P9l+mkanQgyOgv0Ng3jHT1NVFC9e6rb1zbDdaJVmuhWX5xVliUA5bDDCcJeg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.11.tgz", - "integrity": "sha512-oeR6dIrrojr8DKVrxtH3xl4eencmjsgI6kPkDCRIIFwv4p+K7ySviM85K66BN01oLjzthpUMvBVfWSJkBLeRbg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.14.tgz", + "integrity": "sha512-IC+wAiIg/egp5OhQp4W44D9PcBOH1b621iRn1OXmlLzij9a/6BGr9NMIL4CRwz4j2kp3WNZu5sT473tYdynOuQ==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.11.tgz", - "integrity": "sha512-vcwskfD9g0tojux/ZaTJptJQU3a7YgTYsptK1y6LQ/rJmw7U5QJvboNawqM98Ca3ToYEucfCRGbl66OTNtp6KQ==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.14.tgz", + "integrity": "sha512-gxpOaHOPwp7zSmcKYsHrtxabScMqaTzfSQioAMUaB047YiMuDBzqVcKBG8OuESrYkGrL9DDljXr/mQNg7pbdaQ==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.11.tgz", - "integrity": "sha512-+e6ZCgTFQYZlmg2OqLkg1jHLYtkNDksxWDBWNtI4XG4WxuOCUErLqfEt9qWjvzK3XBcCzHImrajkUjO+rRkbMg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.14.tgz", + "integrity": "sha512-6QVul3RI4M5/VxVIRF/I5F+7BaxzR3DfNGoqEVSCZqUbgzHExPn+LXr5ly1C7af2Kw4AHpo+wDqx8A4ziP9avw==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.11.tgz", - "integrity": "sha512-Rrs99L+p54vepmXIb87xTG6ukrQv+CzrM8eoeR+r/OFL2Rg8RlyEtCeshXJ2+Q66MXZOgPJaokXJZb9snq28bw==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.14.tgz", + "integrity": "sha512-4Jl5/+xoINKbA4cesH3f4R+q0vltAztZ6Jm8YycS8lNhN1pgZJBDxWfI6HUMIAdkKlIpR1PIkA9aXQgZ8sxFAg==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.11.tgz", - "integrity": "sha512-JyzziGAI0D30Vyzt0HDihp4s1IUtJ3ssV2zx9O/c+U/dhUHVP2TmlYjzCfCr2Q6mwXTeloDcLS4qkyvJtYptdQ==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.14.tgz", + "integrity": "sha512-BitW37GxeebKxqYNl4SVuSdnIJAzH830Lr6Mkq3pBHXtzQay0vK+IeOR/Ele1GtNVJ+/f8wYM53tcThkv5SC5w==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.11.tgz", - "integrity": "sha512-DoThrkzunZ1nfRGoDN6REwmo8ZZWHd2ztniPVIR5RMw/Il9wiWEYBahb8jnMzQaSOxBsGp0PbyJeVLTUatnlcw==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.14.tgz", + "integrity": "sha512-vLj6p76HOZG3wfuTr5MyO3qW5iu8YdhUNxuY+tx846rPo7GcKtYSPMusQjeVEfZlJpSYoR+yrNBBxq+qVF9zrw==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.11.tgz", - "integrity": "sha512-12luoRQz+6eihKYh1zjrw0CBa2aw3twIiHV/FAfjh2NEBDgJQOY4WCEUEN+Rgon7xmLh4XUxCQjnwrvf8zhACw==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.14.tgz", + "integrity": "sha512-fn8looXPQhpVqUyCBWUuPjesH+yGIyfbIQrLKG05rr1Kgm3rZD/gaYrd3Wpmf5syVZx70pKZPvdHp8OTA+y7cQ==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.11.tgz", - "integrity": "sha512-l18TZDjmvwW6cDeR4fmizNoxndyDHamGOOAenwI4SOJbzlJmwfr0jUgjbaXCUuYVOA964siw+Ix+A+bhALWg8Q==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.14.tgz", + "integrity": "sha512-HdAnJ399pPff3SKbd8g+P4o5znseni5u5n5rJ6Z7ouqOdgbOwHe2ofZbMow17WMdNtz1IyOZk2Wo9Ve6/lZ4Rg==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.11.tgz", - "integrity": "sha512-bmYzDtwASBB8c+0/HVOAiE9diR7+8zLm/i3kEojUH2z0aIs6x/S4KiTuT5/0VKJ4zk69kXel1cNWlHBMkmavQg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.14.tgz", + "integrity": "sha512-bmDHa99ulsGnYlh/xjBEfxoGuC8CEG5OWvlgD+pF7bKKiVTbtxqVCvOGEZeoDXB+ja6AvHIbPxrEE32J+m5nqQ==", "dev": true, "optional": true }, "esbuild-wasm": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.11.tgz", - "integrity": "sha512-9e1R6hv0hiU+BkJI2edqUuWfXUbOP2Mox+Ijl/uY1vLLlSsunkrcADqD/4Rz+VCEDzw6ecscJM+uJqR2fRmEUg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.14.tgz", + "integrity": "sha512-qTjK4MWnYtQHCMGg2qDUqeFYXfVvYq5qJkQTIsOV4VZCknoYePVaDTG9ygEB9Ct0kc0DWs7IrS6Ja+GjY62Kzw==", "dev": true }, "esbuild-windows-32": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.11.tgz", - "integrity": "sha512-J1Ys5hMid8QgdY00OBvIolXgCQn1ARhYtxPnG6ESWNTty3ashtc4+As5nTrsErnv8ZGUcWZe4WzTP/DmEVX1UQ==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.14.tgz", + "integrity": "sha512-6tVooQcxJCNenPp5GHZBs/RLu31q4B+BuF4MEoRxswT+Eq2JGF0ZWDRQwNKB8QVIo3t6Svc5wNGez+CwKNQjBg==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.11.tgz", - "integrity": "sha512-h9FmMskMuGeN/9G9+LlHPAoiQk9jlKDUn9yA0MpiGzwLa82E7r1b1u+h2a+InprbSnSLxDq/7p5YGtYVO85Mlg==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.14.tgz", + "integrity": "sha512-kl3BdPXh0/RD/dad41dtzj2itMUR4C6nQbXQCyYHHo4zoUoeIXhpCrSl7BAW1nv5EFL8stT1V+TQVXGZca5A2A==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.11", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.11.tgz", - "integrity": "sha512-dZp7Krv13KpwKklt9/1vBFBMqxEQIO6ri7Azf8C+ob4zOegpJmha2XY9VVWP/OyQ0OWk6cEeIzMJwInRZrzBUQ==", + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.14.tgz", + "integrity": "sha512-dCm1wTOm6HIisLanmybvRKvaXZZo4yEVrHh1dY0v582GThXJOzuXGja1HIQgV09RpSHYRL3m4KoUBL00l6SWEg==", "dev": true, "optional": true }, @@ -7990,12 +8254,12 @@ } }, "http-proxy-middleware": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", - "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz", + "integrity": "sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g==", "dev": true, "requires": { - "@types/http-proxy": "^1.17.5", + "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", "is-glob": "^4.0.1", "is-plain-obj": "^3.0.0", @@ -9234,23 +9498,54 @@ } }, "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", "dev": true, "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" }, "dependencies": { - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + } } } }, @@ -9422,9 +9717,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz", - "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", "dev": true, "requires": { "schema-utils": "^4.0.0" @@ -9590,9 +9885,9 @@ "dev": true }, "nanoid": { - "version": "3.1.30", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", - "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==" }, "natural-compare": { "version": "1.4.0", @@ -9654,9 +9949,9 @@ "optional": true }, "node-forge": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", - "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", "dev": true }, "node-gyp": { @@ -10267,9 +10562,9 @@ } }, "piscina": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", - "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", "dev": true, "requires": { "eventemitter-asyncresource": "^1.0.0", @@ -10677,15 +10972,15 @@ } }, "caniuse-lite": { - "version": "1.0.30001300", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz", - "integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==", + "version": "1.0.30001303", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz", + "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==", "dev": true }, "electron-to-chromium": { - "version": "1.4.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz", - "integrity": "sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ==", + "version": "1.4.56", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", + "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", "dev": true } } @@ -11009,12 +11304,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -11290,15 +11579,15 @@ "dev": true }, "resolve-url-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", - "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", "dev": true, "requires": { "adjust-sourcemap-loader": "^4.0.0", "convert-source-map": "^1.7.0", "loader-utils": "^2.0.0", - "postcss": "^7.0.35", + "postcss": "^8.2.14", "source-map": "0.6.1" }, "dependencies": { @@ -11313,22 +11602,6 @@ "json5": "^2.1.2" } }, - "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", - "dev": true - }, - "postcss": { - "version": "7.0.39", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", - "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", - "dev": true, - "requires": { - "picocolors": "^0.2.1", - "source-map": "^0.6.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11421,13 +11694,14 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", - "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", + "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0" + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" } }, "sass-loader": { @@ -11563,12 +11837,12 @@ } }, "selfsigned": { - "version": "1.10.14", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", - "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", + "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", "dev": true, "requires": { - "node-forge": "^0.10.0" + "node-forge": "^1.2.0" } }, "semver": { @@ -11876,14 +12150,14 @@ "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" }, "source-map-loader": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", - "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", "dev": true, "requires": { "abab": "^2.0.5", - "iconv-lite": "^0.6.2", - "source-map-js": "^0.6.2" + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" }, "dependencies": { "iconv-lite": { @@ -11894,6 +12168,12 @@ "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true } } }, @@ -12017,51 +12297,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - } - } - }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -12138,42 +12373,17 @@ "dev": true }, "stylus": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", - "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", "dev": true, "requires": { "css": "^3.0.0", - "debug": "~3.1.0", + "debug": "^4.3.2", "glob": "^7.1.6", - "mkdirp": "~1.0.4", "safer-buffer": "^2.1.2", "sax": "~1.2.4", - "semver": "^6.3.0", "source-map": "^0.7.3" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "stylus-loader": { @@ -12583,24 +12793,6 @@ "punycode": "^2.1.0" } }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12809,9 +13001,9 @@ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, "webpack": { - "version": "5.65.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", - "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "version": "5.67.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", + "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -12828,7 +13020,7 @@ "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -12837,7 +13029,7 @@ "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", "watchpack": "^2.3.1", - "webpack-sources": "^3.2.2" + "webpack-sources": "^3.2.3" }, "dependencies": { "ajv": { @@ -12852,6 +13044,12 @@ "uri-js": "^4.2.2" } }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -12872,9 +13070,9 @@ } }, "webpack-dev-middleware": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz", - "integrity": "sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", "dev": true, "requires": { "colorette": "^2.0.10", @@ -12908,11 +13106,16 @@ } }, "webpack-dev-server": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", - "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", "dev": true, "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", "ansi-html-community": "^0.0.8", "bonjour": "^3.5.0", "chokidar": "^3.5.2", @@ -12930,13 +13133,12 @@ "p-retry": "^4.5.0", "portfinder": "^1.0.28", "schema-utils": "^4.0.0", - "selfsigned": "^1.10.11", + "selfsigned": "^2.0.0", "serve-index": "^1.9.1", "sockjs": "^0.3.21", "spdy": "^4.0.2", "strip-ansi": "^7.0.0", - "url": "^0.11.0", - "webpack-dev-middleware": "^5.2.1", + "webpack-dev-middleware": "^5.3.0", "ws": "^8.1.0" }, "dependencies": { @@ -13029,9 +13231,9 @@ "dev": true }, "webpack-subresource-integrity": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.0.0.tgz", - "integrity": "sha512-x9514FpLRydO+UAQ8DY4aLtCjxmdLkuQVcDFN1kGzuusREYJ1B0rzk/iIlWiL6dnvrhEGFj2+UsdxDkP8Z4UKg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", "dev": true, "requires": { "typed-assert": "^1.0.8" diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index d32c02389c..ac6ec16fe0 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -56,7 +56,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^13.1.4", + "@angular-devkit/build-angular": "^13.2.0", "@angular-eslint/builder": "13.0.1", "@angular-eslint/eslint-plugin": "13.0.1", "@angular-eslint/eslint-plugin-template": "13.0.1", From 4e7a015c9f98115e3e3c7af09cc811ba0447fe4c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 28 Jan 2022 08:38:45 -0700 Subject: [PATCH 47/50] Upgrade Angular to version 13.2.0 --- experimental/traffic-portal/package-lock.json | 268 ++++++++++++------ experimental/traffic-portal/package.json | 28 +- 2 files changed, 189 insertions(+), 107 deletions(-) diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index ee4d55ce89..47e055160e 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -15,12 +15,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1301.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.3.tgz", - "integrity": "sha512-fFSevgYGZHCybYoyTkZ9b1YCSthBmoi77alwWjqMhYXUNXx7yx50zJZ6Ur2v3YpctVjU6eoGc5FDFyVHwXT0Iw==", + "version": "0.1302.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.0.tgz", + "integrity": "sha512-1CmVYvxyfvK/khTcDJwwXibm/z4upM2j5SDpwuIdaLx21E4oQPmHn+U/quT/jE5VI1zfZi2vfvIaSXn9XQzMiQ==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.3", + "@angular-devkit/core": "13.2.0", "rxjs": "6.6.7" } }, @@ -578,26 +578,40 @@ } }, "@angular-devkit/core": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.3.tgz", - "integrity": "sha512-o14jGDk4h14dVYYQafOn+2rq9CDmDMbDV6logqKYCLzTDRlK8gccDnqJM/QKAlfWCzbllZqcHDmg6FyoRLO9RQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.0.tgz", + "integrity": "sha512-5+aV2W2QUazySMKusBuT2pi2qsXWpTHJG2x62mKGAy0lxzwG8l3if+WP3Uh85SQS+zqlHeKxEbmm9zNn8ZrzFg==", "dev": true, "requires": { - "ajv": "8.8.2", + "ajv": "8.9.0", "ajv-formats": "2.1.1", "fast-json-stable-stringify": "2.1.0", "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } } }, "@angular-devkit/schematics": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.3.tgz", - "integrity": "sha512-TvjThB/pFXNFM0j0WX5yg0L2/3xNsqawQuWhkDJ05MBDEnSxbgv5hmOzNL8SNIEMgP0VbSTHtSg5kZvmNiH7vg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.0.tgz", + "integrity": "sha512-EwoqDqLJH5YpWiLuQJwonnJu2bi4xQlyKXyUTuXsQ4gIsAPrg+ijyAe+F/brAtDLBj0sU7JHoC0U1yx2pZ7f1A==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.3", + "@angular-devkit/core": "13.2.0", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", @@ -675,32 +689,32 @@ } }, "@angular/animations": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.1.2.tgz", - "integrity": "sha512-k1eQ8YZq3eelLhJDQjkRCt/4MXxwK2TFeGdtcYJF0G7vFOppE8hlI4PT7Bvmk08lTqvgiqtTI3ZaYmIINLfUMg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.0.tgz", + "integrity": "sha512-zLmNxkfxDQShJ97V9gTyQdlEbCD/zDUdpHXKlUViBIbe2M13FLGV3e2D+x9jGr/PRzFe0cukOnYxNEHJqqjqPA==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.1.2.tgz", - "integrity": "sha512-xORyqvfM0MueJpxHxVi3CR/X/f1RPKr45vt7NV6/x91OTnh2ukwxg++dAGuA6M5gUAHcVAcaBrfju4GQlU9hmg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.0.tgz", + "integrity": "sha512-1fQyfr/KmcF8y/Xz789DN37XgjQPE4kAYjoh6GRd62yKDm/Ic9hKuoKfAthA1bQeskjTO1pb4sMOgum8B4iHeA==", "requires": { "parse5": "^5.0.0", "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.1.3.tgz", - "integrity": "sha512-Ju/A8LFnfcv1PC665a5FiIQx9SXqB+3yWYFXPIiVkkRcye95gpfsbV48WW7QV35gzIwbR1m3H907Zg6ptiNv0A==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.0.tgz", + "integrity": "sha512-xrtClCucVSBwELG6zgaHrjC71p1rZOkwjF/HewnOFNjyjXSbWIO2y5d/6O2wxmNASoeStpiEU0zPpwDGhXiYpQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1301.3", - "@angular-devkit/core": "13.1.3", - "@angular-devkit/schematics": "13.1.3", - "@schematics/angular": "13.1.3", + "@angular-devkit/architect": "0.1302.0", + "@angular-devkit/core": "13.2.0", + "@angular-devkit/schematics": "13.2.0", + "@schematics/angular": "13.2.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.3", @@ -711,8 +725,8 @@ "npm-pick-manifest": "6.1.1", "open": "8.4.0", "ora": "5.4.1", - "pacote": "12.0.2", - "resolve": "1.20.0", + "pacote": "12.0.3", + "resolve": "1.22.0", "semver": "7.3.5", "symbol-observable": "4.0.0", "uuid": "8.3.2" @@ -726,29 +740,49 @@ "requires": { "ms": "2.1.2" } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } } } }, "@angular/common": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.1.2.tgz", - "integrity": "sha512-/8RWYQkZ1KPNvu2FANJM44wXlOMjMyxZVOEIn3llMRgxV2iiYtmluAOJNafTAbKedAuD6wiSpbi++QbioqCyyA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.0.tgz", + "integrity": "sha512-zyq3kscl5BoY+xxl4YOfbKP72xwzx/vKLE+2ougjPu2spm5KIllIAo/VrxVqIBrsGWT/4gs9pvIOqOdOfufxUA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.2.tgz", - "integrity": "sha512-xbM3eClhUIHEFR0Et1bVC18Q7+kJx+hNNWWQl63RNYYBxTZnZpXA3mYi6IcEasy7BHkobVW+5teqlibFQY4gfQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.0.tgz", + "integrity": "sha512-TTA+Mn31vAwI4qiaH0h8DqNV3DWgZF+Q9G8Qqbw17k8Jf+B5CdLkMYBF8wbGegIdsEfo+6DebCp71W+aJxuSlw==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.1.2.tgz", - "integrity": "sha512-yqM6RLcYtfwIuqBQ7eS7WdksBYY7Dh9sP4rElgLiEhDGIPQf6YE5zeuRThGq5pQ2fvHbNflw8QmTHu/18Y1u/g==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.0.tgz", + "integrity": "sha512-IDX0X3GXjhUzd/cFyNZBG3eVqh6Y2W7MYvH9tXbZHcJ6vH9RkN2+zh/XQautVWy4EP33oQoDlsydfYKqbHr9TA==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -765,49 +799,49 @@ } }, "@angular/core": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.2.tgz", - "integrity": "sha512-dsb90lUf8BELzdg7MgSMfPc36xzZKsDggOimfXhIvmctgc+H71Zo07KYTy5JVqsscLdT+A/KBvtU1bKk4P+Rfg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.0.tgz", + "integrity": "sha512-mWRWbbZ6k00AicA/GrxmWKaw8upo77sRQz4tSYKpwVKt2TtCeoW8OkdYUpnmuVjxpF0bD6PtVc0e1fD6es/ElA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.1.2.tgz", - "integrity": "sha512-r5I5cPngk2Erxe/OEL9Hl1j1VcNSAAyVzh7KmtOP8z7RZYCd0MeRISKrmA5CGn5Dh7A5POFLoOpBatmvnc4Z/A==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.0.tgz", + "integrity": "sha512-aduXLuvqynDRRdb316yY1O5rdMQ2DKeNxu5P2FG1nkLQ3hqZvpiaUMhFyXvKDG3s0rV5e/PZs1cpg0Aqdfwevw==", "requires": { "tslib": "^2.3.0" } }, "@angular/material": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.1.2.tgz", - "integrity": "sha512-M7eDgTMCZ/naoiS6Z5nj3N/sNUFc+CGPHX4yb563RuknqN7huDCvdyxA6KnhYLZsVlNCPh5ZrEr6H8ZiYJWcpg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.0.tgz", + "integrity": "sha512-VxseAkzEN2fakorQUa+r4enUhTAeY4gJ8NRbd0A7r0gKDLGcszJ1XYph4WiNs3bLkZUH1EirhOMAfpNOZ8SqFg==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.1.2.tgz", - "integrity": "sha512-yBUWtYJHr/1LuK3/YRRav2O82i6RHVPtRoAlZHoeTlh2CYA4u1m3JHq9XBrxIxSXexBX69pMrZENW1xskwKRTQ==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.0.tgz", + "integrity": "sha512-FB9eKdRqpjopTFbea5JXnqSPFR7DZD4nepOSGnYttV9cVj4pABqx2A6FJCnyvPPUSTamODye/pNkGmzP2P1gcw==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.2.tgz", - "integrity": "sha512-gABOn8DxGai56WmIt5o+eXtduabiq4Mlprg+6+dv+2PvWV871pLvswV9EGUSgwKXvbhBlDZDuNFU5LgvNDuGFg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.0.tgz", + "integrity": "sha512-VPL0uF/KWk+jBfkZwt60K6YbTFOvQzZbhwE4LttjjejstdvR0IMD3PtVDrdgIUWNfjikcCVN5Ds0GB6zZUb04Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-server": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.1.2.tgz", - "integrity": "sha512-fSrdMeLoypuH0NfivYnztfKbwZhAGtfFFfBYZL27gQJLDmYkbr5fWFe3e4cVNdY/J2LcIDUSJptQmnIC1EKOlA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.2.0.tgz", + "integrity": "sha512-hPskVX3OghY9c8nKQDb4yQ2Dfyjq3bSIXw9uixCnHXKouewxdM4kuJk9o3kplxy2M9+uvsFXPFK/Od1P7SrOhQ==", "requires": { "domino": "^2.1.2", "tslib": "^2.3.0", @@ -815,9 +849,9 @@ } }, "@angular/router": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.1.2.tgz", - "integrity": "sha512-5S0De6SdlbERoX9FwOBiTWxINchW7nTPUIH/tdanOqq12cqp6/7NigOr3BZDSvUNIh/6Is+pSQTKGAbhxejN2w==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.0.tgz", + "integrity": "sha512-8fWxcWT/LpaGhmXJ8xH+E7UObzt5IMGzK1sJGRu508y5tcbuBlTJt3yV97mCeUQ0g/E+2GEv6vuxY7OcfDaZow==", "requires": { "tslib": "^2.3.0" } @@ -3779,21 +3813,21 @@ "dev": true }, "@nguniversal/common": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@nguniversal/common/-/common-13.0.1.tgz", - "integrity": "sha512-/9q/G7K/3zkfVXafi2FciYgcsgyvYYJfp5ppHHlFl81YYALNJftEkk5go0K+PzLVvDSTcIvGtB4V5qRGob/Vyw==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@nguniversal/common/-/common-13.0.2.tgz", + "integrity": "sha512-HtjtPFmz/GhW2TnvxqdFdewL5NpTXYBA51U7RUjJtLs78xsW4rG3kfZEG20y6E3xn+++B0jJMfAx6Q+2cuRdig==", "requires": { - "critters": "0.0.14", - "jsdom": "18.0.0", + "critters": "0.0.16", + "jsdom": "19.0.0", "tslib": "^2.3.0" } }, "@nguniversal/express-engine": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-13.0.1.tgz", - "integrity": "sha512-af2hzfg+m+VGsXqNFFJ+He2Q8LplsuxvhlSRx04zqoC1jqf15Miz2UW6pHlHya4fDyU8Q6gSNWCqcApNLVkeJA==", + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/@nguniversal/express-engine/-/express-engine-13.0.2.tgz", + "integrity": "sha512-4CUBAYeatF8hl01hNdt372ANHjFFuaZ8rAYX64LWJSrlnt5a33NAbbHzMnAESbeo4LOkdG0XFQPB9IGG1MN5qw==", "requires": { - "@nguniversal/common": "13.0.1", + "@nguniversal/common": "13.0.2", "tslib": "^2.3.0" } }, @@ -4150,13 +4184,13 @@ } }, "@schematics/angular": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.1.3.tgz", - "integrity": "sha512-IixVWAEtN97N74PCxg3T03Ar/ECjGyJBWKAjKTTCrgNSWhm2mKgIc4RyI6cVCnltfJWIo48fcFhlOx/elShaCg==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.0.tgz", + "integrity": "sha512-DlUJ+ix9u/wz7IWc82dix5xsDGu0nztZ6Litrv+EsFDRYc95IFxTWuNwwjL2eRkI2KLIk79wmO7xhlUwrUyNlg==", "dev": true, "requires": { - "@angular-devkit/core": "13.1.3", - "@angular-devkit/schematics": "13.1.3", + "@angular-devkit/core": "13.2.0", + "@angular-devkit/schematics": "13.2.0", "jsonc-parser": "3.0.0" } }, @@ -6143,12 +6177,12 @@ } }, "critters": { - "version": "0.0.14", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.14.tgz", - "integrity": "sha512-YiBoGKfU8/xg+tVMw0KfMBgmr0TWa1JGmRXDzbQRQQaDarGUcZZtZEB25QyYrLasQZAnvqoZhSg2GW0zdsQkYQ==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", "requires": { "chalk": "^4.1.0", - "css-select": "^4.1.3", + "css-select": "^4.2.0", "parse5": "^6.0.1", "parse5-htmlparser2-tree-adapter": "^6.0.1", "postcss": "^8.3.7", @@ -6271,15 +6305,25 @@ "dev": true }, "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "requires": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "dependencies": { + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "requires": { + "domelementtype": "^2.2.0" + } + } } }, "css-selector-tokenizer": { @@ -8971,9 +9015,9 @@ "dev": true }, "jsdom": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-18.0.0.tgz", - "integrity": "sha512-HVLuBcFmwdWulStv5U+J59b1AyzXhM92KXlM8HQ3ecYtRM2OQEUCPMa4oNuDeCBmtRcC7tJvb0Xz5OeFXMOKTA==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", "requires": { "abab": "^2.0.5", "acorn": "^8.5.0", @@ -10066,17 +10110,49 @@ } }, "npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.1.tgz", + "integrity": "sha512-ricy4ezH3Uv0d4am6RSwHjCYTWJI74NJjurIigWMAG7Vs3PFyd0TUlkrez5L0AgaPzDLRsEzqb5cOZ/Ue01bmA==", "dev": true, "requires": { - "make-fetch-happen": "^9.0.1", + "make-fetch-happen": "^10.0.0", "minipass": "^3.1.3", "minipass-fetch": "^1.3.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.0.0", "npm-package-arg": "^8.0.0" + }, + "dependencies": { + "make-fetch-happen": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.0.0.tgz", + "integrity": "sha512-CREcDkbKZZ64g5MN1FT+u58mDHX9FQFFtFyio5HonX44BdQdytqPZBXUz+6ibi2w/6ncji59f2phyXGSMGpgzA==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + } } }, "npm-run-path": { @@ -10362,9 +10438,9 @@ "dev": true }, "pacote": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", - "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", "dev": true, "requires": { "@npmcli/git": "^2.1.0", @@ -10380,7 +10456,7 @@ "npm-package-arg": "^8.0.1", "npm-packlist": "^3.0.0", "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", + "npm-registry-fetch": "^12.0.0", "promise-retry": "^2.0.1", "read-package-json-fast": "^2.0.1", "rimraf": "^3.0.2", @@ -12406,6 +12482,12 @@ "has-flag": "^3.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index ac6ec16fe0..03419d750c 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -30,22 +30,22 @@ }, "private": true, "dependencies": { - "@angular/animations": "~13.1.2", - "@angular/cdk": "^13.1.2", - "@angular/common": "~13.1.2", - "@angular/compiler": "~13.1.2", - "@angular/core": "~13.1.2", - "@angular/forms": "~13.1.2", - "@angular/material": "^13.1.2", - "@angular/platform-browser": "~13.1.2", - "@angular/platform-browser-dynamic": "~13.1.2", - "@angular/platform-server": "^13.1.2", - "@angular/router": "~13.1.2", + "@angular/animations": "~13.2.0", + "@angular/cdk": "^13.2.0", + "@angular/common": "~13.2.0", + "@angular/compiler": "~13.2.0", + "@angular/core": "~13.2.0", + "@angular/forms": "~13.2.0", + "@angular/material": "^13.2.0", + "@angular/platform-browser": "~13.2.0", + "@angular/platform-browser-dynamic": "~13.2.0", + "@angular/platform-server": "^13.2.0", + "@angular/router": "~13.2.0", "@fortawesome/angular-fontawesome": "^0.10.0", "@fortawesome/fontawesome-svg-core": "^1.2.32", "@fortawesome/free-regular-svg-icons": "^5.15.2", "@fortawesome/free-solid-svg-icons": "^5.15.1", - "@nguniversal/express-engine": "^13.0.1", + "@nguniversal/express-engine": "^13.0.2", "ag-grid-angular": "^26.2.0", "ag-grid-community": "^26.2.0", "argparse": "^2.0.1", @@ -62,8 +62,8 @@ "@angular-eslint/eslint-plugin-template": "13.0.1", "@angular-eslint/schematics": "13.0.1", "@angular-eslint/template-parser": "13.0.1", - "@angular/cli": "~13.1.3", - "@angular/compiler-cli": "~13.1.2", + "@angular/cli": "~13.2.0", + "@angular/compiler-cli": "~13.2.0", "@types/argparse": "^2.0.2", "@types/chart.js": "^2.9.34", "@types/express": "^4.17.0", From 0afda1bbbe35525297f841812f4c1f9a021715e1 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 28 Jan 2022 09:01:19 -0700 Subject: [PATCH 48/50] Disable warning for imports that should be type-only I enabled that rule just for myself going through the project so that I could update things as I went along but because the rule isn't Angular-aware, it's emitting warnings for types used for dependency injection, which breaks compilation if 'fixed' (e.g. with 'ng lint --fix'). --- experimental/traffic-portal/.eslintrc.json | 1 - 1 file changed, 1 deletion(-) diff --git a/experimental/traffic-portal/.eslintrc.json b/experimental/traffic-portal/.eslintrc.json index 53a020112b..16e63c07ee 100644 --- a/experimental/traffic-portal/.eslintrc.json +++ b/experimental/traffic-portal/.eslintrc.json @@ -80,7 +80,6 @@ ], "@typescript-eslint/consistent-type-assertions": "error", "@typescript-eslint/consistent-type-definitions": "error", - "@typescript-eslint/consistent-type-imports": "warn", "@typescript-eslint/dot-notation": "error", "@typescript-eslint/explicit-function-return-type": "error", "@typescript-eslint/explicit-member-accessibility": [ From 58034c120c286eba2cf61d7c78a5d85987da7eb5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 28 Jan 2022 10:03:19 -0700 Subject: [PATCH 49/50] Replace typedoc with compodoc Has better support for Angular concepts. Also, is now an optional dependency rather than a development dependency. --- .../documentation.styles/style.css | 32 + experimental/traffic-portal/package-lock.json | 2730 ++++++++++++----- experimental/traffic-portal/package.json | 26 +- experimental/traffic-portal/tsconfig.doc.json | 18 + 4 files changed, 2051 insertions(+), 755 deletions(-) create mode 100644 experimental/traffic-portal/documentation.styles/style.css create mode 100644 experimental/traffic-portal/tsconfig.doc.json diff --git a/experimental/traffic-portal/documentation.styles/style.css b/experimental/traffic-portal/documentation.styles/style.css new file mode 100644 index 0000000000..fca4cce557 --- /dev/null +++ b/experimental/traffic-portal/documentation.styles/style.css @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +@import "./reset.css"; +@import "./bootstrap.min.css"; +@import "./bootstrap-card.css"; +@import "./prism.css"; +@import "./ionicons.min.css"; +@import "./compodoc.css"; +@import "./tablesort.css"; + +.img-responsive[data-type="custom-logo"] { + max-height: 150px; + display: block; + margin: auto; +} diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index 47e055160e..6673ed34f4 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -1,9 +1,15 @@ { "name": "traffic-portal", - "version": "0.3.0", + "version": "0.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@aduh95/viz.js": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@aduh95/viz.js/-/viz.js-3.5.0.tgz", + "integrity": "sha512-ahLdpRAoGsdgEfy2SGV2wnnHrBSLDHuwA32v+BoNGnz1gqajr8VMzF8y6mIQt28hHi4LQ272wqSi78DK4YdT2g==", + "optional": true + }, "@ampproject/remapping": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", @@ -581,7 +587,6 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.0.tgz", "integrity": "sha512-5+aV2W2QUazySMKusBuT2pi2qsXWpTHJG2x62mKGAy0lxzwG8l3if+WP3Uh85SQS+zqlHeKxEbmm9zNn8ZrzFg==", - "dev": true, "requires": { "ajv": "8.9.0", "ajv-formats": "2.1.1", @@ -595,7 +600,6 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -609,7 +613,6 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.0.tgz", "integrity": "sha512-EwoqDqLJH5YpWiLuQJwonnJu2bi4xQlyKXyUTuXsQ4gIsAPrg+ijyAe+F/brAtDLBj0sU7JHoC0U1yx2pZ7f1A==", - "dev": true, "requires": { "@angular-devkit/core": "13.2.0", "jsonc-parser": "3.0.0", @@ -866,7 +869,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", - "dev": true, "requires": { "@babel/highlight": "^7.16.0" } @@ -874,8 +876,7 @@ "@babel/compat-data": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", - "dev": true + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==" }, "@babel/core": { "version": "7.15.8", @@ -937,7 +938,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" }, @@ -945,14 +945,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -964,7 +962,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", - "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.16.7", "@babel/types": "^7.16.7" @@ -973,14 +970,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -992,7 +987,6 @@ "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.0", "@babel/helper-validator-option": "^7.14.5", @@ -1003,8 +997,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -1012,7 +1005,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -1027,7 +1019,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -1036,7 +1027,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -1047,7 +1037,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -1058,7 +1047,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1067,7 +1055,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1076,7 +1063,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1085,7 +1071,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1094,7 +1079,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-member-expression-to-functions": "^7.16.7", @@ -1107,7 +1091,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1115,14 +1098,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -1132,14 +1113,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -1150,7 +1129,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -1168,7 +1146,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1177,8 +1154,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -1186,7 +1162,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "regexpu-core": "^4.7.1" @@ -1196,7 +1171,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -1211,8 +1185,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -1220,7 +1193,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, "requires": { "@babel/types": "^7.16.7" }, @@ -1228,14 +1200,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1247,7 +1217,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", - "dev": true, "requires": { "@babel/types": "^7.16.7" }, @@ -1255,14 +1224,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1274,7 +1241,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.0", "@babel/template": "^7.16.0", @@ -1285,7 +1251,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/parser": "^7.16.0", @@ -1298,7 +1263,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -1307,7 +1271,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -1325,7 +1288,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -1371,14 +1333,12 @@ "@babel/helper-plugin-utils": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", - "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", - "dev": true + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-remap-async-to-generator": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-wrap-function": "^7.16.8", @@ -1388,14 +1348,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1428,7 +1386,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -1437,7 +1394,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dev": true, "requires": { "@babel/types": "^7.16.0" } @@ -1445,20 +1401,17 @@ "@babel/helper-validator-identifier": { "version": "7.15.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", - "dev": true + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" }, "@babel/helper-validator-option": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", - "dev": true + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" }, "@babel/helper-wrap-function": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.16.7", "@babel/template": "^7.16.7", @@ -1470,7 +1423,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -1479,7 +1431,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -1490,7 +1441,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -1501,7 +1451,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1510,7 +1459,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1519,7 +1467,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1527,14 +1474,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -1544,14 +1489,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -1562,7 +1505,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -1580,7 +1522,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -1589,8 +1530,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -1622,7 +1562,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", "chalk": "^2.0.0", @@ -1632,14 +1571,12 @@ "@babel/parser": { "version": "7.16.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", - "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==", - "dev": true + "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -1648,7 +1585,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", @@ -1659,7 +1595,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-remap-async-to-generator": "^7.16.8", @@ -1670,7 +1605,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1680,7 +1614,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -1691,7 +1624,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -1701,7 +1633,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -1711,7 +1642,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -1721,7 +1651,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -1731,7 +1660,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -1741,7 +1669,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -1751,7 +1678,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-compilation-targets": "^7.16.7", @@ -1764,7 +1690,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-validator-option": "^7.16.7", @@ -1775,14 +1700,12 @@ "@babel/helper-validator-option": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -1790,7 +1713,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -1800,7 +1722,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", @@ -1811,7 +1732,6 @@ "version": "7.16.11", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.16.10", "@babel/helper-plugin-utils": "^7.16.7" @@ -1821,7 +1741,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-create-class-features-plugin": "^7.16.7", @@ -1833,7 +1752,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -1843,7 +1761,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1852,7 +1769,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -1861,7 +1777,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -1870,7 +1785,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1879,7 +1793,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -1888,7 +1801,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1897,7 +1809,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -1906,7 +1817,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1915,7 +1825,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -1924,7 +1833,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1933,7 +1841,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1942,7 +1849,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -1951,7 +1857,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -1960,7 +1865,6 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -1969,7 +1873,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -1978,7 +1881,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -1989,7 +1891,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -1997,14 +1898,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2016,7 +1915,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2025,7 +1923,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2034,7 +1931,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.16.7", "@babel/helper-environment-visitor": "^7.16.7", @@ -2050,7 +1946,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -2059,7 +1954,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -2070,7 +1964,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -2081,7 +1974,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2090,7 +1982,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2099,7 +1990,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2108,7 +1998,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2117,7 +2006,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-member-expression-to-functions": "^7.16.7", @@ -2130,7 +2018,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2138,14 +2025,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -2155,14 +2040,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -2173,7 +2056,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -2191,7 +2073,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2200,8 +2081,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -2209,7 +2089,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2218,7 +2097,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2227,7 +2105,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -2237,7 +2114,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2246,7 +2122,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", - "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -2256,7 +2131,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2265,7 +2139,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.16.7", "@babel/helper-function-name": "^7.16.7", @@ -2276,7 +2149,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -2285,7 +2157,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-validator-option": "^7.16.7", @@ -2297,7 +2168,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -2308,7 +2178,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2316,20 +2185,17 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -2339,14 +2205,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -2357,7 +2221,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2366,8 +2229,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -2375,7 +2237,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2384,7 +2245,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -2393,7 +2253,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -2404,7 +2263,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -2413,7 +2271,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -2424,7 +2281,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -2435,7 +2291,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2444,7 +2299,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2453,7 +2307,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2462,7 +2315,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -2478,7 +2330,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2487,7 +2338,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2495,14 +2345,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -2512,14 +2360,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -2530,7 +2376,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -2548,7 +2393,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2557,8 +2401,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -2566,7 +2409,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -2578,7 +2420,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -2587,7 +2428,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -2598,7 +2438,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -2609,7 +2448,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2618,7 +2456,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2627,7 +2464,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2636,7 +2472,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -2652,7 +2487,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2661,7 +2495,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2669,14 +2502,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -2686,14 +2517,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -2704,7 +2533,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -2722,7 +2550,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2731,8 +2558,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -2740,7 +2566,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", - "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.7", "@babel/helper-module-transforms": "^7.16.7", @@ -2753,7 +2578,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -2762,7 +2586,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -2773,7 +2596,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -2784,7 +2606,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2793,7 +2614,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2802,7 +2622,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2811,7 +2630,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -2827,7 +2645,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2836,7 +2653,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2844,14 +2660,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -2861,14 +2675,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -2879,7 +2691,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -2897,7 +2708,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -2906,8 +2716,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -2915,7 +2724,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -2925,7 +2733,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -2934,7 +2741,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -2945,7 +2751,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -2956,7 +2761,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2965,7 +2769,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2974,7 +2777,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -2983,7 +2785,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-module-imports": "^7.16.7", @@ -2999,7 +2800,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3008,7 +2808,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3016,14 +2815,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -3033,14 +2830,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -3051,7 +2846,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -3069,7 +2863,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -3078,8 +2871,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -3087,7 +2879,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7" } @@ -3096,7 +2887,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3105,7 +2895,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-replace-supers": "^7.16.7" @@ -3115,7 +2904,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, "requires": { "@babel/highlight": "^7.16.7" } @@ -3124,7 +2912,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -3135,7 +2922,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, "requires": { "@babel/helper-get-function-arity": "^7.16.7", "@babel/template": "^7.16.7", @@ -3146,7 +2932,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3155,7 +2940,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3164,7 +2948,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3173,7 +2956,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3182,7 +2964,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.16.7", "@babel/helper-member-expression-to-functions": "^7.16.7", @@ -3195,7 +2976,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dev": true, "requires": { "@babel/types": "^7.16.7" } @@ -3203,14 +2983,12 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/highlight": { "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", @@ -3220,14 +2998,12 @@ "@babel/parser": { "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", - "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", - "dev": true + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/template": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/parser": "^7.16.7", @@ -3238,7 +3014,6 @@ "version": "7.16.10", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -3256,7 +3031,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -3265,8 +3039,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -3274,7 +3047,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3283,7 +3055,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3292,7 +3063,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", - "dev": true, "requires": { "regenerator-transform": "^0.14.2" } @@ -3301,7 +3071,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3357,7 +3126,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3366,7 +3134,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" @@ -3376,7 +3143,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3385,7 +3151,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3394,7 +3159,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3403,7 +3167,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.16.7" } @@ -3412,7 +3175,6 @@ "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.16.7", "@babel/helper-plugin-utils": "^7.16.7" @@ -3422,7 +3184,6 @@ "version": "7.16.11", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.8", "@babel/helper-compilation-targets": "^7.16.7", @@ -3503,14 +3264,12 @@ "@babel/compat-data": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", - "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", - "dev": true + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/helper-compilation-targets": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dev": true, "requires": { "@babel/compat-data": "^7.16.4", "@babel/helper-validator-option": "^7.16.7", @@ -3521,20 +3280,17 @@ "@babel/helper-validator-identifier": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { "version": "7.16.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "dev": true + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/types": { "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" @@ -3543,8 +3299,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -3552,7 +3307,6 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -3565,7 +3319,6 @@ "version": "7.15.4", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", - "dev": true, "requires": { "regenerator-runtime": "^0.13.4" } @@ -3595,7 +3348,6 @@ "version": "7.16.3", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.0", "@babel/generator": "^7.16.0", @@ -3612,7 +3364,6 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", - "dev": true, "requires": { "@babel/types": "^7.16.0", "jsesc": "^2.5.1", @@ -3622,8 +3373,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -3631,12 +3381,511 @@ "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", - "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.15.7", "to-fast-properties": "^2.0.0" } }, + "@compodoc/compodoc": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.18.tgz", + "integrity": "sha512-+AFtcj2U3AJq6r8a2+PTdajIlS7m3pgvDhqgoYZJ4Rg/Zp9xvuDvUJU+5oHu8iHCAWwda3NoLUDjOZMNR8uIKg==", + "optional": true, + "requires": { + "@angular-devkit/schematics": "^13.1.2", + "@babel/core": "^7.16.7", + "@babel/preset-env": "^7.16.7", + "@compodoc/live-server": "^1.2.3", + "@compodoc/ngd-transformer": "^2.1.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.10", + "chokidar": "^3.5.2", + "colors": "1.4.0", + "commander": "^8.3.0", + "cosmiconfig": "^7.0.1", + "decache": "^4.6.1", + "fancy-log": "^2.0.0", + "findit2": "^2.2.3", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "handlebars": "^4.7.7", + "html-entities": "^2.3.2", + "i18next": "^21.6.5", + "inside": "^1.0.0", + "json5": "^2.2.0", + "lodash": "^4.17.21", + "loglevel": "^1.8.0", + "loglevel-plugin-prefix": "^0.8.4", + "lunr": "^2.3.9", + "marked": "^4.0.9", + "minimist": "^1.2.5", + "opencollective-postinstall": "^2.0.3", + "os-name": "4.0.1", + "pdfjs-dist": "^2.12.313", + "pdfmake": "^0.2.4", + "semver": "^7.3.5", + "traverse": "^0.6.6", + "ts-morph": "^13.0.2", + "uuid": "^8.3.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "optional": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/core": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "optional": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + } + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "optional": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "optional": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "optional": true + } + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "optional": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "optional": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "optional": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "optional": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "optional": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "optional": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "optional": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "optional": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "optional": true + }, + "@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "optional": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/highlight": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "optional": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", + "optional": true + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "optional": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "optional": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "optional": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "optional": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.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==", + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "optional": true, + "requires": { + "has-flag": "^4.0.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==", + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "optional": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "optional": true, + "requires": { + "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==", + "optional": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "@compodoc/live-server": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@compodoc/live-server/-/live-server-1.2.3.tgz", + "integrity": "sha512-hDmntVCyjjaxuJzPzBx68orNZ7TW4BtHWMnXlIVn5dqhK7vuFF/11hspO1cMmc+2QTYgqde1TBcb3127S7Zrow==", + "optional": true, + "requires": { + "chokidar": "^3.5.2", + "colors": "1.4.0", + "connect": "^3.7.0", + "cors": "^2.8.5", + "event-stream": "4.0.1", + "faye-websocket": "0.11.x", + "http-auth": "4.1.9", + "http-auth-connect": "^1.0.5", + "morgan": "^1.10.0", + "object-assign": "^4.1.1", + "open": "8.4.0", + "proxy-middleware": "^0.15.0", + "send": "^0.17.2", + "serve-index": "^1.9.1" + }, + "dependencies": { + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "optional": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + } + } + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "optional": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "optional": true + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "optional": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "optional": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "optional": true + } + } + }, + "@compodoc/ngd-core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.1.0.tgz", + "integrity": "sha512-nyBH7J7SJJ2AV6OeZhJ02kRtVB7ALnZJKgShjoL9CNmOFEj8AkdhP9qTBIgjaDrbsW5pF4nx32KQL2fT7RFnqw==", + "optional": true, + "requires": { + "ansi-colors": "^4.1.1", + "fancy-log": "^1.3.3", + "typescript": "^4.0.3" + }, + "dependencies": { + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "optional": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + } + } + }, + "@compodoc/ngd-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.1.0.tgz", + "integrity": "sha512-Jo4VCMzIUtgIAdRmhHhOoRRE01gCjc5CyrUERRx0VgEzkkCm1Wmu/XHSsQP6tSpCYHBjERghqaDqH5DabkR2oQ==", + "optional": true, + "requires": { + "@aduh95/viz.js": "^3.1.0", + "@compodoc/ngd-core": "~2.1.0", + "dot": "^1.1.3", + "fs-extra": "^9.0.1" + } + }, "@discoveryjs/json-ext": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", @@ -3721,6 +3970,61 @@ } } }, + "@foliojs-fork/fontkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz", + "integrity": "sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==", + "optional": true, + "requires": { + "@foliojs-fork/restructure": "^2.0.2", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "@foliojs-fork/linebreak": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz", + "integrity": "sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==", + "optional": true, + "requires": { + "base64-js": "1.3.1", + "brfs": "^2.0.2", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "optional": true + } + } + }, + "@foliojs-fork/pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==", + "optional": true, + "requires": { + "@foliojs-fork/fontkit": "^1.9.1", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.0.0", + "png-js": "^1.0.0" + } + }, + "@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "optional": true + }, "@fortawesome/angular-fontawesome": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.10.1.tgz", @@ -3835,7 +4139,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3844,14 +4147,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4205,6 +4506,18 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" }, + "@ts-morph/common": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.3.tgz", + "integrity": "sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==", + "optional": true, + "requires": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, "@types/argparse": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.10.tgz", @@ -4376,8 +4689,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/q": { "version": "0.0.32", @@ -4868,6 +5180,25 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "optional": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "optional": true + } + } + }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -4955,7 +5286,6 @@ "version": "8.8.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -4967,7 +5297,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "requires": { "ajv": "^8.0.0" } @@ -4978,11 +5307,16 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "optional": true + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { "version": "4.3.2", @@ -4993,6 +5327,15 @@ "type-fest": "^0.21.3" } }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "optional": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -5002,28 +5345,46 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "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" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "optional": true + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, + "apache-crypt": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz", + "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==", + "optional": true, + "requires": { + "unix-crypt-td-js": "^1.1.4" + } + }, + "apache-md5": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz", + "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==", + "optional": true + }, "app-root-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", @@ -5072,6 +5433,12 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "optional": true + }, "array-includes": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", @@ -5123,11 +5490,69 @@ "safer-buffer": "~2.1.0" } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", + "optional": true, + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", + "optional": true, + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "optional": true + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", + "optional": true + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", + "optional": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", + "optional": true }, "ast-types-flow": { "version": "0.0.7", @@ -5149,8 +5574,7 @@ "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 + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "atob": { "version": "2.1.2", @@ -5255,7 +5679,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -5277,7 +5700,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, "requires": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.3.1", @@ -5287,8 +5709,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -5296,7 +5717,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.1.tgz", "integrity": "sha512-TihqEe4sQcb/QcPJvxe94/9RZuLQuF1+To4WqQcRvc+3J3gLCPIPgDKzGLG6zmQLfH3nn25heRuDNkS2KR4I8A==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.20.0" @@ -5306,7 +5726,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1" } @@ -5314,14 +5733,12 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "base64id": { "version": "2.0.0", @@ -5329,11 +5746,19 @@ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "optional": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" }, "bcrypt-pbkdf": { "version": "1.0.2", @@ -5344,6 +5769,12 @@ "tweetnacl": "^0.14.3" } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", + "optional": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5353,14 +5784,12 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5439,7 +5868,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5449,21 +5877,68 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } }, + "brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "optional": true, + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" + } + }, + "brotli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", + "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "optional": true, + "requires": { + "base64-js": "^1.1.2" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "optional": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "optional": true + } + } + }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", + "optional": true, + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "browserslist": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz", "integrity": "sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001280", "electron-to-chromium": "^1.3.896", @@ -5515,17 +5990,21 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "optional": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -5574,17 +6053,21 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "optional": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camelcase": { "version": "5.3.1", @@ -5595,8 +6078,7 @@ "caniuse-lite": { "version": "1.0.30001282", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz", - "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==", - "dev": true + "integrity": "sha512-YhF/hG6nqBEllymSIjLtR2iWDDnChvhnVJqp+vloyt2tEHFG1yBR+ac2B/rOw0qOK0m0lEXU2dv4E/sMk5P9Kg==" }, "canonical-path": { "version": "1.0.0", @@ -5614,7 +6096,6 @@ "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", @@ -5653,11 +6134,46 @@ "color-name": "^1.0.0" } }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "optional": true, + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "optional": true + } + } + }, + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "optional": true, + "requires": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + } + }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5697,7 +6213,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, "requires": { "restore-cursor": "^3.1.0" } @@ -5705,8 +6220,7 @@ "cli-spinners": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", - "dev": true + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==" }, "cli-width": { "version": "3.0.0", @@ -5728,8 +6242,7 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" }, "clone-deep": { "version": "4.0.1", @@ -5742,6 +6255,15 @@ "shallow-clone": "^3.0.0" } }, + "code-block-writer": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.0.tgz", + "integrity": "sha512-GEqWvEWWsOvER+g9keO4ohFoD3ymwyCnqY3hoTr7GZipYFwEhMHJw+TtV0rfgRhNImM6QWZGO2XYjlJVyYT62w==", + "optional": true, + "requires": { + "tslib": "2.3.1" + } + }, "codelyzer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", @@ -5838,8 +6360,7 @@ "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { "version": "2.0.16", @@ -5850,8 +6371,7 @@ "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" }, "combined-stream": { "version": "1.0.8", @@ -5935,14 +6455,50 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, "requires": { "debug": "2.6.9", "finalhandler": "1.1.2", @@ -5954,7 +6510,6 @@ "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" } @@ -5962,8 +6517,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -5996,7 +6550,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -6102,7 +6655,6 @@ "version": "3.20.3", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.3.tgz", "integrity": "sha512-c8M5h0IkNZ+I92QhIpuSijOxGAcj3lgpsWdkCqmUTZNwidujF4r3pi6x1DCN+Vcs5qTS2XWWMfWSuCqyupX8gw==", - "dev": true, "requires": { "browserslist": "^4.19.1", "semver": "7.0.0" @@ -6112,7 +6664,6 @@ "version": "4.19.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001286", "electron-to-chromium": "^1.4.17", @@ -6124,20 +6675,17 @@ "caniuse-lite": { "version": "1.0.30001303", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001303.tgz", - "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==", - "dev": true + "integrity": "sha512-/Mqc1oESndUNszJP0kx0UaQU9kEv9nNtJ7Kn8AdA0mNnH8eR1cj0kG+NbNuC1Wq/b21eA8prhKRA3bbkjONegQ==" }, "electron-to-chromium": { "version": "1.4.56", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.56.tgz", - "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==", - "dev": true + "integrity": "sha512-0k/S0FQqRRpJbX7YUjwCcLZ8D42RqGKtaiq90adXBOYgTIWwLA/g3toO8k9yEpqU8iC4QyaWYYWSTBIna8WV4g==" }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, @@ -6150,8 +6698,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cors": { "version": "2.8.5", @@ -6167,7 +6714,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -6238,13 +6784,18 @@ "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" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "optional": true + }, "css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -6388,12 +6939,27 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "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 }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "optional": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -6421,6 +6987,15 @@ "ms": "2.1.2" } }, + "decache": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.1.tgz", + "integrity": "sha512-ohApBM8u9ygepJCjgBrEZSSxPjc0T/PJkD+uNyxXPkqudyUpdXpwJYp0VISm2WrPVzASU6DZyIi6BWdyw7uJ2Q==", + "optional": true, + "requires": { + "callsite": "^1.0.0" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -6442,7 +7017,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", - "dev": true, "requires": { "is-arguments": "^1.0.4", "is-date-object": "^1.0.1", @@ -6470,7 +7044,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, "requires": { "clone": "^1.0.2" } @@ -6478,14 +7051,12 @@ "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -6572,6 +7143,12 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "dev": true }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "optional": true + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -6685,6 +7262,53 @@ "domhandler": "^4.2.0" } }, + "dot": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz", + "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", + "optional": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "optional": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "optional": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -6712,8 +7336,7 @@ "electron-to-chromium": { "version": "1.3.903", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.903.tgz", - "integrity": "sha512-+PnYAyniRRTkNq56cqYDLq9LyklZYk0hqoDy9GpcU11H5QjRmFZVDbxtgHUMK/YzdNTcn1XWP5gb+hFlSCr20g==", - "dev": true + "integrity": "sha512-+PnYAyniRRTkNq56cqYDLq9LyklZYk0hqoDy9GpcU11H5QjRmFZVDbxtgHUMK/YzdNTcn1XWP5gb+hFlSCr20g==" }, "emoji-regex": { "version": "8.0.0", @@ -6754,6 +7377,15 @@ } } }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "requires": { + "once": "^1.4.0" + } + }, "engine.io": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", @@ -6845,7 +7477,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -6895,6 +7526,40 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "optional": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -6907,7 +7572,41 @@ "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "^4.0.3" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "optional": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "optional": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" } }, "esbuild-android-arm64": { @@ -7045,8 +7744,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", @@ -7056,8 +7754,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { "version": "2.0.0", @@ -7531,8 +8228,13 @@ "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "optional": true }, "esutils": { "version": "2.0.3", @@ -7544,6 +8246,31 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "optional": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "optional": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, "eventemitter-asyncresource": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", @@ -7637,6 +8364,21 @@ } } }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -7671,17 +8413,24 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, + "fancy-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-2.0.0.tgz", + "integrity": "sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==", + "optional": true, + "requires": { + "color-support": "^1.1.3" + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7693,8 +8442,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -7711,7 +8459,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -7720,7 +8467,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, "requires": { "websocket-driver": ">=0.5.1" } @@ -7756,7 +8502,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -7822,6 +8567,12 @@ "path-exists": "^4.0.0" } }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "optional": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -7876,11 +8627,16 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "optional": 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", @@ -7906,21 +8662,18 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -7948,8 +8701,13 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "optional": true }, "get-caller-file": { "version": "2.0.5", @@ -7961,7 +8719,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -8003,7 +8760,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8017,7 +8773,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -8031,8 +8786,7 @@ "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" }, "globby": { "version": "11.0.4", @@ -8051,8 +8805,7 @@ "graceful-fs": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", - "dev": true + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" }, "handle-thing": { "version": "2.0.1", @@ -8060,6 +8813,27 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "optional": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -8100,7 +8874,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -8131,20 +8904,17 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, "has-tostringtag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -8230,8 +9000,7 @@ "html-entities": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", - "dev": true + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==" }, "html-escaper": { "version": "2.0.2", @@ -8239,6 +9008,36 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "optional": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-auth": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-4.1.9.tgz", + "integrity": "sha512-kvPYxNGc9EKGTXvOMnTBQw2RZfuiSihK/mLw/a4pbtRueTE45S55Lw/3k5CktIf7Ak0veMKEIteDj4YkNmCzmQ==", + "optional": true, + "requires": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.4.3", + "uuid": "^8.3.2" + } + }, + "http-auth-connect": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.5.tgz", + "integrity": "sha512-zykAOKpVAXyzhOLm6+xyB/RtRcfN3uDfH4Al73DIfeSb6B7nr0WToLI6UyyM6ohtcLmbBPksWXzVbEDStz8ObQ==", + "optional": true + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -8273,8 +9072,7 @@ "http-parser-js": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", - "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", - "dev": true + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==" }, "http-proxy": { "version": "1.18.1", @@ -8345,6 +9143,15 @@ "ms": "^2.0.0" } }, + "i18next": { + "version": "21.6.10", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.10.tgz", + "integrity": "sha512-Xw+tEGQ61BF6SXtBlFffhM/YhJKHZf2cyDrcNK/l2dE6yVbkPkSasC3VhkAsHXX30vUJ0yG04WIUtf7UvwjOxg==", + "optional": true, + "requires": { + "@babel/runtime": "^7.12.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -8362,8 +9169,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.1.9", @@ -8403,7 +9209,6 @@ "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" @@ -8412,8 +9217,7 @@ "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 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -8439,7 +9243,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -8448,8 +9251,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "2.0.0", @@ -8533,6 +9335,12 @@ } } }, + "inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inside/-/inside-1.0.0.tgz", + "integrity": "sha1-20Xpk1c82z23C5gy6ChbrUZCR3A=", + "optional": true + }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -8559,7 +9367,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8568,8 +9375,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, "is-bigint": { "version": "1.0.4", @@ -8584,7 +9390,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -8609,7 +9414,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -8618,7 +9422,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -8626,14 +9429,12 @@ "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -8645,7 +9446,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -8653,8 +9453,7 @@ "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" }, "is-lambda": { "version": "1.0.1", @@ -8671,8 +9470,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.6", @@ -8731,7 +9529,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -8746,8 +9543,7 @@ "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 + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { "version": "1.0.7", @@ -8776,8 +9572,7 @@ "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" }, "is-weakref": { "version": "1.0.1", @@ -8798,7 +9593,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "requires": { "is-docker": "^2.0.0" } @@ -8806,8 +9600,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isbinaryfile": { "version": "4.0.8", @@ -8818,8 +9611,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -8972,8 +9764,7 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "3.14.1", @@ -9058,8 +9849,7 @@ "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", @@ -9070,8 +9860,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.4.0", @@ -9082,8 +9871,7 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -9101,7 +9889,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, "requires": { "minimist": "^1.2.5" } @@ -9109,14 +9896,12 @@ "jsonc-parser": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", - "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", - "dev": true + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" }, "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" @@ -9444,8 +10229,7 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "loader-runner": { "version": "4.2.0", @@ -9471,14 +10255,12 @@ "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" }, "lodash.merge": { "version": "4.6.2", @@ -9490,7 +10272,6 @@ "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" @@ -9500,7 +10281,6 @@ "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" } @@ -9509,7 +10289,6 @@ "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" @@ -9519,7 +10298,6 @@ "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" } @@ -9527,14 +10305,12 @@ "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 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "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" } @@ -9593,11 +10369,22 @@ } } }, + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "optional": true + }, + "loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "optional": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -9606,13 +10393,18 @@ "version": "2.3.9", "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "optional": true + }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "optional": true }, "magic-string": { "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -9683,11 +10475,17 @@ } } }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "optional": true + }, "marked": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.10.tgz", "integrity": "sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw==", - "dev": true + "optional": true }, "media-typer": { "version": "0.3.0", @@ -9708,17 +10506,32 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "optional": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -9729,7 +10542,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -9757,8 +10569,7 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "mini-css-extract-plugin": { "version": "2.5.3", @@ -9802,7 +10613,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -9810,8 +10620,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.6", @@ -9893,14 +10702,49 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "moment": { "version": "2.29.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "optional": true, + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "optional": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "optional": true + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -9971,8 +10815,12 @@ "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, "nice-napi": { "version": "1.0.2", @@ -10026,8 +10874,7 @@ "node-releases": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", - "dev": true + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "nopt": { "version": "5.0.0", @@ -10041,8 +10888,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -10159,7 +11005,6 @@ "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": { "path-key": "^3.0.0" } @@ -10213,14 +11058,12 @@ "object-inspect": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", - "dev": true + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -10229,14 +11072,12 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -10272,14 +11113,12 @@ "on-headers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -10288,7 +11127,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -10297,13 +11135,18 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "optional": true + }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -10322,7 +11165,6 @@ "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, "requires": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -10339,7 +11181,6 @@ "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" } @@ -10348,7 +11189,6 @@ "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" @@ -10358,7 +11198,6 @@ "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" } @@ -10366,20 +11205,28 @@ "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 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "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" } } } }, + "os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "optional": true, + "requires": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -10474,7 +11321,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -10483,7 +11329,6 @@ "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", @@ -10494,8 +11339,7 @@ "parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==" }, "parse5": { "version": "5.1.1", @@ -10558,6 +11402,12 @@ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "optional": true + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10567,8 +11417,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -10579,14 +11428,12 @@ "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 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", @@ -10596,8 +11443,45 @@ "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "optional": true, + "requires": { + "through": "~2.3" + } + }, + "pdfjs-dist": { + "version": "2.12.313", + "resolved": "https://registry.npmjs.org/pdfjs-dist/-/pdfjs-dist-2.12.313.tgz", + "integrity": "sha512-1x6iXO4Qnv6Eb+YFdN5JdUzt4pAkxSp3aLAYPX93eQCyg/m7QFzXVWJHJVtoW48CI8HCXju4dSkhQZwoheL5mA==", + "optional": true + }, + "pdfmake": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.4.tgz", + "integrity": "sha512-EM39waHUe/Dg1W9C3XqYbpx6tfhYyU14JHZlI1HaW0AUEY32GbkRBjDLGWo9f7z/k3ea6k1p9yyDrflnvtZS1A==", + "optional": true, + "requires": { + "@foliojs-fork/linebreak": "^1.1.1", + "@foliojs-fork/pdfkit": "^0.13.0", + "iconv-lite": "^0.6.3", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } }, "performance-now": { "version": "2.1.0", @@ -10613,8 +11497,7 @@ "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pify": { "version": "2.3.0", @@ -10703,6 +11586,12 @@ } } }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==", + "optional": true + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", @@ -11115,8 +12004,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { "version": "2.0.3", @@ -11346,6 +12234,12 @@ "ipaddr.js": "1.9.1" } }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "optional": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -11358,6 +12252,16 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -11383,8 +12287,18 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "optional": true, + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + } }, "randombytes": { "version": "2.1.0", @@ -11434,7 +12348,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11445,7 +12358,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -11459,14 +12371,12 @@ "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", - "dev": true, "requires": { "regenerate": "^1.4.2" } @@ -11474,14 +12384,12 @@ "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", - "dev": true + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", - "dev": true, "requires": { "@babel/runtime": "^7.8.4" } @@ -11496,7 +12404,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3" @@ -11512,7 +12419,6 @@ "version": "4.8.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", - "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^9.0.0", @@ -11531,14 +12437,12 @@ "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", - "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", - "dev": true + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" }, "regjsparser": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -11546,8 +12450,7 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" } } }, @@ -11623,8 +12526,7 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", @@ -11642,7 +12544,6 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -11690,7 +12591,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, "requires": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -11705,8 +12605,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rfdc": { "version": "1.3.0", @@ -11733,7 +12632,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -11832,8 +12730,7 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "saxes": { "version": "5.0.1", @@ -11874,6 +12771,21 @@ } } }, + "scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "optional": true, + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -11925,7 +12837,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -12007,7 +12918,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -12022,7 +12932,6 @@ "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" } @@ -12031,7 +12940,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -12042,20 +12950,17 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" } } }, @@ -12096,11 +13001,16 @@ "kind-of": "^6.0.2" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "optional": 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" } @@ -12108,19 +13018,7 @@ "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 - }, - "shiki": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.10.0.tgz", - "integrity": "sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" - } + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", @@ -12136,8 +13034,7 @@ "signal-exit": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", - "dev": true + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "slash": { "version": "3.0.0", @@ -12217,8 +13114,7 @@ "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" }, "source-map-js": { "version": "0.6.2", @@ -12277,102 +13173,304 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "optional": true, + "requires": { + "through": "2" + } + }, + "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", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "optional": true, + "requires": { + "escodegen": "^1.11.1" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "optional": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2" + } + } + } + }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "optional": true, + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" + }, + "dependencies": { + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "optional": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "optional": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2" + } } } }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", - "dev": true - }, - "spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - } - }, - "spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "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", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "optional": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -12408,7 +13506,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -12416,8 +13513,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -12425,7 +13521,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -12439,8 +13534,7 @@ "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 + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-json-comments": { "version": "3.1.1", @@ -12477,7 +13571,6 @@ "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" } @@ -12600,8 +13693,43 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "optional": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } }, "thunky": { "version": "1.1.0", @@ -12609,6 +13737,18 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "optional": true + }, + "tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "optional": true + }, "tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -12621,14 +13761,12 @@ "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -12663,12 +13801,28 @@ "punycode": "^2.1.1" } }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "optional": true + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-morph": { + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.3.tgz", + "integrity": "sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==", + "optional": true, + "requires": { + "@ts-morph/common": "~0.12.3", + "code-block-writer": "^11.0.0" + } + }, "ts-node": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.3.0.tgz", @@ -12742,6 +13896,11 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -12772,24 +13931,16 @@ "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", "dev": true }, - "typedoc": { - "version": "0.22.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.22.11.tgz", - "integrity": "sha512-pVr3hh6dkS3lPPaZz1fNpvcrqLdtEvXmXayN55czlamSgvEjh+57GUqfhAI1Xsuu/hNHUT1KNSx8LH2wBP/7SA==", - "dev": true, - "requires": { - "glob": "^7.2.0", - "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.4", - "shiki": "^0.10.0" - } + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "optional": true }, "typescript": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", - "dev": true + "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==" }, "ua-parser-js": { "version": "0.7.31", @@ -12797,6 +13948,12 @@ "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, + "uglify-js": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz", + "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==", + "optional": true + }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -12812,14 +13969,12 @@ "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -12828,14 +13983,40 @@ "unicode-match-property-value-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", - "dev": true + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + }, + "unicode-properties": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.3.1.tgz", + "integrity": "sha512-nIV3Tf3LcUEZttY/2g4ZJtGXhWwSkuLL+rCu0DIAMbjyVPj+8j5gNVz4T/sVbnQybIsd5SFGkPKg/756OY6jlA==", + "optional": true, + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "optional": true, + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "optional": true + } + } }, "unique-filename": { "version": "1.1.1", @@ -12858,8 +14039,13 @@ "universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", + "optional": true }, "unpipe": { "version": "1.0.0", @@ -12870,7 +14056,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -12878,8 +14063,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -12889,8 +14073,7 @@ "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -12929,18 +14112,6 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, - "vscode-oniguruma": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.6.1.tgz", - "integrity": "sha512-vc4WhSIaVpgJ0jJIejjYxPvURJavX6QG41vu0mGhqywMkQqulezEqEQ3cO3gc8GvcOpX6ycmKGqRoROEMBNXTQ==", - "dev": true - }, - "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -12980,7 +14151,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, "requires": { "defaults": "^1.0.3" } @@ -13325,7 +14495,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, "requires": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -13335,8 +14504,7 @@ "websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "2.0.0", @@ -13374,7 +14542,6 @@ "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" } @@ -13413,11 +14580,60 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "optional": true, + "requires": { + "execa": "^4.0.2" + }, + "dependencies": { + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "optional": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "optional": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "optional": true + } + } + }, "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==" }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "optional": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -13452,8 +14668,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "8.2.3", @@ -13491,6 +14706,21 @@ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "optional": true, + "requires": { + "sax": "^1.2.1" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "optional": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13500,14 +14730,12 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "17.3.1", diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index 03419d750c..e1184dccb0 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -1,20 +1,36 @@ { "name": "traffic-portal", - "version": "0.3.0", + "version": "0.4.0", + "description": "The web UI for interacting with the Apache Traffic Control CDN management and operation system.", "homepage": "https://github.com/apache/trafficcontrol", "repository": { "type": "git", "url": "https://github.com/apache/trafficcontrol.git" }, - "author": "Apache Software Foundation", + "bugs": { + "email": "dev@trafficcontrol.apache.org", + "url": "https://github.com/apache/trafficcontrol/issues" + }, + "author": { + "email": "dev@trafficcontrol.apache.org", + "name": "Apache Software Foundation", + "url": "https://trafficcontrol.apache.org" + }, "license": "Apache-2.0", + "keywords": [ + "CDN", + "ATC", + "Traffic Control", + "Traffic Portal" + ], "engines": { "node": ">=14" }, "engineStrict": true, "scripts": { "ng": "ng", - "doc": "find ./src/ -name '*.ts' | grep -v 'spec.ts' | xargs typedoc --includeVersion --entryPoints", + "doc": "compodoc -p tsconfig.doc.json -d docs -y documentation.styles/ -n 'Traffic Portal Documentation' --theme material --disablePrivate --disableProtected --disableInternal --customLogo ./src/assets/logo.svg --customFavicon ./src/assets/logo.svg", + "doc:serve": "compodoc -s -p tsconfig.doc.json -d docs -y documentation.styles/ -n 'Traffic Portal Documentation' --theme material --disablePrivate --disableProtected --disableInternal --customLogo ./src/assets/logo.svg --customFavicon ./src/assets/logo.svg", "start": "ng serve", "build": "ng build", "test": "ng test", @@ -85,7 +101,9 @@ "karma-jasmine-html-reporter": "^1.5.0", "protractor": "~7.0.0", "ts-node": "~8.3.0", - "typedoc": "^0.22.11", "typescript": "^4.5.4" + }, + "optionalDependencies": { + "@compodoc/compodoc": "^1.1.18" } } diff --git a/experimental/traffic-portal/tsconfig.doc.json b/experimental/traffic-portal/tsconfig.doc.json new file mode 100644 index 0000000000..76bfdb25d8 --- /dev/null +++ b/experimental/traffic-portal/tsconfig.doc.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "src/**/*.spec.ts", + "src/test.ts" + ] +} From ff4d856d24531a9c21443a28b203d46a63d7b78b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 28 Jan 2022 10:27:58 -0700 Subject: [PATCH 50/50] Fix missing license headers --- experimental/traffic-portal/src/app/api/index.ts | 15 +++++++++++++++ .../traffic-portal/src/app/api/testing/index.ts | 14 ++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/experimental/traffic-portal/src/app/api/index.ts b/experimental/traffic-portal/src/app/api/index.ts index 3ba2648147..9086df5fb7 100644 --- a/experimental/traffic-portal/src/app/api/index.ts +++ b/experimental/traffic-portal/src/app/api/index.ts @@ -1,3 +1,18 @@ +/** + * @license Apache-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; diff --git a/experimental/traffic-portal/src/app/api/testing/index.ts b/experimental/traffic-portal/src/app/api/testing/index.ts index 64469a1556..09673a7b28 100644 --- a/experimental/traffic-portal/src/app/api/testing/index.ts +++ b/experimental/traffic-portal/src/app/api/testing/index.ts @@ -1,3 +1,17 @@ +/** + * @license Apache-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core";