diff --git a/package-lock.json b/package-lock.json
index 93f059ef..aa4ddedc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4006,6 +4006,32 @@
"restore-cursor": "^3.1.0"
}
},
+ "cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "requires": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "dependencies": {
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+ },
+ "slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ }
+ }
+ },
"cli-width": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
@@ -4209,6 +4235,11 @@
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
},
+ "compare-versions": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
+ "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA=="
+ },
"component-bind": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
@@ -4834,6 +4865,11 @@
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
},
+ "dedent": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw="
+ },
"deep-equal": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
@@ -5371,6 +5407,21 @@
}
}
},
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ },
+ "dependencies": {
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA=="
+ }
+ }
+ },
"entities": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
@@ -6589,6 +6640,14 @@
"locate-path": "^3.0.0"
}
},
+ "find-versions": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
+ "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+ "requires": {
+ "semver-regex": "^2.0.0"
+ }
+ },
"flat-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
@@ -7406,6 +7465,124 @@
"resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
"integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
},
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
+ },
+ "husky": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-4.2.5.tgz",
+ "integrity": "sha512-SYZ95AjKcX7goYVZtVZF2i6XiZcHknw50iXvY7b0MiGoj5RwdgRQNEHdb+gPDPCXKlzwrybjFjkL6FOj8uRhZQ==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "ci-info": "^2.0.0",
+ "compare-versions": "^3.6.0",
+ "cosmiconfig": "^6.0.0",
+ "find-versions": "^3.2.0",
+ "opencollective-postinstall": "^2.0.2",
+ "pkg-dir": "^4.2.0",
+ "please-upgrade-node": "^3.2.0",
+ "slash": "^3.0.0",
+ "which-pm-runs": "^1.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "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"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+ "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+ "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-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "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=="
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ }
+ }
+ },
"hyphenate-style-name": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz",
@@ -9936,6 +10113,236 @@
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
},
+ "lint-staged": {
+ "version": "10.2.11",
+ "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.11.tgz",
+ "integrity": "sha512-LRRrSogzbixYaZItE2APaS4l2eJMjjf5MbclRZpLJtcQJShcvUzKXsNeZgsLIZ0H0+fg2tL4B59fU9wHIHtFIA==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "cli-truncate": "2.1.0",
+ "commander": "^5.1.0",
+ "cosmiconfig": "^6.0.0",
+ "debug": "^4.1.1",
+ "dedent": "^0.7.0",
+ "enquirer": "^2.3.5",
+ "execa": "^4.0.1",
+ "listr2": "^2.1.0",
+ "log-symbols": "^4.0.0",
+ "micromatch": "^4.0.2",
+ "normalize-path": "^3.0.0",
+ "please-upgrade-node": "^3.2.0",
+ "string-argv": "0.3.1",
+ "stringify-object": "^3.3.0"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+ },
+ "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"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "execa": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+ "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "get-stream": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
+ "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+ "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+ "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-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ },
+ "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=="
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "listr2": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.4.0.tgz",
+ "integrity": "sha512-Hj2ECZdAxDkuYFtIKE35PgdMSqMp0muIhJRG5EyV5pOWFEUmKUG+fhfFrvIUNGBQvvi7wQ41eKTxDBisfvDjFQ==",
+ "requires": {
+ "chalk": "^4.1.0",
+ "cli-truncate": "^2.1.0",
+ "figures": "^3.2.0",
+ "indent-string": "^4.0.0",
+ "log-update": "^4.0.0",
+ "p-map": "^4.0.0",
+ "rxjs": "^6.6.0",
+ "through": "^2.3.8"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "requires": {
+ "aggregate-error": "^3.0.0"
+ }
+ }
+ }
+ },
"load-json-file": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
@@ -10074,6 +10481,71 @@
"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
},
+ "log-symbols": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
+ "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+ "requires": {
+ "chalk": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ }
+ }
+ },
+ "log-update": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz",
+ "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==",
+ "requires": {
+ "ansi-escapes": "^4.3.0",
+ "cli-cursor": "^3.1.0",
+ "slice-ansi": "^4.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="
+ },
+ "slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
"loglevel": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz",
@@ -10996,6 +11468,11 @@
}
}
},
+ "opencollective-postinstall": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
+ "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q=="
+ },
"opn": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
@@ -11364,6 +11841,14 @@
"find-up": "^3.0.0"
}
},
+ "please-upgrade-node": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
+ "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
+ "requires": {
+ "semver-compare": "^1.0.0"
+ }
+ },
"pn": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
@@ -12383,6 +12868,11 @@
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
"integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
},
+ "prettier": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.0.5.tgz",
+ "integrity": "sha512-7PtVymN48hGcO4fGjybyBSIWDsLU4H4XlvOHfq91pz9kkGlonzwTfYkaIEwiRg/dAJF9YlbsduBAgtYLi+8cFg=="
+ },
"pretty-bytes": {
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
@@ -13705,6 +14195,16 @@
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
},
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w="
+ },
+ "semver-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
+ "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw=="
+ },
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@@ -14483,6 +14983,11 @@
"resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
"integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
},
+ "string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg=="
+ },
"string-length": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz",
@@ -14624,6 +15129,11 @@
"resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
"integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
},
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ },
"strip-indent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
@@ -16116,6 +16626,11 @@
"resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
+ "which-pm-runs": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+ },
"word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
diff --git a/package.json b/package.json
index 5bff66f8..fb497b52 100644
--- a/package.json
+++ b/package.json
@@ -9,9 +9,12 @@
"@testing-library/jest-dom": "^5.11.1",
"@testing-library/react": "^10.4.7",
"@testing-library/user-event": "^12.0.11",
+ "husky": "^4.2.5",
"konva": "^7.0.3",
+ "lint-staged": "^10.2.11",
"material-ui-popup-state": "^1.6.1",
"notistack": "^0.9.17",
+ "prettier": "^2.0.5",
"qs": "^6.9.4",
"react": "^16.13.1",
"react-debounce-input": "^3.2.2",
@@ -43,6 +46,16 @@
"last 1 safari version"
]
},
+ "husky": {
+ "hooks": {
+ "pre-commit": "lint-staged"
+ }
+ },
+ "lint-staged": {
+ "src/**/*.{js,jsx,ts,tsx,json,css,scss,md}": [
+ "prettier --write"
+ ]
+ },
"devDependencies": {
"@types/jest": "^26.0.5",
"@types/node": "^13.13.0",
diff --git a/src/App.jsx b/src/App.jsx
index a5c1b08d..03a1ddca 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -1,5 +1,5 @@
import React from "react";
-import { SnackbarProvider } from 'notistack';
+import { SnackbarProvider } from "notistack";
import "./App.css";
import Header from "./components/Header";
import {
diff --git a/src/App.test.js b/src/App.test.js
index 4db7ebc2..352d7b8f 100644
--- a/src/App.test.js
+++ b/src/App.test.js
@@ -1,8 +1,8 @@
-import React from 'react';
-import { render } from '@testing-library/react';
-import App from './App';
+import React from "react";
+import { render } from "@testing-library/react";
+import App from "./App";
-test('renders learn react link', () => {
+test("renders learn react link", () => {
const { getByText } = render();
const linkElement = getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
diff --git a/src/_config/api.config.ts b/src/_config/api.config.ts
index 6ab20fe2..e330b882 100644
--- a/src/_config/api.config.ts
+++ b/src/_config/api.config.ts
@@ -1 +1 @@
-export const API_URL = process.env.REACT_APP_API_URL
\ No newline at end of file
+export const API_URL = process.env.REACT_APP_API_URL;
diff --git a/src/_helpers/service.helpers.ts b/src/_helpers/service.helpers.ts
index 0b04d743..54901f91 100644
--- a/src/_helpers/service.helpers.ts
+++ b/src/_helpers/service.helpers.ts
@@ -1,32 +1,32 @@
-import { usersService } from '../services'
-import { User } from '../types';
+import { usersService } from "../services";
+import { User } from "../types";
export function authHeader() {
- // return authorization header with jwt token
- const userString = localStorage.getItem('user')
- if (userString) {
- const user: User = JSON.parse(userString);
- if (user && user.token) {
- return { 'Authorization': 'Bearer ' + user.token };
- }
+ // return authorization header with jwt token
+ const userString = localStorage.getItem("user");
+ if (userString) {
+ const user: User = JSON.parse(userString);
+ if (user && user.token) {
+ return { Authorization: "Bearer " + user.token };
}
- return [];
+ }
+ return [];
}
export function handleResponse(response: Response) {
- return response.text().then((text: string) => {
- const data = text && JSON.parse(text);
- if (!response.ok) {
- if (response.status === 401) {
- // auto logout if 401 response returned from api
- usersService.logout();
- window.location.reload();
- }
+ return response.text().then((text: string) => {
+ const data = text && JSON.parse(text);
+ if (!response.ok) {
+ if (response.status === 401) {
+ // auto logout if 401 response returned from api
+ usersService.logout();
+ window.location.reload();
+ }
- const error = (data && data.message) || response.statusText;
- return Promise.reject(error);
- }
+ const error = (data && data.message) || response.statusText;
+ return Promise.reject(error);
+ }
- return data;
- });
-}
\ No newline at end of file
+ return data;
+ });
+}
diff --git a/src/components/DateFormated.tsx b/src/components/DateFormated.tsx
deleted file mode 100644
index b30ab639..00000000
--- a/src/components/DateFormated.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import React from "react";
-import {
- Button,
- Popper,
- Fade,
- Paper,
- makeStyles,
- TextField,
- Badge,
- IconButton,
-} from "@material-ui/core";
-import {
- usePopupState,
- bindToggle,
- bindPopper,
-} from "material-ui-popup-state/hooks";
-import { Comment } from "@material-ui/icons";
-
-interface IProps {
- text: string | undefined;
-}
-
-export const DateFormatted: React.FunctionComponent = ({
- text,
-}) => {
-
- return (
-
-
-
- );
-};
diff --git a/src/components/DrawArea.tsx b/src/components/DrawArea.tsx
index 1d6f644f..c382209e 100644
--- a/src/components/DrawArea.tsx
+++ b/src/components/DrawArea.tsx
@@ -126,7 +126,11 @@ export const DrawArea: FunctionComponent = ({
-
+
{imageStatus === "loading" && (
= ({
- component: Component,
- ...rest
+ component: Component,
+ ...rest
}) => {
- const { loggedIn } = useAuthState();
- if (!Component) {
- return null;
- }
- return (
-
- loggedIn ? (
-
- ) : (
-
- )
- }
- />
- );
+ const { loggedIn } = useAuthState();
+ if (!Component) {
+ return null;
+ }
+ return (
+
+ loggedIn ? (
+
+ ) : (
+
+ )
+ }
+ />
+ );
};
export default PrivateRoute;
diff --git a/src/components/TestRunDetails.tsx b/src/components/TestRunDetails.tsx
index 80d604c8..a103ecf6 100644
--- a/src/components/TestRunDetails.tsx
+++ b/src/components/TestRunDetails.tsx
@@ -16,7 +16,7 @@ export const TestRunDetails: React.FunctionComponent = ({
OS: {testRun.os}
)}
- {testRun.device && (
+ {testRun.device && (
Device: {testRun.device}
diff --git a/src/components/TestStatusChip.tsx b/src/components/TestStatusChip.tsx
index b1a23261..2a75e059 100644
--- a/src/components/TestStatusChip.tsx
+++ b/src/components/TestStatusChip.tsx
@@ -19,7 +19,7 @@ const TestStatusChip: React.FunctionComponent<{ status: TestStatus }> = ({
default:
color = undefined;
}
- return ;
+ return ;
};
export default TestStatusChip;
diff --git a/src/constants/index.ts b/src/constants/index.ts
index 7256eea7..9bf9b1b6 100644
--- a/src/constants/index.ts
+++ b/src/constants/index.ts
@@ -1 +1 @@
-export * from './routes'
\ No newline at end of file
+export * from "./routes";
diff --git a/src/constants/routes.ts b/src/constants/routes.ts
index 8698ab9e..4143e32c 100644
--- a/src/constants/routes.ts
+++ b/src/constants/routes.ts
@@ -1,7 +1,7 @@
export const routes = {
// open
- LOGIN: '/login',
- REGISTER: '/register',
+ LOGIN: "/login",
+ REGISTER: "/register",
// secured
HOME: "/",
diff --git a/src/contexts/index.ts b/src/contexts/index.ts
index 2d3e691a..6e8710c6 100644
--- a/src/contexts/index.ts
+++ b/src/contexts/index.ts
@@ -1,4 +1,4 @@
-export * from './auth.context'
-export * from './build.context'
-export * from './project.context'
-export * from './testRun.context'
\ No newline at end of file
+export * from "./auth.context";
+export * from "./build.context";
+export * from "./project.context";
+export * from "./testRun.context";
diff --git a/src/contexts/socket.context.tsx b/src/contexts/socket.context.tsx
index 2514d67a..28d24072 100644
--- a/src/contexts/socket.context.tsx
+++ b/src/contexts/socket.context.tsx
@@ -1,6 +1,11 @@
import * as React from "react";
import socketIOClient from "socket.io-client";
-import { useBuildState, useBuildDispatch, addBuild, updateBuild } from "./build.context";
+import {
+ useBuildState,
+ useBuildDispatch,
+ addBuild,
+ updateBuild,
+} from "./build.context";
import { Build, TestRun } from "../types";
import { useTestRunDispatch, addTestRun } from "./testRun.context";
diff --git a/src/pages/ProjectListPage.tsx b/src/pages/ProjectListPage.tsx
index 3342379b..0857f5a9 100644
--- a/src/pages/ProjectListPage.tsx
+++ b/src/pages/ProjectListPage.tsx
@@ -132,7 +132,7 @@ const ProjectsListPage = () => {
- Key: {project.id}
+ Id: {project.id}
Name: {project.name}
Main branch: {project.mainBranchName}
diff --git a/src/pages/ProjectPage.tsx b/src/pages/ProjectPage.tsx
index 1c2a03fb..b0a057e4 100644
--- a/src/pages/ProjectPage.tsx
+++ b/src/pages/ProjectPage.tsx
@@ -71,10 +71,7 @@ const ProjectPage = () => {
const { enqueueSnackbar } = useSnackbar();
const { buildList, selectedBuildId } = useBuildState();
const buildDispatch = useBuildDispatch();
- const {
- testRuns,
- selectedTestRunIndex,
- } = useTestRunState();
+ const { testRuns, selectedTestRunIndex } = useTestRunState();
const testRunDispatch = useTestRunDispatch();
// filter
diff --git a/src/serviceWorker.js b/src/serviceWorker.js
index b04b771a..c7cd6663 100644
--- a/src/serviceWorker.js
+++ b/src/serviceWorker.js
@@ -11,9 +11,9 @@
// opt-in, read https://bit.ly/CRA-PWA
const isLocalhost = Boolean(
- window.location.hostname === 'localhost' ||
+ window.location.hostname === "localhost" ||
// [::1] is the IPv6 localhost address.
- window.location.hostname === '[::1]' ||
+ window.location.hostname === "[::1]" ||
// 127.0.0.0/8 are considered localhost for IPv4.
window.location.hostname.match(
/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
@@ -21,7 +21,7 @@ const isLocalhost = Boolean(
);
export function register(config) {
- if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
+ if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) {
// The URL constructor is available in all browsers that support SW.
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
if (publicUrl.origin !== window.location.origin) {
@@ -31,7 +31,7 @@ export function register(config) {
return;
}
- window.addEventListener('load', () => {
+ window.addEventListener("load", () => {
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
if (isLocalhost) {
@@ -42,8 +42,8 @@ export function register(config) {
// service worker/PWA documentation.
navigator.serviceWorker.ready.then(() => {
console.log(
- 'This web app is being served cache-first by a service ' +
- 'worker. To learn more, visit https://bit.ly/CRA-PWA'
+ "This web app is being served cache-first by a service " +
+ "worker. To learn more, visit https://bit.ly/CRA-PWA"
);
});
} else {
@@ -57,21 +57,21 @@ export function register(config) {
function registerValidSW(swUrl, config) {
navigator.serviceWorker
.register(swUrl)
- .then(registration => {
+ .then((registration) => {
registration.onupdatefound = () => {
const installingWorker = registration.installing;
if (installingWorker == null) {
return;
}
installingWorker.onstatechange = () => {
- if (installingWorker.state === 'installed') {
+ if (installingWorker.state === "installed") {
if (navigator.serviceWorker.controller) {
// At this point, the updated precached content has been fetched,
// but the previous service worker will still serve the older
// content until all client tabs are closed.
console.log(
- 'New content is available and will be used when all ' +
- 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
+ "New content is available and will be used when all " +
+ "tabs for this page are closed. See https://bit.ly/CRA-PWA."
);
// Execute callback
@@ -82,7 +82,7 @@ function registerValidSW(swUrl, config) {
// At this point, everything has been precached.
// It's the perfect time to display a
// "Content is cached for offline use." message.
- console.log('Content is cached for offline use.');
+ console.log("Content is cached for offline use.");
// Execute callback
if (config && config.onSuccess) {
@@ -93,25 +93,25 @@ function registerValidSW(swUrl, config) {
};
};
})
- .catch(error => {
- console.error('Error during service worker registration:', error);
+ .catch((error) => {
+ console.error("Error during service worker registration:", error);
});
}
function checkValidServiceWorker(swUrl, config) {
// Check if the service worker can be found. If it can't reload the page.
fetch(swUrl, {
- headers: { 'Service-Worker': 'script' },
+ headers: { "Service-Worker": "script" },
})
- .then(response => {
+ .then((response) => {
// Ensure service worker exists, and that we really are getting a JS file.
- const contentType = response.headers.get('content-type');
+ const contentType = response.headers.get("content-type");
if (
response.status === 404 ||
- (contentType != null && contentType.indexOf('javascript') === -1)
+ (contentType != null && contentType.indexOf("javascript") === -1)
) {
// No service worker found. Probably a different app. Reload the page.
- navigator.serviceWorker.ready.then(registration => {
+ navigator.serviceWorker.ready.then((registration) => {
registration.unregister().then(() => {
window.location.reload();
});
@@ -123,18 +123,18 @@ function checkValidServiceWorker(swUrl, config) {
})
.catch(() => {
console.log(
- 'No internet connection found. App is running in offline mode.'
+ "No internet connection found. App is running in offline mode."
);
});
}
export function unregister() {
- if ('serviceWorker' in navigator) {
+ if ("serviceWorker" in navigator) {
navigator.serviceWorker.ready
- .then(registration => {
+ .then((registration) => {
registration.unregister();
})
- .catch(error => {
+ .catch((error) => {
console.error(error.message);
});
}
diff --git a/src/services/builds.service.ts b/src/services/builds.service.ts
index f1ebdae1..14af5b6d 100644
--- a/src/services/builds.service.ts
+++ b/src/services/builds.service.ts
@@ -2,12 +2,7 @@ import { Build } from "../types";
import { handleResponse, authHeader } from "../_helpers/service.helpers";
import { API_URL } from "../_config/api.config";
-const ENDPOINT_URL = "/builds"
-
-export const buildsService = {
- getList,
- remove,
-};
+const ENDPOINT_URL = "/builds";
function getList(projectId: string): Promise {
const requestOptions = {
@@ -15,9 +10,10 @@ function getList(projectId: string): Promise {
headers: authHeader(),
};
- return fetch(`${API_URL}${ENDPOINT_URL}?projectId=${projectId}`, requestOptions).then(
- handleResponse
- );
+ return fetch(
+ `${API_URL}${ENDPOINT_URL}?projectId=${projectId}`,
+ requestOptions
+ ).then(handleResponse);
}
function remove(id: string): Promise {
@@ -26,5 +22,12 @@ function remove(id: string): Promise {
headers: authHeader(),
};
- return fetch(`${API_URL}${ENDPOINT_URL}/${id}`, requestOptions).then(handleResponse);
+ return fetch(`${API_URL}${ENDPOINT_URL}/${id}`, requestOptions).then(
+ handleResponse
+ );
}
+
+export const buildsService = {
+ getList,
+ remove,
+};
diff --git a/src/services/index.ts b/src/services/index.ts
index 8131c1de..4d33a69b 100644
--- a/src/services/index.ts
+++ b/src/services/index.ts
@@ -1,6 +1,6 @@
-export * from './users.service';
-export * from './projects.service'
-export * from './builds.service'
-export * from './static.service'
-export * from './testVariation.service'
-export * from './testRun.service'
\ No newline at end of file
+export * from "./users.service";
+export * from "./projects.service";
+export * from "./builds.service";
+export * from "./static.service";
+export * from "./testVariation.service";
+export * from "./testRun.service";
diff --git a/src/services/projects.service.ts b/src/services/projects.service.ts
index 7f3c2b26..ab261405 100644
--- a/src/services/projects.service.ts
+++ b/src/services/projects.service.ts
@@ -2,13 +2,6 @@ import { Project } from "../types";
import { handleResponse, authHeader } from "../_helpers/service.helpers";
import { API_URL } from "../_config/api.config";
-export const projectsService = {
- getAll,
- remove,
- create,
- update,
-};
-
function getAll(): Promise {
const requestOptions = {
method: "GET",
@@ -55,3 +48,10 @@ function update(project: {
return fetch(`${API_URL}/projects`, requestOptions).then(handleResponse);
}
+
+export const projectsService = {
+ getAll,
+ remove,
+ create,
+ update,
+};
diff --git a/src/services/static.service.ts b/src/services/static.service.ts
index f1aac578..cda05c82 100644
--- a/src/services/static.service.ts
+++ b/src/services/static.service.ts
@@ -1,10 +1,10 @@
import { API_URL } from "../_config/api.config";
-export const staticService = {
- getImage,
-};
-
function getImage(name: string): string {
if (name) return `${API_URL}/${name}`;
return "/no-image.png";
}
+
+export const staticService = {
+ getImage,
+};
diff --git a/src/services/testRun.service.ts b/src/services/testRun.service.ts
index 12e6f609..b350d5b7 100644
--- a/src/services/testRun.service.ts
+++ b/src/services/testRun.service.ts
@@ -5,16 +5,6 @@ import { IgnoreArea } from "../types/ignoreArea";
const ENDPOINT_URL = "/test-runs";
-export const testRunService = {
- getList,
- remove,
- recalculateDiff,
- approve,
- reject,
- setIgnoreAreas,
- setComment,
-};
-
async function getList(buildId: string): Promise {
const requestOptions = {
method: "GET",
@@ -100,3 +90,13 @@ async function setComment(id: string, comment: string): Promise {
handleResponse
);
}
+
+export const testRunService = {
+ getList,
+ remove,
+ recalculateDiff,
+ approve,
+ reject,
+ setIgnoreAreas,
+ setComment,
+};
diff --git a/src/services/testVariation.service.ts b/src/services/testVariation.service.ts
index acbd31df..16901eac 100644
--- a/src/services/testVariation.service.ts
+++ b/src/services/testVariation.service.ts
@@ -5,15 +5,6 @@ import { IgnoreArea } from "../types/ignoreArea";
const ENDPOINT_URL = "/test-variations";
-export const testVariationService = {
- getList,
- getDetails,
- setIgnoreAreas,
- setComment,
- merge,
- remove,
-};
-
async function getList(projectId: String): Promise {
const requestOptions = {
method: "GET",
@@ -87,3 +78,12 @@ async function remove(id: String): Promise {
handleResponse
);
}
+
+export const testVariationService = {
+ getList,
+ getDetails,
+ setIgnoreAreas,
+ setComment,
+ merge,
+ remove,
+};
diff --git a/src/services/users.service.ts b/src/services/users.service.ts
index d8ae61d6..c77005ae 100644
--- a/src/services/users.service.ts
+++ b/src/services/users.service.ts
@@ -2,15 +2,12 @@ import { handleResponse, authHeader } from "../_helpers/service.helpers";
import { User } from "../types/user";
import { API_URL } from "../_config/api.config";
-const ENDPOINT_URL = "/users"
+const ENDPOINT_URL = "/users";
-export const usersService = {
- login,
- logout,
- register,
- update,
- changePassword,
-};
+function setUserInLocalStorage(user: User) {
+ // store user details and jwt token in local storage to keep user logged in between page refreshes
+ localStorage.setItem("user", JSON.stringify(user));
+}
function login(email: string, password: string): Promise {
const requestOptions = {
@@ -22,12 +19,17 @@ function login(email: string, password: string): Promise {
return fetch(`${API_URL}${ENDPOINT_URL}/login`, requestOptions)
.then(handleResponse)
.then((user) => {
- setUserInLocalStorage(user)
+ setUserInLocalStorage(user);
return user;
});
}
-function register(firstName: string, lastName: string, email: string, password: string): Promise {
+function register(
+ firstName: string,
+ lastName: string,
+ email: string,
+ password: string
+): Promise {
const requestOptions = {
method: "POST",
headers: { "Content-Type": "application/json" },
@@ -37,12 +39,20 @@ function register(firstName: string, lastName: string, email: string, password:
return fetch(`${API_URL}${ENDPOINT_URL}/register`, requestOptions)
.then(handleResponse)
.then((user) => {
- setUserInLocalStorage(user)
+ setUserInLocalStorage(user);
return user;
});
}
-function update({ firstName, lastName, email }: { firstName: string, lastName: string, email: string }): Promise {
+function update({
+ firstName,
+ lastName,
+ email,
+}: {
+ firstName: string;
+ lastName: string;
+ email: string;
+}): Promise {
const requestOptions = {
method: "PUT",
headers: { "Content-Type": "application/json", ...authHeader() },
@@ -52,7 +62,7 @@ function update({ firstName, lastName, email }: { firstName: string, lastName: s
return fetch(`${API_URL}${ENDPOINT_URL}`, requestOptions)
.then(handleResponse)
.then((user) => {
- setUserInLocalStorage(user)
+ setUserInLocalStorage(user);
return user;
});
}
@@ -64,15 +74,19 @@ function changePassword(password: string): Promise {
body: JSON.stringify({ password }),
};
- return fetch(`${API_URL}${ENDPOINT_URL}/password`, requestOptions)
- .then(handleResponse)
-}
-
-function setUserInLocalStorage(user: User) {
- // store user details and jwt token in local storage to keep user logged in between page refreshes
- localStorage.setItem("user", JSON.stringify(user));
+ return fetch(`${API_URL}${ENDPOINT_URL}/password`, requestOptions).then(
+ handleResponse
+ );
}
function logout() {
localStorage.removeItem("user");
}
+
+export const usersService = {
+ login,
+ logout,
+ register,
+ update,
+ changePassword,
+};
diff --git a/src/setupTests.js b/src/setupTests.js
index 74b1a275..5fdf0016 100644
--- a/src/setupTests.js
+++ b/src/setupTests.js
@@ -2,4 +2,4 @@
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
-import '@testing-library/jest-dom/extend-expect';
+import "@testing-library/jest-dom/extend-expect";
diff --git a/src/types/index.ts b/src/types/index.ts
index e3d6c938..e2835ae0 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -1,5 +1,5 @@
-export * from './user'
-export * from './project'
-export * from './build'
-export * from './testRun'
-export * from './testVariation'
\ No newline at end of file
+export * from "./user";
+export * from "./project";
+export * from "./build";
+export * from "./testRun";
+export * from "./testVariation";
diff --git a/src/types/user.ts b/src/types/user.ts
index c67ee769..6af87165 100644
--- a/src/types/user.ts
+++ b/src/types/user.ts
@@ -1,8 +1,8 @@
export interface User {
- id: string,
- email: string,
- firstName: string,
- lastName: string,
- token: number,
- apiKey: string,
-}
\ No newline at end of file
+ id: string;
+ email: string;
+ firstName: string;
+ lastName: string;
+ token: number;
+ apiKey: string;
+}