diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..aed7815 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,11 @@ +.dockerignore +.env +.git +.gitignore +.vs +.vscode +docker-compose.yml +docker-compose.*.yml +*/bin +*/obj +*/node_modules \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index dacd6d3..da1386a 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -12,6 +12,49 @@ "@babel/highlight": "^7.0.0" } }, + "@babel/compat-data": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.5.tgz", + "integrity": "sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw==", + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "requires": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "caniuse-lite": { + "version": "1.0.30001105", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz", + "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==" + }, + "electron-to-chromium": { + "version": "1.3.505", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.505.tgz", + "integrity": "sha512-Aunrp3HWtmdiJLIl+IPSFtEvJ/4Q9a3eKaxmzCthaZF1gbTbpHUTCU2zOVnFPH7r/AD7zQXyuFidYXzSHXBdsw==" + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "@babel/core": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.3.tgz", @@ -78,6 +121,44 @@ "esutils": "^2.0.0" } }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", + "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.10.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-call-delegate": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", @@ -88,17 +169,273 @@ "@babel/types": "^7.4.4" } }, - "@babel/helper-create-class-features-plugin": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.4.4.tgz", - "integrity": "sha512-UbBHIa2qeAGgyiNR9RszVF7bUHEdgS4JAUNT8SiqrAN6YJVxlOxeLr5pBzb5kan302dejJ9nla4RyKcR1XT6XA==", + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", "requires": { - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-member-expression-to-functions": "^7.0.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.4", - "@babel/helper-split-export-declaration": "^7.4.4" + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "requires": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "caniuse-lite": { + "version": "1.0.30001105", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz", + "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==" + }, + "electron-to-chromium": { + "version": "1.3.505", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.505.tgz", + "integrity": "sha512-Aunrp3HWtmdiJLIl+IPSFtEvJ/4Q9a3eKaxmzCthaZF1gbTbpHUTCU2zOVnFPH7r/AD7zQXyuFidYXzSHXBdsw==" + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", + "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "requires": { + "@babel/types": "^7.10.5" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==" + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "requires": { + "regenerate": "^1.4.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "requires": { + "jsesc": "~0.5.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==" + } } }, "@babel/helper-define-map": { @@ -236,6 +573,11 @@ "@babel/types": "^7.4.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" + }, "@babel/helper-wrap-function": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz", @@ -283,22 +625,52 @@ } }, "@babel/plugin-proposal-class-properties": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.0.tgz", - "integrity": "sha512-t2ECPNOXsIeK1JxJNKmgbzQtoG27KIlVE61vTqX0DKR9E9sZlVVxWUtEW9D5FlZ8b8j7SBNCHY47GgPKCKlpPg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz", + "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.0", - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-proposal-decorators": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.4.0.tgz", - "integrity": "sha512-d08TLmXeK/XbgCo7ZeZ+JaeZDtDai/2ctapTRsWWkkmy7G/cqz8DQN/HlWG7RR4YmfXxmExsbU3SuCjlM7AtUg==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.8.3.tgz", + "integrity": "sha512-e3RvdvS4qPJVTe288DlXjwKflpfy1hr0j5dz5WpIYYeP7vQZg2WfAEIp8k5/Lwis/m5REXEteIz6rrcDtXXG7w==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.4.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-decorators": "^7.2.0" + "@babel/helper-create-class-features-plugin": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-decorators": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-proposal-json-strings": { @@ -310,6 +682,38 @@ "@babel/plugin-syntax-json-strings": "^7.2.0" } }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz", + "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", @@ -328,6 +732,22 @@ "@babel/plugin-syntax-optional-catch-binding": "^7.2.0" } }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz", + "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", @@ -347,27 +767,48 @@ } }, "@babel/plugin-syntax-decorators": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.2.0.tgz", - "integrity": "sha512-38QdqVoXdHUQfTpZo3rQwqQdWtCn5tMv4uV6r2RMfTqNBuv4ZBhz79SfaQWKTVmxHjeFv/DnXVC/+agHCklYWA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.4.tgz", + "integrity": "sha512-2NaoC6fAk2VMdhY1eerkfHV+lVYC1u8b+jmRJISqANCJlTxYy19HGdIkkQtix2UtkcPuPu+IlDgrVseZnU03bw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-dynamic-import": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz", - "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-flow": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.2.0.tgz", - "integrity": "sha512-r6YMuZDWLtLlu0kqIim5o/3TNRAlWb073HwT3e2nKf9I8IIvOggPrnILYPsrrKilmn/mYEMCf/Z07w3yQJF6dg==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", + "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-syntax-json-strings": { @@ -386,6 +827,36 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz", @@ -402,12 +873,49 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.3.3.tgz", - "integrity": "sha512-dGwbSMA1YhVS8+31CnPR7LB4pcbrzcV99wQzby4uAfrkZPYZlQ7ImwdpzLqi6Z6IL02b8IAL379CaMwo0x5Lag==", + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-arrow-functions": { @@ -504,12 +1012,19 @@ } }, "@babel/plugin-transform-flow-strip-types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.4.0.tgz", - "integrity": "sha512-C4ZVNejHnfB22vI2TYN4RUp2oCmq6cSEAg4RygSvYZUECRqUu9O4PMEMNJ4wsemaRGg27BbgYctG4BZh+AgIHw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz", + "integrity": "sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-flow": "^7.2.0" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-syntax-flow": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-for-of": { @@ -652,6 +1167,31 @@ "@babel/plugin-syntax-jsx": "^7.2.0" } }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.10.4.tgz", + "integrity": "sha512-RM3ZAd1sU1iQ7rI2dhrZRZGv0aqzNQMbkIUCS1txYpi9wHQ2ZHNjo5TwX+UD6pvFW4AbWqLVYvKy5qJSAyRGjQ==", + "requires": { + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + } + } + }, "@babel/plugin-transform-react-jsx-self": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.2.0.tgz", @@ -687,20 +1227,43 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.3.tgz", - "integrity": "sha512-7Q61bU+uEI7bCUFReT1NKn7/X6sDQsZ7wL1sJ9IYMAO7cI+eg6x9re1cEw2fCRMbbTVyoeUKWSV1M6azEfKCfg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz", + "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", "resolve": "^1.8.1", "semver": "^5.5.1" }, "dependencies": { + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -747,12 +1310,20 @@ } }, "@babel/plugin-transform-typescript": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz", - "integrity": "sha512-RPB/YeGr4ZrFKNwfuQRlMf2lxoCUaU01MTw39/OFE/RiL8HDjtn68BwEPft1P7JN4akyEmjGWAMNldOV7o9V2g==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.10.5.tgz", + "integrity": "sha512-YCyYsFrrRMZ3qR7wRwtSSJovPG5vGyG4ZdcSAivGwTfoasMp3VOB/AKhohu3dFtmB4cCDcsndCSxGtrdliCsZQ==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-typescript": "^7.2.0" + "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/plugin-transform-unicode-regex": { @@ -827,6 +1398,18 @@ } } }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, "@babel/preset-react": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.0.0.tgz", @@ -840,12 +1423,19 @@ } }, "@babel/preset-typescript": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz", - "integrity": "sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz", + "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-transform-typescript": "^7.3.2" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-typescript": "^7.9.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } } }, "@babel/runtime": { @@ -911,6 +1501,92 @@ "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-9.0.1.tgz", "integrity": "sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==" }, + "@fluentui/date-time-utilities": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@fluentui/date-time-utilities/-/date-time-utilities-7.2.0.tgz", + "integrity": "sha512-F3lbP7RMVANG3vTeVuIEQxxc+WS2V3EnzN2BFbpjE64ho8J3PeoOHV51WX8jFsVKdUcSAb+kixFPUniwPqiHpA==", + "requires": { + "@uifabric/set-version": "^7.0.18", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "@fluentui/keyboard-key": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@fluentui/keyboard-key/-/keyboard-key-0.2.7.tgz", + "integrity": "sha512-NX6BPT/hXOocYCksnqSw3gTFwaMHaIsaqfe6ZbGZpfBIN4idwhVUYDLwcyjUx0FmUJoWfaVsa61fbelg35USiA==", + "requires": { + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "@fluentui/react": { + "version": "7.123.7", + "resolved": "https://registry.npmjs.org/@fluentui/react/-/react-7.123.7.tgz", + "integrity": "sha512-DHA5uvhNxo9geCtGv4sZI3mu2LV0aqnRLfnf1EnY7MMnuuscrMxuii8gSHFlbxOkVVoc5uzb10quiUyWlUFD6A==", + "requires": { + "@uifabric/set-version": "^7.0.18", + "office-ui-fabric-react": "^7.123.8", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "@fluentui/react-focus": { + "version": "7.12.25", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-7.12.25.tgz", + "integrity": "sha512-NRh5HXNJ7X52I48B+SJGOM0X8vqpoD4NO8KlBpcDJFwN3VV/5Mi5BGRUq87rpbpKdPB2q4Ni3o8E2LB4qQmL0A==", + "requires": { + "@fluentui/keyboard-key": "^0.2.7", + "@uifabric/merge-styles": "^7.16.3", + "@uifabric/set-version": "^7.0.18", + "@uifabric/styling": "^7.14.5", + "@uifabric/utilities": "^7.24.5", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "@fluentui/react-icons": { + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@fluentui/react-icons/-/react-icons-0.1.40.tgz", + "integrity": "sha512-UFGMeQgajjfFwWtoEvk7eHd6Bye4aeVzOVTVKQ9MWxZZQIzP5gzA8Qk8dMfwSrPV5oplsMlTKijl7kULdY+H6g==", + "requires": { + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/set-version": "^7.0.18", + "@uifabric/utilities": "^7.24.5", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, "@hapi/address": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", @@ -1149,9 +1825,9 @@ } }, "@microsoft/load-themed-styles": { - "version": "1.9.8", - "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.9.8.tgz", - "integrity": "sha512-EWn+lvrG9wK42G1nYZB+yQ+5yCFCi4zXuv/WB9/5rEU+dc4p8xM9YEcJ6auydMpkdpyySxGYgHFnMgoIKCTVWg==" + "version": "1.10.65", + "resolved": "https://registry.npmjs.org/@microsoft/load-themed-styles/-/load-themed-styles-1.10.65.tgz", + "integrity": "sha512-4sLbMM9aywtSMRHebh912/6n4/lC/go6QlTbbQfIBBtfy0oQJdDOW1KtfZfSGPggoPiNEzA7xnVsFCFyMnZyEg==" }, "@mrmlnc/readdir-enhanced": { "version": "2.2.1", @@ -1279,9 +1955,9 @@ } }, "@types/babel__core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.2.tgz", - "integrity": "sha512-cfCCrFmiGY/yq0NuKNxIQvZFy9kY/1immpSpTngOnyIbD4+eJOG5mxphhHDv3CHL9GltO4GcKr54kGBg3RNdbg==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", + "integrity": "sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==", "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0", @@ -1291,9 +1967,9 @@ } }, "@types/babel__generator": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", - "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz", + "integrity": "sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==", "requires": { "@babel/types": "^7.0.0" } @@ -1308,17 +1984,17 @@ } }, "@types/babel__traverse": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", - "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.13.tgz", + "integrity": "sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==", "requires": { "@babel/types": "^7.3.0" } }, "@types/history": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.2.tgz", - "integrity": "sha512-ui3WwXmjTaY73fOQ3/m3nnajU/Orhi6cEu5rzX+BrAAJxa3eITXZ5ch9suPqtM03OWhAHhPSyBGCN4UKoxO20Q==" + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.6.tgz", + "integrity": "sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w==" }, "@types/hoist-non-react-statics": { "version": "3.3.1", @@ -1370,13 +2046,31 @@ "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==" }, "@types/node-fetch": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.3.7.tgz", - "integrity": "sha512-+bKtuxhj/TYSSP1r4CZhfmyA0vm/aDRQNo7vbAgf6/cZajn0SAniGGST07yvI4Q+q169WTa2/x9gEHfJrkcALw==", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", "requires": { - "@types/node": "*" + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, "@types/prop-types": { "version": "15.7.1", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.1.tgz", @@ -1397,9 +2091,9 @@ } }, "@types/react-adal": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/react-adal/-/react-adal-0.4.1.tgz", - "integrity": "sha512-uXGo/QBvXNidyQftPH3484K5F7P0UMLy08U7mOGayownTg013MltakbTPOKpnVUksToMoj8zSYSe40XIYQV08A==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@types/react-adal/-/react-adal-0.4.2.tgz", + "integrity": "sha512-t4ao5iTRbCZfu0oe1iPnZrTRNtea2lDZUzX45iTEzEJXbKh1wbV7U/EKbnIWunuEORRmxjETgz7ScFBSMLVp9A==", "requires": { "@types/react": "*" } @@ -1413,9 +2107,9 @@ } }, "@types/react-redux": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.1.tgz", - "integrity": "sha512-owqNahzE8en/jR4NtrUJDJya3tKru7CIEGSRL/pVS84LtSCdSoT7qZTkrbBd3S4Lp11sAp+7LsvxIeONJVKMnw==", + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.9.tgz", + "integrity": "sha512-mpC0jqxhP4mhmOl3P4ipRsgTgbNofMRXJb08Ms6gekViLj61v1hOZEKWDCyWsdONr6EjEA6ZHXC446wdywDe0w==", "requires": { "@types/hoist-non-react-statics": "^3.3.0", "@types/react": "*", @@ -1424,18 +2118,18 @@ } }, "@types/react-router": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.0.3.tgz", - "integrity": "sha512-j2Gge5cvxca+5lK9wxovmGPgpVJMwjyu5lTA/Cd6fLGoPq7FXcUE1jFkEdxeyqGGz8VfHYSHCn5Lcn24BzaNKA==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.8.tgz", + "integrity": "sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg==", "requires": { "@types/history": "*", "@types/react": "*" } }, "@types/react-router-dom": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.3.4.tgz", - "integrity": "sha512-xrwaWHpnxKk/TTRe7pmoGy3E4SyF/ojFqNfFJacw7OLdfLXRvGfk4r/XePVaZNVfeJzL8fcnNilPN7xOdJ/vGw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-4.3.5.tgz", + "integrity": "sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==", "requires": { "@types/history": "*", "@types/react": "*", @@ -1476,6 +2170,11 @@ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==" }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" + }, "@typescript-eslint/eslint-plugin": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-1.6.0.tgz", @@ -1514,87 +2213,161 @@ } }, "@uifabric/fluent-theme": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@uifabric/fluent-theme/-/fluent-theme-7.0.2.tgz", - "integrity": "sha512-BFpy7qi/AtygWP/xCzSQ1enSA6yJHPLx+C2vNHyjV1HTX1dUUUqyCQRowHFinQiR6A3uWi4k4/um36aMgrXrMA==", + "version": "7.1.115", + "resolved": "https://registry.npmjs.org/@uifabric/fluent-theme/-/fluent-theme-7.1.115.tgz", + "integrity": "sha512-XUea2l/TJAKfrXVH430NW5/K3dXDn6AP3gl+aNNT7pSTgTzoUHSjbPHLj2AGub54unUQixbD3yd4/pfvPqHD0A==", "requires": { - "@uifabric/merge-styles": "^7.0.2", - "@uifabric/set-version": "^7.0.0", - "@uifabric/styling": "^7.0.2", - "@uifabric/variants": "^7.0.2", - "office-ui-fabric-react": "^7.1.1", - "tslib": "^1.7.1" + "@uifabric/merge-styles": "^7.16.3", + "@uifabric/set-version": "^7.0.18", + "@uifabric/styling": "^7.14.5", + "@uifabric/variants": "^7.1.100", + "office-ui-fabric-react": "^7.123.8", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/foundation": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.0.2.tgz", - "integrity": "sha512-9ik+k8B+otG3t/FyUqdWiAZHQS0nIZQR8SrFfZfW3sEt6kITxg0bHb8jWEW+xqc0b2qEO2V5lJmtWz6nRp2CDQ==", + "version": "7.7.39", + "resolved": "https://registry.npmjs.org/@uifabric/foundation/-/foundation-7.7.39.tgz", + "integrity": "sha512-dQvUcSbLFPAiLagn8gxPXMVB+I//3pz6QB313mQaNlOgeSw45S8Hm1b/sy/KoMqHl8zCJRmZInX3IYTpmhKrJQ==", "requires": { - "@uifabric/set-version": "^7.0.0", - "@uifabric/styling": "^7.1.1", - "@uifabric/utilities": "^7.0.6", - "tslib": "^1.7.1" + "@uifabric/merge-styles": "^7.16.3", + "@uifabric/set-version": "^7.0.18", + "@uifabric/styling": "^7.14.5", + "@uifabric/utilities": "^7.24.5", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/icons": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.1.0.tgz", - "integrity": "sha512-hKGWPTkxZkGEuvfsFx5dh28yyWbYHf32BtvcwsFR5Tn8LEpTR1HZY/tc2aS+JjNMpX1m+R3SrrxLYT9rVkC77Q==", + "version": "7.3.65", + "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-7.3.65.tgz", + "integrity": "sha512-aDnuRS1+su/slD4pkIzdZfrDQxYfgosGdildvgIAKX9HSShw4BZKH7KkqenAdmhY3iBZoV5htr+kGFZGiCjWTw==", "requires": { - "@uifabric/set-version": "^7.0.0", - "@uifabric/styling": "^7.1.1", - "tslib": "^1.7.1" + "@uifabric/set-version": "^7.0.18", + "@uifabric/styling": "^7.14.5", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/merge-styles": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.1.1.tgz", - "integrity": "sha512-FrQvdydkFPcwLkI4GykKdeUXMZJ6VlAsWl5McNDZq3UQEkwDS69OUwwA+zdwtNZMSrgo5TT1MshViUvwHvFFIA==", + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-7.16.3.tgz", + "integrity": "sha512-MmLPDRVbFENixb77K041y9VlSohcULbYXHlolYedNW+KCr1tyu700GunnBwOnWRhKOoKgStvBZZdy5X7ty41xQ==", "requires": { - "@uifabric/set-version": "^7.0.0", - "tslib": "^1.7.1" + "@uifabric/set-version": "^7.0.18", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } + } + }, + "@uifabric/react-hooks": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/@uifabric/react-hooks/-/react-hooks-7.6.2.tgz", + "integrity": "sha512-ETokkVskutNvaWWGUy6x4bOFyek1/tVfUygG1NyiqNs78S2qfl4Pt8pyZs5PDOcGNfPor5IIKSi519ZmRayCIw==", + "requires": { + "@uifabric/set-version": "^7.0.18", + "@uifabric/utilities": "^7.24.5", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/set-version": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.0.tgz", - "integrity": "sha512-0cdpZJ5AHmrzb1RMrA420+sRxJiMRwgiOfLoRCSpOqkSwn2TILACGGfTJ9vRWuKEugBiz/+qVltBUYMcdPlATQ==", + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/@uifabric/set-version/-/set-version-7.0.18.tgz", + "integrity": "sha512-W/SD7FzukXw1tz8zeD7fy548as1I048dA9tTnfbWMH9iSAbRG1LWmkw2+4BgyoOcEDumcQlpGY2818+atpndyw==", "requires": { - "tslib": "^1.7.1" + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/styling": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.1.1.tgz", - "integrity": "sha512-UiBIj7HZwRk3qLKO+RcSnT59Vizu6+QPrv94e5MIFVIbh241J8N+PRFHK6U44Se+7ZjGON1DvZKs1ll57NWufg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-7.14.5.tgz", + "integrity": "sha512-9HFZsBMXqW6uilhbL/z9Ih2JwqK0IVM1Z0HYAG9cYOciXvCZ6MUUi08nnkwRq2bkOe6vgaiCovsAh2HkOhb+0Q==", "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/merge-styles": "^7.1.1", - "@uifabric/set-version": "^7.0.0", - "@uifabric/utilities": "^7.0.6", - "tslib": "^1.7.1" + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/merge-styles": "^7.16.3", + "@uifabric/set-version": "^7.0.18", + "@uifabric/utilities": "^7.24.5", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/utilities": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.0.6.tgz", - "integrity": "sha512-5rvfwfcbUm7YWgeQ1fiQ67gi6P2PSQG5N7sX9xIs/Jzoem/qpE5E9+QIP7UTnB6tOrpDJgFwWsBYKY8CfAlZsg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-7.24.5.tgz", + "integrity": "sha512-pg8pzEwNoytofrcTx0LHBm9NZNgyJqTiF6AQV0sRbL1eF27sxGZXb9PD7PBWv0rRJ79Q0xyEr4PiEsLZ2k/d5w==", "requires": { - "@uifabric/merge-styles": "^7.1.1", - "@uifabric/set-version": "^7.0.0", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" + "@uifabric/merge-styles": "^7.16.3", + "@uifabric/set-version": "^7.0.18", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@uifabric/variants": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@uifabric/variants/-/variants-7.0.2.tgz", - "integrity": "sha512-3PtVIyDS88Zu6rO02hdm5cUS0HWPcd3mNoHOkVFPU184VancJXWKMRvjuU7W8Gu9Gd7NKc+7UelUBPr1qPCpEg==", + "version": "7.1.100", + "resolved": "https://registry.npmjs.org/@uifabric/variants/-/variants-7.1.100.tgz", + "integrity": "sha512-ImHNwQhLuq7qcalP896yTNM5tWy3yVCWpKWWgLze5xHy1qts51Vb6px99NNREtKTKEiWNYDbMBMWDDvDlaGJPA==", "requires": { - "@uifabric/set-version": "^7.0.0", - "office-ui-fabric-react": "^7.1.1", - "tslib": "^1.7.1" + "@uifabric/set-version": "^7.0.18", + "office-ui-fabric-react": "^7.123.8", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "@webassemblyjs/ast": { @@ -1814,9 +2587,9 @@ "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" }, "address": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz", - "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" }, "ajv": { "version": "6.10.0", @@ -1937,11 +2710,6 @@ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=" - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -1961,16 +2729,6 @@ "es-abstract": "^1.7.0" } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=" - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=" - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -2207,17 +2965,203 @@ } }, "babel-jest": { - "version": "24.8.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", - "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.9.0.tgz", + "integrity": "sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==", "requires": { - "@jest/transform": "^24.8.0", - "@jest/types": "^24.8.0", + "@jest/transform": "^24.9.0", + "@jest/types": "^24.9.0", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^5.1.0", - "babel-preset-jest": "^24.6.0", + "babel-preset-jest": "^24.9.0", "chalk": "^2.4.2", "slash": "^2.0.0" + }, + "dependencies": { + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/transform": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.9.0.tgz", + "integrity": "sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==", + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.9.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.9.0", + "jest-regex-util": "^24.9.0", + "jest-util": "^24.9.0", + "micromatch": "^3.1.10", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" + } + }, + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.9.tgz", + "integrity": "sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "requires": { + "@jest/types": "^24.9.0" + } + }, + "jest-regex-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.9.0.tgz", + "integrity": "sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==" + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==" + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "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" + } + } } }, "babel-loader": { @@ -2232,9 +3176,9 @@ } }, "babel-plugin-dynamic-import-node": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.2.0.tgz", - "integrity": "sha512-fP899ELUnTaBcIzmrW7nniyqqdYWrWuJUyPWHxFa/c7r7hS6KC8FscNfLlBNIoPSc55kYMGEEKjPjJGCLbE1qA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "requires": { "object.assign": "^4.1.0" } @@ -2250,27 +3194,92 @@ } }, "babel-plugin-jest-hoist": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", - "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz", + "integrity": "sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==", "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-plugin-macros": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz", - "integrity": "sha512-xN3KhAxPzsJ6OQTktCanNpIFnnMsCV+t8OloKxIL72D6+SUZYFn9qfklPgef5HyyDtzYZqqb+fs1S12+gQY82Q==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz", + "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==", "requires": { - "@babel/runtime": "^7.4.2", - "cosmiconfig": "^5.2.0", - "resolve": "^1.10.0" + "@babel/runtime": "^7.7.2", + "cosmiconfig": "^6.0.0", + "resolve": "^1.12.0" + }, + "dependencies": { + "@babel/runtime": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", + "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + } + }, + "import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + } } }, "babel-plugin-named-asset-import": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz", - "integrity": "sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==" + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.6.tgz", + "integrity": "sha512-1aGDUfL1qOOIoqk9QKGIo2lANk+C7ko/fqH0uIyC71x3PEGz0uVP8ISgfEsFuG+FKmjHTvFK/nNM8dowpmUxLA==" }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", @@ -2292,130 +3301,877 @@ "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" }, "babel-preset-jest": { - "version": "24.6.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", - "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz", + "integrity": "sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==", "requires": { "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^24.6.0" + "babel-plugin-jest-hoist": "^24.9.0" } }, "babel-preset-react-app": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.0.0.tgz", - "integrity": "sha512-YVsDA8HpAKklhFLJtl9+AgaxrDaor8gGvDFlsg1ByOS0IPGUovumdv4/gJiAnLcDmZmKlH6+9sVOz4NVW7emAg==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-9.1.2.tgz", + "integrity": "sha512-k58RtQOKH21NyKtzptoAvtAODuAJJs3ZhqBMl456/GnXEQ/0La92pNmwgWoMn5pBTrsvk3YYXdY7zpY4e3UIxA==", "requires": { - "@babel/core": "7.4.3", - "@babel/plugin-proposal-class-properties": "7.4.0", - "@babel/plugin-proposal-decorators": "7.4.0", - "@babel/plugin-proposal-object-rest-spread": "7.4.3", - "@babel/plugin-syntax-dynamic-import": "7.2.0", - "@babel/plugin-transform-classes": "7.4.3", - "@babel/plugin-transform-destructuring": "7.4.3", - "@babel/plugin-transform-flow-strip-types": "7.4.0", - "@babel/plugin-transform-react-constant-elements": "7.2.0", - "@babel/plugin-transform-react-display-name": "7.2.0", - "@babel/plugin-transform-runtime": "7.4.3", - "@babel/preset-env": "7.4.3", - "@babel/preset-react": "7.0.0", - "@babel/preset-typescript": "7.3.3", - "@babel/runtime": "7.4.3", - "babel-plugin-dynamic-import-node": "2.2.0", - "babel-plugin-macros": "2.5.1", + "@babel/core": "7.9.0", + "@babel/plugin-proposal-class-properties": "7.8.3", + "@babel/plugin-proposal-decorators": "7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.8.3", + "@babel/plugin-proposal-numeric-separator": "7.8.3", + "@babel/plugin-proposal-optional-chaining": "7.9.0", + "@babel/plugin-transform-flow-strip-types": "7.9.0", + "@babel/plugin-transform-react-display-name": "7.8.3", + "@babel/plugin-transform-runtime": "7.9.0", + "@babel/preset-env": "7.9.0", + "@babel/preset-react": "7.9.1", + "@babel/preset-typescript": "7.9.0", + "@babel/runtime": "7.9.0", + "babel-plugin-macros": "2.8.0", "babel-plugin-transform-react-remove-prop-types": "0.4.24" }, "dependencies": { - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.3.tgz", - "integrity": "sha512-xC//6DNSSHVjq8O2ge0dyYlhshsH4T7XdCVoxbi5HzLYWfsC5ooFlJjrXk8RcAT+hjHAK9UjBXdylzSoDK3t4g==", + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0" + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", + "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "requires": { + "@babel/types": "^7.10.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", + "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==" + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz", + "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-transform-classes": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.3.tgz", - "integrity": "sha512-PUaIKyFUDtG6jF5DUJOfkBdwAS/kFFV3XFk7Nn0a6vR7ZT8jYw5cGtIlat77wcnd0C6ViGqo/wyNf4ZHytF/nQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.4.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.4.0", - "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", "globals": "^11.1.0" } }, - "@babel/plugin-transform-destructuring": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.3.tgz", - "integrity": "sha512-rVTLLZpydDFDyN4qnXdzwoVpk1oaXHIvPEOkOLyr88o7oHxVc/LyrnDx+amuBWGOwUb7D1s/uLsKBNTx08htZg==", + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", "requires": { - "@babel/helper-plugin-utils": "^7.0.0" + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz", + "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", + "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/preset-env": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.3.tgz", - "integrity": "sha512-FYbZdV12yHdJU5Z70cEg0f6lvtpZ8jFSDakTm7WXeJbLXh4R0ztGEu/SW7G1nJ2ZvKwDhz8YrbA84eYyprmGqw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz", + "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==", "requires": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-async-generator-functions": "^7.2.0", - "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.4.3", - "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.0", - "@babel/plugin-syntax-async-generators": "^7.2.0", - "@babel/plugin-syntax-json-strings": "^7.2.0", - "@babel/plugin-syntax-object-rest-spread": "^7.2.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", - "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.4.0", - "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.4.0", - "@babel/plugin-transform-classes": "^7.4.3", - "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.4.3", - "@babel/plugin-transform-dotall-regex": "^7.4.3", - "@babel/plugin-transform-duplicate-keys": "^7.2.0", - "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.4.3", - "@babel/plugin-transform-function-name": "^7.4.3", - "@babel/plugin-transform-literals": "^7.2.0", - "@babel/plugin-transform-member-expression-literals": "^7.2.0", - "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.4.3", - "@babel/plugin-transform-modules-systemjs": "^7.4.0", - "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.2", - "@babel/plugin-transform-new-target": "^7.4.0", - "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.4.3", - "@babel/plugin-transform-property-literals": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.4.3", - "@babel/plugin-transform-reserved-words": "^7.2.0", - "@babel/plugin-transform-shorthand-properties": "^7.2.0", - "@babel/plugin-transform-spread": "^7.2.0", - "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", - "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.4.3", - "@babel/types": "^7.4.0", - "browserslist": "^4.5.2", - "core-js-compat": "^3.0.0", + "@babel/compat-data": "^7.9.0", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-numeric-separator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.9.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.9.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.9.0", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.9.0", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.9.0", + "@babel/plugin-transform-modules-commonjs": "^7.9.0", + "@babel/plugin-transform-modules-systemjs": "^7.9.0", + "@babel/plugin-transform-modules-umd": "^7.9.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.9.0", + "browserslist": "^4.9.1", + "core-js-compat": "^3.6.2", "invariant": "^2.2.2", - "js-levenshtein": "^1.1.3", + "levenary": "^1.1.1", "semver": "^5.5.0" } }, + "@babel/preset-react": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.9.1.tgz", + "integrity": "sha512-aJBYF23MPj0RNdp/4bHnAP0NVqqZRr9kl0NAOP4nJCex6OYVio59+dnQzsAWFuogdLyeaKA1hmfUIVZkY5J+TQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-transform-react-display-name": "^7.8.3", + "@babel/plugin-transform-react-jsx": "^7.9.1", + "@babel/plugin-transform-react-jsx-development": "^7.9.0", + "@babel/plugin-transform-react-jsx-self": "^7.9.0", + "@babel/plugin-transform-react-jsx-source": "^7.9.0" + } + }, + "@babel/runtime": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.0.tgz", + "integrity": "sha512-cTIudHnzuWLS56ik4DnRnqqNf8MkdUzV4iFFI1h7Jo9xvrpQROYaAnaSd2mHLQAzzZAPfATynX5ord6YlNYNMA==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "browserslist": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.13.0.tgz", + "integrity": "sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==", + "requires": { + "caniuse-lite": "^1.0.30001093", + "electron-to-chromium": "^1.3.488", + "escalade": "^3.0.1", + "node-releases": "^1.1.58" + } + }, + "caniuse-lite": { + "version": "1.0.30001105", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz", + "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==" + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "electron-to-chromium": { + "version": "1.3.505", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.505.tgz", + "integrity": "sha512-Aunrp3HWtmdiJLIl+IPSFtEvJ/4Q9a3eKaxmzCthaZF1gbTbpHUTCU2zOVnFPH7r/AD7zQXyuFidYXzSHXBdsw==" + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -3865,9 +5621,9 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "core-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", - "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==" + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", + "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==" }, "core-js-compat": { "version": "3.1.1", @@ -4748,6 +6504,11 @@ "is-symbol": "^1.0.2" } }, + "escalade": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.0.2.tgz", + "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -5139,9 +6900,9 @@ } }, "eslint-plugin-react-hooks": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz", - "integrity": "sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag==" + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz", + "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==" }, "eslint-scope": { "version": "4.0.3", @@ -5716,9 +7477,9 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "fork-ts-checker-webpack-plugin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.1.1.tgz", - "integrity": "sha512-gqWAEMLlae/oeVnN6RWCAhesOJMswAN1MaKNqhhjXHV5O0/rTUjWI4UbgQHdlrVbCnb+xLotXmJbBlC66QmpFw==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz", + "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==", "requires": { "babel-code-frame": "^6.22.0", "chalk": "^2.4.1", @@ -5731,9 +7492,9 @@ }, "dependencies": { "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -5887,6 +7648,11 @@ "globule": "^1.0.0" } }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==" + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -5971,9 +7737,9 @@ }, "dependencies": { "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" } } }, @@ -6009,9 +7775,9 @@ } }, "globule": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", - "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", "requires": { "glob": "~7.1.1", "lodash": "~4.17.10", @@ -6029,12 +7795,19 @@ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=" }, "gzip-size": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", - "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", "requires": { "duplexer": "^0.1.1", - "pify": "^3.0.0" + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + } } }, "handle-thing": { @@ -6231,9 +8004,9 @@ } }, "hoist-non-react-statics": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.0.tgz", - "integrity": "sha512-0XsbTXxgiaCDYDIWFcwkmerZPSwywfUqYmwT4jzewKTQSWoE6FCMoUVOeBJWK3E/CrWbxRG3m5GzY4lnIwGRBA==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "requires": { "react-is": "^16.7.0" } @@ -6505,9 +8278,9 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "in-publish": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", - "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" }, "indent-string": { "version": "2.1.0", @@ -6721,12 +8494,9 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -6817,9 +8587,9 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" }, "is-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.0.0.tgz", - "integrity": "sha512-F/pJIk8QD6OX5DNhRB7hWamLsUilmkDGho48KbgZ6xg/lmAZXHxzXQ91jzB3yRSw5kdQGGGc4yz8HYhTYIMWPg==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" }, "is-stream": { "version": "1.1.0", @@ -7500,9 +9270,9 @@ } }, "js-base64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.5.1.tgz", - "integrity": "sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.3.tgz", + "integrity": "sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==" }, "js-levenshtein": { "version": "1.1.6", @@ -7713,6 +9483,21 @@ "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "requires": { + "leven": "^3.1.0" + }, + "dependencies": { + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + } + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -7722,6 +9507,11 @@ "type-check": "~0.3.2" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -7833,11 +9623,6 @@ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=" - }, "lodash.template": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -7922,9 +9707,9 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "makeerror": { @@ -8134,9 +9919,9 @@ } }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "methods": { "version": "1.1.2", @@ -8515,9 +10300,9 @@ } }, "node-sass": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.12.0.tgz", - "integrity": "sha512-A1Iv4oN+Iel6EPv77/HddXErL2a+gZ4uBeZUy+a8O35CFYTXhgA8MgLCWBtwpGZdCvTvQ9d+bQxX/QC36GDPpQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", "requires": { "async-foreach": "^0.1.3", "chalk": "^1.1.1", @@ -8526,14 +10311,14 @@ "get-stdin": "^4.0.1", "glob": "^7.0.3", "in-publish": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.15", "meow": "^3.7.0", "mkdirp": "^0.5.1", "nan": "^2.13.2", "node-gyp": "^3.8.0", "npmlog": "^4.0.0", "request": "^2.88.0", - "sass-graph": "^2.2.4", + "sass-graph": "2.2.5", "stdout-stream": "^1.4.0", "true-case-path": "^1.0.2" }, @@ -8787,25 +10572,31 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, - "office-ui-fabric-core": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/office-ui-fabric-core/-/office-ui-fabric-core-10.1.0.tgz", - "integrity": "sha512-t/CwL+02bwY7bNrrYaKAk++pf9RQoqsc56/hhuzoJ2muUvZYmQMDVG5jzUc6LU5uQvbafVjn9J+RpxM0EkiG0A==" - }, "office-ui-fabric-react": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.7.0.tgz", - "integrity": "sha512-BWeCMAL1lQwotnrB3f2VcTNDu3X1B5WlBX6VSMVkDPACzedX823nbqkFMBVtOKaGHSo2L3nGghHi//jLsWsUQw==", + "version": "7.123.8", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-7.123.8.tgz", + "integrity": "sha512-CzmRuqHu/54ulM40icxZqOMif6ut9hbbGCOLJ21ElRG58L0ahH28aTrbGbrFcwC1RciY65UW1YunsibLTqwG+g==", "requires": { - "@microsoft/load-themed-styles": "^1.7.13", - "@uifabric/foundation": "^7.0.2", - "@uifabric/icons": "^7.1.0", - "@uifabric/merge-styles": "^7.1.1", - "@uifabric/set-version": "^7.0.0", - "@uifabric/styling": "^7.1.1", - "@uifabric/utilities": "^7.0.6", - "prop-types": "^15.5.10", - "tslib": "^1.7.1" + "@fluentui/date-time-utilities": "^7.2.0", + "@fluentui/react-focus": "^7.12.25", + "@fluentui/react-icons": "^0.1.40", + "@microsoft/load-themed-styles": "^1.10.26", + "@uifabric/foundation": "^7.7.39", + "@uifabric/icons": "^7.3.65", + "@uifabric/merge-styles": "^7.16.3", + "@uifabric/react-hooks": "^7.6.2", + "@uifabric/set-version": "^7.0.18", + "@uifabric/styling": "^7.14.5", + "@uifabric/utilities": "^7.24.5", + "prop-types": "^15.7.2", + "tslib": "^1.10.0" + }, + "dependencies": { + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + } } }, "on-finished": { @@ -8837,6 +10628,14 @@ "mimic-fn": "^1.0.0" } }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "requires": { + "is-wsl": "^1.1.0" + } + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -10199,9 +11998,9 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.0.2.tgz", - "integrity": "sha512-EIyzM39FpVOMbqgzEHhxdrEhtOSDOtjMZQ0M6iVfCE+kWNgCkAyOdnuCWqfmflylftfadU6FkiMgHZA2kUzwRw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", "requires": { "asap": "~2.0.6" } @@ -10384,14 +12183,13 @@ } }, "react": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react/-/react-16.8.6.tgz", - "integrity": "sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "prop-types": "^15.6.2" } }, "react-adal": { @@ -10400,69 +12198,102 @@ "integrity": "sha512-7fxPjKqgDHCSW7WJMFcPSqeuFQote9LgHyJVlLYbsL/3dVUrwt9P5nM/sDjnOm96I2zRLLgWdpQ5aDLFh0Qf9g==" }, "react-app-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.1.tgz", - "integrity": "sha512-LbVpT1NdzTdDDs7xEZdebjDrqsvKi5UyVKUQqtTYYNyC1JJYVAwNQWe4ybWvoT2V2WW9PGVO2u5Y6aVj4ER/Ow==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-1.0.6.tgz", + "integrity": "sha512-OfBnObtnGgLGfweORmdZbyEz+3dgVePQBb3zipiaDsMHV1NpWm0rDFYIVXFV/AK+x4VIIfWHhrdMIeoTLyRr2g==", "requires": { - "core-js": "3.0.1", - "object-assign": "4.1.1", - "promise": "8.0.2", - "raf": "3.4.1", - "regenerator-runtime": "0.13.2", - "whatwg-fetch": "3.0.0" + "core-js": "^3.5.0", + "object-assign": "^4.1.1", + "promise": "^8.0.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.3", + "whatwg-fetch": "^3.0.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } } }, "react-dev-utils": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.0.1.tgz", - "integrity": "sha512-pnaeMo/Pxel8aZpxk1WwxT3uXxM3tEwYvsjCYn5R7gNxjhN1auowdcLDzFB8kr7rafAj2rxmvfic/fbac5CzwQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz", + "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==", "requires": { - "@babel/code-frame": "7.0.0", - "address": "1.0.3", - "browserslist": "4.5.4", + "@babel/code-frame": "7.5.5", + "address": "1.1.2", + "browserslist": "4.7.0", "chalk": "2.4.2", "cross-spawn": "6.0.5", "detect-port-alt": "1.1.6", "escape-string-regexp": "1.0.5", "filesize": "3.6.1", "find-up": "3.0.0", - "fork-ts-checker-webpack-plugin": "1.1.1", + "fork-ts-checker-webpack-plugin": "1.5.0", "global-modules": "2.0.0", "globby": "8.0.2", - "gzip-size": "5.0.0", + "gzip-size": "5.1.1", "immer": "1.10.0", - "inquirer": "6.2.2", - "is-root": "2.0.0", + "inquirer": "6.5.0", + "is-root": "2.1.0", "loader-utils": "1.2.3", - "opn": "5.4.0", + "open": "^6.3.0", "pkg-up": "2.0.0", - "react-error-overlay": "^5.1.6", + "react-error-overlay": "^6.0.3", "recursive-readdir": "2.2.2", - "shell-quote": "1.6.1", - "sockjs-client": "1.3.0", + "shell-quote": "1.7.2", + "sockjs-client": "1.4.0", "strip-ansi": "5.2.0", "text-table": "0.2.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "requires": { + "@babel/highlight": "^7.0.0" + } + }, "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "browserslist": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.4.tgz", - "integrity": "sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz", + "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "requires": { - "caniuse-lite": "^1.0.30000955", - "electron-to-chromium": "^1.3.122", - "node-releases": "^1.1.13" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, + "caniuse-lite": { + "version": "1.0.30001105", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001105.tgz", + "integrity": "sha512-JupOe6+dGMr7E20siZHIZQwYqrllxotAhiaej96y6x00b/48rPt42o+SzOSCPbrpsDWvRja40Hwrj0g0q6LZJg==" + }, + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "electron-to-chromium": { + "version": "1.3.505", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.505.tgz", + "integrity": "sha512-Aunrp3HWtmdiJLIl+IPSFtEvJ/4Q9a3eKaxmzCthaZF1gbTbpHUTCU2zOVnFPH7r/AD7zQXyuFidYXzSHXBdsw==" + }, "inquirer": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.2.tgz", - "integrity": "sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz", + "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==", "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", @@ -10470,15 +12301,33 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", - "strip-ansi": "^5.0.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" } }, + "node-releases": { + "version": "1.1.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.60.tgz", + "integrity": "sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA==" + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + } + }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", @@ -10490,20 +12339,20 @@ } }, "react-dom": { - "version": "16.8.6", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.8.6.tgz", - "integrity": "sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz", + "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", "prop-types": "^15.6.2", - "scheduler": "^0.13.6" + "scheduler": "^0.19.1" } }, "react-error-overlay": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", - "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz", + "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==" }, "react-is": { "version": "16.8.6", @@ -10511,25 +12360,34 @@ "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==" }, "react-redux": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.1.0.tgz", - "integrity": "sha512-hyu/PoFK3vZgdLTg9ozbt7WF3GgX5+Yn3pZm5/96/o4UueXA+zj08aiSC9Mfj2WtD1bvpIb3C5yvskzZySzzaw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.0.tgz", + "integrity": "sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==", "requires": { - "@babel/runtime": "^7.4.5", + "@babel/runtime": "^7.5.5", "hoist-non-react-statics": "^3.3.0", - "invariant": "^2.2.4", "loose-envify": "^1.4.0", "prop-types": "^15.7.2", - "react-is": "^16.8.6" + "react-is": "^16.9.0" }, "dependencies": { "@babel/runtime": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.4.5.tgz", - "integrity": "sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ==", + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", + "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" } } }, @@ -10649,9 +12507,9 @@ } }, "redux": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz", - "integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", + "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==", "requires": { "loose-envify": "^1.4.0", "symbol-observable": "^1.2.0" @@ -11047,264 +12905,135 @@ } }, "sass-graph": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", - "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", "requires": { "glob": "^7.0.0", "lodash": "^4.0.0", "scss-tokenizer": "^0.2.3", - "yargs": "^7.0.0" + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "^1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^4.1.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "requires": { - "is-utf8": "^0.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, "yargs": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", - "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.0" + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "requires": { - "camelcase": "^3.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", + "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", "requires": { - "clone-deep": "^2.0.1", + "clone-deep": "^4.0.1", "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", "neo-async": "^2.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0" + "pify": "^4.0.1", + "semver": "^6.3.0" }, "dependencies": { "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { - "for-own": "^1.0.0", "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" - } - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "requires": { - "for-in": "^1.0.1" + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" - } + "kind-of": "^6.0.2" } } } @@ -11323,9 +13052,9 @@ } }, "scheduler": { - "version": "0.13.6", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.13.6.tgz", - "integrity": "sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -11571,15 +13300,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" }, "shellwords": { "version": "0.1.1", @@ -12401,15 +14124,16 @@ } }, "ts-jest": { - "version": "24.0.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", - "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.3.0.tgz", + "integrity": "sha512-Hb94C/+QRIgjVZlJyiWwouYUF+siNJHJHknyspaOcZ+OQAIdFG/UrdQVXw/0B8Z3No34xkUXZJpOTy9alOWdVQ==", "dev": true, "requires": { "bs-logger": "0.x", "buffer-from": "1.x", "fast-json-stable-stringify": "2.x", "json5": "2.x", + "lodash.memoize": "4.x", "make-error": "1.x", "mkdirp": "0.x", "resolve": "1.x", @@ -12424,9 +14148,9 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "yargs-parser": { @@ -13188,9 +14912,9 @@ } }, "whatwg-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz", - "integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.2.0.tgz", + "integrity": "sha512-SdGPoQMMnzVYThUbSrEvqTlkvC1Ux27NehaJ/GUHBfNrh5Mjg+1/uRyFMwVnxO2MrikMWvWAqUGgQOfVU4hT7w==" }, "whatwg-mimetype": { "version": "2.3.0", @@ -13518,6 +15242,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" }, + "yaml": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz", + "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==" + }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", diff --git a/client/package.json b/client/package.json index 0c0c008..f9e9c6e 100644 --- a/client/package.json +++ b/client/package.json @@ -3,77 +3,18 @@ "version": "0.1.0", "private": true, "dependencies": { - "@babel/core": "7.4.3", - "@svgr/webpack": "4.1.0", - "@types/jest": "24.0.13", - "@types/node": "12.0.2", - "@types/node-fetch": "^2.3.7", - "@types/react": "16.8.18", - "@types/react-adal": "^0.4.1", - "@types/react-dom": "16.8.4", - "@types/react-redux": "^7.1.1", - "@types/react-router-dom": "^4.3.4", - "@typescript-eslint/eslint-plugin": "1.6.0", - "@typescript-eslint/parser": "1.6.0", - "@uifabric/fluent-theme": "^7.0.2", - "babel-eslint": "10.0.1", - "babel-jest": "^24.8.0", - "babel-loader": "8.0.5", - "babel-plugin-named-asset-import": "^0.3.2", - "babel-preset-react-app": "^9.0.0", + "@fluentui/react": "^7.123.7", + "@uifabric/fluent-theme": "^7.1.115", "camelcase": "^5.2.0", - "case-sensitive-paths-webpack-plugin": "2.2.0", - "css-loader": "^1.0.1", "dotenv": "6.2.0", "dotenv-expand": "4.2.0", - "eslint": "^5.16.0", - "eslint-config-react-app": "^4.0.1", - "eslint-loader": "2.1.2", - "eslint-plugin-flowtype": "2.50.1", - "eslint-plugin-import": "2.16.0", - "eslint-plugin-jsx-a11y": "6.2.1", - "eslint-plugin-react": "7.12.4", - "eslint-plugin-react-hooks": "^1.5.0", - "file-loader": "3.0.1", "fs-extra": "7.0.1", - "html-webpack-plugin": "4.0.0-beta.5", - "identity-obj-proxy": "3.0.0", - "is-wsl": "^1.1.0", - "jest": "24.7.1", - "jest-environment-jsdom-fourteen": "0.1.0", - "jest-resolve": "24.7.1", - "jest-watch-typeahead": "0.3.0", - "mini-css-extract-plugin": "0.5.0", - "node-sass": "^4.12.0", - "office-ui-fabric-core": "^10.1.0", - "office-ui-fabric-react": "^7.7.0", - "optimize-css-assets-webpack-plugin": "5.0.1", - "pnp-webpack-plugin": "1.2.1", - "postcss-flexbugs-fixes": "4.1.0", - "postcss-loader": "3.0.0", - "postcss-normalize": "7.0.1", - "postcss-preset-env": "6.6.0", - "postcss-safe-parser": "4.0.1", - "react": "^16.8.6", + "react": "^16.13.1", "react-adal": "^0.4.24", - "react-app-polyfill": "^1.0.1", - "react-dev-utils": "^9.0.1", - "react-dom": "^16.8.6", - "react-redux": "^7.1.0", - "react-router-dom": "^4.3.1", - "resolve": "1.10.0", - "sass-loader": "^7.1.0", - "semver": "6.0.0", - "style-loader": "0.23.1", - "terser-webpack-plugin": "1.2.3", - "ts-pnp": "1.1.2", - "typescript": "3.4.5", - "typings-for-css-modules-loader": "^1.7.0", - "url-loader": "1.1.2", - "webpack": "4.29.6", - "webpack-dev-server": "3.2.1", - "webpack-manifest-plugin": "2.0.4", - "workbox-webpack-plugin": "4.2.0" + "react-app-polyfill": "^1.0.6", + "react-dom": "^16.13.1", + "react-redux": "^7.2.0", + "react-router-dom": "^4.3.1" }, "scripts": { "start": "node scripts/start.js", @@ -147,6 +88,64 @@ ] }, "devDependencies": { - "ts-jest": "^24.0.2" + "@babel/core": "7.4.3", + "@svgr/webpack": "4.1.0", + "@types/jest": "24.0.13", + "@types/node": "12.0.2", + "@types/node-fetch": "^2.5.7", + "@types/react": "16.8.18", + "@types/react-adal": "^0.4.2", + "@types/react-dom": "16.8.4", + "@types/react-redux": "^7.1.9", + "@types/react-router-dom": "^4.3.5", + "@typescript-eslint/eslint-plugin": "1.6.0", + "@typescript-eslint/parser": "1.6.0", + "babel-eslint": "10.0.1", + "babel-jest": "^24.9.0", + "babel-loader": "8.0.5", + "babel-plugin-named-asset-import": "^0.3.6", + "babel-preset-react-app": "^9.1.2", + "case-sensitive-paths-webpack-plugin": "2.2.0", + "css-loader": "^1.0.1", + "eslint": "^5.16.0", + "eslint-config-react-app": "^4.0.1", + "eslint-loader": "2.1.2", + "eslint-plugin-flowtype": "2.50.1", + "eslint-plugin-import": "2.16.0", + "eslint-plugin-jsx-a11y": "6.2.1", + "eslint-plugin-react": "7.12.4", + "eslint-plugin-react-hooks": "^1.7.0", + "file-loader": "3.0.1", + "html-webpack-plugin": "4.0.0-beta.5", + "identity-obj-proxy": "3.0.0", + "is-wsl": "^1.1.0", + "jest": "24.7.1", + "jest-environment-jsdom-fourteen": "0.1.0", + "jest-resolve": "24.7.1", + "jest-watch-typeahead": "0.3.0", + "mini-css-extract-plugin": "0.5.0", + "node-sass": "^4.14.1", + "optimize-css-assets-webpack-plugin": "5.0.1", + "pnp-webpack-plugin": "1.2.1", + "postcss-flexbugs-fixes": "4.1.0", + "postcss-loader": "3.0.0", + "postcss-normalize": "7.0.1", + "postcss-preset-env": "6.6.0", + "postcss-safe-parser": "4.0.1", + "react-dev-utils": "^9.1.0", + "resolve": "1.10.0", + "sass-loader": "^7.3.1", + "semver": "6.0.0", + "style-loader": "0.23.1", + "terser-webpack-plugin": "1.2.3", + "ts-jest": "^24.3.0", + "ts-pnp": "1.1.2", + "typescript": "3.4.5", + "typings-for-css-modules-loader": "^1.7.0", + "url-loader": "1.1.2", + "webpack": "4.29.6", + "webpack-dev-server": "3.2.1", + "webpack-manifest-plugin": "2.0.4", + "workbox-webpack-plugin": "4.2.0" } } diff --git a/client/src/components/app/App.tsx b/client/src/components/app/App.tsx index cb37f0d..935a6fb 100644 --- a/client/src/components/app/App.tsx +++ b/client/src/components/app/App.tsx @@ -1,15 +1,13 @@ -import 'office-ui-fabric-core/dist/css/fabric.css'; +import 'office-ui-fabric-react/dist/css/fabric.css'; -import { FluentCustomizations } from '@uifabric/fluent-theme'; import { - Customizer, IButtonProps, Icon, Image, initializeIcons, Nav, Text -} from 'office-ui-fabric-react'; +} from '@fluentui/react'; import React from 'react'; import { BrowserRouter, Link, Route } from 'react-router-dom'; @@ -24,7 +22,7 @@ initializeIcons(); const App: React.FC = () => { return ( - + @@ -66,7 +64,7 @@ const App: React.FC = () => { - + ); }; diff --git a/client/src/components/groups/Groups.tsx b/client/src/components/groups/Groups.tsx index a7c6c3e..8ea56fb 100644 --- a/client/src/components/groups/Groups.tsx +++ b/client/src/components/groups/Groups.tsx @@ -6,7 +6,7 @@ import { DetailsList, DetailsListLayoutMode, SpinnerSize -} from 'office-ui-fabric-react'; +} from '@fluentui/react'; import { IGroupDto, ApiClient } from '../../generated/backend'; const Groups: React.FC = () => { diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..843dfcf --- /dev/null +++ b/dockerfile @@ -0,0 +1,44 @@ +# to build local image from PowerShell (e.g. when you're authoring this dockerfile): +# docker build -f .\dockerfile . --build-arg BUILDCONFIG=dev + +# build backend +FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS serviceBuild + +# copy backend files into 'service' folder in prep for dotnet commands +COPY service /service + +# ensure tests are passing +ARG ASPNETCORE_ENVIRONMENT +WORKDIR /service/Microsoft.DSX.ProjectTemplate.API +RUN dotnet build + +# setup frontend +FROM node:12.16.1 AS clientBuild +ARG APP_ENV +RUN echo APP_ENV = ${APP_ENV} +RUN npm config set unsafe-perm true +COPY client /client + +# copy auto-generated TS files from API bulid +COPY --from=serviceBuild /client/src/generated/. client/src/generated/ + +# build frontend +WORKDIR /client +RUN npm i +ENV REACT_APP_ENV=${APP_ENV} +RUN npm run build + +# copy our frontend into published app's wwwroot folder +FROM serviceBuild AS publisher +COPY --from=clientBuild /client/build /app/wwwroot/ + +# build & publish our API projectARG ClientId +ARG ASPNETCORE_ENVIRONMENT +RUN dotnet publish /service/Microsoft.DSX.ProjectTemplate.API/Microsoft.DSX.ProjectTemplate.API.csproj -c Release -o /app + +# build runtime image (contains full stack) +FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 +WORKDIR /app +EXPOSE 80 +COPY --from=publisher /app ./ +ENTRYPOINT ["dotnet", "Microsoft.DSX.ProjectTemplate.API.dll"] diff --git a/service/Microsoft.DSX.ProjectTemplate.API/Controllers/BaseController.cs b/service/Microsoft.DSX.ProjectTemplate.API/Controllers/BaseController.cs index 13350a5..aba75eb 100644 --- a/service/Microsoft.DSX.ProjectTemplate.API/Controllers/BaseController.cs +++ b/service/Microsoft.DSX.ProjectTemplate.API/Controllers/BaseController.cs @@ -1,13 +1,21 @@ -namespace Microsoft.DSX.ProjectTemplate.API.Controllers -{ - using MediatR; - using Microsoft.AspNetCore.Mvc; +using MediatR; +using Microsoft.AspNetCore.Mvc; +namespace Microsoft.DSX.ProjectTemplate.API.Controllers +{ /// /// Base controller for our web API. /// + [ApiController] + [Route("api/[controller]")] + [Produces("application/json")] public abstract class BaseController : Controller { + /// + /// Gets injected Mediator instance. + /// + protected IMediator Mediator { get; } + /// /// Initializes a new instance of the class. /// @@ -17,10 +25,5 @@ { Mediator = mediator; } - - /// - /// Gets injected Mediator instance. - /// - protected IMediator Mediator { get; } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.API/Controllers/GroupsController.cs b/service/Microsoft.DSX.ProjectTemplate.API/Controllers/GroupsController.cs index 99bea5b..8097003 100644 --- a/service/Microsoft.DSX.ProjectTemplate.API/Controllers/GroupsController.cs +++ b/service/Microsoft.DSX.ProjectTemplate.API/Controllers/GroupsController.cs @@ -1,43 +1,66 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using MediatR; +using MediatR; using Microsoft.AspNetCore.Mvc; using Microsoft.DSX.ProjectTemplate.Command.Group; using Microsoft.DSX.ProjectTemplate.Data.DTOs; +using System.Collections.Generic; +using System.Threading.Tasks; namespace Microsoft.DSX.ProjectTemplate.API.Controllers { - [Route("api/[controller]")] - [ApiController] - [Produces("application/json")] + /// + /// Controller for Group APIs. + /// public class GroupsController : BaseController { + /// + /// Initializes a new instance of the class. + /// + /// Mediator instance from dependency injection. public GroupsController(IMediator mediator) : base(mediator) { } + /// + /// Get all Groups. + /// [HttpGet] public async Task>> GetAllGroups() { return Ok(await Mediator.Send(new GetAllGroupsQuery())); } + /// + /// Get a Group by its Id. + /// + /// ID of the Group to get. [HttpGet("{id}")] public async Task> GetGroup(int id) { return Ok(await Mediator.Send(new GetGroupByIdQuery() { GroupId = id })); } + /// + /// Create a new Group. + /// + /// A Group DTO. [HttpPost] public async Task> CreateGroup([FromBody] GroupDto dto) { return Ok(await Mediator.Send(new CreateGroupCommand() { Group = dto })); } + /// + /// Update an existing Group. + /// + /// Updated Group DTO. [HttpPut] public async Task> UpdateGroup([FromBody] GroupDto dto) { return Ok(await Mediator.Send(new UpdateGroupCommand() { Group = dto })); } + /// + /// Delete an existing Group. + /// + /// Id of the Group to be deleted. [HttpDelete("{id}")] public async Task> DeleteGroup([FromRoute] int id) { diff --git a/service/Microsoft.DSX.ProjectTemplate.API/GlobalExceptionFilter.cs b/service/Microsoft.DSX.ProjectTemplate.API/GlobalExceptionFilter.cs deleted file mode 100644 index f7f2fb7..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.API/GlobalExceptionFilter.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; -using Microsoft.DSX.ProjectTemplate.Data.DTOs; -using Microsoft.DSX.ProjectTemplate.Data.Exceptions; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Hosting; -using System; - -namespace Microsoft.DSX.ProjectTemplate.API -{ - /// - /// This filter will capture unhandled exceptions that occur in - /// controller creation, model binding, action filters, or action methods. - /// - /// https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/filters#exception-filters - public class GlobalExceptionFilter : IExceptionFilter - { - private readonly IHostEnvironment _hostingEnvironment; - private readonly ILogger _logger; - - /// - /// Initializes a new instance of the class. - /// - public GlobalExceptionFilter(IHostEnvironment hostingEnvironment, ILogger logger) - { - _hostingEnvironment = hostingEnvironment; - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - /// - public void OnException(ExceptionContext context) - { - // transform the exception into JSON - if (context.Exception is ExceptionBase) - { - _logger.LogInformation(context.Exception, context.ActionDescriptor.DisplayName); - - ExceptionBase customException = context.Exception as ExceptionBase; - - var exceptionJson = new ErrorResponseDto - { - Message = customException.Message, - InnerExceptionMessage = customException.InnerException?.Message, - }; - - switch (_hostingEnvironment.EnvironmentName.ToLowerInvariant()) - { - case "local": - case "dev": - case "development": - exceptionJson.StackTrace = customException.StackTrace; - break; - default: - break; - } - - context.Result = new JsonResult(exceptionJson) { StatusCode = (int)customException.StatusCode }; - context.ExceptionHandled = true; - } - else - { - // unexpected exception so log to _logger (which probably will be Application Insights) - _logger.LogCritical(context.Exception, context.ActionDescriptor.DisplayName); - - // unhandled exception keeps percolating and will be handled by ASP.NET Core - } - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.API/Program.cs b/service/Microsoft.DSX.ProjectTemplate.API/Program.cs index b134d13..a7a56ab 100644 --- a/service/Microsoft.DSX.ProjectTemplate.API/Program.cs +++ b/service/Microsoft.DSX.ProjectTemplate.API/Program.cs @@ -1,22 +1,24 @@ -using System; -using Microsoft.AspNetCore; -using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Hosting; using Microsoft.DSX.ProjectTemplate.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; +using System; namespace Microsoft.DSX.ProjectTemplate.API { + /// + /// The main class of the application. + /// public class Program - { - + { + /// + /// Main method where execution begins. + /// + /// Injected by the operating system. public static void Main(string[] args) { - - //var webHost = CreateWebHostBuilder(args).Build(); - IHost host = CreateHostBuilder(args).Build(); var logger = host.Services.GetRequiredService>(); @@ -29,27 +31,35 @@ namespace Microsoft.DSX.ProjectTemplate.API { logger.LogCritical(ex, ex.Message); throw; - } - + } } - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - + /// + /// Creates a host builder for this API. + /// + /// Arguments for the web host builder. + /// A fully configured host builder. + public static IHostBuilder CreateHostBuilder(string[] args) + { + return Host + .CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } private static void RunDatabaseMigrations(IHost host, ILogger logger) { - logger.LogInformation($"Running database migrations"); + logger.LogInformation($"Running database migrations."); + using (var serviceScope = host.Services.CreateScope()) { var context = serviceScope.ServiceProvider.GetRequiredService(); context.Database.Migrate(); } - logger.LogInformation($"Completed database migrations"); + + logger.LogInformation($"Completed database migrations."); } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.API/Startup.Extensions.cs b/service/Microsoft.DSX.ProjectTemplate.API/Startup.Extensions.cs new file mode 100644 index 0000000..afe0d52 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.API/Startup.Extensions.cs @@ -0,0 +1,138 @@ +using AutoMapper; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Http; +using Microsoft.DSX.ProjectTemplate.Data; +using Microsoft.DSX.ProjectTemplate.Data.Abstractions; +using Microsoft.DSX.ProjectTemplate.Data.Exceptions; +using Microsoft.DSX.ProjectTemplate.Data.Services; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System.Text.Json; + +namespace Microsoft.DSX.ProjectTemplate.API +{ + /// + /// Startup extensions. + /// + public static class StartupExtensions + { + /// + /// Register the database connections used by the API with DI. + /// + public static IServiceCollection AddDbConnections(this IServiceCollection services, IConfiguration configuration, IHostEnvironment environment) + { + /* + * NOTE: All database queries against strings are case-insensitive unless collation is set against + * the database, table, or column. This cannot be overridden by the client and the results are + * evaluated locally (e.g. .Equals(string, comparison)). + * We should avoid client evaluation where possible! + * See - https://github.com/aspnet/EntityFrameworkCore/issues/1222#issuecomment-443119582 + */ + + if (environment.IsEnvironment(Constants.Environments.Test)) + { + return services; + } + + return services.AddDbContext(options => options + .UseSqlServer(configuration.GetConnectionString("Database"))); + } + + /// + /// Configure the mapping profiles. + /// + public static IServiceCollection AddAutoMapperProfiles(this IServiceCollection services) + { + var config = new MapperConfiguration(cfg => cfg.AddProfile()); + return services.AddSingleton(config.CreateMapper()); + + } + + /// + /// Register the services used by the API with DI + /// + public static IServiceCollection AddServices(this IServiceCollection services) + { + return services + .AddOptions() + .AddSingleton(); + } + + /// + /// Configure Cross-Origin Request Sharing (CORS) options. + /// + public static IServiceCollection AddCors(this IServiceCollection services) + { + return services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => + { + builder + .AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader(); + }); + }); + } + + /// + /// Configure project template swagger document. + /// + public static IServiceCollection AddSwaggerDocument(this IServiceCollection services) + { + return services + .AddSwaggerDocument(config => + { + config.PostProcess = document => + { + document.Info.Version = "v1"; + document.Info.Title = "Project Template API"; + document.Info.Contact = new NSwag.OpenApiContact + { + Name = "Devices Software Experiences" + }; + }; + }); + } + + /// + /// Startup extension method to add our custom exception handling. + /// + public static IApplicationBuilder UseExceptionHandling(this IApplicationBuilder app) + { + return app.UseExceptionHandler(options => + { + options.Run(async context => + { + var pathFeature = context.Features.Get(); + using var scope = context.RequestServices.CreateScope(); + + var hostEnvironment = scope.ServiceProvider.GetRequiredService(); + var loggerFactory = scope.ServiceProvider.GetRequiredService(); + var logger = loggerFactory.CreateLogger(pathFeature?.Error.GetType()); + logger.LogError(pathFeature?.Error, pathFeature?.Path); + + object exceptionJson = hostEnvironment.EnvironmentName.ToLower() switch + { + var env when + env == Constants.Environments.Local || + env == Constants.Environments.Test || + env == Constants.Environments.Dev || + env == Constants.Environments.Development => new { pathFeature?.Error.Message, pathFeature?.Error.StackTrace }, + _ => new { pathFeature?.Error.Message } + }; + + // if we threw the exception, ensure the response contains the right status code + context.Response.StatusCode = pathFeature?.Error is ExceptionBase ? (int)(pathFeature.Error as ExceptionBase)?.StatusCode : 500; + context.Response.ContentType = "application/json"; + await context.Response.WriteAsync(JsonSerializer.Serialize(exceptionJson), context.RequestAborted); + }); + }); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.API/Startup.cs b/service/Microsoft.DSX.ProjectTemplate.API/Startup.cs index d3705da..af136c9 100644 --- a/service/Microsoft.DSX.ProjectTemplate.API/Startup.cs +++ b/service/Microsoft.DSX.ProjectTemplate.API/Startup.cs @@ -1,13 +1,8 @@ -using AutoMapper; -using MediatR; +using MediatR; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.DSX.ProjectTemplate.Command; -using Microsoft.DSX.ProjectTemplate.Data; -using Microsoft.DSX.ProjectTemplate.Data.Abstractions; -using Microsoft.DSX.ProjectTemplate.Data.Services; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -15,76 +10,48 @@ using Microsoft.Extensions.Hosting; [assembly: ApiConventionType(typeof(DefaultApiConventions))] namespace Microsoft.DSX.ProjectTemplate.API { + /// + /// Class that initializes our API. + /// public class Startup { - public Startup(IConfiguration configuration, IHostEnvironment hostingEnvironment) + private readonly IConfiguration _configuration; + private readonly IHostEnvironment _environment; + + /// + /// Initializes a new instance of the class. + /// + /// Configuration of the web API. + /// Hosting environment. + public Startup(IConfiguration configuration, IHostEnvironment environment) { - Configuration = configuration; - HostingEnvironment = hostingEnvironment; + _configuration = configuration; + _environment = environment; } - readonly string CorsPolicy = "CorsPolicy"; - - public IConfiguration Configuration { get; } - public IHostEnvironment HostingEnvironment { get; } - - // This method gets called by the runtime. Use this method to add services to the container. + /// + /// This method gets called by the runtime and is used to add services to the DI container. + /// + /// Collection of services to be provided by DI. public void ConfigureServices(IServiceCollection services) { - services.AddSingleton(); - services - .AddCors(options => - { - options.AddPolicy(CorsPolicy, - builder => builder.AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader()); - }) + .AddDbConnections(_configuration, _environment) + .AddAutoMapperProfiles() + .AddServices() + .AddMediatR(typeof(HandlerBase)) + .AddCors() + .AddSwaggerDocument() .AddControllers(); - - // Register Entity Framework Core - ConfigureDatabase(services); - - // Register MediatR and handlers - services.AddMediatR(typeof(HandlerBase)); - - // Register AutoMapper - var mapperConfig = new MapperConfiguration(cfg => cfg.AddProfile()); - services.AddSingleton(mapperConfig.CreateMapper()); - - // Register our custom services. - services.AddSingleton(); - - // Register the Swagger services - services.AddSwaggerDocument(config => - { - config.PostProcess = document => - { - document.Info.Version = "v1"; - document.Info.Title = "Project Template API"; - document.Info.Contact = new NSwag.OpenApiContact - { - Name = "Devices Software Experiences", - Email = "dsx@microsoft.com", - Url = "https://deviceswiki.com/wiki/DSX" - }; - }; - }); } - protected virtual void ConfigureDatabase(IServiceCollection services) + /// + /// This method gets called by the runtime and is used to configure the HTTP request pipeline. + /// + /// Application builder. + public virtual void Configure(IApplicationBuilder app) { - services.AddDbContext(options => - { - options.UseSqlServer(Configuration.GetConnectionString("Database")); - }); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) + if (_environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } @@ -94,25 +61,14 @@ namespace Microsoft.DSX.ProjectTemplate.API app.UseHsts(); } - // Register the Swagger generator and the Swagger UI middlewares - app.UseOpenApi(); - app.UseSwaggerUi3(); - - if (!env.IsEnvironment("Test")) - { - app.UseHttpsRedirection(); - } - - app.UseRouting(); - - app.UseCors(CorsPolicy); - - app.UseAuthorization(); - - app.UseEndpoints(endpoints => - { - endpoints.MapControllers(); - }); + app + .UseExceptionHandling() + .UseOpenApi() + .UseSwaggerUi3() + .UseRouting() + .UseCors("CorsPolicy") + .UseAuthorization() + .UseEndpoints(endpoints => endpoints.MapControllers()); } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.API/TestStartup.cs b/service/Microsoft.DSX.ProjectTemplate.API/TestStartup.cs deleted file mode 100644 index 89422f1..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.API/TestStartup.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.DSX.ProjectTemplate.Data; -using Microsoft.DSX.ProjectTemplate.Data.Utilities; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.DSX.ProjectTemplate.API -{ - public class TestStartup : Startup - { - public TestStartup(IConfiguration configuration, IHostEnvironment hostingEnvironment) - : base(configuration, hostingEnvironment) - { - } - - protected override void ConfigureDatabase(IServiceCollection services) - { - services - .AddDbContext(options => - options.UseInMemoryDatabase("InMemoryTestDatabase"), ServiceLifetime.Singleton); - - services - .AddTransient(); - } - - public override void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - // perform all configuration in the normal startup - base.Configure(app, env); - - // seed the database with test data - using (var serviceScope = app.ApplicationServices.GetRequiredService().CreateScope()) - { - var seeder = serviceScope.ServiceProvider.GetService(); - seeder.SeedTestData(); - } - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/CommandHandlerBase.cs b/service/Microsoft.DSX.ProjectTemplate.Command/CommandHandlerBase.cs index a07d5bf..b176bb0 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/CommandHandlerBase.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/CommandHandlerBase.cs @@ -6,7 +6,7 @@ using Microsoft.DSX.ProjectTemplate.Data; namespace Microsoft.DSX.ProjectTemplate.Command { /// - /// Base class that all command handlers inherit from + /// Base class of all command handlers. /// public abstract class CommandHandlerBase : HandlerBase { diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/Group/CreateGroupCommand.cs b/service/Microsoft.DSX.ProjectTemplate.Command/Group/CreateGroupCommand.cs index 088012b..d1b7fb9 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/Group/CreateGroupCommand.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/Group/CreateGroupCommand.cs @@ -30,23 +30,13 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group public async Task Handle(CreateGroupCommand request, CancellationToken cancellationToken) { - if (request.Group == null) - { - throw new BadRequestException($"A valid {nameof(Data.Models.Group)} must be provided"); - } - - if (!request.Group.IsValid()) - { - throw new BadRequestException(request.Group.GetValidationErrors()); - } - var dto = request.Group; bool nameAlreadyUsed = await Database.Groups .AnyAsync(e => e.Name.Trim() == dto.Name.Trim()); if (nameAlreadyUsed) { - throw new BadRequestException($"{nameof(dto.Name)} '{dto.Name}' already used"); + throw new BadRequestException($"{nameof(dto.Name)} '{dto.Name}' already used."); } var model = new Data.Models.Group() diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/Group/DeleteGroupCommand.cs b/service/Microsoft.DSX.ProjectTemplate.Command/Group/DeleteGroupCommand.cs index 8a39891..1438b8d 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/Group/DeleteGroupCommand.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/Group/DeleteGroupCommand.cs @@ -30,14 +30,14 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group { if (request.GroupId <= 0) { - throw new BadRequestException($"A valid {nameof(Data.Models.Group)} Id must be provided"); + throw new BadRequestException($"A valid {nameof(Data.Models.Group)} Id must be provided."); } var group = await Database.Groups.FindAsync(request.GroupId); if (group == null) { - throw new EntityNotFoundException($"{nameof(Data.Models.Group)} not found"); + throw new EntityNotFoundException($"{nameof(Data.Models.Group)} not found."); } Database.Groups.Remove(group); diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/Group/GetGroupQueries.cs b/service/Microsoft.DSX.ProjectTemplate.Command/Group/GetGroupQueries.cs index 3f86c62..722330e 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/Group/GetGroupQueries.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/Group/GetGroupQueries.cs @@ -45,7 +45,7 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group { if (request.GroupId <= 0) { - throw new BadRequestException($"A valid {nameof(Data.Models.Group)} Id must be provided"); + throw new BadRequestException($"A valid {nameof(Data.Models.Group)} Id must be provided."); } var innerResult = await Database.Groups @@ -53,7 +53,7 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group if (innerResult == null) { - throw new EntityNotFoundException($"{nameof(Data.Models.Group)} with Id {request.GroupId} cannot be found"); + throw new EntityNotFoundException($"{nameof(Data.Models.Group)} with Id {request.GroupId} cannot be found."); } return Mapper.Map(innerResult); diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/Group/GroupCreatedEventHandler.cs b/service/Microsoft.DSX.ProjectTemplate.Command/Group/GroupCreatedEventHandler.cs index 9285541..3603650 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/Group/GroupCreatedEventHandler.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/Group/GroupCreatedEventHandler.cs @@ -34,11 +34,11 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group // As a subscriber, we run on the thread pool so we need to handle our own failures appropriately. try { - await _emailService.SendEmailAsync("a@microsoft.com", "b@microsoft.com", $"New group '{notification.Group.Name}' was created", "lorem ipsum"); + await _emailService.SendEmailAsync("a@microsoft.com", "b@microsoft.com", $"New group '{notification.Group.Name}' was created.", "lorem ipsum"); } catch (Exception ex) { - _logger.LogError(ex, "Failed to send email"); + _logger.LogError(ex, "Failed to send email."); } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/Group/UpdateGroupCommand.cs b/service/Microsoft.DSX.ProjectTemplate.Command/Group/UpdateGroupCommand.cs index 065bec9..12e22e9 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/Group/UpdateGroupCommand.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/Group/UpdateGroupCommand.cs @@ -30,16 +30,6 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group public async Task Handle(UpdateGroupCommand request, CancellationToken cancellationToken) { - if (request.Group == null) - { - throw new BadRequestException($"A valid {nameof(Data.Models.Group)} object must be provided"); - } - - if (!request.Group.IsValid()) - { - throw new BadRequestException(request.Group.GetValidationErrors()); - } - var dto = request.Group; if (dto.Id <= 0) @@ -53,7 +43,7 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group if (model == null) { - throw new EntityNotFoundException($"{nameof(Data.Models.Group)} with Id {dto.Id} not found"); + throw new EntityNotFoundException($"{nameof(Data.Models.Group)} with Id {dto.Id} not found."); } // ensure uniqueness of name @@ -61,7 +51,7 @@ namespace Microsoft.DSX.ProjectTemplate.Command.Group .AnyAsync(e => e.Name.Trim() == dto.Name.Trim()) && dto.Name != (model.Name); if (nameAlreadyUsed) { - throw new BadRequestException($"{nameof(dto.Name)} {dto.Name} already used"); + throw new BadRequestException($"{nameof(dto.Name)} {dto.Name} already used."); } model.Name = dto.Name; diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/HandlerBase.cs b/service/Microsoft.DSX.ProjectTemplate.Command/HandlerBase.cs index 3b9deb2..296349b 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/HandlerBase.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/HandlerBase.cs @@ -6,7 +6,7 @@ using Microsoft.DSX.ProjectTemplate.Data; namespace Microsoft.DSX.ProjectTemplate.Command { /// - /// Base class that all handlers inherit from + /// Base class of all handlers. /// public abstract class HandlerBase { diff --git a/service/Microsoft.DSX.ProjectTemplate.Command/QueryHandlerBase.cs b/service/Microsoft.DSX.ProjectTemplate.Command/QueryHandlerBase.cs index e31b31c..ebaca6d 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Command/QueryHandlerBase.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Command/QueryHandlerBase.cs @@ -6,7 +6,7 @@ using Microsoft.DSX.ProjectTemplate.Data; namespace Microsoft.DSX.ProjectTemplate.Command { /// - /// Base class that all query handlers inherit from + /// Base class of all query handlers. /// public abstract class QueryHandlerBase : HandlerBase { diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Constants.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Constants.cs new file mode 100644 index 0000000..f89f986 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Constants.cs @@ -0,0 +1,18 @@ +namespace Microsoft.DSX.ProjectTemplate.Data +{ + public static class Constants + { + public static class Environments + { + public const string Local = "local"; + public const string Test = "test"; + public const string Dev = "dev"; + public const string Development = "development"; + } + + public static class MaximumLengths + { + public const int StringColumn = 512; + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/AuditDto.cs b/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/AuditDto.cs index 7c81162..7b62866 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/AuditDto.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/AuditDto.cs @@ -5,6 +5,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.DTOs public abstract class AuditDto : BaseDto { public DateTime CreatedDate { get; set; } + public DateTime UpdatedDate { get; set; } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/BaseDto.cs b/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/BaseDto.cs index 875898f..3cae5aa 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/BaseDto.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/BaseDto.cs @@ -1,25 +1,15 @@ using Microsoft.AspNetCore.Mvc.ModelBinding; -using System.Text; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; namespace Microsoft.DSX.ProjectTemplate.Data.DTOs { - public abstract class BaseDto + public abstract class BaseDto : IValidatableObject { public TType Id { get; set; } - protected ModelStateDictionary ModelState { get; } = new ModelStateDictionary(); - - public abstract bool IsValid(); - - public virtual string GetValidationErrors() - { - StringBuilder sb = new StringBuilder(); - foreach (var error in ModelState) - { - sb.AppendLine($"{error.Key} : {error.Value}"); - } - - return sb.ToString(); - } + protected ModelStateDictionary ModelState { get; } = new ModelStateDictionary(); + + public abstract IEnumerable Validate(ValidationContext validationContext); } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/GroupDto.cs b/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/GroupDto.cs index 8fc20b9..7ce80b4 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/GroupDto.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/DTOs/GroupDto.cs @@ -1,19 +1,27 @@ -namespace Microsoft.DSX.ProjectTemplate.Data.DTOs +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; + +namespace Microsoft.DSX.ProjectTemplate.Data.DTOs { public class GroupDto : AuditDto { public string Name { get; set; } public bool IsActive { get; set; } - - public override bool IsValid() - { - if (string.IsNullOrWhiteSpace(Name)) - { - ModelState.AddModelError(nameof(Name), $"{nameof(Name)} cannot be null or empty."); + + public override IEnumerable Validate(ValidationContext validationContext) + { + if (!string.IsNullOrWhiteSpace(Name)) + { + if (Name.Length > Constants.MaximumLengths.StringColumn) + { + yield return new ValidationResult($"{nameof(Name)} must be less than {Constants.MaximumLengths.StringColumn} characters.", new[] { nameof(Name) }); + } } - - return ModelState.IsValid; - } + else + { + yield return new ValidationResult($"{nameof(Name)} cannot be null or empty.", new[] { nameof(Name) }); + } + } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Events/GroupCreatedDomainEvent.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Events/GroupCreatedDomainEvent.cs index 8deea7c..842e514 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Events/GroupCreatedDomainEvent.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Events/GroupCreatedDomainEvent.cs @@ -5,11 +5,11 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Events { public class GroupCreatedDomainEvent : INotification { + public Group Group { get; } + public GroupCreatedDomainEvent(Group group) { Group = group; } - - public Group Group { get; } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/BadRequestException.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/BadRequestException.cs index b84124b..a236988 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/BadRequestException.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/BadRequestException.cs @@ -6,9 +6,9 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Exceptions { private static string DefaultMessageHeader => "Bad Request"; + public override HttpStatusCode StatusCode => HttpStatusCode.BadRequest; + public BadRequestException(string message, string messageHeader = null) : base(message, messageHeader ?? DefaultMessageHeader) { } - - public override HttpStatusCode StatusCode => HttpStatusCode.BadRequest; } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/EntityNotFoundException.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/EntityNotFoundException.cs index 3268b4e..7283a66 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/EntityNotFoundException.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/EntityNotFoundException.cs @@ -6,9 +6,9 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Exceptions { private static string DefaultMessageHeader => "Not found"; + public override HttpStatusCode StatusCode => HttpStatusCode.NotFound; + public EntityNotFoundException(string message, string messageHeader = null) : base(message, messageHeader ?? DefaultMessageHeader) { } - - public override HttpStatusCode StatusCode => HttpStatusCode.NotFound; } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/ExceptionBase.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/ExceptionBase.cs index 39cf83c..1fd523b 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/ExceptionBase.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Exceptions/ExceptionBase.cs @@ -5,14 +5,14 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Exceptions { public abstract class ExceptionBase : Exception { + public abstract HttpStatusCode StatusCode { get; } + + public string MessageHeader { get; } + protected ExceptionBase(string message, string messageHeader = null) : base(message) { MessageHeader = messageHeader; } - - public abstract HttpStatusCode StatusCode { get; } - - public string MessageHeader { get; } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.Designer.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.Designer.cs index e13e277..7894d89 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.Designer.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.Designer.cs @@ -35,7 +35,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("Name") .IsRequired() - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("UpdatedDate"); @@ -84,7 +84,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("CreatedDate"); b.Property("Name") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("UpdatedDate"); @@ -111,7 +111,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("Name") .IsRequired() - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("OwnerId"); @@ -140,7 +140,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("GroupId"); b.Property("Name") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("UpdatedDate"); @@ -160,7 +160,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("CreatedDate"); b.Property("DisplayName") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("Metadata"); @@ -187,22 +187,22 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); b1.Property("LocationAddressLine1") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationAddressLine2") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationCity") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationCountry") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationStateProvince") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationZipCode") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.HasKey("LibraryId"); diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.cs index 9f4485a..134de0e 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/20190709203526_Initial.cs @@ -16,13 +16,13 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), CreatedDate = table.Column(nullable: false), UpdatedDate = table.Column(nullable: false), - Name = table.Column(maxLength: 512, nullable: true), - Address_LocationAddressLine1 = table.Column(maxLength: 512, nullable: true), - Address_LocationAddressLine2 = table.Column(maxLength: 512, nullable: true), - Address_LocationCity = table.Column(maxLength: 512, nullable: true), - Address_LocationStateProvince = table.Column(maxLength: 512, nullable: true), - Address_LocationZipCode = table.Column(maxLength: 512, nullable: true), - Address_LocationCountry = table.Column(maxLength: 512, nullable: true) + Name = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), + Address_LocationAddressLine1 = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), + Address_LocationAddressLine2 = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), + Address_LocationCity = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), + Address_LocationStateProvince = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), + Address_LocationZipCode = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), + Address_LocationCountry = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true) }, constraints: table => { @@ -37,7 +37,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), CreatedDate = table.Column(nullable: false), UpdatedDate = table.Column(nullable: false), - DisplayName = table.Column(maxLength: 512, nullable: true), + DisplayName = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), Metadata = table.Column(nullable: true) }, constraints: table => @@ -53,7 +53,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), CreatedDate = table.Column(nullable: false), UpdatedDate = table.Column(nullable: false), - Name = table.Column(maxLength: 512, nullable: false), + Name = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: false), IsActive = table.Column(nullable: false), DefaultLibraryId = table.Column(nullable: true) }, @@ -76,7 +76,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), CreatedDate = table.Column(nullable: false), UpdatedDate = table.Column(nullable: false), - Name = table.Column(maxLength: 512, nullable: false), + Name = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: false), IsActive = table.Column(nullable: false), GroupId = table.Column(nullable: false), OwnerId = table.Column(nullable: true) @@ -106,7 +106,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), CreatedDate = table.Column(nullable: false), UpdatedDate = table.Column(nullable: false), - Name = table.Column(maxLength: 512, nullable: true), + Name = table.Column(maxLength: Constants.MaximumLengths.StringColumn, nullable: true), GroupId = table.Column(nullable: false) }, constraints: table => diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/ProjectTemplateDbContextModelSnapshot.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/ProjectTemplateDbContextModelSnapshot.cs index 343fe3b..f33cc32 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/ProjectTemplateDbContextModelSnapshot.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Migrations/ProjectTemplateDbContextModelSnapshot.cs @@ -33,7 +33,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("Name") .IsRequired() - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("UpdatedDate"); @@ -82,7 +82,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("CreatedDate"); b.Property("Name") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("UpdatedDate"); @@ -109,7 +109,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("Name") .IsRequired() - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("OwnerId"); @@ -138,7 +138,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("GroupId"); b.Property("Name") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("UpdatedDate"); @@ -158,7 +158,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations b.Property("CreatedDate"); b.Property("DisplayName") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b.Property("Metadata"); @@ -185,22 +185,22 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Migrations .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); b1.Property("LocationAddressLine1") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationAddressLine2") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationCity") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationCountry") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationStateProvince") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.Property("LocationZipCode") - .HasMaxLength(512); + .HasMaxLength(Constants.MaximumLengths.StringColumn); b1.HasKey("LibraryId"); diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Address.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Address.cs index c1be5dd..db83bfa 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Address.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Address.cs @@ -1,27 +1,27 @@ -using System.ComponentModel.DataAnnotations; -using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations; namespace Microsoft.DSX.ProjectTemplate.Data.Models { [Owned] public class Address { - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string LocationAddressLine1 { get; set; } - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string LocationAddressLine2 { get; set; } - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string LocationCity { get; set; } - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string LocationStateProvince { get; set; } - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string LocationZipCode { get; set; } - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string LocationCountry { get; set; } } } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Group.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Group.cs index b4a2e44..5e4137d 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Group.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Group.cs @@ -6,7 +6,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Models public class Group : AuditModel { [Required] - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string Name { get; set; } public bool IsActive { get; set; } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Library.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Library.cs index 743a1c4..c02a36c 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Library.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Library.cs @@ -4,7 +4,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Models { public class Library : AuditModel { - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string Name { get; set; } public Address Address { get; set; } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Project.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Project.cs index 458faee..a26d28f 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Project.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Project.cs @@ -5,7 +5,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Models public class Project : AuditModel { [Required] - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string Name { get; set; } public bool IsActive { get; set; } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Team.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Team.cs index 6e2f6e7..3099462 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Models/Team.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Models/Team.cs @@ -4,7 +4,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Models { public class Team : AuditModel { - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string Name { get; set; } public virtual Group Group { get; set; } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Models/User.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Models/User.cs index cb382cc..77971e7 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Models/User.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Models/User.cs @@ -5,7 +5,7 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Models { public class User : AuditModel { - [MaxLength(512)] + [MaxLength(Constants.MaximumLengths.StringColumn)] public string DisplayName { get; set; } public Dictionary Metadata { get; set; } diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/ProjectTemplateDbContext.cs b/service/Microsoft.DSX.ProjectTemplate.Data/ProjectTemplateDbContext.cs index 20fbb1e..abcb076 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/ProjectTemplateDbContext.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/ProjectTemplateDbContext.cs @@ -1,12 +1,11 @@ using Microsoft.DSX.ProjectTemplate.Data.Models; using Microsoft.EntityFrameworkCore; -//using Microsoft.AspNetCore.Mvc.NewtonsoftJson; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; -using Newtonsoft.Json; namespace Microsoft.DSX.ProjectTemplate.Data { diff --git a/service/Microsoft.DSX.ProjectTemplate.Data/Utilities/TestDataSeeder.cs b/service/Microsoft.DSX.ProjectTemplate.Data/Utilities/TestDataSeeder.cs index 9b0cd88..08f267a 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Data/Utilities/TestDataSeeder.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Data/Utilities/TestDataSeeder.cs @@ -15,13 +15,13 @@ namespace Microsoft.DSX.ProjectTemplate.Data.Utilities public void SeedTestData() { - _logger.LogInformation("Database seeding started"); + _logger.LogInformation("Database seeding started."); SeedGroups(10); SeedProjects(10); - _logger.LogInformation("Database seeding completed"); + _logger.LogInformation("Database seeding completed."); } private void SeedGroups(int entityCount) diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/CustomWebApplicationFactoryOfT.cs b/service/Microsoft.DSX.ProjectTemplate.Test/CustomWebApplicationFactoryOfT.cs deleted file mode 100644 index 04484f9..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/CustomWebApplicationFactoryOfT.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace Microsoft.DSX.ProjectTemplate.Test -{ - public class CustomWebApplicationFactory - : WebApplicationFactory - where TStartup : class - { - /// - /// Code inside this method runs _before_ does. - /// - protected override void ConfigureWebHost(IWebHostBuilder builder) - { - - builder - .UseEnvironment("Test") - .UseStartup(); - - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupControllerTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupControllerTests.cs deleted file mode 100644 index 2c6d0b4..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupControllerTests.cs +++ /dev/null @@ -1,105 +0,0 @@ -using FluentAssertions; -using Microsoft.DSX.ProjectTemplate.Data.DTOs; -using Microsoft.DSX.ProjectTemplate.Data.Utilities; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Collections.Generic; -using System.Net.Http; -using System.Threading.Tasks; - -namespace Microsoft.DSX.ProjectTemplate.Test.Group -{ - [TestClass] - [TestCategory("Group")] - public class GroupControllerTests : IntegrationTest - { - [TestMethod] - public async Task GetAll_Valid_Success() - { - // Arrange - var client = Factory.CreateClient(); - - // Act - var response = await client.GetAsync("/api/groups"); - - // Assert - var result = await EnsureObject>(response); - result.Should().HaveCountGreaterThan(0); - } - - [DataTestMethod] - [DataRow(1)] - public async Task GetById_Valid_Success(int groupId) - { - // Arrange - var client = Factory.CreateClient(); - - // Act - var response = await client.GetAsync($"/api/groups/{groupId}"); - - // Assert - var result = await EnsureObject(response); - result.Should().NotBeNull(); - result.Id.Should().Be(groupId); - result.IsValid().Should().BeTrue(); - } - - [TestMethod] - public async Task Create_Valid_Success() - { - // Arrange - var client = Factory.CreateClient(); - var dto = SetupGroupDto(); - - // Act - var response = await client.PostAsJsonAsync("/api/groups", dto); - - // Assert - var result = await EnsureObject(response); - result.Id.Should().BeGreaterThan(0); - result.Name.Should().Be(dto.Name); - result.IsActive.Should().Be(dto.IsActive); - } - - [TestMethod] - public async Task Update_Valid_Success() - { - // Arrange - var client = Factory.CreateClient(); - var dto = SetupGroupDto(); - dto.Id = 4; - - // Act - var response = await client.PutAsJsonAsync("/api/groups", dto); - - // Assert - var result = await EnsureObject(response); - result.Id.Should().Be(dto.Id); - result.Name.Should().Be(dto.Name); - result.IsActive.Should().Be(dto.IsActive); - } - - [DataTestMethod] - [DataRow(4)] - public async Task Delete_Valid_Success(int groupId) - { - // Arrange - var client = Factory.CreateClient(); - - // Act - var response = await client.DeleteAsync($"/api/groups/{groupId}"); - - // Assert - var result = await EnsureObject(response); - result.Should().BeTrue(); - } - - private GroupDto SetupGroupDto() - { - return new GroupDto() - { - Name = RandomFactory.GetCompanyName(), - IsActive = RandomFactory.GetBoolean() - }; - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupCreateCommandHandlerTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupCreateCommandHandlerTests.cs deleted file mode 100644 index 7f5d216..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupCreateCommandHandlerTests.cs +++ /dev/null @@ -1,76 +0,0 @@ -using Microsoft.DSX.ProjectTemplate.Command.Group; -using Microsoft.DSX.ProjectTemplate.Data.Events; -using Microsoft.DSX.ProjectTemplate.Data.Exceptions; -using Microsoft.DSX.ProjectTemplate.Data.Utilities; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.DSX.ProjectTemplate.Test.Group -{ - [TestClass] - [TestCategory("Group")] - public class GroupCreateCommandHandlerTests : UnitTest - { - [DataTestMethod] - [ExpectedException(typeof(BadRequestException))] - [DataRow(null)] - [DataRow("")] - public async Task Create_MissingName_BadRequestException(string name) - { - await ExecuteWithDb((db) => - { - var handler = new CreateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var dto = SeedHelper.CreateValidNewGroupDto(db, Mapper); - dto.Name = name; - - return handler.Handle(new CreateGroupCommand() { Group = dto }, default); - }); - } - - [TestMethod] - [ExpectedException(typeof(BadRequestException))] - public async Task Create_NameAlreadyUsed_BadRequestException() - { - await ExecuteWithDb((db) => - { - var handler = new CreateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var existingGroup = SeedHelper.GetRandomGroup(db); - var dto = SeedHelper.CreateValidNewGroupDto(db, Mapper, existingGroup.Name); - - return handler.Handle(new CreateGroupCommand() { Group = dto }, default); - }); - } - - [TestMethod] - public async Task Create_Valid_PublishesGroupCreatedDomainEvent() - { - await ExecuteWithDb((db) => - { - var handler = new CreateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var dto = SeedHelper.CreateValidNewGroupDto(db, Mapper); - - return handler.Handle(new CreateGroupCommand() { Group = dto }, default); - }, (result, db) => - { - MockMediator.Verify(x => x.Publish(It.IsAny(), It.IsAny()), Times.Once); - }); - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupCreatedEventHandlerTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupCreatedEventHandlerTests.cs deleted file mode 100644 index 8d08906..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupCreatedEventHandlerTests.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.DSX.ProjectTemplate.Command.Group; -using Microsoft.DSX.ProjectTemplate.Data.Events; -using Microsoft.DSX.ProjectTemplate.Data.Utilities; -using Microsoft.Extensions.Logging; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using Moq; -using System.Threading.Tasks; - -namespace Microsoft.DSX.ProjectTemplate.Test.Group -{ - [TestClass] - [TestCategory("Group")] - public class GroupCreatedEventHandlerTests : UnitTest - { - [DataTestMethod] - [DataRow("Alpha")] - public async Task Event_Created_SendsEmail(string groupName) - { - await ExecuteWithDb(async (db) => - { - var handler = new GroupCreatedEventHandler(MockMediator.Object, db, Mapper, - MockAuthorizationService.Object, MockEmailService.Object, - LoggerFactory.CreateLogger()); - - var group = SeedHelper.CreateValidNewGroup(db, groupName); - var notification = new GroupCreatedDomainEvent(group); - - await handler.Handle(notification, default); - return Task.CompletedTask; - }, (_, db) => - { - MockEmailService.Verify(x => x.SendEmailAsync(It.IsNotNull(), - It.IsNotNull(), - It.Is(subject => subject.Contains(groupName)), - It.IsNotNull()), - Times.Once); - }); - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupDeleteCommandHandlerTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupDeleteCommandHandlerTests.cs deleted file mode 100644 index 72b7305..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupDeleteCommandHandlerTests.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Microsoft.DSX.ProjectTemplate.Command.Group; -using Microsoft.DSX.ProjectTemplate.Data.Exceptions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.DSX.ProjectTemplate.Test.Group -{ - [TestClass] - [TestCategory("Group")] - public class GroupDeleteCommandHandlerTests : UnitTest - { - [DataTestMethod] - [ExpectedException(typeof(BadRequestException))] - [DataRow(0)] - [DataRow(-1)] - public async Task Delete_InvalidId_BadRequestException(int id) - { - await ExecuteWithDb((db) => - { - var handler = new DeleteGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - return handler.Handle(new DeleteGroupCommand() { GroupId = id }, default(CancellationToken)); - }); - } - - [TestMethod] - [ExpectedException(typeof(EntityNotFoundException))] - public async Task Delete_IdNotFound_EntityNotFoundException() - { - await ExecuteWithDb((db) => - { - var handler = new DeleteGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var lastGroup = db.Groups.OrderBy(o => o.Id).Last(); - - return handler.Handle(new DeleteGroupCommand() { GroupId = (lastGroup.Id + 1) }, default(CancellationToken)); - }); - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupQueryHandlerTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupQueryHandlerTests.cs deleted file mode 100644 index b02a042..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupQueryHandlerTests.cs +++ /dev/null @@ -1,78 +0,0 @@ -using FluentAssertions; -using Microsoft.DSX.ProjectTemplate.Command.Group; -using Microsoft.DSX.ProjectTemplate.Data.DTOs; -using Microsoft.DSX.ProjectTemplate.Data.Exceptions; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.DSX.ProjectTemplate.Test.Group -{ - [TestClass] - [TestCategory("Group")] - public class GroupQueryHandlerTests : UnitTest - { - [TestMethod] - public async Task GetAll_Valid_Success() - { - DateTime dtStart = DateTime.Now; - - await ExecuteWithDb((db) => - { - var handler = new GroupQueryHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - return handler.Handle(new GetAllGroupsQuery(), default(CancellationToken)); - }, (result, db) => - { - result.Should().NotBeNull(); - result.Should().BeAssignableTo>(); - result.Should().HaveCountGreaterThan(0); - foreach (var group in result) - { - group.Id.Should().BeGreaterThan(0); - group.Name.Should().NotBeNullOrWhiteSpace(); - group.CreatedDate.Should().BeOnOrAfter(dtStart); - group.UpdatedDate.Should().BeOnOrAfter(dtStart); - } - }); - } - - [DataTestMethod] - [ExpectedException(typeof(BadRequestException))] - [DataRow(0)] - [DataRow(-1)] - public async Task GetById_InvalidId_BadRequestException(int id) - { - await ExecuteWithDb((db) => - { - var handler = new GroupQueryHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - return handler.Handle(new GetGroupByIdQuery() { GroupId = id }, default(CancellationToken)); - }); - } - - [DataTestMethod] - [ExpectedException(typeof(EntityNotFoundException))] - [DataRow(int.MaxValue)] - public async Task GetById_IdNotFound_EntityNotFoundException(int id) - { - await ExecuteWithDb((db) => - { - var handler = new GroupQueryHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - return handler.Handle(new GetGroupByIdQuery() { GroupId = id }, default(CancellationToken)); - }); - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupUpdateCommandHandlerTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupUpdateCommandHandlerTests.cs deleted file mode 100644 index 6737a06..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Group/GroupUpdateCommandHandlerTests.cs +++ /dev/null @@ -1,123 +0,0 @@ -using Microsoft.DSX.ProjectTemplate.Command.Group; -using Microsoft.DSX.ProjectTemplate.Data.DTOs; -using Microsoft.DSX.ProjectTemplate.Data.Exceptions; -using Microsoft.DSX.ProjectTemplate.Data.Utilities; -using Microsoft.VisualStudio.TestTools.UnitTesting; -using System; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.DSX.ProjectTemplate.Test.Group -{ - [TestClass] - [TestCategory("Group")] - public class GroupUpdateCommandHandlerTests : UnitTest - { - [DataTestMethod] - [ExpectedException(typeof(BadRequestException))] - [DataRow(0)] - [DataRow(-1)] - public async Task Update_InvalidId_BadRequestException(int id) - { - await ExecuteWithDb(async (db) => - { - var handler = new UpdateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var randomGroup = SeedHelper.GetRandomGroup(db); - var dto = Mapper.Map(randomGroup); - dto.Id = id; - - return await handler.Handle(new UpdateGroupCommand() { Group = dto }, default(CancellationToken)); - }); - } - - [DataTestMethod] - [ExpectedException(typeof(BadRequestException))] - [DataRow(null)] - [DataRow("")] - public async Task Update_MissingName_BadRequestException(string name) - { - await ExecuteWithDb(async (db) => - { - var handler = new UpdateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var randomGroup = SeedHelper.GetRandomGroup(db); - var dto = Mapper.Map(randomGroup); - - dto.Name = name; - - return await handler.Handle(new UpdateGroupCommand() { Group = dto }, default(CancellationToken)); - }); - } - - [TestMethod] - public async Task Update_NoChanges_Success() - { - await ExecuteWithDb((db) => - { - var handler = new UpdateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var existingGroup = SeedHelper.GetRandomGroup(db); - var dto = Mapper.Map(existingGroup); - - return handler.Handle(new UpdateGroupCommand() { Group = dto }, default(CancellationToken)); - }); - } - - [TestMethod] - [ExpectedException(typeof(BadRequestException))] - public async Task Update_NameAlreadyUsed_BadRequestException() - { - await ExecuteWithDb((db) => - { - var handler = new UpdateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var existingGroup = SeedHelper.GetRandomGroup(db); - var differentGroup = db.Groups - .Where(x => x.Id != existingGroup.Id) - .OrderBy(x => Guid.NewGuid()) - .First(); - var dto = Mapper.Map(existingGroup); - dto.Name = differentGroup.Name; - - return handler.Handle(new UpdateGroupCommand() { Group = dto }, default(CancellationToken)); - }); - } - - [TestMethod] - [ExpectedException(typeof(EntityNotFoundException))] - public async Task Update_IdNotFound_EntityNotFoundException() - { - await ExecuteWithDb((db) => - { - var handler = new UpdateGroupCommandHandler( - MockMediator.Object, - db, - Mapper, - MockAuthorizationService.Object); - - var dto = SeedHelper.CreateValidNewGroupDto(db, Mapper); - dto.Id = int.MaxValue; - - return handler.Handle(new UpdateGroupCommand() { Group = dto }, default(CancellationToken)); - }); - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/FakeEmailService.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/FakeEmailService.cs new file mode 100644 index 0000000..d5e7acd --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/FakeEmailService.cs @@ -0,0 +1,27 @@ +using Microsoft.DSX.ProjectTemplate.Data.Abstractions; +using System.Threading.Tasks; + +namespace Microsoft.DSX.ProjectTemplate.Test.Infrastructure +{ + internal class FakeEmailService : IEmailService + { + private int m_sentCount; + + public FakeEmailService() + { + m_sentCount = 0; + } + + public Task SendEmailAsync(string from, string to, string subject, string body) + { + m_sentCount++; + + return Task.CompletedTask; + } + + public int GetSentCount() + { + return m_sentCount; + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/ProjectTemplateWebApplicationFactory.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/ProjectTemplateWebApplicationFactory.cs new file mode 100644 index 0000000..ed79e36 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/ProjectTemplateWebApplicationFactory.cs @@ -0,0 +1,79 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.AspNetCore.TestHost; +using Microsoft.DSX.ProjectTemplate.Data; +using Microsoft.DSX.ProjectTemplate.Data.Abstractions; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using System; + +namespace Microsoft.DSX.ProjectTemplate.Test.Infrastructure +{ + /// + /// Factory for bootstrapping an application into memory for functional end-to-end testing. + /// + public class ProjectTemplateWebApplicationFactory : WebApplicationFactory where TStartup : class + { + private readonly Guid _dbGuid = Guid.NewGuid(); + + /// + /// Creates an instance of an and adds to its pre-configured defaults + /// + protected override IHostBuilder CreateHostBuilder() + { + return Host + .CreateDefaultBuilder() + .UseEnvironment(Constants.Environments.Test) + .ConfigureLogging(loggingBuilder => + { + loggingBuilder + .ClearProviders() + .AddConsole() + .SetMinimumLevel(LogLevel.Trace); + }) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder + .UseSetting(WebHostDefaults.DetailedErrorsKey, "true") + .CaptureStartupErrors(true) + .UseStartup(); + }); + } + + /// + /// Configures the services and sets up the in-memory database + /// + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder + .ConfigureTestServices(services => + { + services + .AddSingleton() + .RemoveAll(typeof(IHostedService)); + }) + .ConfigureServices((_, services) => + { + var serviceProvider = new ServiceCollection() + .AddEntityFrameworkInMemoryDatabase() + .BuildServiceProvider(); + + services + .AddDbContext(options => + { + options + .ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning)) + .UseInMemoryDatabase(_dbGuid.ToString()) + .EnableSensitiveDataLogging(); + }); + + var sp = services.BuildServiceProvider(); + Utilities.SetupDatabase>(sp); + }); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/Utilities.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/Utilities.cs new file mode 100644 index 0000000..7ac6e0a --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/Utilities.cs @@ -0,0 +1,66 @@ +using Microsoft.DSX.ProjectTemplate.Data; +using Microsoft.DSX.ProjectTemplate.Data.Utilities; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using System; +using System.Threading.Tasks; + +namespace Microsoft.DSX.ProjectTemplate.Test.Infrastructure +{ + internal static class Utilities + { + /// + /// Ensure the database is created and seeded with both real and test data. + /// + /// The class that initialized the setup, for relevant logging. + public static void SetupDatabase(IServiceProvider serviceProvider) + { + using IServiceScope scope = serviceProvider.CreateScope(); + var loggerFactory = scope.ServiceProvider.GetRequiredService(); + var logger = loggerFactory.CreateLogger(); + + try + { + logger.LogInformation("Database configuration started"); + + var db = scope.ServiceProvider.GetRequiredService(); + db.Database.EnsureCreated(); + (new TestDataSeeder(db, loggerFactory.CreateLogger())).SeedTestData(); + + logger.LogInformation("Database configuration completed"); + } + catch (Exception ex) + { + logger.LogError(ex, $"An error occurred setting up the database. Error: {ex.Message}"); + } + } + + /// + /// Asynchronously resolves a service scope and executes a delegate function. + /// The scoped DbContext is disposed after the delegate is executed. + /// + /// The delegate to execute with the scoped + public static async Task ExecuteWithDbScope(this IServiceProvider provider, Func> func) + { + using (IServiceScope scope = provider.CreateScope()) + { + ProjectTemplateDbContext db = scope.ServiceProvider.GetRequiredService(); + return await func.Invoke(db).ConfigureAwait(false); + } + } + + /// + /// Resolves a service scope and executes a delegate action. + /// The scoped DbContext is disposed after the delegate is executed. + /// + /// The delegate to execute with the scoped + public static void ExecuteWithDbScope(this IServiceProvider provider, Action action) + { + using (IServiceScope scope = provider.CreateScope()) + { + ProjectTemplateDbContext db = scope.ServiceProvider.GetRequiredService(); + action.Invoke(db); + } + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/IntegrationTest.cs b/service/Microsoft.DSX.ProjectTemplate.Test/IntegrationTest.cs deleted file mode 100644 index 795a968..0000000 --- a/service/Microsoft.DSX.ProjectTemplate.Test/IntegrationTest.cs +++ /dev/null @@ -1,27 +0,0 @@ -using Microsoft.AspNetCore.Mvc.Testing; -using Microsoft.DSX.ProjectTemplate.API; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace Microsoft.DSX.ProjectTemplate.Test -{ - /// - /// Each integration test is truly isolated because the test has private instances of: - /// - - /// - - /// - database - /// - [TestCategory("Integration")] - [TestClass] - public abstract class IntegrationTest : BaseTest - { - /// - /// Gets factory that creates instances for sending HTTP requests to. - /// - protected WebApplicationFactory Factory { get; } - - protected IntegrationTest() - { - Factory = new CustomWebApplicationFactory(); - } - } -} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/BaseTest.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/BaseTest.cs similarity index 94% rename from service/Microsoft.DSX.ProjectTemplate.Test/BaseTest.cs rename to service/Microsoft.DSX.ProjectTemplate.Test/Tests/BaseTest.cs index c473115..40d827c 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Test/BaseTest.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/BaseTest.cs @@ -5,7 +5,7 @@ using System.Net.Http; using System.Threading.Tasks; [assembly: Parallelize(Workers = 0, Scope = ExecutionScope.MethodLevel)] -namespace Microsoft.DSX.ProjectTemplate.Test +namespace Microsoft.DSX.ProjectTemplate.Test.Tests { public abstract class BaseTest { diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/BaseIntegrationTest.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/BaseIntegrationTest.cs new file mode 100644 index 0000000..d3a9a88 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/BaseIntegrationTest.cs @@ -0,0 +1,64 @@ +using AutoMapper; +using Microsoft.DSX.ProjectTemplate.API; +using Microsoft.DSX.ProjectTemplate.Data.Abstractions; +using Microsoft.DSX.ProjectTemplate.Test.Infrastructure; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Net.Http; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Integration +{ + /// + /// Each integration test is truly isolated because the test has private instances of: + /// - + /// - + /// - database + /// + [TestCategory("Integration")] + [TestClass] + public abstract class BaseIntegrationTest : BaseTest + { + /// + /// Gets factory that creates instances for sending HTTP requests to. + /// + protected ProjectTemplateWebApplicationFactory _factory; + + protected IServiceProvider ServiceProvider { get; } + + protected HttpClient Client { get; } + + protected IMapper Mapper { get; } + + protected BaseIntegrationTest() + { + _factory = new ProjectTemplateWebApplicationFactory(); + ServiceProvider = _factory.Services; + + Client = _factory.CreateClient(); + Client.DefaultRequestVersion = new Version(2, 0); + + Mapper = _factory.Services.GetRequiredService(); + } + + [TestCleanup] + public void Cleanup() + { + Client.Dispose(); + _factory.Dispose(); + } + + /// + /// Resolves a service scope and gets the count of sent emails. + /// + /// Count of emails sent. + protected int GetSentCount() + { + using (IServiceScope scope = ServiceProvider.CreateScope()) + { + var emailService = (FakeEmailService)scope.ServiceProvider.GetRequiredService(); + return emailService.GetSentCount(); + } + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/BaseGroupTest.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/BaseGroupTest.cs new file mode 100644 index 0000000..81611aa --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/BaseGroupTest.cs @@ -0,0 +1,17 @@ +using Microsoft.DSX.ProjectTemplate.Data.DTOs; +using Microsoft.DSX.ProjectTemplate.Data.Utilities; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Integration.Group +{ + public abstract class BaseGroupTest : BaseIntegrationTest + { + protected GroupDto GetGroupDto() + { + return new GroupDto() + { + Name = RandomFactory.GetCompanyName(), + IsActive = RandomFactory.GetBoolean() + }; + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/CreateGroupTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/CreateGroupTests.cs new file mode 100644 index 0000000..3d33277 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/CreateGroupTests.cs @@ -0,0 +1,99 @@ +using FluentAssertions; +using Microsoft.DSX.ProjectTemplate.Data; +using Microsoft.DSX.ProjectTemplate.Data.DTOs; +using Microsoft.DSX.ProjectTemplate.Data.Utilities; +using Microsoft.DSX.ProjectTemplate.Test.Infrastructure; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Integration.Group +{ + [TestClass] + [TestCategory("Groups - Create")] + public class CreateGroupTests : BaseGroupTest + { + [TestMethod] + public async Task CreateGroup_ValidDto_Success() + { + // Arrange + var dto = GetGroupDto(); + + // Act + var response = await Client.PostAsJsonAsync("/api/groups", dto); + + // Assert + var result = await EnsureObject(response); + result.Id.Should().BeGreaterThan(0); + result.Name.Should().Be(dto.Name); + result.IsActive.Should().Be(dto.IsActive); + } + + [DataTestMethod] + [DataRow(null)] + [DataRow("")] + [DataRow(" ")] + [DataRow("\t")] + public async Task CreateGroup_MissingName_BadRequest(string name) + { + // Arrange + var dto = GetGroupDto(); + dto.Name = name; + + // Act + var response = await Client.PostAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [TestMethod] + public async Task CreateGroup_NameTooLong_BadRequest() + { + // Arrange + var dto = GetGroupDto(); + dto.Name = RandomFactory.GetAlphanumericString(Constants.MaximumLengths.StringColumn + 1); + + // Act + var response = await Client.PostAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [TestMethod] + public async Task CreateGroup_NameAlreadyExists_BadRequest() + { + // Arrange + Data.Models.Group randomGroup = null; + ServiceProvider.ExecuteWithDbScope(db => + { + randomGroup = SeedHelper.GetRandomGroup(db); + }); + var dto = GetGroupDto(); + dto.Name = randomGroup.Name; + + // Act + var response = await Client.PostAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [TestMethod] + public async Task CreateGroup_ValidDto_SendsEmail() + { + // Arrange + var dto = GetGroupDto(); + + // Act + var response = await Client.PostAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.OK); + + GetSentCount().Should().Be(1); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/DeleteGroupTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/DeleteGroupTests.cs new file mode 100644 index 0000000..088dd69 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/DeleteGroupTests.cs @@ -0,0 +1,53 @@ +using FluentAssertions; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Net; +using System.Threading.Tasks; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Integration.Group +{ + [TestClass] + [TestCategory("Groups - Delete")] + public class DeleteGroupTests : BaseGroupTest + { + [DataTestMethod] + [DataRow(5)] + public async Task DeleteGroup_ValidId_Success(int groupId) + { + // Arrange + + // Act + var response = await Client.DeleteAsync($"/api/groups/{groupId}"); + + // Assert + var result = await EnsureObject(response); + result.Should().BeTrue(); + } + + [DataTestMethod] + [DataRow(0)] + [DataRow(-1)] + public async Task DeleteGroup_InvalidId_BadRequest(int groupId) + { + // Arrange + + // Act + var response = await Client.DeleteAsync($"/api/groups/{groupId}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [DataTestMethod] + [DataRow(int.MaxValue)] + public async Task DeleteGroup_IdDoesNotExist_NotFound(int groupId) + { + // Arrange + + // Act + var response = await Client.DeleteAsync($"/api/groups/{groupId}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.NotFound); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/GetGroupTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/GetGroupTests.cs new file mode 100644 index 0000000..becbec5 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/GetGroupTests.cs @@ -0,0 +1,69 @@ +using FluentAssertions; +using Microsoft.DSX.ProjectTemplate.Data.DTOs; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Collections.Generic; +using System.Net; +using System.Threading.Tasks; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Integration.Group +{ + [TestClass] + [TestCategory("Groups - Get")] + public class GetGroupTests : BaseGroupTest + { + [TestMethod] + public async Task GetAllGroup_Valid_Success() + { + // Arrange + + // Act + var response = await Client.GetAsync("/api/groups"); + + // Assert + var result = await EnsureObject>(response); + result.Should().HaveCountGreaterThan(0); + } + + [DataTestMethod] + [DataRow(1)] + public async Task GetByIdGroup_ValidId_Success(int groupId) + { + // Arrange + + // Act + var response = await Client.GetAsync($"/api/groups/{groupId}"); + + // Assert + var result = await EnsureObject(response); + result.Should().NotBeNull(); + result.Id.Should().Be(groupId); + } + + [DataTestMethod] + [DataRow(0)] + [DataRow(-1)] + public async Task GetByIdGroup_InvalidId_BadRequest(int groupId) + { + // Arrange + + // Act + var response = await Client.GetAsync($"/api/groups/{groupId}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [DataTestMethod] + [DataRow(int.MaxValue)] + public async Task GetByIdGroup_IdDoesNotExist_NotFound(int groupId) + { + // Arrange + + // Act + var response = await Client.GetAsync($"/api/groups/{groupId}"); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.NotFound); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/UpdateGroupTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/UpdateGroupTests.cs new file mode 100644 index 0000000..06b9476 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Integration/Group/UpdateGroupTests.cs @@ -0,0 +1,144 @@ +using FluentAssertions; +using Microsoft.DSX.ProjectTemplate.Data; +using Microsoft.DSX.ProjectTemplate.Data.DTOs; +using Microsoft.DSX.ProjectTemplate.Data.Utilities; +using Microsoft.DSX.ProjectTemplate.Test.Infrastructure; +using Microsoft.EntityFrameworkCore; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Integration.Group +{ + [TestClass] + [TestCategory("Groups - Update")] + public class UpdateGroupTests : BaseGroupTest + { + [TestMethod] + public async Task UpdateGroup_ValidDto_Success() + { + // Arrange + var dto = GetGroupDto(); + dto.Id = 4; + + // Act + var response = await Client.PutAsJsonAsync("/api/groups", dto); + + // Assert + var result = await EnsureObject(response); + result.Id.Should().Be(dto.Id); + result.Name.Should().Be(dto.Name); + result.IsActive.Should().Be(dto.IsActive); + } + + [DataTestMethod] + [DataRow(0)] + [DataRow(-1)] + public async Task UpdateGroup_InvalidId_BadRequest(int id) + { + // Arrange + Data.Models.Group randomGroup = null; + ServiceProvider.ExecuteWithDbScope(db => + { + randomGroup = SeedHelper.GetRandomGroup(db); + }); + var dto = Mapper.Map(randomGroup); + dto.Id = id; + + // Act + var response = await Client.PutAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [DataTestMethod] + [DataRow(int.MaxValue)] + public async Task UpdateGroup_IdDoesNotExist_NotFound(int id) + { + // Arrange + Data.Models.Group randomGroup = null; + ServiceProvider.ExecuteWithDbScope(db => + { + randomGroup = SeedHelper.GetRandomGroup(db); + }); + var dto = Mapper.Map(randomGroup); + dto.Id = id; + + // Act + var response = await Client.PutAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.NotFound); + } + + [DataTestMethod] + [DataRow(null)] + [DataRow("")] + [DataRow(" ")] + [DataRow("\t")] + public async Task UpdateGroup_MissingName_BadRequest(string name) + { + // Arrange + Data.Models.Group randomGroup = null; + ServiceProvider.ExecuteWithDbScope(db => + { + randomGroup = SeedHelper.GetRandomGroup(db); + }); + var dto = Mapper.Map(randomGroup); + dto.Name = name; + + // Act + var response = await Client.PutAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [TestMethod] + public async Task UpdateGroup_NameTooLong_BadRequest() + { + // Arrange + Data.Models.Group randomGroup = null; + ServiceProvider.ExecuteWithDbScope(db => + { + randomGroup = SeedHelper.GetRandomGroup(db); + }); + var dto = Mapper.Map(randomGroup); + dto.Name = RandomFactory.GetAlphanumericString(Constants.MaximumLengths.StringColumn + 1); + + // Act + var response = await Client.PutAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + + [TestMethod] + public async Task UpdateGroup_NameAlreadyExists_BadRequest() + { + // Arrange + Data.Models.Group randomGroup = null; + Data.Models.Group differentGroup = null; + ServiceProvider.ExecuteWithDbScope(async db => + { + randomGroup = SeedHelper.GetRandomGroup(db); + differentGroup = await db.Groups + .Where(x => x.Id != randomGroup.Id) + .OrderBy(x => Guid.NewGuid()) + .FirstAsync(); + }); + var dto = Mapper.Map(randomGroup); + dto.Name = differentGroup.Name; + + // Act + var response = await Client.PutAsJsonAsync("/api/groups", dto); + + // Assert + response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/UnitTest.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/BaseUnitTest.cs similarity index 96% rename from service/Microsoft.DSX.ProjectTemplate.Test/UnitTest.cs rename to service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/BaseUnitTest.cs index 5ae6f9f..fcdcbd5 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Test/UnitTest.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/BaseUnitTest.cs @@ -16,10 +16,10 @@ using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; -namespace Microsoft.DSX.ProjectTemplate.Test +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Unit { [TestCategory("Unit")] - public abstract class UnitTest : BaseTest + public abstract class BaseUnitTest : BaseTest { protected ILoggerFactory LoggerFactory { get; set; } @@ -31,7 +31,7 @@ namespace Microsoft.DSX.ProjectTemplate.Test protected Mock MockEmailService { get; set; } = new Mock(); - protected UnitTest() + protected BaseUnitTest() { // redirect all logging to console var services = new ServiceCollection(); diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/DtoValidation/BaseDtoTest.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/DtoValidation/BaseDtoTest.cs new file mode 100644 index 0000000..a53e374 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/DtoValidation/BaseDtoTest.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Unit.DtoValidation +{ + public abstract class BaseDtoTest : BaseUnitTest + { + protected ValidationResult FindMember(IEnumerable validationResults, string memberNameToFind) + { + return validationResults + .FirstOrDefault(validationResult => validationResult.MemberNames.Any( + memberName => memberName.Equals(memberNameToFind))); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/DtoValidation/GroupDtoTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/DtoValidation/GroupDtoTests.cs new file mode 100644 index 0000000..73bddb4 --- /dev/null +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/DtoValidation/GroupDtoTests.cs @@ -0,0 +1,65 @@ +using FluentAssertions; +using Microsoft.DSX.ProjectTemplate.Data; +using Microsoft.DSX.ProjectTemplate.Data.DTOs; +using Microsoft.DSX.ProjectTemplate.Data.Utilities; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.ComponentModel.DataAnnotations; +using System.Linq; + +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Unit.DtoValidation +{ + [TestClass] + [TestCategory("Group")] + public class GroupDtoTests : BaseDtoTest + { + [TestMethod] + public void GroupDtoValidation_Valid_NoErrors() + { + var dto = new GroupDto + { + Name = RandomFactory.GetCompanyName(), + }; + + var validationContext = new ValidationContext(dto); + + var validationResults = dto.Validate(validationContext); + + validationResults.Should().HaveCount(0); + } + + [DataTestMethod] + [DataRow(null)] + [DataRow("")] + [DataRow(" ")] + public void GroupDtoValidation_MissingName_HasValidationErrors(string name) + { + var dto = new GroupDto + { + Name = name, + }; + + var validationContext = new ValidationContext(dto); + + var validationResults = dto.Validate(validationContext); + + validationResults.Should().HaveCountGreaterThan(0); + validationResults.FirstOrDefault(validationResult => validationResult.MemberNames.Any(memberName => memberName.Equals(nameof(GroupDto.Name)))).Should().NotBeNull(); + } + + [TestMethod] + public void GroupDtoValidation_NameTooLong_HasValidationErrors() + { + var dto = new GroupDto + { + Name = RandomFactory.GetAlphanumericString(Constants.MaximumLengths.StringColumn + 1), + }; + + var validationContext = new ValidationContext(dto); + + var validationResults = dto.Validate(validationContext); + + validationResults.Should().HaveCountGreaterThan(0); + validationResults.FirstOrDefault(validationResult => validationResult.MemberNames.Any(memberName => memberName.Equals(nameof(GroupDto.Name)))).Should().NotBeNull(); + } + } +} diff --git a/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/InfrastructureTests.cs b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/Infrastructure/InfrastructureTests.cs similarity index 51% rename from service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/InfrastructureTests.cs rename to service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/Infrastructure/InfrastructureTests.cs index 7a49e41..29ab215 100644 --- a/service/Microsoft.DSX.ProjectTemplate.Test/Infrastructure/InfrastructureTests.cs +++ b/service/Microsoft.DSX.ProjectTemplate.Test/Tests/Unit/Infrastructure/InfrastructureTests.cs @@ -1,10 +1,11 @@ -using System.Threading.Tasks; -using Microsoft.VisualStudio.TestTools.UnitTesting; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Threading.Tasks; -namespace Microsoft.DSX.ProjectTemplate.Test.Infrastructure +namespace Microsoft.DSX.ProjectTemplate.Test.Tests.Unit.Infrastructure { [TestClass] - public class InfrastructureTests : UnitTest + [TestCategory("Infrastructure")] + public class InfrastructureTests : BaseUnitTest { [TestMethod] public async Task Infrastructure_AutoMapper_ConfigurationIsValid()