diff --git a/Dockerfile b/Dockerfile
index b03d55f..98cecb3 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:14-alpine as builder
+FROM node:16-alpine as builder
ARG ENVIRONMENT=local
diff --git a/package-lock.json b/package-lock.json
index e0a4b0b..5a45a50 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1275,9 +1275,9 @@
"integrity": "sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg=="
},
"@datadog/browser-core": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@datadog/browser-core/-/browser-core-3.1.2.tgz",
- "integrity": "sha512-TVw6AEM39UgBm9wDAQJ/t1BurxfRvZY1TaKZiGOm2OQIFjQgdlbB1BXVZru/OcR3/kGA1JMQ6Nhh2cERDLpNHw==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@datadog/browser-core/-/browser-core-3.7.0.tgz",
+ "integrity": "sha512-Fb36Ev1b0uSyx6J+qikgs8UDtPaVKw42da66kwifgNX+DtXN18T/2aRJon+pheOq/NEmECBG6CsxDRdBJnOYug==",
"requires": {
"tslib": "^1.10.0"
},
@@ -1290,11 +1290,11 @@
}
},
"@datadog/browser-logs": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@datadog/browser-logs/-/browser-logs-3.1.2.tgz",
- "integrity": "sha512-XBtqH1RoLky4E7Gpr2eDVod4Zji1/BIOh+1T6zO+quapFWin9VRtiwpo9DjWFjSdGENbjGpz0HJfQIS5b+sLTA==",
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@datadog/browser-logs/-/browser-logs-3.7.0.tgz",
+ "integrity": "sha512-ip7uoBA98vnRCPh2sc3rr3TFWi429bbHqNVmcoNBSQzjZO2ogIcPneXCHvNmGabe/LkPmpWM5/kN9CZN1T5B3Q==",
"requires": {
- "@datadog/browser-core": "3.1.2",
+ "@datadog/browser-core": "3.7.0",
"tslib": "^1.10.0"
},
"dependencies": {
@@ -1862,9 +1862,9 @@
}
},
"@react-leaflet/core": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-1.1.0.tgz",
- "integrity": "sha512-zFxMHgfjCi7khRVB7o7H8NoJl36NaezvfcaeEurVXx22lAGHFlTHiSuLOGA4tOiHj+Ep+Lo3uwUGJ3YM9BGkHg=="
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-1.1.1.tgz",
+ "integrity": "sha512-7PGLWa9MZ5x/cWy8EH2VzI4T8q5WpuHbixzCDXqixP/WyqwIrg5NDUPgYuFnB4IEIZF+6nA265mYzswFo/h1Pw=="
},
"@rollup/plugin-node-resolve": {
"version": "7.1.3",
@@ -2039,24 +2039,24 @@
}
},
"@testing-library/dom": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.1.0.tgz",
- "integrity": "sha512-kmW9alndr19qd6DABzQ978zKQ+J65gU2Rzkl8hriIetPnwpesRaK4//jEQyYh8fEALmGhomD/LBQqt+o+DL95Q==",
+ "version": "8.11.1",
+ "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.11.1.tgz",
+ "integrity": "sha512-3KQDyx9r0RKYailW2MiYrSSKEfH0GTkI51UGEvJenvcoDoeRYs0PZpi2SXqtnMClQvCqdtTTpOfFETDTVADpAg==",
"requires": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
"@types/aria-query": "^4.2.0",
- "aria-query": "^4.2.2",
+ "aria-query": "^5.0.0",
"chalk": "^4.1.0",
- "dom-accessibility-api": "^0.5.6",
+ "dom-accessibility-api": "^0.5.9",
"lz-string": "^1.4.4",
"pretty-format": "^27.0.2"
},
"dependencies": {
"@jest/types": {
- "version": "27.0.6",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz",
- "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==",
+ "version": "27.2.5",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz",
+ "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==",
"requires": {
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
@@ -2073,6 +2073,16 @@
"@types/yargs-parser": "*"
}
},
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ },
+ "aria-query": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz",
+ "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg=="
+ },
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -2082,13 +2092,18 @@
"supports-color": "^7.1.0"
}
},
+ "dom-accessibility-api": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.10.tgz",
+ "integrity": "sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g=="
+ },
"pretty-format": {
- "version": "27.0.6",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
- "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+ "version": "27.3.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz",
+ "integrity": "sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==",
"requires": {
- "@jest/types": "^27.0.6",
- "ansi-regex": "^5.0.0",
+ "@jest/types": "^27.2.5",
+ "ansi-regex": "^5.0.1",
"ansi-styles": "^5.0.0",
"react-is": "^17.0.1"
},
@@ -2103,9 +2118,9 @@
}
},
"@testing-library/jest-dom": {
- "version": "5.14.1",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.14.1.tgz",
- "integrity": "sha512-dfB7HVIgTNCxH22M1+KU6viG5of2ldoA5ly8Ar8xkezKHKXjRvznCdbMbqjYGgO2xjRbwnR+rR8MLUIqF3kKbQ==",
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.15.0.tgz",
+ "integrity": "sha512-lOMuQidnL1tWHLEWIhL6UvSZC1Qt3OkNe1khvi2h6xFiqpe5O8arYs46OU0qyUGq0cSTbroQyMktYNXu3a7sAA==",
"requires": {
"@babel/runtime": "^7.9.2",
"@types/testing-library__jest-dom": "^5.9.1",
@@ -2119,18 +2134,18 @@
}
},
"@testing-library/react": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.0.0.tgz",
- "integrity": "sha512-sh3jhFgEshFyJ/0IxGltRhwZv2kFKfJ3fN1vTZ6hhMXzz9ZbbcTgmDYM4e+zJv+oiVKKEWZPyqPAh4MQBI65gA==",
+ "version": "12.1.2",
+ "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-12.1.2.tgz",
+ "integrity": "sha512-ihQiEOklNyHIpo2Y8FREkyD1QAea054U0MVbwH1m8N9TxeFz+KoJ9LkqoKqJlzx2JDm56DVwaJ1r36JYxZM05g==",
"requires": {
"@babel/runtime": "^7.12.5",
"@testing-library/dom": "^8.0.0"
}
},
"@testing-library/user-event": {
- "version": "13.2.1",
- "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.2.1.tgz",
- "integrity": "sha512-cczlgVl+krjOb3j1625usarNEibI0IFRJrSWX9UsJ1HKYFgCQv9Nb7QAipUDXl3Xdz8NDTsiS78eAkPSxlzTlw==",
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz",
+ "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==",
"requires": {
"@babel/runtime": "^7.12.5"
}
@@ -2240,12 +2255,87 @@
}
},
"@types/jest": {
- "version": "26.0.24",
- "resolved": "https://registry.npmjs.org/@types/jest/-/jest-26.0.24.tgz",
- "integrity": "sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==",
+ "version": "27.0.2",
+ "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz",
+ "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==",
"requires": {
- "jest-diff": "^26.0.0",
- "pretty-format": "^26.0.0"
+ "jest-diff": "^27.0.0",
+ "pretty-format": "^27.0.0"
+ },
+ "dependencies": {
+ "@jest/types": {
+ "version": "27.2.5",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz",
+ "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==",
+ "requires": {
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^16.0.0",
+ "chalk": "^4.0.0"
+ }
+ },
+ "@types/yargs": {
+ "version": "16.0.4",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
+ "integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+ "requires": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "diff-sequences": {
+ "version": "27.0.6",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
+ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ=="
+ },
+ "jest-diff": {
+ "version": "27.3.1",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.3.1.tgz",
+ "integrity": "sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==",
+ "requires": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^27.0.6",
+ "jest-get-type": "^27.3.1",
+ "pretty-format": "^27.3.1"
+ }
+ },
+ "jest-get-type": {
+ "version": "27.3.1",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.3.1.tgz",
+ "integrity": "sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg=="
+ },
+ "pretty-format": {
+ "version": "27.3.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.3.1.tgz",
+ "integrity": "sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==",
+ "requires": {
+ "@jest/types": "^27.2.5",
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="
+ }
+ }
+ }
}
},
"@types/json-schema": {
@@ -2347,9 +2437,9 @@
"integrity": "sha512-0VBprVqfgFD7Ehb2vd8Lh9TG3jP98gvr8rgehQqzztZNI7o8zS8Ad4jyZneKELphpuE212D8J70LnSNQSyO6bQ=="
},
"@types/testing-library__jest-dom": {
- "version": "5.14.0",
- "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.0.tgz",
- "integrity": "sha512-l2P2GO+hFF4Liye+fAajT1qBqvZOiL79YMpEvgGs1xTK7hECxBI8Wz4J7ntACJNiJ9r0vXQqYovroXRLPDja6A==",
+ "version": "5.14.1",
+ "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.1.tgz",
+ "integrity": "sha512-Gk9vaXfbzc5zCXI9eYE9BI5BNHEp4D3FWjgqBE/ePGYElLAP+KvxBcsdkwfIVvezs605oiyd/VrpiHe3Oeg+Aw==",
"requires": {
"@types/jest": "*"
}
@@ -2761,9 +2851,9 @@
"integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
},
"ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
},
"ansi-styles": {
"version": "4.3.0",
@@ -3020,11 +3110,18 @@
"integrity": "sha512-1uIESzroqpaTzt9uX48HO+6gfnKu3RwvWdCcWSrX4csMInJfCo1yvKPNXCwXFRpJqRW25tiASb6No0YH57PXqg=="
},
"axios": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
- "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+ "version": "0.21.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+ "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
"requires": {
- "follow-redirects": "^1.10.0"
+ "follow-redirects": "^1.14.0"
+ },
+ "dependencies": {
+ "follow-redirects": {
+ "version": "1.14.5",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
+ "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA=="
+ }
}
},
"axobject-query": {
@@ -12200,11 +12297,11 @@
"integrity": "sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA=="
},
"react-leaflet": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-3.2.1.tgz",
- "integrity": "sha512-3iS1fpOO+uaRpbuq68Euw9kgaoM9oIGBiDfeFtVb/C9PWBQvXdrv1n946Z8GrbQEhrT+hM9ND6NLLF9fGxTGRw==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-3.2.2.tgz",
+ "integrity": "sha512-5W7iWjI9+CdTGVAICe8RUyK0n+uLshr+eLQa8eBCbmstPNpCHZJTUSbju4Ws5dkS/PUCr9t5VmoIE9CXuSBEhw==",
"requires": {
- "@react-leaflet/core": "^1.1.0"
+ "@react-leaflet/core": "^1.1.1"
}
},
"react-refresh": {
@@ -12213,11 +12310,11 @@
"integrity": "sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg=="
},
"react-router": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz",
- "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz",
+ "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==",
"requires": {
- "@babel/runtime": "^7.1.2",
+ "@babel/runtime": "^7.12.13",
"history": "^4.9.0",
"hoist-non-react-statics": "^3.1.0",
"loose-envify": "^1.3.1",
@@ -12237,15 +12334,15 @@
}
},
"react-router-dom": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz",
- "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz",
+ "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==",
"requires": {
- "@babel/runtime": "^7.1.2",
+ "@babel/runtime": "^7.12.13",
"history": "^4.9.0",
"loose-envify": "^1.3.1",
"prop-types": "^15.6.2",
- "react-router": "5.2.0",
+ "react-router": "5.2.1",
"tiny-invariant": "^1.0.2",
"tiny-warning": "^1.0.0"
}
@@ -12629,9 +12726,9 @@
}
},
"nth-check": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
- "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+ "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
"requires": {
"boolbase": "^1.0.0"
}
@@ -14458,9 +14555,9 @@
"integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
},
"tiny-invariant": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
- "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw=="
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz",
+ "integrity": "sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg=="
},
"tiny-warning": {
"version": "1.0.3",
@@ -14468,9 +14565,9 @@
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
},
"tmpl": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
- "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE="
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="
},
"to-arraybuffer": {
"version": "1.0.1",
@@ -15268,9 +15365,9 @@
}
},
"web-vitals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.0.tgz",
- "integrity": "sha512-npEyJP8jHf3J71t1tRTEtz9FeKp8H2udWJUUq5ykfPhhstr//TUxiYhIEzLNwk4zv2ybAilMn7v7N6Mxmuitmg=="
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.2.tgz",
+ "integrity": "sha512-nZnEH8dj+vJFqCRYdvYv0a59iLXsb8jJkt+xvXfwgnkyPdsSLtKNlYmtTDiHmTNGXeSXtpjTTUcNvFtrAk6VMQ=="
},
"webidl-conversions": {
"version": "6.1.0",
diff --git a/package.json b/package.json
index 3e9d325..f2edab5 100644
--- a/package.json
+++ b/package.json
@@ -3,23 +3,23 @@
"version": "0.1.1",
"private": true,
"dependencies": {
- "@datadog/browser-logs": "^3.1.2",
+ "@datadog/browser-logs": "^3.7.0",
"@material-ui/core": "^4.12.3",
"@material-ui/icons": "^4.11.2",
- "@testing-library/jest-dom": "^5.14.1",
- "@testing-library/react": "^12.0.0",
- "@testing-library/user-event": "^13.2.1",
- "axios": "^0.21.1",
+ "@testing-library/jest-dom": "^5.15.0",
+ "@testing-library/react": "^12.1.2",
+ "@testing-library/user-event": "^13.5.0",
+ "axios": "^0.21.4",
"clsx": "^1.1.1",
"env-cmd": "^10.1.0",
"leaflet": "^1.7.1",
"material-ui-dropzone": "^3.5.0",
"react": "^17.0.2",
"react-dom": "^17.0.2",
- "react-leaflet": "^3.2.1",
- "react-router-dom": "^5.2.0",
+ "react-leaflet": "^3.2.2",
+ "react-router-dom": "^5.3.0",
"react-scripts": "4.0.3",
- "web-vitals": "^2.1.0"
+ "web-vitals": "^2.1.2"
},
"scripts": {
"start": "env-cmd -f .env.local react-scripts start",
diff --git a/src/components/App/App.test.js b/src/components/App/App.test.js
index 2e024cf..33b158c 100644
--- a/src/components/App/App.test.js
+++ b/src/components/App/App.test.js
@@ -57,7 +57,7 @@ describe("App", () => {
return `"${str}"`;
},
});
- }, 30000);
+ }, 60000);
afterEach(() => {
setToken(null);
@@ -178,13 +178,4 @@ describe("App", () => {
setToken(TEST_AUTH_OBJECT);
await check("/vehicle-status/FISKER123", "h6", "Vehicle FISKER123 Details");
});
-
- it("Route /vehicle-status/vin/carupdateid authenticated", async () => {
- setToken(TEST_AUTH_OBJECT);
- await sleepAndCheck(
- "/vehicle-status/1G1FP87S3GN100062/283",
- "h6",
- "Vehicle 1G1FP87S3GN100062, Update TEST UPDATE"
- );
- });
});
diff --git a/src/components/App/__snapshots__/App.test.js.snap b/src/components/App/__snapshots__/App.test.js.snap
index eeb4f4b..c6a1989 100644
--- a/src/components/App/__snapshots__/App.test.js.snap
+++ b/src/components/App/__snapshots__/App.test.js.snap
@@ -7784,887 +7784,6 @@ exports[`App Route /vehicle-status unauthenticated 1`] = `
`;
-exports[`App Route /vehicle-status/vin/carupdateid authenticated 1`] = `
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Precondition
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
- Date
-
-
- |
-
-
- Status
-
-
- |
-
-
- Info
-
-
- |
-
-
- Error
-
-
- |
-
-
-
-
- |
- 8/23/2021 5:06:38 PM
- |
-
- package_install_complete
- |
- |
- |
-
-
- |
- 8/23/2021 5:06:38 PM
- |
-
- package_install_start
- |
- |
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
exports[`App Route /vehicle-status/vin/carupdateid unauthenticated 1`] = `
{
setECUs(result.data);
if (result.total > -1) setTotal(result.total);
} catch (e) {
- console.log(e);
setMessage(e.message);
logger.warn(e.stack);
}
diff --git a/src/components/Cars/UpdateStatus/index.jsx b/src/components/Cars/UpdateStatus/index.jsx
index f39933c..74fde9d 100644
--- a/src/components/Cars/UpdateStatus/index.jsx
+++ b/src/components/Cars/UpdateStatus/index.jsx
@@ -19,8 +19,7 @@ const MainForm = () => {
const [manifest, setManifest] = useState(null);
const [status, setStatus] = useState(null);
const { setTitle, setSitePath, setMessage } = useStatusContext();
- const { getCarUpdates, carUpdates, startMonitor, stopMonitor } =
- useCarUpdatesContext();
+ const { getCarUpdates, carUpdates } = useCarUpdatesContext();
const {
token: {
idToken: { jwtToken: token },
@@ -66,17 +65,15 @@ const MainForm = () => {
try {
if (carUpdates.length === 0) return;
setStatus(carUpdates[0]);
- startMonitor(token);
} catch (e) {
setMessage(e.message);
logger.warn(e.stack);
}
- return () => {
- stopMonitor();
- };
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [carUpdates]);
+ if (!status) return null;
+
return (
diff --git a/src/components/Contexts/CarUpdatesContext.jsx b/src/components/Contexts/CarUpdatesContext.jsx
index d3df57b..588d6b4 100644
--- a/src/components/Contexts/CarUpdatesContext.jsx
+++ b/src/components/Contexts/CarUpdatesContext.jsx
@@ -98,19 +98,19 @@ export const CarUpdatesProvider = ({ children }) => {
if (validateStatusMessage(status)) {
if (status.msg === "downloading") {
item.progress = getDownloadProgress(status);
- item.status = `downloading ${item.progress}%`;
+ item.status = `downloading ${item.ecu} ${item.progress}%`;
return;
} else if (status.msg === "package_download_complete") {
item.progress = 100;
- item.status = "downloaded";
+ item.status = "download complete";
return;
} else if (status.msg === "installing") {
item.progress = getInstallProgress(status);
- item.status = `installing ${item.progress}%`;
+ item.status = `installing ${item.ecu} ${item.progress}%`;
return;
} else if (status.msg === "package_install_complete") {
item.progress = 100;
- item.status = "installed";
+ item.status = "install complete";
return;
}
}
diff --git a/src/components/Contexts/__mocks__/CarUpdatesContext.jsx b/src/components/Contexts/__mocks__/CarUpdatesContext.jsx
index 1ded07f..befabba 100644
--- a/src/components/Contexts/__mocks__/CarUpdatesContext.jsx
+++ b/src/components/Contexts/__mocks__/CarUpdatesContext.jsx
@@ -7,8 +7,9 @@ let carUpdates = [
{
id: 1,
vin: "1G1FP87S3GN100062",
- updatepackage_id: 18,
+ manifest_id: 283,
status: "downloaded",
+ msg: "downloaded",
created: "2021-07-01T22:40:07.778509Z",
updated: "2021-07-12T18:22:13.736755Z",
updatemanifest: {
@@ -16,6 +17,7 @@ let carUpdates = [
name: "TEST UPDATE",
version: "1000",
description: "UPDATE DESCRIPTION",
+ release_notes: "https://releasenotes.com",
ecu_list: "AGS 1.0.0,AMP 1.0.0",
created: "2021-08-20T18:37:41.960397Z",
updated: "2021-08-20T18:37:50.007853Z",
@@ -27,6 +29,7 @@ let carUpdateLog = {
data: [
{
id: 90,
+ carupdate_id: 283,
status: "package_install_complete",
error_code: 0,
created: "2021-08-23T17:06:38.410115Z",
@@ -37,6 +40,7 @@ let carUpdateLog = {
carupdate_id: 283,
status: "package_install_start",
error_code: 0,
+ info: "TEST",
created: "2021-08-23T17:06:38.030052Z",
updated: "2021-08-23T17:06:38.030052Z",
},
diff --git a/src/components/Controls/CarUpdateStatusProgress/CarUpdateStatusProgress.test.jsx b/src/components/Controls/CarUpdateStatusProgress/CarUpdateStatusProgress.test.jsx
new file mode 100644
index 0000000..8bfdbfd
--- /dev/null
+++ b/src/components/Controls/CarUpdateStatusProgress/CarUpdateStatusProgress.test.jsx
@@ -0,0 +1,150 @@
+import React from "react";
+import { render, waitFor } from "@testing-library/react";
+
+import CarUpdateStatusProgress from "../CarUpdateStatusProgress";
+import useStyles from "../../useStyles";
+
+const TestWrapper = ({ status }) => {
+ const classes = useStyles();
+ return ;
+};
+
+const renderCarUpdateStatusProgress = async (status) => {
+ const { container } = render();
+ await waitFor(() => {});
+ return container;
+};
+
+describe("CarUpdateStatusProgress", () => {
+ const tests = [
+ {
+ name: "manifest_received",
+ status: {
+ car_update_id: 297,
+ msg: "manifest_received",
+ err: -6,
+ extra_info: "",
+ },
+ },
+ {
+ name: "manifest_accepted",
+ status: {
+ car_update_id: 297,
+ msg: "manifest_accepted",
+ err: -7,
+ extra_info: "",
+ },
+ },
+ {
+ name: "download_started",
+ status: {
+ car_update_id: 297,
+ msg: "download_started",
+ err: -14,
+ extra_info: "",
+ },
+ },
+ {
+ name: "download_start ECU",
+ status: {
+ car_update_id: 297,
+ ecu: "ADAS",
+ file_current: 0,
+ file_total: 1264672,
+ package_current: 0,
+ package_total: 2529856,
+ msg: "download_start",
+ err: 0,
+ },
+ },
+ {
+ name: "downloading",
+ status: {
+ car_update_id: 297,
+ ecu: "ADAS",
+ file_current: 1048576,
+ file_total: 1264672,
+ package_current: 1048576,
+ package_total: 2529856,
+ msg: "downloading",
+ err: 0,
+ },
+ },
+ {
+ name: "download_complete",
+ status: {
+ car_update_id: 297,
+ ecu: "ADAS",
+ file_current: 1264672,
+ file_total: 1264672,
+ package_current: 1264672,
+ package_total: 2529856,
+ msg: "download_complete",
+ err: 0,
+ },
+ },
+ {
+ name: "package_download_complete",
+ status: {
+ car_update_id: 297,
+ msg: "package_download_complete",
+ err: -15,
+ extra_info: "",
+ },
+ },
+ {
+ name: "download_error",
+ status: {
+ car_update_id: 1,
+ ecu: "TEST",
+ file_current: 0,
+ file_total: 100,
+ package_current: 0,
+ package_total: 1000,
+ msg: "download_error",
+ err: 0,
+ },
+ },
+ {
+ name: "installing",
+ status: {
+ car_update_id: 1,
+ ecu: "TEST",
+ installed: 5,
+ total_files: 10,
+ msg: "installing",
+ err: 0,
+ },
+ },
+ {
+ name: "install_complete ECU",
+ status: {
+ car_update_id: 1,
+ ecu: "TEST",
+ installed: 10,
+ total_files: 10,
+ msg: "install_complete",
+ err: 0,
+ },
+ },
+ {
+ name: "install_error",
+ status: {
+ car_update_id: 1,
+ ecu: "TEST",
+ installed: 5,
+ total_files: 10,
+ msg: "install_error",
+ err: 0,
+ },
+ },
+ ];
+ for (let i = 0, len = tests.length; i < len; i++) {
+ const test = tests[i];
+
+ it(`Render ${test.name}`, async () => {
+ const container = await renderCarUpdateStatusProgress(test.status);
+ expect(container).toMatchSnapshot();
+ });
+ }
+});
diff --git a/src/components/Controls/CarUpdateStatusProgress/__snapshots__/CarUpdateStatusProgress.test.jsx.snap b/src/components/Controls/CarUpdateStatusProgress/__snapshots__/CarUpdateStatusProgress.test.jsx.snap
new file mode 100644
index 0000000..0588a73
--- /dev/null
+++ b/src/components/Controls/CarUpdateStatusProgress/__snapshots__/CarUpdateStatusProgress.test.jsx.snap
@@ -0,0 +1,1772 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CarUpdateStatusProgress Render download_complete 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render download_error 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render download_start ECU 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render download_started 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render downloading 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render install_complete ECU 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render install_error 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render installing 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render manifest_accepted 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render manifest_received 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`CarUpdateStatusProgress Render package_download_complete 1`] = `
+
+
+
+
+
+
+
+ Precondition
+
+
+
+
+
+
+
+
+
+`;
diff --git a/src/components/Controls/CarUpdateStatusProgress/index.jsx b/src/components/Controls/CarUpdateStatusProgress/index.jsx
index 56a8fa8..f43e08b 100644
--- a/src/components/Controls/CarUpdateStatusProgress/index.jsx
+++ b/src/components/Controls/CarUpdateStatusProgress/index.jsx
@@ -5,6 +5,80 @@ import clsx from "clsx";
import CircularProgress from "../CircularProgress";
+const PHASES = [
+ {
+ label: "Pending",
+ events: ["pending"],
+ progress: () => 100,
+ },
+ {
+ label: "Recieved",
+ events: ["manifest_accepted", "manifest_received"],
+ progress: () => 100,
+ },
+ {
+ label: "Precondition",
+ events: ["requirements_succeeded"],
+ progress: () => 100,
+ },
+ {
+ label: "Download",
+ events: [
+ "downloading",
+ "download_start",
+ "download_complete",
+ "download_error",
+ "package_download_start",
+ ],
+ progress: (msg, progress) =>
+ [
+ "package_download_start",
+ "downloading",
+ "download_start",
+ "download_complete",
+ ].indexOf(msg) > -1
+ ? progress
+ : -100,
+ },
+ {
+ label: "Approved",
+ events: ["package_download_complete", "install_approval_await"],
+ progress: () => -1,
+ },
+ {
+ label: "Install",
+ events: [
+ "install_approval_received",
+ "install_start",
+ "installing",
+ "install_complete",
+ "install_error",
+ ],
+ progress: (msg, progress) =>
+ [
+ "install_approval_received",
+ "install_start",
+ "installing",
+ "install_complete",
+ ].indexOf(msg) > -1
+ ? progress
+ : -100,
+ },
+ {
+ label: "Clean up",
+ events: ["package_install_complete", "cleanup_failed"],
+ progress: (msg, progress) => {
+ if (msg === "package_install_complete") return -1;
+ return -100;
+ },
+ },
+ {
+ label: "Updated",
+ events: ["cleanup_success", "manifest_succeeded"],
+ progress: (msg, progress) => 100,
+ },
+];
+
const Progress = ({ value, classes }) => {
if (value === 100)
return (
@@ -21,63 +95,26 @@ const Progress = ({ value, classes }) => {
return ;
};
+const getProgress = (index, phase, progress) => {
+ if (index === phase) return progress;
+ if (index < phase) return 100;
+ return -1;
+};
+
const CarUpdateStatus = ({ status, classes }) => {
- const [approval, setApproval] = useState(-1);
- const [cleanup, setCleanup] = useState(-1);
- const [download, setDownload] = useState(-1);
- const [install, setInstall] = useState(-1);
- const [precondition, setPrecondition] = useState(-1);
- const [received, setReceived] = useState(-1);
- const [updated, setUpdated] = useState(-1);
+ const [phase, setPhase] = useState(0);
+ const [progress, setProgress] = useState(-1);
useEffect(() => {
- /* eslint-disable no-fallthrough, default-case */
if (!status) return;
- // update previous steps
- switch (status.msg) {
- case "manifest_succeeded":
- setUpdated(100);
- case "cleanup_success":
- setCleanup(100);
- case "package_install_complete":
- setInstall(100);
- case "install_approval_received":
- setApproval(100);
- case "install_approval_await":
- case "install_start":
- case "installing":
- case "install_complete":
- case "install_error":
- case "package_download_complete":
- setDownload(100);
- case "download_start":
- case "downloading":
- case "download_complete":
- case "download_error":
- case "package_download_start":
- case "requirements_succeeded":
- setPrecondition(100);
- case "manifest_accepted":
- case "manifest_received":
- setReceived(100);
- }
- // update progress and errors
- switch (status.msg) {
- case "installing":
- setInstall(status.progress);
- break;
- case "install_error":
- setInstall(-100);
- break;
- case "downloading":
- setDownload(status.progress);
- break;
- case "download_error":
- setDownload(-100);
- break;
- case "cleanup_failed":
- setCleanup(-100);
+
+ for (let i = 0, len = PHASES.length; i < len; i++) {
+ const PHASE = PHASES[i];
+ if (PHASE.events.indexOf(status.msg) > -1) {
+ setPhase(i);
+ setProgress(PHASE.progress(status.msg, status.progress));
break;
+ }
}
}, [status]);
@@ -90,38 +127,17 @@ const CarUpdateStatus = ({ status, classes }) => {
flexWrap: "wrap",
}}
>
-
-
-
-
-
-
-
-
+ {PHASES.map((item, index) => {
+ return (
+
+ );
+ })}
);
};
diff --git a/src/components/Controls/CarUpdateStatusTable/CarUpdateStatusTable.test.jsx b/src/components/Controls/CarUpdateStatusTable/CarUpdateStatusTable.test.jsx
new file mode 100644
index 0000000..3317184
--- /dev/null
+++ b/src/components/Controls/CarUpdateStatusTable/CarUpdateStatusTable.test.jsx
@@ -0,0 +1,42 @@
+jest.mock("../../Contexts/CarUpdatesContext");
+
+import React from "react";
+import { render, waitFor } from "@testing-library/react";
+
+import { CarUpdatesProvider } from "../../Contexts/CarUpdatesContext";
+import CarUpdateStatusTable from "../CarUpdateStatusTable";
+import { StatusProvider } from "../../Contexts/StatusContext";
+import { TEST_AUTH_OBJECT } from "../../../utils/testing";
+
+const renderCarUpdateStatusTable = async () => {
+ const { container } = render(
+
+
+
+
+
+ );
+ await waitFor(() => {});
+ return container;
+};
+
+describe("CarUpdateStatusTable", () => {
+ beforeAll(() => {
+ expect.addSnapshotSerializer({
+ test: function (val) {
+ return val && typeof val === "string" && val.indexOf("mui-") >= 0;
+ },
+ print: function (val) {
+ let str = val;
+ str = str.replace(/mui-\d*/g, "mui-00000");
+
+ return `"${str}"`;
+ },
+ });
+ });
+
+ it("Render", async () => {
+ const container = await renderCarUpdateStatusTable();
+ expect(container).toMatchSnapshot();
+ });
+});
diff --git a/src/components/Controls/CarUpdateStatusTable/__snapshots__/CarUpdateStatusTable.test.jsx.snap b/src/components/Controls/CarUpdateStatusTable/__snapshots__/CarUpdateStatusTable.test.jsx.snap
new file mode 100644
index 0000000..cec400e
--- /dev/null
+++ b/src/components/Controls/CarUpdateStatusTable/__snapshots__/CarUpdateStatusTable.test.jsx.snap
@@ -0,0 +1,285 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CarUpdateStatusTable Render 1`] = `
+
+
+
+
+
+ |
+
+ Date
+
+
+ |
+
+
+ Status
+
+
+ |
+
+
+ Info
+
+
+ |
+
+
+ Error
+
+
+ |
+
+
+
+
+ |
+ 8/23/2021 5:06:38 PM
+ |
+
+ package_install_complete
+ |
+ |
+ |
+
+
+ |
+ 8/23/2021 5:06:38 PM
+ |
+
+ package_install_start
+ |
+
+ TEST
+ |
+ |
+
+
+
+
+
+
+`;