From 268447bd5a606b30546b063f17ef00206ec5c697 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Mon, 3 Jan 2022 19:54:23 +0100 Subject: [PATCH 01/20] Small refactorings --- package-lock.json | 1304 +++++++---------- .../pages/User/UserInformationInput.tsx | 49 +- 2 files changed, 545 insertions(+), 808 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3af2d567..a95d7c96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2579,12 +2579,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/git/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", @@ -2675,18 +2669,6 @@ "node": ">=10" } }, - "node_modules/@npmcli/run-script/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@npmcli/run-script/node_modules/node-gyp": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", @@ -2756,23 +2738,6 @@ "node": ">=10" } }, - "node_modules/@npmcli/run-script/node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/@npmcli/run-script/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2788,12 +2753,6 @@ "node": ">= 8" } }, - "node_modules/@npmcli/run-script/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.4.3.tgz", @@ -4131,12 +4090,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@storybook/builder-webpack4/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@storybook/channel-postmessage": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-6.3.2.tgz", @@ -4858,12 +4811,6 @@ "node": ">=10" } }, - "node_modules/@storybook/core-common/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@storybook/core-events": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.3.2.tgz", @@ -5602,12 +5549,6 @@ "node": ">=10" } }, - "node_modules/@storybook/preset-create-react-app/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@storybook/react": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/@storybook/react/-/react-6.3.2.tgz", @@ -7016,11 +6957,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.20.0.tgz", @@ -7113,11 +7049,6 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.20.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.20.0.tgz", @@ -7463,56 +7394,53 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "node_modules/ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "dependencies": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" } }, - "node_modules/ansi-align/node_modules/ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true }, "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/ansi-align/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-align/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/ansi-colors": { @@ -7565,10 +7493,22 @@ "ansi-html": "bin/ansi-html" } }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } @@ -9225,27 +9165,6 @@ "rimraf": "bin.js" } }, - "node_modules/cacache/node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -10944,11 +10863,6 @@ "node": ">=10" } }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/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", @@ -12050,9 +11964,9 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "node_modules/dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "dependencies": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -12153,13 +12067,30 @@ } }, "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dependencies": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, + "node_modules/domhandler/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, "node_modules/domutils": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", @@ -13347,11 +13278,6 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-testing-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -13556,11 +13482,6 @@ "node": ">= 8" } }, - "node_modules/eslint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -15653,11 +15574,6 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, - "node_modules/html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, "node_modules/html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -15771,34 +15687,58 @@ } }, "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" } }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "node_modules/htmlparser2/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" }, - "engines": { - "node": ">= 6" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, "node_modules/http-cache-semantics": { @@ -16869,17 +16809,6 @@ "node": ">= 0.4" } }, - "node_modules/is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "dependencies": { - "html-comment-regex": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -18429,11 +18358,6 @@ "node": ">=10" } }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/jest-specific-snapshot": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jest-specific-snapshot/-/jest-specific-snapshot-4.0.0.tgz", @@ -18912,9 +18836,9 @@ } }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -18975,17 +18899,17 @@ ] }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/jsx-ast-utils": { @@ -19583,12 +19507,6 @@ "node": ">=10" } }, - "node_modules/make-fetch-happen/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -20052,11 +19970,6 @@ "node": ">=8" } }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -20069,11 +19982,6 @@ "node": ">= 8" } }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -20388,12 +20296,6 @@ "node": ">= 8" } }, - "node_modules/node-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, "node_modules/node-releases": { "version": "1.1.71", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz", @@ -20644,12 +20546,6 @@ "node": ">=10" } }, - "node_modules/npm-check-updates/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/npm-conf": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", @@ -20711,12 +20607,6 @@ "node": ">=10" } }, - "node_modules/npm-install-checks/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", @@ -20776,12 +20666,6 @@ "node": ">=10" } }, - "node_modules/npm-package-arg/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/npm-packlist": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", @@ -20839,12 +20723,6 @@ "node": ">=10" } }, - "node_modules/npm-pick-manifest/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/npm-registry-fetch": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", @@ -21535,29 +21413,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/pacote/node_modules/tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/pacote/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -21727,9 +21582,9 @@ } }, "node_modules/path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "1.8.0", @@ -23045,11 +22900,10 @@ } }, "node_modules/postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "dependencies": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -23238,11 +23092,6 @@ "node": ">= 10" } }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -23253,9 +23102,9 @@ } }, "node_modules/prismjs": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.0.tgz", - "integrity": "sha512-SqV5GRsNqnzCL8k5dfAjCNhUrF3pR0A9lTDSCUZeh/LIshheXJEaP0hwLz2t4XHivd2J/v2HR+gRnigzeKe3cQ==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==", "dev": true }, "node_modules/process": { @@ -24193,8 +24042,7 @@ "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-lifecycles-compat": { "version": "3.0.4", @@ -24612,14 +24460,14 @@ "integrity": "sha512-FQa1Q1thpr7ZIgoi3uKatFWLKN4GhRwY0YNSRZQkw2/Bcs6CBiz55IQQHNkaXNYPsTt4c9XQwn9UiuBnI35iyQ==" }, "node_modules/refractor": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.4.0.tgz", - "integrity": "sha512-dBeD02lC5eytm9Gld2Mx0cMcnR+zhSnsTfPpWqFaMgUMJfC9A6bcN3Br/NaXrnBJcuxnLFR90k1jrkaSyV8umg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", "dev": true, "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", - "prismjs": "~1.24.0" + "prismjs": "~1.25.0" }, "funding": { "type": "github", @@ -24963,15 +24811,89 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "node_modules/renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "dependencies": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/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==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/repeat-element": { @@ -25126,9 +25048,9 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "node_modules/resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", "dependencies": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -25136,7 +25058,7 @@ "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "1.2.3", - "postcss": "7.0.21", + "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" @@ -25145,17 +25067,6 @@ "node": ">=6.0.0" } }, - "node_modules/resolve-url-loader/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-url-loader/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -25164,43 +25075,6 @@ "node": ">=6" } }, - "node_modules/resolve-url-loader/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-url-loader/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/resolve-url-loader/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, "node_modules/resolve-url-loader/node_modules/emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", @@ -25209,14 +25083,6 @@ "node": ">= 0.10" } }, - "node_modules/resolve-url-loader/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-url-loader/node_modules/json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -25241,30 +25107,6 @@ "node": ">=4.0.0" } }, - "node_modules/resolve-url-loader/node_modules/postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/resolve-url-loader/node_modules/supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -25753,11 +25595,6 @@ "node": ">=10" } }, - "node_modules/sass-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -27334,6 +27171,22 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -27352,6 +27205,17 @@ "node": ">= 0.8.0" } }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/telejson": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/telejson/-/telejson-5.3.3.tgz", @@ -27746,9 +27610,9 @@ } }, "node_modules/tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "node_modules/to-arraybuffer": { "version": "1.0.1", @@ -28628,12 +28492,6 @@ "node": ">=10" } }, - "node_modules/update-notifier/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -28683,9 +28541,9 @@ } }, "node_modules/url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", + "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -29714,9 +29572,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "dependencies": { "async-limiter": "~1.0.0" } @@ -29734,15 +29592,33 @@ } }, "node_modules/webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", + "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", "dev": true, "dependencies": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" + "strip-ansi": "^6.0.0" + } + }, + "node_modules/webpack-hot-middleware/node_modules/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 + }, + "node_modules/webpack-hot-middleware/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/webpack-log": { @@ -30048,9 +29924,9 @@ } }, "node_modules/webpack/node_modules/ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dependencies": { "figgy-pudding": "^3.5.1" } @@ -30561,11 +30437,23 @@ } }, "node_modules/ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "engines": { "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/xdg-basedir": { @@ -30600,6 +30488,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", @@ -32889,12 +32782,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -32969,12 +32856,6 @@ "yallist": "^4.0.0" } }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "node-gyp": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", @@ -33020,20 +32901,6 @@ "lru-cache": "^6.0.0" } }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -33042,12 +32909,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -33898,12 +33759,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -34418,12 +34273,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -34959,12 +34808,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -36137,11 +35980,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -36212,11 +36050,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -36535,44 +36368,44 @@ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" + "string-width": "^4.1.0" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "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": "^4.1.0" + "ansi-regex": "^5.0.1" } } } @@ -36611,10 +36444,16 @@ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", @@ -38040,24 +37879,6 @@ "requires": { "glob": "^7.1.3" } - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -39426,11 +39247,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -40326,9 +40142,9 @@ "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" }, "dns-packet": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", - "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", "requires": { "ip": "^1.1.0", "safe-buffer": "^5.0.1" @@ -40420,11 +40236,18 @@ } }, "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "requires": { - "domelementtype": "1" + "domelementtype": "^2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } } }, "domutils": { @@ -41103,11 +40926,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -41510,11 +41328,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -43281,11 +43094,6 @@ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" }, - "html-comment-regex": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", - "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==" - }, "html-encoding-sniffer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", @@ -43376,31 +43184,39 @@ } }, "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" }, "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" } } } @@ -44232,14 +44048,6 @@ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.0" - } - }, "is-symbol": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", @@ -45604,11 +45412,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -45859,9 +45662,9 @@ } }, "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { "version": "0.4.1", @@ -45913,13 +45716,13 @@ "dev": true }, "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" } }, @@ -46411,12 +46214,6 @@ "requires": { "yallist": "^4.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -46725,13 +46522,6 @@ "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", "requires": { "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "minipass-collect": { @@ -46796,13 +46586,6 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "mississippi": { @@ -47073,12 +46856,6 @@ "requires": { "isexe": "^2.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true } } }, @@ -47273,12 +47050,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -47326,12 +47097,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -47378,12 +47143,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -47428,12 +47187,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -47973,26 +47726,6 @@ "requires": { "glob": "^7.1.3" } - }, - "tar": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", - "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -48138,9 +47871,9 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "1.8.0", @@ -49287,11 +49020,10 @@ } }, "postcss-svgo": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", - "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", "requires": { - "is-svg": "^3.0.0", "postcss": "^7.0.0", "postcss-value-parser": "^3.0.0", "svgo": "^1.0.0" @@ -49385,13 +49117,6 @@ "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^17.0.1" - }, - "dependencies": { - "react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - } } }, "pretty-hrtime": { @@ -49401,9 +49126,9 @@ "dev": true }, "prismjs": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.0.tgz", - "integrity": "sha512-SqV5GRsNqnzCL8k5dfAjCNhUrF3pR0A9lTDSCUZeh/LIshheXJEaP0hwLz2t4XHivd2J/v2HR+gRnigzeKe3cQ==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==", "dev": true }, "process": { @@ -50178,8 +49903,7 @@ "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "react-lifecycles-compat": { "version": "3.0.4", @@ -50539,14 +50263,14 @@ "integrity": "sha512-FQa1Q1thpr7ZIgoi3uKatFWLKN4GhRwY0YNSRZQkw2/Bcs6CBiz55IQQHNkaXNYPsTt4c9XQwn9UiuBnI35iyQ==" }, "refractor": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.4.0.tgz", - "integrity": "sha512-dBeD02lC5eytm9Gld2Mx0cMcnR+zhSnsTfPpWqFaMgUMJfC9A6bcN3Br/NaXrnBJcuxnLFR90k1jrkaSyV8umg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.5.0.tgz", + "integrity": "sha512-QwPJd3ferTZ4cSPPjdP5bsYHMytwWYnAN5EEnLtGvkqp/FCCnGsBgxrm9EuIDnjUC3Uc/kETtvVi7fSIVC74Dg==", "dev": true, "requires": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", - "prismjs": "~1.24.0" + "prismjs": "~1.25.0" } }, "regenerate": { @@ -50816,15 +50540,67 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "renderkid": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", - "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", "requires": { - "css-select": "^2.0.2", - "dom-converter": "^0.2", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.20", - "strip-ansi": "^3.0.0" + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "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==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "requires": { + "boolbase": "^1.0.0" + } + } } }, "repeat-element": { @@ -50951,9 +50727,9 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" }, "resolve-url-loader": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz", - "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz", + "integrity": "sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==", "requires": { "adjust-sourcemap-loader": "3.0.0", "camelcase": "5.3.1", @@ -50961,68 +50737,22 @@ "convert-source-map": "1.7.0", "es6-iterator": "2.0.3", "loader-utils": "1.2.3", - "postcss": "7.0.21", + "postcss": "7.0.36", "rework": "1.0.1", "rework-visit": "1.0.0", "source-map": "0.6.1" }, "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -51040,24 +50770,6 @@ "emojis-list": "^2.0.0", "json5": "^1.0.1" } - }, - "postcss": { - "version": "7.0.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.21.tgz", - "integrity": "sha512-uIFtJElxJo29QC753JzhidoAhvp/e/Exezkdhfmt8AymWT6/5B7W1WmponYWkHk2eg6sONyTch0A3nkMPun3SQ==", - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "requires": { - "has-flag": "^3.0.0" - } } } }, @@ -51474,11 +51186,6 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -52799,6 +52506,26 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, "tar-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", @@ -53129,9 +52856,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, "to-arraybuffer": { "version": "1.0.1", @@ -53787,12 +53514,6 @@ "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -53853,9 +53574,9 @@ } }, "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.4.tgz", + "integrity": "sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==", "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" @@ -54552,9 +54273,9 @@ } }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "requires": { "figgy-pudding": "^3.5.1" } @@ -54890,9 +54611,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", "requires": { "async-limiter": "~1.0.0" } @@ -54907,15 +54628,32 @@ "requires": {} }, "webpack-hot-middleware": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz", - "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==", + "version": "2.25.1", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz", + "integrity": "sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==", "dev": true, "requires": { - "ansi-html": "0.0.7", - "html-entities": "^1.2.0", + "ansi-html-community": "0.0.8", + "html-entities": "^2.1.0", "querystring": "^0.2.0", - "strip-ansi": "^3.0.0" + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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 + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } } }, "webpack-log": { @@ -55415,9 +55153,10 @@ } }, "ws": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.4.tgz", - "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==" + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "requires": {} }, "xdg-basedir": { "version": "4.0.0", @@ -55445,6 +55184,11 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index 29d41b1e..f05db527 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -80,7 +80,7 @@ export default function UserInformationInput( reviewPasswordMatch(); }, [reviewPasswordMatch]); - const makePasswordInputFitRules = (input: string): [string, boolean] => { + const checkPasswordRules = (input: string): boolean => { input = deleteSpaces(input); if (biggerMaxStrLength(input, MAX_PASSWORD_LENGTH)) { triggerAlert( @@ -88,47 +88,40 @@ export default function UserInformationInput( "warning", "Maximum password length exceeded. Input was undone." ); - return [input, false]; + return false; } - return [input, true]; + return true; }; const handlePasswordChange = (event: ChangeEvent) => { event.preventDefault(); - let newValue: string; + let newPassword: string = event.target.value; - let [stringValue, isOK]: [string, boolean] = makePasswordInputFitRules( - event.target.value - ); + let isOK = checkPasswordRules(newPassword); + // if the password does not match the rules, do not change it. if (!isOK) { - newValue = password; - } else { - newValue = stringValue; + newPassword = password; } setPasswordInformationLength( - !notMinStrLength(newValue, MIN_PASSWORD_LENGTH) + !notMinStrLength(newPassword, MIN_PASSWORD_LENGTH) ); - setPasswordInformationLowercase(newValue.match(/[a-z]/) !== null); - setPasswordInformationUppercase(newValue.match(/[A-Z]/) !== null); - setPasswordInformationNumber(newValue.match(/\d/) !== null); - setPassword(newValue); + setPasswordInformationLowercase(newPassword.match(/[a-z]/) !== null); + setPasswordInformationUppercase(newPassword.match(/[A-Z]/) !== null); + setPasswordInformationNumber(newPassword.match(/\d/) !== null); + setPassword(newPassword); }; const handlePasswordConfirmationChange = async ( event: ChangeEvent ) => { event.preventDefault(); - let newValue: string; - const [stringValue, isOK]: [ - string, - boolean - ] = makePasswordInputFitRules(event.target.value); + let newConfirmationPassword: string = event.target.value; + const isOK = checkPasswordRules(newConfirmationPassword); + // if the confirmationPassword does not match the rules do not change it if (!isOK) { - newValue = passwordConfirmation; - } else { - newValue = stringValue; + newConfirmationPassword = passwordConfirmation; } - setPasswordConfirmation(newValue); + setPasswordConfirmation(newConfirmationPassword); }; const handleSubmit = async (event: FormEvent) => { @@ -262,8 +255,8 @@ export default function UserInformationInput( !passwordConfirmation ? info_svg : passwordsMatch - ? check_svg - : error_svg + ? check_svg + : error_svg } /> @@ -274,8 +267,8 @@ export default function UserInformationInput( !passwordConfirmation ? "text-muted" : passwordsMatch - ? "text-success" - : "text-danger" + ? "text-success" + : "text-danger" } > Passwords must match. From 1722595291e95ac4542ff57bb1e15a704a4d2166 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Mon, 3 Jan 2022 21:23:27 +0100 Subject: [PATCH 02/20] Refactored ruleChecks in Profile --- .../pages/User/UserInformationInput.tsx | 158 +++++++----------- 1 file changed, 60 insertions(+), 98 deletions(-) diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index f05db527..513f5b8d 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -54,22 +54,14 @@ export default function UserInformationInput( const [passwordConfirmation, setPasswordConfirmation] = useState( presets?.password ?? "" ); - const [ - passwordInformationLength, - setPasswordInformationLength - ] = useState(false); - const [ - passwordInformationLowercase, - setPasswordInformationLowercase - ] = useState(false); - const [ - passwordInformationUppercase, - setPasswordInformationUppercase - ] = useState(false); - const [ - passwordInformationNumber, - setPasswordInformationNumber - ] = useState(false); + const [passwordInformationLength, setPasswordInformationLength] = + useState(false); + const [passwordInformationLowercase, setPasswordInformationLowercase] = + useState(false); + const [passwordInformationUppercase, setPasswordInformationUppercase] = + useState(false); + const [passwordInformationNumber, setPasswordInformationNumber] = + useState(false); const [passwordsMatch, setPasswordsMatch] = useState(true); const reviewPasswordMatch = useCallback((): void => { @@ -136,6 +128,30 @@ export default function UserInformationInput( submitFunction(newUser); }; + // inner component rendering the checks + type RuleCheckerProps = { + ruleToCheck: boolean; + ruleDesc: string; + imageAlt: string; + }; + const RuleChecker = ({ + ruleToCheck, + ruleDesc, + imageAlt + }: RuleCheckerProps): JSX.Element => { + return ( +
+ {imageAlt} + + {ruleToCheck ? "Done: " : "Missing: "} + + + {ruleDesc} + +
+ ); + }; + return (
@@ -156,88 +172,34 @@ export default function UserInformationInput( handlePasswordChange(event) } /> -
- {"status - - {passwordInformationLength ? "Done: " : "Missing: "} - - - Passwords must be between 8 and 20 characters. - -
-
- { - - {passwordInformationUppercase ? "Done: " : "Missing: "} - - - Passwords must be at least contain 1 uppercase - character. - -
-
- { - - {passwordInformationLowercase ? "Done: " : "Missing: "} - - - Passwords must be at least contain 1 lowercase - character. - -
-
- {"status - - {passwordInformationNumber ? "Done: " : "Missing: "} - - - Passwords must be at least contain 1 number. - -
+ + + + Re-enter password From b45ff85dfad42a77ac61416c2eecee66891e4598 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Mon, 3 Jan 2022 21:56:42 +0100 Subject: [PATCH 03/20] Added basic wrapper component and dependency --- package-lock.json | 31 ++++++++++++ package.json | 3 +- .../pages/User/UserInformationInput.tsx | 48 +++++++++---------- 3 files changed, 57 insertions(+), 25 deletions(-) diff --git a/package-lock.json b/package-lock.json index a95d7c96..16491dcb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "react-bootstrap": "1.6.1", "react-dom": "17.0.2", "react-dropzone": "11.3.4", + "react-password-strength-bar": "^0.4.0", "react-redux": "7.2.4", "react-router-dom": "5.2.0", "react-scripts": "4.0.3", @@ -24068,6 +24069,18 @@ "react-dom": ">=16.3.0" } }, + "node_modules/react-password-strength-bar": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-password-strength-bar/-/react-password-strength-bar-0.4.0.tgz", + "integrity": "sha512-gXgFdGJfeqLKC/xR76kqD8z9w84Rb9YOTcJXKopBzMx8dIdxNTfXGZ64Y2yTvpbnfxLdRNSV3vgAGD7CtdcnIQ==", + "dependencies": { + "zxcvbn": "4.4.2" + }, + "peerDependencies": { + "react": "^16.8.6 || ^17", + "react-dom": "^16.8.6 || ^17" + } + }, "node_modules/react-popper": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", @@ -30613,6 +30626,11 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } + }, + "node_modules/zxcvbn": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/zxcvbn/-/zxcvbn-4.4.2.tgz", + "integrity": "sha1-KOwXzwl0PtyrBW3dixsGJizHPDA=" } }, "dependencies": { @@ -49925,6 +49943,14 @@ "warning": "^4.0.3" } }, + "react-password-strength-bar": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/react-password-strength-bar/-/react-password-strength-bar-0.4.0.tgz", + "integrity": "sha512-gXgFdGJfeqLKC/xR76kqD8z9w84Rb9YOTcJXKopBzMx8dIdxNTfXGZ64Y2yTvpbnfxLdRNSV3vgAGD7CtdcnIQ==", + "requires": { + "zxcvbn": "4.4.2" + } + }, "react-popper": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.2.5.tgz", @@ -55285,6 +55311,11 @@ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", "dev": true + }, + "zxcvbn": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/zxcvbn/-/zxcvbn-4.4.2.tgz", + "integrity": "sha1-KOwXzwl0PtyrBW3dixsGJizHPDA=" } } } diff --git a/package.json b/package.json index 304d1145..d2cf9fac 100644 --- a/package.json +++ b/package.json @@ -17,16 +17,17 @@ "axios": "0.21.2", "bootstrap": "4.6.0", "eslint-plugin-react-hooks": "4.2.0", - "sass": "1.45.2", "react": "17.0.2", "react-bootstrap": "1.6.1", "react-dom": "17.0.2", "react-dropzone": "11.3.4", + "react-password-strength-bar": "^0.4.0", "react-redux": "7.2.4", "react-router-dom": "5.2.0", "react-scripts": "4.0.3", "redux": "4.1.0", "redux-types": "2.0.3", + "sass": "1.45.2", "super-tiny-icons": "0.4.0", "typescript": "4.3.5" }, diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index 513f5b8d..28ee6f8c 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -4,7 +4,8 @@ import React, { ReactElement, useCallback, useEffect, - useState + useState, + Suspense } from "react"; import { Button, Form, FormGroup } from "react-bootstrap"; import check_svg from "../../../assets/images/icons/material.io/check_circle-24px.svg"; @@ -21,6 +22,9 @@ import { MIN_PASSWORD_LENGTH } from "../../../background/constants"; +// lazy load the lib +const PasswordStrengthBar = React.lazy(() => import("react-password-strength-bar")); + export interface UserInformationInputInterface { username: string; password: string; @@ -152,6 +156,23 @@ export default function UserInformationInput( ); }; + // a small component wrapping the password strength checks by lazy loading the component if necessary. + type PasswordStrengthBarWrapperArgs = { + currentPassword: string + } + const PasswordStrengthBarWrapper = ({ currentPassword }: PasswordStrengthBarWrapperArgs): JSX.Element | null => { + // if the user typed something show the component + if (currentPassword.length > 0) { + return ( + + + + ) + } else { + return null; + } + } + return ( @@ -172,34 +193,12 @@ export default function UserInformationInput( handlePasswordChange(event) } /> + - - - Re-enter password @@ -210,6 +209,7 @@ export default function UserInformationInput( handlePasswordConfirmationChange(event) } /> +
{"status Date: Mon, 3 Jan 2022 22:10:27 +0100 Subject: [PATCH 04/20] More refactoring --- .../pages/User/PasswordStrengthBar.tsx | 24 ++++++++++ src/components/pages/User/RuleChecker.tsx | 30 ++++++++++++ .../pages/User/UserInformationInput.tsx | 46 +------------------ 3 files changed, 56 insertions(+), 44 deletions(-) create mode 100644 src/components/pages/User/PasswordStrengthBar.tsx create mode 100644 src/components/pages/User/RuleChecker.tsx diff --git a/src/components/pages/User/PasswordStrengthBar.tsx b/src/components/pages/User/PasswordStrengthBar.tsx new file mode 100644 index 00000000..86b1ded1 --- /dev/null +++ b/src/components/pages/User/PasswordStrengthBar.tsx @@ -0,0 +1,24 @@ +import React, { Suspense } from "react"; + +// lazy load the lib +const PasswordStrengthBar = React.lazy(() => import("react-password-strength-bar")); + +type PasswordStrengthBarWrapperArgs = { + currentPassword: string +} + +// a small component wrapping the password strength checks by lazy loading the component if necessary. +const PasswordStrengthBarWrapper = ({ currentPassword }: PasswordStrengthBarWrapperArgs): JSX.Element | null => { + // if the user typed something show the component + if (currentPassword.length > 0) { + return ( + + + + ) + } else { + return null; + } +} + +export { PasswordStrengthBarWrapper } diff --git a/src/components/pages/User/RuleChecker.tsx b/src/components/pages/User/RuleChecker.tsx new file mode 100644 index 00000000..23d1d221 --- /dev/null +++ b/src/components/pages/User/RuleChecker.tsx @@ -0,0 +1,30 @@ +import React from "react" +import info_svg from "../../../assets/images/icons/material.io/info-24px.svg"; +import check_svg from "../../../assets/images/icons/material.io/check_circle-24px.svg"; + + +// inner component rendering the checks +type RuleCheckerProps = { + ruleToCheck: boolean; + ruleDesc: string; + imageAlt: string; +}; +const RuleChecker = ({ + ruleToCheck, + ruleDesc, + imageAlt +}: RuleCheckerProps): JSX.Element => { + return ( +
+ {imageAlt} + + {ruleToCheck ? "Done: " : "Missing: "} + + + {ruleDesc} + +
+ ); +}; + +export { RuleChecker } diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index 28ee6f8c..814e6c2d 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -5,7 +5,6 @@ import React, { useCallback, useEffect, useState, - Suspense } from "react"; import { Button, Form, FormGroup } from "react-bootstrap"; import check_svg from "../../../assets/images/icons/material.io/check_circle-24px.svg"; @@ -21,9 +20,9 @@ import { MAX_PASSWORD_LENGTH, MIN_PASSWORD_LENGTH } from "../../../background/constants"; +import { PasswordStrengthBarWrapper } from "./PasswordStrengthBar"; +import { RuleChecker } from "./RuleChecker"; -// lazy load the lib -const PasswordStrengthBar = React.lazy(() => import("react-password-strength-bar")); export interface UserInformationInputInterface { username: string; @@ -132,47 +131,6 @@ export default function UserInformationInput( submitFunction(newUser); }; - // inner component rendering the checks - type RuleCheckerProps = { - ruleToCheck: boolean; - ruleDesc: string; - imageAlt: string; - }; - const RuleChecker = ({ - ruleToCheck, - ruleDesc, - imageAlt - }: RuleCheckerProps): JSX.Element => { - return ( -
- {imageAlt} - - {ruleToCheck ? "Done: " : "Missing: "} - - - {ruleDesc} - -
- ); - }; - - // a small component wrapping the password strength checks by lazy loading the component if necessary. - type PasswordStrengthBarWrapperArgs = { - currentPassword: string - } - const PasswordStrengthBarWrapper = ({ currentPassword }: PasswordStrengthBarWrapperArgs): JSX.Element | null => { - // if the user typed something show the component - if (currentPassword.length > 0) { - return ( - - - - ) - } else { - return null; - } - } - return ( From 80fb56fb506a29616ba98e7e03ac089c481562d1 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Fri, 21 Jan 2022 20:29:38 +0100 Subject: [PATCH 05/20] Refactorings, Removed useless rules --- src/background/constants.ts | 3 +- src/background/methods/checkInput.ts | 7 -- .../pages/User/PasswordStrengthBar.tsx | 12 +- src/components/pages/User/Profile.tsx | 10 +- src/components/pages/User/Registration.tsx | 21 ++-- .../pages/User/UserInformationInput.tsx | 119 ++++++------------ 6 files changed, 60 insertions(+), 112 deletions(-) delete mode 100644 src/background/methods/checkInput.ts diff --git a/src/background/constants.ts b/src/background/constants.ts index 7349747d..97e57889 100644 --- a/src/background/constants.ts +++ b/src/background/constants.ts @@ -21,6 +21,5 @@ const dev: constantsdef = { }; export const constants = process.env.NODE_ENV === "development" ? dev : prod; -export const MIN_PASSWORD_LENGTH = 8; -export const MAX_PASSWORD_LENGTH = 20; +export const MIN_PASSWORD_STRENGTH = 3; export const DEFAULT_ALERT_DURATION = 3500; diff --git a/src/background/methods/checkInput.ts b/src/background/methods/checkInput.ts deleted file mode 100644 index 8bb38c7c..00000000 --- a/src/background/methods/checkInput.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function notMinStrLength(text: string, minAnz: number): boolean { - return text.length < minAnz; -} - -export function biggerMaxStrLength(text: string, maxAnz: number): boolean { - return text.length > maxAnz; -} diff --git a/src/components/pages/User/PasswordStrengthBar.tsx b/src/components/pages/User/PasswordStrengthBar.tsx index 86b1ded1..9ee59b13 100644 --- a/src/components/pages/User/PasswordStrengthBar.tsx +++ b/src/components/pages/User/PasswordStrengthBar.tsx @@ -1,19 +1,25 @@ import React, { Suspense } from "react"; +import { PasswordFeedback } from "react-password-strength-bar"; // lazy load the lib const PasswordStrengthBar = React.lazy(() => import("react-password-strength-bar")); type PasswordStrengthBarWrapperArgs = { - currentPassword: string + currentPassword: string, + scoreChangeCallback: (score: number, feedback: PasswordFeedback) => void } // a small component wrapping the password strength checks by lazy loading the component if necessary. -const PasswordStrengthBarWrapper = ({ currentPassword }: PasswordStrengthBarWrapperArgs): JSX.Element | null => { +const PasswordStrengthBarWrapper = ({ currentPassword, scoreChangeCallback }: PasswordStrengthBarWrapperArgs): JSX.Element | null => { // if the user typed something show the component if (currentPassword.length > 0) { return ( - + scoreChangeCallback(score, feedback)} + scoreWords={["weak", "weak", "ok", "strong", "epic"]} + /> ) } else { diff --git a/src/components/pages/User/Profile.tsx b/src/components/pages/User/Profile.tsx index 792f75cc..33798d0e 100644 --- a/src/components/pages/User/Profile.tsx +++ b/src/components/pages/User/Profile.tsx @@ -7,13 +7,11 @@ import { useSelector } from "react-redux"; import { RootState } from "../../../background/redux/store"; import { DEFAULT_ALERT_DURATION, - MIN_PASSWORD_LENGTH } from "../../../background/constants"; import { changeUserInformation, UserInformation } from "../../../background/api/userInformation"; -import { notMinStrLength } from "../../../background/methods/checkInput"; import edit_svg from "../../../assets/images/icons/material.io/edit_white_24dp.svg"; import { hashPassword } from "../../../background/methods/passwords"; @@ -87,11 +85,11 @@ export default function Profile(): ReactElement { ); return; } + // TODO: wtf is this shit if ( inputUser.password.match(/\d/) == null || inputUser.password.match(/[a-z]/) == null || - inputUser.password.match(/[A-Z]/) == null || - notMinStrLength(inputUser.password, MIN_PASSWORD_LENGTH) + inputUser.password.match(/[A-Z]/) == null ) { handleAlertVisibility( DEFAULT_ALERT_DURATION, @@ -127,7 +125,9 @@ export default function Profile(): ReactElement { return ( <> handleAlertVisibility(DEFAULT_ALERT_DURATION, "danger", errorMessage) + } submitFunction={handleSubmit} presets={{ username: user.username ?? "", password: "" }} /> diff --git a/src/components/pages/User/Registration.tsx b/src/components/pages/User/Registration.tsx index 9c98d692..a639adbd 100644 --- a/src/components/pages/User/Registration.tsx +++ b/src/components/pages/User/Registration.tsx @@ -1,6 +1,5 @@ import React, { ReactElement, useEffect, useState } from "react"; import { Alert, Container, Row } from "react-bootstrap"; -import { notMinStrLength } from "../../../background/methods/checkInput"; import fileFighter from "../../../assets/images/logos/adventurer-run.gif"; import { registerNewUser } from "../../../background/api/registration"; import { @@ -10,7 +9,6 @@ import { import { getStyleValue } from "../../../background/methods/style"; import { DEFAULT_ALERT_DURATION, - MIN_PASSWORD_LENGTH } from "../../../background/constants"; import UserInformationInput, { UserInformationInputInterface @@ -86,8 +84,7 @@ export default function Registration(): ReactElement { } else if ( newUser.password.match(/\d/) == null || newUser.password.match(/[a-z]/) == null || - newUser.password.match(/[A-Z]/) == null || - notMinStrLength(newUser.password, MIN_PASSWORD_LENGTH) + newUser.password.match(/[A-Z]/) == null ) { handleAlertVisibility( DEFAULT_ALERT_DURATION, @@ -105,9 +102,9 @@ export default function Registration(): ReactElement { DEFAULT_ALERT_DURATION, "success", "Worked: " + - (res.outputMessage - ? res.outputMessage - : res.httpStatus + " " + res.httpMessage) + (res.outputMessage + ? res.outputMessage + : res.httpStatus + " " + res.httpMessage) ); toggleSubmitLogo(); }) @@ -116,9 +113,9 @@ export default function Registration(): ReactElement { DEFAULT_ALERT_DURATION, "danger", "Error: " + - (err.outputMessage - ? err.outputMessage - : err.httpStatus + " " + err.httpMessage) + (err.outputMessage + ? err.outputMessage + : err.httpStatus + " " + err.httpMessage) ); }); } @@ -153,7 +150,9 @@ export default function Registration(): ReactElement {

Create new account

handleAlertVisibility(DEFAULT_ALERT_DURATION, "danger", errorMessage) + } submitFunction={handleSubmit} /> ( presets?.password ?? "" ); - const [passwordInformationLength, setPasswordInformationLength] = - useState(false); - const [passwordInformationLowercase, setPasswordInformationLowercase] = - useState(false); - const [passwordInformationUppercase, setPasswordInformationUppercase] = - useState(false); - const [passwordInformationNumber, setPasswordInformationNumber] = - useState(false); + + // states to check passwords const [passwordsMatch, setPasswordsMatch] = useState(true); + const [passwordStrength, setPasswordStrength] = useState(0); - const reviewPasswordMatch = useCallback((): void => { - setPasswordsMatch(password === passwordConfirmation); - }, [password, passwordConfirmation]); useEffect(() => { - reviewPasswordMatch(); - }, [reviewPasswordMatch]); - - const checkPasswordRules = (input: string): boolean => { - input = deleteSpaces(input); - if (biggerMaxStrLength(input, MAX_PASSWORD_LENGTH)) { - triggerAlert( - DEFAULT_ALERT_DURATION, - "warning", - "Maximum password length exceeded. Input was undone." - ); - return false; - } - return true; - }; + setPasswordsMatch(password === passwordConfirmation) + }, [password, passwordConfirmation, setPasswordsMatch]); - const handlePasswordChange = (event: ChangeEvent) => { - event.preventDefault(); - let newPassword: string = event.target.value; - - let isOK = checkPasswordRules(newPassword); - // if the password does not match the rules, do not change it. - if (!isOK) { - newPassword = password; - } - setPasswordInformationLength( - !notMinStrLength(newPassword, MIN_PASSWORD_LENGTH) - ); - setPasswordInformationLowercase(newPassword.match(/[a-z]/) !== null); - setPasswordInformationUppercase(newPassword.match(/[A-Z]/) !== null); - setPasswordInformationNumber(newPassword.match(/\d/) !== null); - setPassword(newPassword); - }; - - const handlePasswordConfirmationChange = async ( - event: ChangeEvent - ) => { - event.preventDefault(); - let newConfirmationPassword: string = event.target.value; - const isOK = checkPasswordRules(newConfirmationPassword); - // if the confirmationPassword does not match the rules do not change it - if (!isOK) { - newConfirmationPassword = passwordConfirmation; - } - setPasswordConfirmation(newConfirmationPassword); - }; + const newHandlePasswordChange = (newPasswordEvent: ChangeEvent, updatePassword: React.Dispatch>) => { + newPasswordEvent.preventDefault() + // TODO: change this to newPassword.trim() instead + let newPassword = deleteSpaces(newPasswordEvent.target.value) + updatePassword(newPassword) + } const handleSubmit = async (event: FormEvent) => { event.preventDefault(); console.log("[UserInformationInput] handleSubmit"); - reviewPasswordMatch(); let newUser = { username: username, password: password, @@ -131,6 +69,17 @@ export default function UserInformationInput( submitFunction(newUser); }; + const parsePasswordStrengthFeedback = (score: number, feedback: PasswordFeedback) => { + console.log(score); + console.log(feedback); + + setPasswordStrength(score); + + if (feedback.warning) { + // TODO: add some warning or hint + } + } + return ( @@ -148,14 +97,12 @@ export default function UserInformationInput( placeholder="Must contain one number, uppercase & lowercase letter each" value={password} onChange={(event: ChangeEvent) => - handlePasswordChange(event) + newHandlePasswordChange(event, setPassword) } /> - - parsePasswordStrengthFeedback(score, feedback)} /> @@ -164,10 +111,14 @@ export default function UserInformationInput( type="password" value={passwordConfirmation} onChange={(event: ChangeEvent) => - handlePasswordConfirmationChange(event) + newHandlePasswordChange(event, setPasswordConfirmation) } /> - + = MIN_PASSWORD_STRENGTH} + ruleDesc={"Passwords must be at least strong."} + imageAlt={"status icon password length"} + />
{"status Date: Fri, 21 Jan 2022 21:24:15 +0100 Subject: [PATCH 06/20] Fixed submit function in Profile --- src/background/api/userInformation.ts | 2 +- src/background/constants.ts | 2 +- src/components/pages/User/Profile.tsx | 47 ++------------ .../pages/User/UserInformationInput.tsx | 64 ++++++++++++------- 4 files changed, 51 insertions(+), 64 deletions(-) diff --git a/src/background/api/userInformation.ts b/src/background/api/userInformation.ts index 696e52c3..953598ac 100644 --- a/src/background/api/userInformation.ts +++ b/src/background/api/userInformation.ts @@ -11,7 +11,7 @@ export interface UserInformation { username?: string | null; groups?: string[] | null; password?: string; - confirmationPassword?: string; + confirmationPassword?: string; // TODO remove this. } export const changeUserInformation = ( diff --git a/src/background/constants.ts b/src/background/constants.ts index 97e57889..8b911959 100644 --- a/src/background/constants.ts +++ b/src/background/constants.ts @@ -21,5 +21,5 @@ const dev: constantsdef = { }; export const constants = process.env.NODE_ENV === "development" ? dev : prod; -export const MIN_PASSWORD_STRENGTH = 3; +export const REQUIRED_PASSWORD_STRENGTH = 3; export const DEFAULT_ALERT_DURATION = 3500; diff --git a/src/components/pages/User/Profile.tsx b/src/components/pages/User/Profile.tsx index 33798d0e..8e447f4c 100644 --- a/src/components/pages/User/Profile.tsx +++ b/src/components/pages/User/Profile.tsx @@ -61,48 +61,15 @@ export default function Profile(): ReactElement { setIsEditing(!isEditing); } + // TODO why is this async const handleSubmit = async (inputUser: UserInformationInputInterface) => { console.log("[PROFILE] handleSubmit"); - let newUser: UserInformation = { - groups: user.groups, - userId: user.userId - }; - if (!inputUser.username) { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: Please choose an username." - ); - return; - } - newUser["username"] = inputUser.username; - if (inputUser.password || inputUser.passwordConfirmation) { - if (inputUser.password !== inputUser.passwordConfirmation) { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: Password and password confirmation must match." - ); - return; - } - // TODO: wtf is this shit - if ( - inputUser.password.match(/\d/) == null || - inputUser.password.match(/[a-z]/) == null || - inputUser.password.match(/[A-Z]/) == null - ) { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: Please pay attention to the notes below the input fields." - ); - return; - } - newUser["password"] = await hashPassword(inputUser.password); - newUser["confirmationPassword"] = newUser["password"]; - } + // hash password + const hashedPassword = await hashPassword(inputUser.password) - await changeUserInformation(newUser) + // trigger api call + let updatedUser = { password: hashedPassword, confirmationPassword: hashedPassword, ...user } + await changeUserInformation(updatedUser) .then((res) => { changeEditMode(); handleAlertVisibility( @@ -112,7 +79,7 @@ export default function Profile(): ReactElement { ); }) .catch((err) => { - console.log("Error:" + err); + console.log("[PROFILE] Error:" + err); handleAlertVisibility( DEFAULT_ALERT_DURATION, "danger", diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index e31eacff..aa6bf975 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -2,9 +2,8 @@ import React, { ChangeEvent, FormEvent, ReactElement, - useCallback, useEffect, - useState, + useState } from "react"; import { Button, Form, FormGroup } from "react-bootstrap"; import check_svg from "../../../assets/images/icons/material.io/check_circle-24px.svg"; @@ -12,18 +11,15 @@ import info_svg from "../../../assets/images/icons/material.io/info-24px.svg"; import error_svg from "../../../assets/images/icons/material.io/error-24px.svg"; import { deleteSpaces } from "../../../background/methods/dataTypes/strings"; import { - DEFAULT_ALERT_DURATION, - MIN_PASSWORD_STRENGTH + REQUIRED_PASSWORD_STRENGTH } from "../../../background/constants"; import { PasswordStrengthBarWrapper } from "./PasswordStrengthBar"; import { RuleChecker } from "./RuleChecker"; import { PasswordFeedback } from "react-password-strength-bar"; - export interface UserInformationInputInterface { username: string; password: string; - passwordConfirmation?: string; } type UserInformationInputProps = { @@ -46,30 +42,52 @@ export default function UserInformationInput( const [passwordsMatch, setPasswordsMatch] = useState(true); const [passwordStrength, setPasswordStrength] = useState(0); - + // re-check passwords are equal after change useEffect(() => { - setPasswordsMatch(password === passwordConfirmation) + setPasswordsMatch(password === passwordConfirmation); }, [password, passwordConfirmation, setPasswordsMatch]); - const newHandlePasswordChange = (newPasswordEvent: ChangeEvent, updatePassword: React.Dispatch>) => { - newPasswordEvent.preventDefault() - // TODO: change this to newPassword.trim() instead - let newPassword = deleteSpaces(newPasswordEvent.target.value) - updatePassword(newPassword) - } + const newHandlePasswordChange = ( + newPasswordEvent: ChangeEvent, + updatePassword: React.Dispatch> + ) => { + newPasswordEvent.preventDefault(); + let newPassword = newPasswordEvent.target.value.trim() + updatePassword(newPassword); + }; const handleSubmit = async (event: FormEvent) => { event.preventDefault(); console.log("[UserInformationInput] handleSubmit"); - let newUser = { + + // check if password is empty + if (!password) { + triggerAlert("Please specify a password."); + return; + } + + // check password strength + if (passwordStrength <= REQUIRED_PASSWORD_STRENGTH) { + triggerAlert("Password is not strong enough"); + return; + } + + // check if passwords match + if (!passwordsMatch) { + triggerAlert("Password is not strong enough"); + return; + } + + submitFunction({ username: username, password: password, - passwordConfirmation: passwordConfirmation - }; - submitFunction(newUser); + }); }; - const parsePasswordStrengthFeedback = (score: number, feedback: PasswordFeedback) => { + const parsePasswordStrengthFeedback = ( + score: number, + feedback: PasswordFeedback + ) => { console.log(score); console.log(feedback); @@ -78,7 +96,7 @@ export default function UserInformationInput( if (feedback.warning) { // TODO: add some warning or hint } - } + }; return ( @@ -102,7 +120,9 @@ export default function UserInformationInput( /> parsePasswordStrengthFeedback(score, feedback)} + scoreChangeCallback={(score, feedback) => + parsePasswordStrengthFeedback(score, feedback) + } /> @@ -115,7 +135,7 @@ export default function UserInformationInput( } /> = MIN_PASSWORD_STRENGTH} + ruleToCheck={passwordStrength >= REQUIRED_PASSWORD_STRENGTH} ruleDesc={"Passwords must be at least strong."} imageAlt={"status icon password length"} /> From 5031a4272a1eed913957bce5591a4c31d341f89e Mon Sep 17 00:00:00 2001 From: open-schnick Date: Sat, 22 Jan 2022 11:56:17 +0100 Subject: [PATCH 07/20] Renaming works again --- src/components/pages/User/Profile.tsx | 18 ++++- src/components/pages/User/Registration.tsx | 77 ++++++++----------- .../pages/User/UserInformationInput.tsx | 48 +++++++----- 3 files changed, 75 insertions(+), 68 deletions(-) diff --git a/src/components/pages/User/Profile.tsx b/src/components/pages/User/Profile.tsx index 8e447f4c..902526c0 100644 --- a/src/components/pages/User/Profile.tsx +++ b/src/components/pages/User/Profile.tsx @@ -62,16 +62,26 @@ export default function Profile(): ReactElement { } // TODO why is this async - const handleSubmit = async (inputUser: UserInformationInputInterface) => { + // TODO handle 409 differently + // TODO handle same username differently + const handleSubmit = async (userInput: UserInformationInputInterface) => { console.log("[PROFILE] handleSubmit"); - // hash password - const hashedPassword = await hashPassword(inputUser.password) + + let updatedUser: UserInformation = { ...user, username: userInput.username } + + // if the user updated the password + if (userInput.password) { + // hash password + const hashedPassword = await hashPassword(userInput.password) + updatedUser.password = hashedPassword + updatedUser.confirmationPassword = hashedPassword + } // trigger api call - let updatedUser = { password: hashedPassword, confirmationPassword: hashedPassword, ...user } await changeUserInformation(updatedUser) .then((res) => { changeEditMode(); + // FIXME this does never appear, because we rerender it and this gets lost handleAlertVisibility( DEFAULT_ALERT_DURATION, "success", diff --git a/src/components/pages/User/Registration.tsx b/src/components/pages/User/Registration.tsx index a639adbd..0e93d67f 100644 --- a/src/components/pages/User/Registration.tsx +++ b/src/components/pages/User/Registration.tsx @@ -69,56 +69,43 @@ export default function Registration(): ReactElement { const handleSubmit = async (newUser: UserInformationInputInterface) => { console.log("[REGISTRATION] handleSubmit"); - if (!newUser.username) { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: Please choose an username." - ); - } else if (newUser.password !== newUser.passwordConfirmation) { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: Password and password confirmation must match." - ); - } else if ( - newUser.password.match(/\d/) == null || - newUser.password.match(/[a-z]/) == null || - newUser.password.match(/[A-Z]/) == null - ) { + + if (!newUser.password) { handleAlertVisibility( DEFAULT_ALERT_DURATION, "danger", - "Error: Please pay attention to the notes below the input fields." - ); - } else { - registerNewUser( - newUser.username, - newUser.password, - newUser.passwordConfirmation + "Please specify a password!" ) - .then((res) => { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "success", - "Worked: " + - (res.outputMessage - ? res.outputMessage - : res.httpStatus + " " + res.httpMessage) - ); - toggleSubmitLogo(); - }) - .catch((err) => { - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: " + - (err.outputMessage - ? err.outputMessage - : err.httpStatus + " " + err.httpMessage) - ); - }); + return } + + // TODO: remove confirmation-password in backend + registerNewUser( + newUser.username, + newUser.password!!, + newUser.password!! + ) + .then((res) => { + handleAlertVisibility( + DEFAULT_ALERT_DURATION, + "success", + "Worked: " + + (res.outputMessage + ? res.outputMessage + : res.httpStatus + " " + res.httpMessage) + ); + toggleSubmitLogo(); + }) + .catch((err) => { + handleAlertVisibility( + DEFAULT_ALERT_DURATION, + "danger", + "Error: " + + (err.outputMessage + ? err.outputMessage + : err.httpStatus + " " + err.httpMessage) + ); + }); }; const handleAlertVisibility = ( diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index aa6bf975..7c26f2b1 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -9,7 +9,6 @@ import { Button, Form, FormGroup } from "react-bootstrap"; import check_svg from "../../../assets/images/icons/material.io/check_circle-24px.svg"; import info_svg from "../../../assets/images/icons/material.io/info-24px.svg"; import error_svg from "../../../assets/images/icons/material.io/error-24px.svg"; -import { deleteSpaces } from "../../../background/methods/dataTypes/strings"; import { REQUIRED_PASSWORD_STRENGTH } from "../../../background/constants"; @@ -19,7 +18,7 @@ import { PasswordFeedback } from "react-password-strength-bar"; export interface UserInformationInputInterface { username: string; - password: string; + password?: string; } type UserInformationInputProps = { @@ -56,32 +55,43 @@ export default function UserInformationInput( updatePassword(newPassword); }; + /** + * Checks if the username is valid. If the password is not null also check that. + * Check the password if the passord is required. + */ const handleSubmit = async (event: FormEvent) => { event.preventDefault(); console.log("[UserInformationInput] handleSubmit"); - // check if password is empty - if (!password) { - triggerAlert("Please specify a password."); + // check if username is valid + if (!username) { + triggerAlert("Please specify a username."); return; } - // check password strength - if (passwordStrength <= REQUIRED_PASSWORD_STRENGTH) { - triggerAlert("Password is not strong enough"); - return; - } + // check if password is empty + if (password) { + // check password strength + if (passwordStrength <= REQUIRED_PASSWORD_STRENGTH) { + triggerAlert("Password is not strong enough"); + return; + } - // check if passwords match - if (!passwordsMatch) { - triggerAlert("Password is not strong enough"); - return; - } + // check if passwords match + if (!passwordsMatch) { + triggerAlert("Password is not strong enough"); + return; + } - submitFunction({ - username: username, - password: password, - }); + submitFunction({ + username: username, + password: password + }); + } else { + submitFunction({ + username: username + }); + } }; const parsePasswordStrengthFeedback = ( From 8b7d3f7dac0dc3ceb088e4a1c49e9d94317378f7 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Sat, 22 Jan 2022 14:34:28 +0100 Subject: [PATCH 08/20] Profile now checks for updates --- src/background/api/userInformation.ts | 19 +++++++++-- src/components/pages/User/Profile.tsx | 47 +++++++++++++++++++-------- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/background/api/userInformation.ts b/src/background/api/userInformation.ts index 953598ac..553815cb 100644 --- a/src/background/api/userInformation.ts +++ b/src/background/api/userInformation.ts @@ -14,6 +14,14 @@ export interface UserInformation { confirmationPassword?: string; // TODO remove this. } +/** + * Interface describing + */ +export interface UpdateUserErrorResponse { + errorCode: number; + error: { statusMessage: string, errorMessage: string }; // TODO does this type already exist? +} + export const changeUserInformation = ( userWithNewInformation: UserInformation ): Promise => { @@ -29,7 +37,14 @@ export const changeUserInformation = ( resolve(response.data); }) .catch((error) => { - reject(error.response?.data?.message); + const errorResponse: UpdateUserErrorResponse = { + errorCode: error.response.status, + error: { + statusMessage: error.response.data.status, + errorMessage: error.response.data.message + } + } + reject(errorResponse); }); }); -}; +} diff --git a/src/components/pages/User/Profile.tsx b/src/components/pages/User/Profile.tsx index 902526c0..4e0b5911 100644 --- a/src/components/pages/User/Profile.tsx +++ b/src/components/pages/User/Profile.tsx @@ -10,7 +10,8 @@ import { } from "../../../background/constants"; import { changeUserInformation, - UserInformation + UserInformation, + UpdateUserErrorResponse } from "../../../background/api/userInformation"; import edit_svg from "../../../assets/images/icons/material.io/edit_white_24dp.svg"; import { hashPassword } from "../../../background/methods/passwords"; @@ -57,24 +58,31 @@ export default function Profile(): ReactElement { }; function changeEditMode(): void { - console.log("[PROFILE] changedEditMode"); + console.log("[Profile] changedEditMode"); setIsEditing(!isEditing); } // TODO why is this async - // TODO handle 409 differently - // TODO handle same username differently const handleSubmit = async (userInput: UserInformationInputInterface) => { - console.log("[PROFILE] handleSubmit"); + console.log("[Profile] handleSubmit"); let updatedUser: UserInformation = { ...user, username: userInput.username } - // if the user updated the password if (userInput.password) { - // hash password + // if the user updated the password const hashedPassword = await hashPassword(userInput.password) updatedUser.password = hashedPassword updatedUser.confirmationPassword = hashedPassword + + } else if (user.username === userInput.username) { + // if the new username is the old one show erorr instead of calling the backend + // TODO should we even show something here? + handleAlertVisibility( + DEFAULT_ALERT_DURATION, + "danger", + "Error: No Changes." + ); + return; } // trigger api call @@ -88,13 +96,24 @@ export default function Profile(): ReactElement { "Worked: " + res ); }) - .catch((err) => { - console.log("[PROFILE] Error:" + err); - handleAlertVisibility( - DEFAULT_ALERT_DURATION, - "danger", - "Error: " + err - ); + .catch(({ errorCode, error }: UpdateUserErrorResponse) => { + console.log("[Profile] Error: (" + errorCode + ") - " + error.errorMessage); + + // 409 === Username already taken + if (errorCode === 409) { + handleAlertVisibility( + DEFAULT_ALERT_DURATION, + "danger", + "Error: Username already taken" + ); + + } else { + handleAlertVisibility( + DEFAULT_ALERT_DURATION, + "danger", + "Error: " + error.errorMessage + ); + } }); }; From a05d76b4381f9895ae7ff955da4b01654dd4dc46 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Sat, 22 Jan 2022 15:04:00 +0100 Subject: [PATCH 09/20] Removed Todos, added fixmes --- src/components/pages/User/Profile.tsx | 3 +-- src/components/pages/User/Registration.tsx | 2 +- src/components/pages/User/UserInformationInput.tsx | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/pages/User/Profile.tsx b/src/components/pages/User/Profile.tsx index 4e0b5911..4ad72305 100644 --- a/src/components/pages/User/Profile.tsx +++ b/src/components/pages/User/Profile.tsx @@ -76,7 +76,7 @@ export default function Profile(): ReactElement { } else if (user.username === userInput.username) { // if the new username is the old one show erorr instead of calling the backend - // TODO should we even show something here? + // FIXME should we even show something here? handleAlertVisibility( DEFAULT_ALERT_DURATION, "danger", @@ -106,7 +106,6 @@ export default function Profile(): ReactElement { "danger", "Error: Username already taken" ); - } else { handleAlertVisibility( DEFAULT_ALERT_DURATION, diff --git a/src/components/pages/User/Registration.tsx b/src/components/pages/User/Registration.tsx index 0e93d67f..e4179859 100644 --- a/src/components/pages/User/Registration.tsx +++ b/src/components/pages/User/Registration.tsx @@ -79,7 +79,7 @@ export default function Registration(): ReactElement { return } - // TODO: remove confirmation-password in backend + // FIXME: remove confirmation-password in backend registerNewUser( newUser.username, newUser.password!!, diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index 7c26f2b1..30f2f0ff 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -72,7 +72,7 @@ export default function UserInformationInput( // check if password is empty if (password) { // check password strength - if (passwordStrength <= REQUIRED_PASSWORD_STRENGTH) { + if (passwordStrength < REQUIRED_PASSWORD_STRENGTH) { triggerAlert("Password is not strong enough"); return; } From 25756ad19a693aea0b98743c28518c84626f4a1e Mon Sep 17 00:00:00 2001 From: open-schnick Date: Sat, 22 Jan 2022 15:20:10 +0100 Subject: [PATCH 10/20] Removed useless asyncs --- src/components/pages/User/Profile.tsx | 1 - src/components/pages/User/Registration.tsx | 2 +- src/components/pages/User/UserInformationInput.tsx | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/components/pages/User/Profile.tsx b/src/components/pages/User/Profile.tsx index 4ad72305..d1fe6245 100644 --- a/src/components/pages/User/Profile.tsx +++ b/src/components/pages/User/Profile.tsx @@ -62,7 +62,6 @@ export default function Profile(): ReactElement { setIsEditing(!isEditing); } - // TODO why is this async const handleSubmit = async (userInput: UserInformationInputInterface) => { console.log("[Profile] handleSubmit"); diff --git a/src/components/pages/User/Registration.tsx b/src/components/pages/User/Registration.tsx index e4179859..ef4dda24 100644 --- a/src/components/pages/User/Registration.tsx +++ b/src/components/pages/User/Registration.tsx @@ -67,7 +67,7 @@ export default function Registration(): ReactElement { repositionSubmitLogo(); }, [registrationContainer, logoSubmit]); - const handleSubmit = async (newUser: UserInformationInputInterface) => { + const handleSubmit = (newUser: UserInformationInputInterface) => { console.log("[REGISTRATION] handleSubmit"); if (!newUser.password) { diff --git a/src/components/pages/User/UserInformationInput.tsx b/src/components/pages/User/UserInformationInput.tsx index 30f2f0ff..eff6c350 100644 --- a/src/components/pages/User/UserInformationInput.tsx +++ b/src/components/pages/User/UserInformationInput.tsx @@ -59,7 +59,7 @@ export default function UserInformationInput( * Checks if the username is valid. If the password is not null also check that. * Check the password if the passord is required. */ - const handleSubmit = async (event: FormEvent) => { + const handleSubmit = (event: FormEvent) => { event.preventDefault(); console.log("[UserInformationInput] handleSubmit"); From d40b8a039873ea3c8c1c3041fa12199c4b54b18e Mon Sep 17 00:00:00 2001 From: open-schnick Date: Sat, 22 Jan 2022 15:22:01 +0100 Subject: [PATCH 11/20] Updated Snapshots --- .../__snapshots__/storybook.test.ts.snap | 80 ++------- .../__snapshots__/Registration.test.tsx.snap | 160 ++++-------------- 2 files changed, 48 insertions(+), 192 deletions(-) diff --git a/src/__tests__/__snapshots__/storybook.test.ts.snap b/src/__tests__/__snapshots__/storybook.test.ts.snap index 3e8642c1..e7f47b6f 100644 --- a/src/__tests__/__snapshots__/storybook.test.ts.snap +++ b/src/__tests__/__snapshots__/storybook.test.ts.snap @@ -1055,70 +1055,6 @@ exports[`Storyshots Registration default 1`] = ` type="password" value="" /> -
- status icon password length - - Missing: - - - Passwords must be between 8 and 20 characters. - -
-
- status icon password contains uppercase character - - Missing: - - - Passwords must be at least contain 1 uppercase character. - -
-
- status icon password contains lowercase character - - Missing: - - - Passwords must be at least contain 1 lowercase character. - -
-
- status icon password contains number - - Missing: - - - Passwords must be at least contain 1 number. - -
+
+ status icon password length + + Missing: + + + Passwords must be at least strong. + +
status icon passwords match -
- status icon password length - - Missing: - - - Passwords must be between 8 and 20 characters. - -
-
- status icon password contains uppercase character - - Missing: - - - Passwords must be at least contain 1 uppercase character. - -
-
- status icon password contains lowercase character - - Missing: - - - Passwords must be at least contain 1 lowercase character. - -
-
- status icon password contains number - - Missing: - - - Passwords must be at least contain 1 number. - -
+
+ status icon password length + + Missing: + + + Passwords must be at least strong. + +
status icon passwords match -
- status icon password length - - Missing: - - - Passwords must be between 8 and 20 characters. - -
-
- status icon password contains uppercase character - - Missing: - - - Passwords must be at least contain 1 uppercase character. - -
-
- status icon password contains lowercase character - - Missing: - - - Passwords must be at least contain 1 lowercase character. - -
-
- status icon password contains number - - Missing: - - - Passwords must be at least contain 1 number. - -
+
+ status icon password length + + Missing: + + + Passwords must be at least strong. + +
status icon passwords match Date: Sat, 22 Jan 2022 16:01:31 +0100 Subject: [PATCH 12/20] Comments --- src/background/api/userInformation.ts | 5 +++-- src/background/constants.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/background/api/userInformation.ts b/src/background/api/userInformation.ts index 553815cb..b9b7d9c8 100644 --- a/src/background/api/userInformation.ts +++ b/src/background/api/userInformation.ts @@ -15,11 +15,12 @@ export interface UserInformation { } /** - * Interface describing + * Interface describing the classic return value of the backend */ +// FIXME does this type already exist? export interface UpdateUserErrorResponse { errorCode: number; - error: { statusMessage: string, errorMessage: string }; // TODO does this type already exist? + error: { statusMessage: string, errorMessage: string }; } export const changeUserInformation = ( diff --git a/src/background/constants.ts b/src/background/constants.ts index 8b911959..302129f8 100644 --- a/src/background/constants.ts +++ b/src/background/constants.ts @@ -21,5 +21,5 @@ const dev: constantsdef = { }; export const constants = process.env.NODE_ENV === "development" ? dev : prod; -export const REQUIRED_PASSWORD_STRENGTH = 3; +export const REQUIRED_PASSWORD_STRENGTH = 3; // 3/4 (starting at 0) export const DEFAULT_ALERT_DURATION = 3500; From fe0198320c58d3754873ad61b7181123c3ad6261 Mon Sep 17 00:00:00 2001 From: open-schnick Date: Sat, 22 Jan 2022 16:07:41 +0100 Subject: [PATCH 13/20] Prettier --- src/background/api/userInformation.ts | 8 +- src/components/App.tsx | 4 +- src/components/Router/BackendRedirect.tsx | 2 +- src/components/Router/Router.tsx | 33 ++--- src/components/basicElements/login/Login.tsx | 25 ++-- .../basicElements/topArea/Header.tsx | 26 ++-- .../pages/User/PasswordStrengthBar.tsx | 25 ++-- src/components/pages/User/Profile.tsx | 31 +++-- src/components/pages/User/Registration.tsx | 28 ++-- src/components/pages/User/RuleChecker.tsx | 5 +- .../pages/User/UserInformationInput.tsx | 14 +- .../pages/filesytem/FileItemContextMenu.tsx | 7 +- .../__tests__/folderContentMock.json | 123 +++++++++++++++++- .../pages/filesytem/upload/UploadZone.tsx | 4 +- src/dev/testUtils/Wrapper.tsx | 11 +- 15 files changed, 246 insertions(+), 100 deletions(-) diff --git a/src/background/api/userInformation.ts b/src/background/api/userInformation.ts index b9b7d9c8..bce3f9f0 100644 --- a/src/background/api/userInformation.ts +++ b/src/background/api/userInformation.ts @@ -11,7 +11,7 @@ export interface UserInformation { username?: string | null; groups?: string[] | null; password?: string; - confirmationPassword?: string; // TODO remove this. + confirmationPassword?: string; // TODO remove this. } /** @@ -20,7 +20,7 @@ export interface UserInformation { // FIXME does this type already exist? export interface UpdateUserErrorResponse { errorCode: number; - error: { statusMessage: string, errorMessage: string }; + error: { statusMessage: string; errorMessage: string }; } export const changeUserInformation = ( @@ -44,8 +44,8 @@ export const changeUserInformation = ( statusMessage: error.response.data.status, errorMessage: error.response.data.message } - } + }; reject(errorResponse); }); }); -} +}; diff --git a/src/components/App.tsx b/src/components/App.tsx index 9619a42d..015e1888 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -1,6 +1,6 @@ import React, { ReactElement } from "react"; import "./App.css"; -import { BrowserRouter, Route,Routes } from "react-router-dom"; +import { BrowserRouter, Route, Routes } from "react-router-dom"; import Router from "./Router/Router"; import PermanentAssets from "./basicElements/PermanentAssets"; @@ -79,7 +79,7 @@ function App(props: Props): ReactElement { path={"/error"} element={} /> - } /> + } />
diff --git a/src/components/Router/BackendRedirect.tsx b/src/components/Router/BackendRedirect.tsx index 2d579e7c..0c04fd29 100644 --- a/src/components/Router/BackendRedirect.tsx +++ b/src/components/Router/BackendRedirect.tsx @@ -1,4 +1,4 @@ -import {useLocation, useNavigate} from "react-router-dom"; +import { useLocation, useNavigate } from "react-router-dom"; export default function BackendRedirect() { const location = useLocation(); diff --git a/src/components/Router/Router.tsx b/src/components/Router/Router.tsx index 14b185a0..942c6741 100644 --- a/src/components/Router/Router.tsx +++ b/src/components/Router/Router.tsx @@ -1,30 +1,31 @@ -import React, {ReactElement} from "react"; -import {Navigate, Route, Routes} from "react-router-dom"; +import React, { ReactElement } from "react"; +import { Navigate, Route, Routes } from "react-router-dom"; import Health from "../pages/health/Health"; import Error404 from "../pages/errors/Error404"; import Login from "../basicElements/login/Login"; import Registration from "../pages/User/Registration"; -import FileSystem, {filesBaseUrl} from "../pages/filesytem/Filesystem"; +import FileSystem, { filesBaseUrl } from "../pages/filesytem/Filesystem"; import Profile from "../pages/User/Profile"; import Error400 from "../pages/errors/Error400"; import BackendRedirect from "./BackendRedirect"; - export default function Router(): ReactElement { - return ( - }/> - }/> - }/> - }/> - }/> - }/> - }/> - }/> - }/> - }/> - }/> + } /> + } + /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> ); } diff --git a/src/components/basicElements/login/Login.tsx b/src/components/basicElements/login/Login.tsx index 68d4308d..88c0416e 100644 --- a/src/components/basicElements/login/Login.tsx +++ b/src/components/basicElements/login/Login.tsx @@ -1,11 +1,18 @@ -import React, {Dispatch, FormEvent, ReactElement, SetStateAction, useEffect, useState} from "react"; -import {Button, Col, Form, Image, Row, Spinner} from "react-bootstrap"; -import {loginWithUsernameAndPassword} from "../../../background/api/auth"; +import React, { + Dispatch, + FormEvent, + ReactElement, + SetStateAction, + useEffect, + useState +} from "react"; +import { Button, Col, Form, Image, Row, Spinner } from "react-bootstrap"; +import { loginWithUsernameAndPassword } from "../../../background/api/auth"; import logo from "../../../assets/images/logos/logoWithWhiteBorder.png"; -import {useLocation, useNavigate} from "react-router-dom"; -import {useSelector} from "react-redux"; -import {RootState} from "../../../background/redux/store"; +import { useLocation, useNavigate } from "react-router-dom"; +import { useSelector } from "react-redux"; +import { RootState } from "../../../background/redux/store"; export interface LoginInputInterface { handleSubmit: (event: FormEvent) => void; @@ -34,7 +41,7 @@ function Login(): ReactElement { const tokens = useSelector((state: RootState) => state.tokens); - useEffect(()=>{ + useEffect(() => { if (tokens.refreshToken && tokens.accessToken?.token) { if (dest) { navigate(decodeURIComponent(dest)); @@ -42,7 +49,7 @@ function Login(): ReactElement { navigate("/"); } } - },[dest,navigate,tokens]) + }, [dest, navigate, tokens]); const handleSubmit = (event: FormEvent) => { event.preventDefault(); @@ -109,7 +116,7 @@ export function LoginHeader() { return (
- +

Greetings Traveller!

diff --git a/src/components/basicElements/topArea/Header.tsx b/src/components/basicElements/topArea/Header.tsx index e7b90d50..68676c4b 100644 --- a/src/components/basicElements/topArea/Header.tsx +++ b/src/components/basicElements/topArea/Header.tsx @@ -1,10 +1,16 @@ -import React, {ReactElement} from "react"; -import {useNavigate} from "react-router-dom"; +import React, { ReactElement } from "react"; +import { useNavigate } from "react-router-dom"; import logo from "../../../assets/images/logos/logo.png"; -import {Container, Nav, Navbar, NavbarBrand, NavDropdown} from "react-bootstrap"; -import {SystemState} from "../../../background/redux/actions/sytemState"; -import {connect, ConnectedProps} from "react-redux"; -import {logout} from "../../../background/api/auth"; +import { + Container, + Nav, + Navbar, + NavbarBrand, + NavDropdown +} from "react-bootstrap"; +import { SystemState } from "../../../background/redux/actions/sytemState"; +import { connect, ConnectedProps } from "react-redux"; +import { logout } from "../../../background/api/auth"; export interface navBarElement_Interface { name: string; @@ -59,7 +65,7 @@ function Header(props: PropsFromRedux): ReactElement { if (element.onClick) element.onClick(); }} > - + {element.text} ); @@ -83,7 +89,7 @@ function Header(props: PropsFromRedux): ReactElement { /> FileFighter - + {props.username && (