summary refs log tree commit diff
path: root/util
diff options
context:
space:
mode:
authorFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-08-26 02:07:16 +0200
committerFlam3rboy <34555296+Flam3rboy@users.noreply.github.com>2021-08-26 02:07:16 +0200
commitc4426920a113b419c22f27eda347e5a04c108acc (patch)
treee475e8af64c3e6c7e6086c1cc09c3a8daa9046a0 /util
parent:sparkles: unit test (diff)
downloadserver-c4426920a113b419c22f27eda347e5a04c108acc.tar.xz
:bug: fix unit tests
Diffstat (limited to 'util')
-rw-r--r--util/package-lock.json793
-rw-r--r--util/package.json3
-rw-r--r--util/src/entities/BaseClass.ts6
-rw-r--r--util/tests/setupJest.js19
-rw-r--r--util/tests/validate.test.js25
5 files changed, 257 insertions, 589 deletions
diff --git a/util/package-lock.json b/util/package-lock.json
index c7510fa8..0ecdaea9 100644
--- a/util/package-lock.json
+++ b/util/package-lock.json
@@ -15,7 +15,6 @@
 				"class-validator": "^0.13.1",
 				"dot-prop": "^6.0.1",
 				"env-paths": "^2.2.1",
-				"jest-test-performance": "^1.0.1",
 				"jsonwebtoken": "^8.5.1",
 				"missing-native-js-functions": "^1.2.10",
 				"node-fetch": "^2.6.1",
@@ -882,15 +881,6 @@
 			"integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==",
 			"dev": true
 		},
-		"node_modules/@jest/globals/node_modules/diff-sequences": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
-			"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
-			"dev": true,
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/@jest/globals/node_modules/escape-string-regexp": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
@@ -929,45 +919,6 @@
 				"is-ci": "bin.js"
 			}
 		},
-		"node_modules/@jest/globals/node_modules/jest-diff": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
-			"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
-			"dev": true,
-			"dependencies": {
-				"chalk": "^4.0.0",
-				"diff-sequences": "^27.0.6",
-				"jest-get-type": "^27.0.6",
-				"pretty-format": "^27.0.6"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
-		"node_modules/@jest/globals/node_modules/jest-get-type": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
-			"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
-			"dev": true,
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
-		"node_modules/@jest/globals/node_modules/jest-matcher-utils": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
-			"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
-			"dev": true,
-			"dependencies": {
-				"chalk": "^4.0.0",
-				"jest-diff": "^27.0.6",
-				"jest-get-type": "^27.0.6",
-				"pretty-format": "^27.0.6"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/@jest/globals/node_modules/jest-message-util": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
@@ -1027,27 +978,6 @@
 				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
 			}
 		},
-		"node_modules/@jest/globals/node_modules/pretty-format": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
-			"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
-			"dev": true,
-			"dependencies": {
-				"@jest/types": "^27.0.6",
-				"ansi-regex": "^5.0.0",
-				"ansi-styles": "^5.0.0",
-				"react-is": "^17.0.1"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
-		"node_modules/@jest/globals/node_modules/react-is": {
-			"version": "17.0.2",
-			"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-			"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-			"dev": true
-		},
 		"node_modules/@jest/globals/node_modules/slash": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -1195,12 +1125,14 @@
 		"node_modules/@types/istanbul-lib-coverage": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
-			"integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+			"integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+			"dev": true
 		},
 		"node_modules/@types/istanbul-lib-report": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
 			"integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+			"dev": true,
 			"dependencies": {
 				"@types/istanbul-lib-coverage": "*"
 			}
@@ -1209,6 +1141,9 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
 			"integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+			"dev": true,
+			"optional": true,
+			"peer": true,
 			"dependencies": {
 				"@types/istanbul-lib-coverage": "*",
 				"@types/istanbul-lib-report": "*"
@@ -1297,7 +1232,8 @@
 		"node_modules/@types/yargs-parser": {
 			"version": "20.2.1",
 			"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
-			"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
+			"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
+			"dev": true
 		},
 		"node_modules/@types/zen-observable": {
 			"version": "0.8.3",
@@ -2149,6 +2085,15 @@
 				"node": ">=0.3.1"
 			}
 		},
+		"node_modules/diff-sequences": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
+			"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
+			"dev": true,
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
 		"node_modules/dot-prop": {
 			"version": "6.0.1",
 			"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
@@ -3467,15 +3412,6 @@
 			"integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==",
 			"dev": true
 		},
-		"node_modules/jest-circus/node_modules/diff-sequences": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
-			"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
-			"dev": true,
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest-circus/node_modules/escape-string-regexp": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
@@ -3552,21 +3488,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/jest-circus/node_modules/jest-diff": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
-			"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
-			"dev": true,
-			"dependencies": {
-				"chalk": "^4.0.0",
-				"diff-sequences": "^27.0.6",
-				"jest-get-type": "^27.0.6",
-				"pretty-format": "^27.0.6"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest-circus/node_modules/jest-each": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz",
@@ -3583,15 +3504,6 @@
 				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
 			}
 		},
-		"node_modules/jest-circus/node_modules/jest-get-type": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
-			"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
-			"dev": true,
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest-circus/node_modules/jest-haste-map": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz",
@@ -3618,21 +3530,6 @@
 				"fsevents": "^2.3.2"
 			}
 		},
-		"node_modules/jest-circus/node_modules/jest-matcher-utils": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
-			"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
-			"dev": true,
-			"dependencies": {
-				"chalk": "^4.0.0",
-				"jest-diff": "^27.0.6",
-				"jest-get-type": "^27.0.6",
-				"pretty-format": "^27.0.6"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest-circus/node_modules/jest-message-util": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
@@ -3852,27 +3749,6 @@
 				"node": ">=0.10.0"
 			}
 		},
-		"node_modules/jest-circus/node_modules/pretty-format": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
-			"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
-			"dev": true,
-			"dependencies": {
-				"@jest/types": "^27.0.6",
-				"ansi-regex": "^5.0.0",
-				"ansi-styles": "^5.0.0",
-				"react-is": "^17.0.1"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
-		"node_modules/jest-circus/node_modules/react-is": {
-			"version": "17.0.2",
-			"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-			"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-			"dev": true
-		},
 		"node_modules/jest-circus/node_modules/semver": {
 			"version": "6.3.0",
 			"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -3977,6 +3853,45 @@
 				"node": ">=10"
 			}
 		},
+		"node_modules/jest-diff": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
+			"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
+			"dev": true,
+			"dependencies": {
+				"chalk": "^4.0.0",
+				"diff-sequences": "^27.0.6",
+				"jest-get-type": "^27.0.6",
+				"pretty-format": "^27.0.6"
+			},
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
+		"node_modules/jest-get-type": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+			"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+			"dev": true,
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
+		"node_modules/jest-matcher-utils": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
+			"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
+			"dev": true,
+			"dependencies": {
+				"chalk": "^4.0.0",
+				"jest-diff": "^27.0.6",
+				"jest-get-type": "^27.0.6",
+				"pretty-format": "^27.0.6"
+			},
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
 		"node_modules/jest-pnp-resolver": {
 			"version": "1.2.2",
 			"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
@@ -4086,107 +4001,6 @@
 				"node": ">=4"
 			}
 		},
-		"node_modules/jest-test-performance": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/jest-test-performance/-/jest-test-performance-1.0.1.tgz",
-			"integrity": "sha512-6aAkkKKcWYj/UvkYYWDmepnluBETZt5QCO4xGk5ECwN2cn/twm4hiAY/ag/x6ILBhVAaucLFaNUvyir0PWSKIw==",
-			"dependencies": {
-				"jest-matcher-utils": "^25.5.0",
-				"test-performance": "^1.1.2"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/@jest/types": {
-			"version": "25.5.0",
-			"resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
-			"integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
-			"dependencies": {
-				"@types/istanbul-lib-coverage": "^2.0.0",
-				"@types/istanbul-reports": "^1.1.1",
-				"@types/yargs": "^15.0.0",
-				"chalk": "^3.0.0"
-			},
-			"engines": {
-				"node": ">= 8.3"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/@types/yargs": {
-			"version": "15.0.14",
-			"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
-			"integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
-			"dependencies": {
-				"@types/yargs-parser": "*"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/chalk": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-			"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-			"dependencies": {
-				"ansi-styles": "^4.1.0",
-				"supports-color": "^7.1.0"
-			},
-			"engines": {
-				"node": ">=8"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/diff-sequences": {
-			"version": "25.2.6",
-			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
-			"integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg==",
-			"engines": {
-				"node": ">= 8.3"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/jest-diff": {
-			"version": "25.5.0",
-			"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
-			"integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
-			"dependencies": {
-				"chalk": "^3.0.0",
-				"diff-sequences": "^25.2.6",
-				"jest-get-type": "^25.2.6",
-				"pretty-format": "^25.5.0"
-			},
-			"engines": {
-				"node": ">= 8.3"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/jest-get-type": {
-			"version": "25.2.6",
-			"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
-			"integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig==",
-			"engines": {
-				"node": ">= 8.3"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/jest-matcher-utils": {
-			"version": "25.5.0",
-			"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz",
-			"integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==",
-			"dependencies": {
-				"chalk": "^3.0.0",
-				"jest-diff": "^25.5.0",
-				"jest-get-type": "^25.2.6",
-				"pretty-format": "^25.5.0"
-			},
-			"engines": {
-				"node": ">= 8.3"
-			}
-		},
-		"node_modules/jest-test-performance/node_modules/pretty-format": {
-			"version": "25.5.0",
-			"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
-			"integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
-			"dependencies": {
-				"@jest/types": "^25.5.0",
-				"ansi-regex": "^5.0.0",
-				"ansi-styles": "^4.0.0",
-				"react-is": "^16.12.0"
-			},
-			"engines": {
-				"node": ">= 8.3"
-			}
-		},
 		"node_modules/jest/node_modules/@jest/console": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/@jest/console/-/console-27.0.6.tgz",
@@ -4685,15 +4499,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/jest/node_modules/diff-sequences": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
-			"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
-			"dev": true,
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest/node_modules/domexception": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
@@ -5039,21 +4844,6 @@
 				}
 			}
 		},
-		"node_modules/jest/node_modules/jest-diff": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
-			"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
-			"dev": true,
-			"dependencies": {
-				"chalk": "^4.0.0",
-				"diff-sequences": "^27.0.6",
-				"jest-get-type": "^27.0.6",
-				"pretty-format": "^27.0.6"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest/node_modules/jest-docblock": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz",
@@ -5117,15 +4907,6 @@
 				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
 			}
 		},
-		"node_modules/jest/node_modules/jest-get-type": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
-			"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
-			"dev": true,
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest/node_modules/jest-haste-map": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz",
@@ -5194,21 +4975,6 @@
 				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
 			}
 		},
-		"node_modules/jest/node_modules/jest-matcher-utils": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
-			"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
-			"dev": true,
-			"dependencies": {
-				"chalk": "^4.0.0",
-				"jest-diff": "^27.0.6",
-				"jest-get-type": "^27.0.6",
-				"pretty-format": "^27.0.6"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
 		"node_modules/jest/node_modules/jest-message-util": {
 			"version": "27.0.6",
 			"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
@@ -5659,27 +5425,6 @@
 				"node": ">=8"
 			}
 		},
-		"node_modules/jest/node_modules/pretty-format": {
-			"version": "27.0.6",
-			"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
-			"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
-			"dev": true,
-			"dependencies": {
-				"@jest/types": "^27.0.6",
-				"ansi-regex": "^5.0.0",
-				"ansi-styles": "^5.0.0",
-				"react-is": "^17.0.1"
-			},
-			"engines": {
-				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
-			}
-		},
-		"node_modules/jest/node_modules/react-is": {
-			"version": "17.0.2",
-			"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-			"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-			"dev": true
-		},
 		"node_modules/jest/node_modules/resolve-cwd": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -7017,6 +6762,67 @@
 				"node": ">= 0.8.0"
 			}
 		},
+		"node_modules/pretty-format": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+			"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+			"dev": true,
+			"dependencies": {
+				"@jest/types": "^27.0.6",
+				"ansi-regex": "^5.0.0",
+				"ansi-styles": "^5.0.0",
+				"react-is": "^17.0.1"
+			},
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
+		"node_modules/pretty-format/node_modules/@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==",
+			"dev": true,
+			"dependencies": {
+				"@types/istanbul-lib-coverage": "^2.0.0",
+				"@types/istanbul-reports": "^3.0.0",
+				"@types/node": "*",
+				"@types/yargs": "^16.0.0",
+				"chalk": "^4.0.0"
+			},
+			"engines": {
+				"node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+			}
+		},
+		"node_modules/pretty-format/node_modules/@types/istanbul-reports": {
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+			"integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+			"dev": true,
+			"dependencies": {
+				"@types/istanbul-lib-report": "*"
+			}
+		},
+		"node_modules/pretty-format/node_modules/@types/yargs": {
+			"version": "16.0.4",
+			"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
+			"integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+			"dev": true,
+			"dependencies": {
+				"@types/yargs-parser": "*"
+			}
+		},
+		"node_modules/pretty-format/node_modules/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==",
+			"dev": true,
+			"engines": {
+				"node": ">=10"
+			},
+			"funding": {
+				"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+			}
+		},
 		"node_modules/process-nextick-args": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -7078,9 +6884,10 @@
 			}
 		},
 		"node_modules/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=="
+			"version": "17.0.2",
+			"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+			"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+			"dev": true
 		},
 		"node_modules/readable-stream": {
 			"version": "1.1.14",
@@ -7582,11 +7389,6 @@
 				"url": "https://github.com/sponsors/sindresorhus"
 			}
 		},
-		"node_modules/test-performance": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/test-performance/-/test-performance-1.1.3.tgz",
-			"integrity": "sha512-oo/sD9L6h9+qxszKq3FGTxxXEQVCuaY83LqcPc+4B9oLISqbdOhxOWz4WArytFAYDtP6Lo4a0DsJi8qcsNohcg=="
-		},
 		"node_modules/thenify": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
@@ -8994,12 +8796,6 @@
 					"integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==",
 					"dev": true
 				},
-				"diff-sequences": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
-					"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
-					"dev": true
-				},
 				"escape-string-regexp": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
@@ -9029,36 +8825,6 @@
 						"ci-info": "^3.1.1"
 					}
 				},
-				"jest-diff": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
-					"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
-					"dev": true,
-					"requires": {
-						"chalk": "^4.0.0",
-						"diff-sequences": "^27.0.6",
-						"jest-get-type": "^27.0.6",
-						"pretty-format": "^27.0.6"
-					}
-				},
-				"jest-get-type": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
-					"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
-					"dev": true
-				},
-				"jest-matcher-utils": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
-					"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
-					"dev": true,
-					"requires": {
-						"chalk": "^4.0.0",
-						"jest-diff": "^27.0.6",
-						"jest-get-type": "^27.0.6",
-						"pretty-format": "^27.0.6"
-					}
-				},
 				"jest-message-util": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
@@ -9106,24 +8872,6 @@
 						"picomatch": "^2.2.3"
 					}
 				},
-				"pretty-format": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
-					"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
-					"dev": true,
-					"requires": {
-						"@jest/types": "^27.0.6",
-						"ansi-regex": "^5.0.0",
-						"ansi-styles": "^5.0.0",
-						"react-is": "^17.0.1"
-					}
-				},
-				"react-is": {
-					"version": "17.0.2",
-					"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-					"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-					"dev": true
-				},
 				"slash": {
 					"version": "3.0.0",
 					"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
@@ -9261,12 +9009,14 @@
 		"@types/istanbul-lib-coverage": {
 			"version": "2.0.3",
 			"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
-			"integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw=="
+			"integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+			"dev": true
 		},
 		"@types/istanbul-lib-report": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
 			"integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
+			"dev": true,
 			"requires": {
 				"@types/istanbul-lib-coverage": "*"
 			}
@@ -9275,6 +9025,9 @@
 			"version": "1.1.2",
 			"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz",
 			"integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==",
+			"dev": true,
+			"optional": true,
+			"peer": true,
 			"requires": {
 				"@types/istanbul-lib-coverage": "*",
 				"@types/istanbul-lib-report": "*"
@@ -9363,7 +9116,8 @@
 		"@types/yargs-parser": {
 			"version": "20.2.1",
 			"resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz",
-			"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw=="
+			"integrity": "sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==",
+			"dev": true
 		},
 		"@types/zen-observable": {
 			"version": "0.8.3",
@@ -10065,6 +9819,12 @@
 			"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
 			"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
 		},
+		"diff-sequences": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
+			"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
+			"dev": true
+		},
 		"dot-prop": {
 			"version": "6.0.1",
 			"resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
@@ -11250,12 +11010,6 @@
 					"integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
 					"dev": true
 				},
-				"diff-sequences": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
-					"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
-					"dev": true
-				},
 				"domexception": {
 					"version": "2.0.1",
 					"resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
@@ -11496,18 +11250,6 @@
 						"pretty-format": "^27.0.6"
 					}
 				},
-				"jest-diff": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
-					"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
-					"dev": true,
-					"requires": {
-						"chalk": "^4.0.0",
-						"diff-sequences": "^27.0.6",
-						"jest-get-type": "^27.0.6",
-						"pretty-format": "^27.0.6"
-					}
-				},
 				"jest-docblock": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.0.6.tgz",
@@ -11559,12 +11301,6 @@
 						"jest-util": "^27.0.6"
 					}
 				},
-				"jest-get-type": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
-					"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
-					"dev": true
-				},
 				"jest-haste-map": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz",
@@ -11622,18 +11358,6 @@
 						"pretty-format": "^27.0.6"
 					}
 				},
-				"jest-matcher-utils": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
-					"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
-					"dev": true,
-					"requires": {
-						"chalk": "^4.0.0",
-						"jest-diff": "^27.0.6",
-						"jest-get-type": "^27.0.6",
-						"pretty-format": "^27.0.6"
-					}
-				},
 				"jest-message-util": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
@@ -11993,24 +11717,6 @@
 						"find-up": "^4.0.0"
 					}
 				},
-				"pretty-format": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
-					"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
-					"dev": true,
-					"requires": {
-						"@jest/types": "^27.0.6",
-						"ansi-regex": "^5.0.0",
-						"ansi-styles": "^5.0.0",
-						"react-is": "^17.0.1"
-					}
-				},
-				"react-is": {
-					"version": "17.0.2",
-					"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-					"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-					"dev": true
-				},
 				"resolve-cwd": {
 					"version": "3.0.0",
 					"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -12377,12 +12083,6 @@
 					"integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==",
 					"dev": true
 				},
-				"diff-sequences": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz",
-					"integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==",
-					"dev": true
-				},
 				"escape-string-regexp": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
@@ -12437,18 +12137,6 @@
 						"semver": "^6.3.0"
 					}
 				},
-				"jest-diff": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
-					"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
-					"dev": true,
-					"requires": {
-						"chalk": "^4.0.0",
-						"diff-sequences": "^27.0.6",
-						"jest-get-type": "^27.0.6",
-						"pretty-format": "^27.0.6"
-					}
-				},
 				"jest-each": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.0.6.tgz",
@@ -12462,12 +12150,6 @@
 						"pretty-format": "^27.0.6"
 					}
 				},
-				"jest-get-type": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
-					"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
-					"dev": true
-				},
 				"jest-haste-map": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.0.6.tgz",
@@ -12489,18 +12171,6 @@
 						"walker": "^1.0.7"
 					}
 				},
-				"jest-matcher-utils": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
-					"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
-					"dev": true,
-					"requires": {
-						"chalk": "^4.0.0",
-						"jest-diff": "^27.0.6",
-						"jest-get-type": "^27.0.6",
-						"pretty-format": "^27.0.6"
-					}
-				},
 				"jest-message-util": {
 					"version": "27.0.6",
 					"resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.0.6.tgz",
@@ -12683,24 +12353,6 @@
 					"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 					"dev": true
 				},
-				"pretty-format": {
-					"version": "27.0.6",
-					"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
-					"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
-					"dev": true,
-					"requires": {
-						"@jest/types": "^27.0.6",
-						"ansi-regex": "^5.0.0",
-						"ansi-styles": "^5.0.0",
-						"react-is": "^17.0.1"
-					}
-				},
-				"react-is": {
-					"version": "17.0.2",
-					"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
-					"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
-					"dev": true
-				},
 				"semver": {
 					"version": "6.3.0",
 					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -12783,6 +12435,36 @@
 				}
 			}
 		},
+		"jest-diff": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz",
+			"integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==",
+			"dev": true,
+			"requires": {
+				"chalk": "^4.0.0",
+				"diff-sequences": "^27.0.6",
+				"jest-get-type": "^27.0.6",
+				"pretty-format": "^27.0.6"
+			}
+		},
+		"jest-get-type": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.0.6.tgz",
+			"integrity": "sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==",
+			"dev": true
+		},
+		"jest-matcher-utils": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.0.6.tgz",
+			"integrity": "sha512-OFgF2VCQx9vdPSYTHWJ9MzFCehs20TsyFi6bIHbk5V1u52zJOnvF0Y/65z3GLZHKRuTgVPY4Z6LVePNahaQ+tA==",
+			"dev": true,
+			"requires": {
+				"chalk": "^4.0.0",
+				"jest-diff": "^27.0.6",
+				"jest-get-type": "^27.0.6",
+				"pretty-format": "^27.0.6"
+			}
+		},
 		"jest-pnp-resolver": {
 			"version": "1.2.2",
 			"resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
@@ -12869,88 +12551,6 @@
 				}
 			}
 		},
-		"jest-test-performance": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/jest-test-performance/-/jest-test-performance-1.0.1.tgz",
-			"integrity": "sha512-6aAkkKKcWYj/UvkYYWDmepnluBETZt5QCO4xGk5ECwN2cn/twm4hiAY/ag/x6ILBhVAaucLFaNUvyir0PWSKIw==",
-			"requires": {
-				"jest-matcher-utils": "^25.5.0",
-				"test-performance": "^1.1.2"
-			},
-			"dependencies": {
-				"@jest/types": {
-					"version": "25.5.0",
-					"resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz",
-					"integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==",
-					"requires": {
-						"@types/istanbul-lib-coverage": "^2.0.0",
-						"@types/istanbul-reports": "^1.1.1",
-						"@types/yargs": "^15.0.0",
-						"chalk": "^3.0.0"
-					}
-				},
-				"@types/yargs": {
-					"version": "15.0.14",
-					"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.14.tgz",
-					"integrity": "sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==",
-					"requires": {
-						"@types/yargs-parser": "*"
-					}
-				},
-				"chalk": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-					"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"diff-sequences": {
-					"version": "25.2.6",
-					"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.6.tgz",
-					"integrity": "sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg=="
-				},
-				"jest-diff": {
-					"version": "25.5.0",
-					"resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.5.0.tgz",
-					"integrity": "sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A==",
-					"requires": {
-						"chalk": "^3.0.0",
-						"diff-sequences": "^25.2.6",
-						"jest-get-type": "^25.2.6",
-						"pretty-format": "^25.5.0"
-					}
-				},
-				"jest-get-type": {
-					"version": "25.2.6",
-					"resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.6.tgz",
-					"integrity": "sha512-DxjtyzOHjObRM+sM1knti6or+eOgcGU4xVSb2HNP1TqO4ahsT+rqZg+nyqHWJSvWgKC5cG3QjGFBqxLghiF/Ig=="
-				},
-				"jest-matcher-utils": {
-					"version": "25.5.0",
-					"resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.5.0.tgz",
-					"integrity": "sha512-VWI269+9JS5cpndnpCwm7dy7JtGQT30UHfrnM3mXl22gHGt/b7NkjBqXfbhZ8V4B7ANUsjK18PlSBmG0YH7gjw==",
-					"requires": {
-						"chalk": "^3.0.0",
-						"jest-diff": "^25.5.0",
-						"jest-get-type": "^25.2.6",
-						"pretty-format": "^25.5.0"
-					}
-				},
-				"pretty-format": {
-					"version": "25.5.0",
-					"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz",
-					"integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==",
-					"requires": {
-						"@jest/types": "^25.5.0",
-						"ansi-regex": "^5.0.0",
-						"ansi-styles": "^4.0.0",
-						"react-is": "^16.12.0"
-					}
-				}
-			}
-		},
 		"js-tokens": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -13823,6 +13423,57 @@
 			"integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
 			"dev": true
 		},
+		"pretty-format": {
+			"version": "27.0.6",
+			"resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz",
+			"integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==",
+			"dev": true,
+			"requires": {
+				"@jest/types": "^27.0.6",
+				"ansi-regex": "^5.0.0",
+				"ansi-styles": "^5.0.0",
+				"react-is": "^17.0.1"
+			},
+			"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==",
+					"dev": true,
+					"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/istanbul-reports": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
+					"integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
+					"dev": true,
+					"requires": {
+						"@types/istanbul-lib-report": "*"
+					}
+				},
+				"@types/yargs": {
+					"version": "16.0.4",
+					"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz",
+					"integrity": "sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==",
+					"dev": true,
+					"requires": {
+						"@types/yargs-parser": "*"
+					}
+				},
+				"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==",
+					"dev": true
+				}
+			}
+		},
 		"process-nextick-args": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13872,9 +13523,10 @@
 			}
 		},
 		"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=="
+			"version": "17.0.2",
+			"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+			"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+			"dev": true
 		},
 		"readable-stream": {
 			"version": "1.1.14",
@@ -14258,11 +13910,6 @@
 				}
 			}
 		},
-		"test-performance": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/test-performance/-/test-performance-1.1.3.tgz",
-			"integrity": "sha512-oo/sD9L6h9+qxszKq3FGTxxXEQVCuaY83LqcPc+4B9oLISqbdOhxOWz4WArytFAYDtP6Lo4a0DsJi8qcsNohcg=="
-		},
 		"thenify": {
 			"version": "3.3.1",
 			"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
diff --git a/util/package.json b/util/package.json
index ac204937..a132a99c 100644
--- a/util/package.json
+++ b/util/package.json
@@ -43,7 +43,6 @@
 		"class-validator": "^0.13.1",
 		"dot-prop": "^6.0.1",
 		"env-paths": "^2.2.1",
-		"jest-test-performance": "^1.0.1",
 		"jsonwebtoken": "^8.5.1",
 		"missing-native-js-functions": "^1.2.10",
 		"node-fetch": "^2.6.1",
@@ -56,7 +55,7 @@
 	},
 	"jest": {
 		"setupFilesAfterEnv": [
-			"jest-test-performance"
+			"./tests/setupJest.js"
 		]
 	}
 }
diff --git a/util/src/entities/BaseClass.ts b/util/src/entities/BaseClass.ts
index 22d9f6d6..2d2457de 100644
--- a/util/src/entities/BaseClass.ts
+++ b/util/src/entities/BaseClass.ts
@@ -23,7 +23,9 @@ export class BaseClass extends BaseEntity {
 		super();
 		this.assign(props);
 
-		if (!this.construct.schema) this.construct.schema = { ...schema, $ref: `#/definitions/${this.construct.name}` };
+		if (!this.construct.schema) {
+			this.construct.schema = ajv.compile({ ...schema, $ref: `#/definitions/${this.construct.name}` });
+		}
 
 		this.id = this.opts.id || Snowflake.generate();
 	}
@@ -51,7 +53,7 @@ export class BaseClass extends BaseEntity {
 	@BeforeUpdate()
 	@BeforeInsert()
 	validate() {
-		const valid = ajv.validate(this.construct.schema, this.toJSON());
+		const valid = this.construct.schema(this.toJSON());
 		if (!valid) throw ajv.errors;
 		return this;
 	}
diff --git a/util/tests/setupJest.js b/util/tests/setupJest.js
new file mode 100644
index 00000000..551d2be5
--- /dev/null
+++ b/util/tests/setupJest.js
@@ -0,0 +1,19 @@
+const { performance } = require("perf_hooks");
+
+global.expect.extend({
+	toBeFasterThan: async (func, target) => {
+		const start = performance.now();
+		var error;
+		try {
+			await func();
+		} catch (e) {
+			error = e.toString();
+		}
+		const time = performance.now() - start;
+
+		return {
+			pass: time < target && !error,
+			message: () => error || `${func.name} took ${time}ms of maximum ${target}`,
+		};
+	},
+});
diff --git a/util/tests/validate.test.js b/util/tests/validate.test.js
index d36da1ed..c885a167 100644
--- a/util/tests/validate.test.js
+++ b/util/tests/validate.test.js
@@ -1,30 +1,31 @@
 const { initDatabase } = require("../dist/util/Database");
 const { User } = require("../dist/entities/User");
+jest.setTimeout(10000);
 
-beforeAll(async () => {
-	await initDatabase();
-	new User().validate();
+beforeAll((done) => {
+	initDatabase().then(() => {
+		new User().validate(); // warm up schema/model
+		done();
+	});
 });
 
 describe("Validate model class properties", () => {
-	describe("validation should be faster than 20ms", () => {
-		expect(() => new User().validate()).toBeFasterThan(20);
-	});
-
 	describe("User", () => {
-		test("object instead of string", () => {
+		test("object instead of string", async () => {
 			expect(() => {
 				new User({ username: {} }).validate();
 			}).toThrow();
 		});
 	});
 
+	test("validation should be faster than 20ms", () => {
+		expect(() => {
+			new User().validate();
+		}).toBeFasterThan(20);
+	});
+
 	test("should not set opts", () => {
 		const user = new User({ opts: { id: 0 } });
 		expect(user.opts.id).not.toBe(0);
 	});
-
-	test("test", () => {
-		expect(1).toBe(1);
-	});
 });