diff --git a/package-lock.json b/package-lock.json index 44cc955..a347da5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,8 +46,6 @@ "@types/howler": "^2.2.12", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", - "@types/mongodb": "^3.3.1", - "@types/mongoose": "^5.5.15", "@types/morgan": "^1.9.10", "@types/node": "^25.5.0", "@types/node-ipc": "^9.2.3", @@ -79,7 +77,7 @@ "chai-as-promised": "^7.1.1", "chalk": "^2.4.2", "color-convert": "^2.0.1", - "connect-mongo": "^3.0.0", + "connect-mongo": "^6.0.0", "cookie-parser": "^1.4.4", "core-js": "^3.2.1", "del": "^5.1.0", @@ -123,7 +121,7 @@ "merge2": "^1.2.4", "mocha": "^6.2.0", "moment": "^2.24.0", - "mongoose": "^5.6.11", + "mongoose": "^9.3.2", "morgan": "^1.9.1", "ngx-bootstrap": "^18.0.1", "passport": "^0.4.0", @@ -5422,6 +5420,15 @@ "win32" ] }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.6.tgz", + "integrity": "sha512-y+x3H1xBZd38n10NZF/rEBlvDOOMQ6LKUTHqr8R9VkJ+mmQOYtJFxIlkkK8fZrtOiL6VixbOBWMbZGBdal3Z1g==", + "license": "MIT", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -6080,15 +6087,6 @@ "@types/node": "*" } }, - "node_modules/@types/bson": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", - "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/caseless": { "version": "0.12.2", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", @@ -6354,26 +6352,6 @@ "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", "license": "MIT" }, - "node_modules/@types/mongodb": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.3.1.tgz", - "integrity": "sha512-Va7o1fN3zeabmIJSQ6yuAWkqPvrT38HSTIi4YbVOb2UL7FJ4diXrWt+OUuuEFWAVPtF9VZV5h+7LDYdzgXWgQA==", - "license": "MIT", - "dependencies": { - "@types/bson": "*", - "@types/node": "*" - } - }, - "node_modules/@types/mongoose": { - "version": "5.5.15", - "resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.5.15.tgz", - "integrity": "sha512-LgUHpGl6mmcyzjZR/afUZ7mDPjDd38mA0HCf8vL11otVKiNGyu7ug8z3ePx2QAqcPrxbtfaJVgirdBeNXYG54Q==", - "license": "MIT", - "dependencies": { - "@types/mongodb": "*", - "@types/node": "*" - } - }, "node_modules/@types/morgan": { "version": "1.9.10", "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.10.tgz", @@ -6654,6 +6632,21 @@ "integrity": "sha512-42qYzEoJ1yQlDNWSwtJmQKUKAoYv25mjsxKXhwn4/1qlG3Xlr8t8EK/2771dVi5ytw/KX5XwwG5L8lNxLf6qSQ==", "license": "MIT" }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", + "license": "MIT" + }, + "node_modules/@types/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, "node_modules/@types/wrap-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", @@ -9426,6 +9419,18 @@ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/asn1js": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", @@ -9478,14 +9483,6 @@ "node": ">=4" } }, - "node_modules/async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dependencies": { - "lodash": "^4.17.11" - } - }, "node_modules/async-done": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", @@ -10293,6 +10290,12 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, + "node_modules/bn.js": { + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.3.tgz", + "integrity": "sha512-fGTi3gxV/23FTYdAoUtLYp6qySe2KE3teyZitipKNRuVYcBkoP/bB3guXN/XVKUe9mxCHXnc9C4ocyz8OmgN0g==", + "license": "MIT" + }, "node_modules/body": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", @@ -10591,12 +10594,12 @@ } }, "node_modules/bson": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.1.tgz", - "integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg==", - "deprecated": "Fixed a critical issue with BSON serialization documented in CVE-2019-2391, see https://bit.ly/2KcpXdo for more details", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-7.2.0.tgz", + "integrity": "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==", + "license": "Apache-2.0", "engines": { - "node": ">=0.6.19" + "node": ">=20.19.0" } }, "node_modules/buffer": { @@ -12045,13 +12048,45 @@ } }, "node_modules/connect-mongo": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-3.0.0.tgz", - "integrity": "sha512-Y95urWNGrAoKY2w31s7Q9Gs/W3qdMCshUIeDTgulssHi6KueYtz4XrbV3kcnQaR8EcBQvooNNX7aOaAJDgudag==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-6.0.0.tgz", + "integrity": "sha512-mHxfnTiWk7ZtxmHdcrFBKlr7fCtgGoFpx/oe9jFW0yb2NinagsxEeuol78nUWMpnWyYK0nnuXMlU9wrgUjTE6g==", + "license": "MIT", "dependencies": { - "mongodb": "^3.1.0" + "debug": "^4.4.3", + "kruptein": "3.0.8" + }, + "engines": { + "node": ">=20.8.0" + }, + "peerDependencies": { + "express-session": "^1.17.1", + "mongodb": ">=5.0.0" } }, + "node_modules/connect-mongo/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/connect-mongo/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/connect/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -15148,35 +15183,71 @@ } }, "node_modules/express-session": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.2.tgz", - "integrity": "sha512-oy0sRsdw6n93E9wpCNWKRnSsxYnSDX9Dnr9mhZgqUEEorzcq5nshGYSZ4ZReHFhKQ80WI5iVUUSPW7u3GaKauw==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.19.0.tgz", + "integrity": "sha512-0csaMkGq+vaiZTmSMMGkfdCOabYv192VbytFypcvI0MANrp+4i/7yEkJ0sbAEhycQjntaKGzYfjfXQyVb7BHMA==", + "license": "MIT", "dependencies": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", + "cookie": "~0.7.2", + "cookie-signature": "~1.0.7", + "debug": "~2.6.9", "depd": "~2.0.0", - "on-headers": "~1.0.2", + "on-headers": "~1.1.0", "parseurl": "~1.3.3", - "safe-buffer": "5.1.2", + "safe-buffer": "~5.2.1", "uid-safe": "~2.1.5" }, "engines": { "node": ">= 0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, "node_modules/express-session/node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/express-session/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, "node_modules/express/node_modules/cookie": { "version": "0.7.2", @@ -21660,9 +21731,13 @@ "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==" }, "node_modules/kareem": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", - "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.2.0.tgz", + "integrity": "sha512-VS8MWZz/cT+SqBCpVfNN4zoVz5VskR3N4+sTmUXme55e9avQHntpwpNq0yjnosISXqwJ3AQVjlbI4Dyzv//JtA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } }, "node_modules/karma-source-map-support": { "version": "1.4.0", @@ -21692,6 +21767,18 @@ "node": ">=0.10.0" } }, + "node_modules/kruptein": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/kruptein/-/kruptein-3.0.8.tgz", + "integrity": "sha512-0CyalFA0Cjp3jnziMp0u1uLZW2/ouhQ0mEMfYlroBXNe86na1RwAuwBcdRAegeWZNMfQy/G5fN47g/Axjtqrfw==", + "license": "MIT", + "dependencies": { + "asn1.js": "^5.4.1" + }, + "engines": { + "node": ">8" + } + }, "node_modules/last-run": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", @@ -23092,7 +23179,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "optional": true + "license": "MIT" }, "node_modules/meow": { "version": "3.7.0", @@ -23766,80 +23853,90 @@ } }, "node_modules/mongodb": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.7.tgz", - "integrity": "sha512-2YdWrdf1PJgxcCrT1tWoL6nHuk6hCxhddAAaEh8QJL231ci4+P9FLyqopbTm2Z2sAU6mhCri+wd9r1hOcHdoMw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz", + "integrity": "sha512-067DXiMjcpYQl6bGjWQoTUEE9UoRViTtKFcoqX7z08I+iDZv/emH1g8XEFiO3qiDfXAheT5ozl1VffDTKhIW/w==", + "license": "Apache-2.0", "dependencies": { - "mongodb-core": "3.2.7", - "safe-buffer": "^5.1.2" + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^7.1.1", + "mongodb-connection-string-url": "^7.0.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/mongodb-core": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.7.tgz", - "integrity": "sha512-WypKdLxFNPOH/Jy6i9z47IjG2wIldA54iDZBmHMINcgKOUcWJh8og+Wix76oGd7EyYkHJKssQ2FAOw5Su/n4XQ==", - "dependencies": { - "bson": "^1.1.1", - "require_optional": "^1.0.1", - "safe-buffer": "^5.1.2" + "node": ">=20.19.0" }, - "optionalDependencies": { - "saslprep": "^1.0.0" + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.806.0", + "@mongodb-js/zstd": "^7.0.0", + "gcp-metadata": "^7.0.1", + "kerberos": "^7.0.0", + "mongodb-client-encryption": ">=7.0.0 <7.1.0", + "snappy": "^7.3.2", + "socks": "^2.8.6" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, - "node_modules/mongodb-core/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/mongodb/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/mongodb-connection-string-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz", + "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^13.0.0", + "whatwg-url": "^14.1.0" + }, + "engines": { + "node": ">=20.19.0" + } }, "node_modules/mongoose": { - "version": "5.6.11", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.6.11.tgz", - "integrity": "sha512-+Mxfmu2Jcspmdqk1111BLUj5mzSLHWKVovImkjzO9GMymTwkHshsuSFmUN7ou4dWy2WR8DPSJcwU52HhnnNk8Q==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.3.2.tgz", + "integrity": "sha512-4hMJA4vLAeNG6LnDwJImPYM+uJMVw+sFs7jtS/91OKOT7rzv19ytAAeswtAdWoinVBUVrzmClL/ZoPhcU5RL8w==", + "license": "MIT", "dependencies": { - "async": "2.6.2", - "bson": "~1.1.1", - "kareem": "2.3.1", - "mongodb": "3.2.7", - "mongodb-core": "3.2.7", - "mongoose-legacy-pluralize": "1.0.2", - "mpath": "0.6.0", - "mquery": "3.2.1", - "ms": "2.1.2", - "regexp-clone": "1.0.0", - "safe-buffer": "5.1.2", - "sift": "7.0.1", - "sliced": "1.0.1" + "kareem": "3.2.0", + "mongodb": "~7.1", + "mpath": "0.9.0", + "mquery": "6.0.0", + "ms": "2.1.3", + "sift": "17.1.3" }, "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mongoose-legacy-pluralize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", - "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==", - "peerDependencies": { - "mongoose": "*" + "node": ">=20.19.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" } }, "node_modules/mongoose/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/mongoose/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/morgan": { "version": "1.9.1", @@ -23865,46 +23962,23 @@ } }, "node_modules/mpath": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", - "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "license": "MIT", "engines": { "node": ">=4.0.0" } }, "node_modules/mquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.1.tgz", - "integrity": "sha512-kY/K8QToZWTTocm0U+r8rqcJCp5PRl6e8tPmoDs5OeSO3DInZE2rAL6AYH+V406JTo8305LdASOQcxRDqHojyw==", - "dependencies": { - "bluebird": "3.5.1", - "debug": "3.1.0", - "regexp-clone": "^1.0.0", - "safe-buffer": "5.1.2", - "sliced": "1.0.1" - }, + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.0.tgz", + "integrity": "sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==", + "license": "MIT", "engines": { - "node": ">=4.0.0" + "node": ">=20.19.0" } }, - "node_modules/mquery/node_modules/bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" - }, - "node_modules/mquery/node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/mquery/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -29799,11 +29873,6 @@ "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==" }, - "node_modules/regexp-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", - "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -30236,15 +30305,6 @@ "uuid": "bin/uuid" } }, - "node_modules/require_optional": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", - "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", - "dependencies": { - "resolve-from": "^2.0.0", - "semver": "^5.1.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -30327,14 +30387,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", @@ -30787,18 +30839,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "node_modules/saslprep": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", - "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", - "optional": true, - "dependencies": { - "sparse-bitfield": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/sass": { "version": "1.77.6", "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", @@ -31365,9 +31405,10 @@ } }, "node_modules/sift": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", - "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", + "license": "MIT" }, "node_modules/signal-exit": { "version": "3.0.7", @@ -31531,11 +31572,6 @@ "node": ">=4" } }, - "node_modules/sliced": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", - "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA==" - }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -31820,7 +31856,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "optional": true, + "license": "MIT", "dependencies": { "memory-pager": "^1.0.2" } @@ -33511,6 +33547,27 @@ "node": ">=6" } }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tr46/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tracer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tracer/-/tracer-1.0.1.tgz", @@ -35125,6 +35182,15 @@ "resolved": "https://registry.npmjs.org/webgl-debug/-/webgl-debug-2.0.1.tgz", "integrity": "sha512-G7BOpMmqdc31X1nb3eqwVxw/v1MNV/ulgw7Bs+7+a/sn+fC0d0OiMkerA55C6+3BL2vULyJ3kZLPcEL5GbXzhw==" }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/webpack": { "version": "5.105.4", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", @@ -35659,6 +35725,19 @@ "node": ">=0.6.0" } }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/whet.extend": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", diff --git a/package.json b/package.json index dce9310..f48142a 100644 --- a/package.json +++ b/package.json @@ -88,8 +88,6 @@ "@types/howler": "^2.2.12", "@types/lodash": "^4.17.24", "@types/mocha": "^10.0.10", - "@types/mongodb": "^3.3.1", - "@types/mongoose": "^5.5.15", "@types/morgan": "^1.9.10", "@types/node": "^25.5.0", "@types/node-ipc": "^9.2.3", @@ -121,7 +119,7 @@ "chai-as-promised": "^7.1.1", "chalk": "^2.4.2", "color-convert": "^2.0.1", - "connect-mongo": "^3.0.0", + "connect-mongo": "^6.0.0", "cookie-parser": "^1.4.4", "core-js": "^3.2.1", "del": "^5.1.0", @@ -165,7 +163,7 @@ "merge2": "^1.2.4", "mocha": "^6.2.0", "moment": "^2.24.0", - "mongoose": "^5.6.11", + "mongoose": "^9.3.2", "morgan": "^1.9.1", "ngx-bootstrap": "^18.0.1", "passport": "^0.4.0", diff --git a/src/ts/server/accountUtils.ts b/src/ts/server/accountUtils.ts index 5e1634f..7aa1501 100644 --- a/src/ts/server/accountUtils.ts +++ b/src/ts/server/accountUtils.ts @@ -229,7 +229,7 @@ export async function removeFriend(accountId: string, friendId: string) { const existing = await findFriendRequest(accountId, friendId); if (existing) { - existing.remove(); + existing.deleteOne(); } } diff --git a/src/ts/server/adminServerActions.ts b/src/ts/server/adminServerActions.ts index 32504b0..3b918ca 100644 --- a/src/ts/server/adminServerActions.ts +++ b/src/ts/server/adminServerActions.ts @@ -289,12 +289,12 @@ export class AdminServerActions implements IAdminServerActions, SocketServer { } @Method({ promise: true }) async getPoniesCreators(account: string) { - const items: ICharacter[] = await Character.find({ account }, '_id name creator').lean().exec(); - return items.map(({ _id, name, creator }) => { _id, name, creator }); + const items = await Character.find({ account }, '_id name creator').lean().exec(); + return items.map(({ _id, name, creator }) => { _id: _id.toString(), name, creator }); } @Method({ promise: true }) async getPoniesForAccount(account: string) { - return await Character.find({ account }).lean().exec(); + return await Character.find({ account }).lean().exec() as any; } @Method({ promise: true }) async getDetailsForAccount(accountId: string) { diff --git a/src/ts/server/api/admin-accounts.ts b/src/ts/server/api/admin-accounts.ts index d4133f6..1bcc724 100644 --- a/src/ts/server/api/admin-accounts.ts +++ b/src/ts/server/api/admin-accounts.ts @@ -183,7 +183,7 @@ export async function removeAccount(service: AdminService, accountId: string) { if (account) { checkIfNotAdmin(account, `remove account: ${accountId}`); - await account.remove(); + await account.deleteOne(); service.removedItem('accounts', accountId); } diff --git a/src/ts/server/api/admin.ts b/src/ts/server/api/admin.ts index 9f35fd1..1862011 100644 --- a/src/ts/server/api/admin.ts +++ b/src/ts/server/api/admin.ts @@ -6,7 +6,7 @@ import { } from '../../common/adminInterfaces'; import { execAsync } from '../serverUtils'; import { - IAccount, Account, Origin, Event, iterate, ISession, Session, SupporterInvite as DBSupporterInvite, + Account, Origin, Event, iterate, ISession, Session, SupporterInvite as DBSupporterInvite, findAccount, ISupporterInvite, ID } from '../db'; import { servers, serverStatus, loginServers } from '../internal'; @@ -157,7 +157,7 @@ export async function getChat(search: string, date: string, caseInsensitive: boo } export async function getChatForAccounts(accountIds: string[], date: string) { - const accounts: Partial[] = await Account.find({ _id: { $in: accountIds } }, '_id merges').lean().exec(); + const accounts = await Account.find({ _id: { $in: accountIds } }, '_id merges').lean().exec(); const map = new Map(); const ids = flatten(accounts.map(a => [a._id.toString(), ...(a.merges || []).map(a => a.id)])); @@ -174,6 +174,7 @@ export async function getChatForAccounts(accountIds: string[], date: string) { const fixed = chat.replace(/^([0-9:]+) \[([a-f0-9]{24})\]/gmu, (_, date, id) => `${date} ${map.has(id) ? map.get(id) : `[${id}]`}`); + return fixed; } @@ -187,11 +188,11 @@ export async function clearSessions(accountId: string) { const user = data && data.passport && data.passport.user; if (user === accountId) { - clearIds.push(session._id); + clearIds.push(session._id.toString()); } } } catch (e) { - logger.error('Error when claring session', e, session._id, session.session); + logger.error('Error when clearing session', e, session._id, session.session); } }); diff --git a/src/ts/server/api/merge.ts b/src/ts/server/api/merge.ts index 17e7192..57a32c8 100644 --- a/src/ts/server/api/merge.ts +++ b/src/ts/server/api/merge.ts @@ -137,19 +137,19 @@ async function merge( Promise.all([ SupporterInvite.updateMany({ source: merge._id }, { source: account._id }).exec(), SupporterInvite.updateMany({ target: merge._id }, { target: account._id }).exec(), - ]).then(() => SupporterInvite.remove({ target: account._id, source: account._id }).exec()), + ]).then(() => SupporterInvite.deleteOne({ target: account._id, source: account._id }).exec()), Promise.all([ FriendRequest.updateMany({ source: merge._id }, { source: account._id }).exec(), FriendRequest.updateMany({ target: merge._id }, { target: account._id }).exec(), - ]).then(() => FriendRequest.remove({ target: account._id, source: account._id }).exec()), + ]).then(() => FriendRequest.deleteOne({ target: account._id, source: account._id }).exec()), Promise.all([ HideRequest.updateMany({ source: merge._id }, { source: account._id }).exec(), HideRequest.updateMany({ target: merge._id }, { target: account._id }).exec(), - ]).then(() => HideRequest.remove({ target: account._id, source: account._id }).exec()), + ]).then(() => HideRequest.deleteOne({ target: account._id, source: account._id }).exec()), ]); await removeDuplicateFriendRequests(id); - await merge.remove(); + await merge.deleteOne(); await kickFromAllServers(withId); await removedDocument('accounts', withId); await updateCharacterCount(id); @@ -175,7 +175,7 @@ async function removeDuplicateFriendRequests(id: string) { } if (removeRequests.length) { - await FriendRequest.remove({ _id: { $in: removeRequests } }).exec(); + await FriendRequest.deleteOne({ _id: { $in: removeRequests } }).exec(); } } @@ -227,7 +227,7 @@ export async function split( const friendsToRemove = [...(keep.friends || []), ...(split.friends || [])]; - await FriendRequest.deleteMany({ + await FriendRequest.deleteOne({ $or: [ { target: account._id, source: { $in: friendsToRemove } }, { source: account._id, target: { $in: friendsToRemove } }, @@ -243,7 +243,7 @@ export async function split( const hidesToRemove = [...(keep.hides || []), ...(split.hides || [])].map(hide => hide.id); - await HideRequest.deleteMany({ + await HideRequest.deleteOne({ $or: [ { source: account._id, target: { $in: hidesToRemove } }, ], diff --git a/src/ts/server/api/ponies.ts b/src/ts/server/api/ponies.ts index b3bbf15..0989acc 100644 --- a/src/ts/server/api/ponies.ts +++ b/src/ts/server/api/ponies.ts @@ -75,7 +75,7 @@ export async function removeCharacter(service: AdminService, characterId: string return; await kickFromAllServersByCharacter(characterId); - await character.remove(); + await character.deleteOne(); await updateCharacterCount(character.account); logRemovedCharacter(character); service.ponies.removed(characterId); @@ -83,7 +83,7 @@ export async function removeCharacter(service: AdminService, characterId: string async function removeCharacters(character: ICharacter[], accountId: string, removedDocument: RemovedDocument) { await Bluebird.map(character, async c => { - await c.remove(); + await c.deleteOne(); await removedDocument('ponies', c._id.toString()); logRemovedCharacter(c); }, { concurrency: 4 }); diff --git a/src/ts/server/api/pony.ts b/src/ts/server/api/pony.ts index cd586f0..661441b 100644 --- a/src/ts/server/api/pony.ts +++ b/src/ts/server/api/pony.ts @@ -88,7 +88,7 @@ export const createSavePony = character.desc = typeof data.desc === 'string' ? data.desc.substr(0, PLAYER_DESC_MAX_LENGTH) : ''; character.name = data.name; character.tag = data.tag; - character.site = auth ? auth._id : null; + character.site = auth?._id; character.info = info; character.flags = flags; character.lastUsed = new Date(); @@ -115,9 +115,9 @@ export const createSavePony = } if (created) { - log(account._id, `created pony "${character.name}"`); + log(account._id.toString(), `created pony "${character.name}"`); } else if (nameChanged) { - log(account._id, `renamed pony "${oldName}" => "${character.name}"`); + log(account._id.toString(), `renamed pony "${oldName}" => "${character.name}"`); } return toPonyObject(character); diff --git a/src/ts/server/authUtils.ts b/src/ts/server/authUtils.ts index 9f06977..3f9a401 100644 --- a/src/ts/server/authUtils.ts +++ b/src/ts/server/authUtils.ts @@ -65,7 +65,7 @@ export async function updateAuthInfo( } if (!auth.account && accountId) { - changes.account = Types.ObjectId(accountId); + changes.account = new Types.ObjectId(accountId); } if (Object.keys(changes).length > 0) { diff --git a/src/ts/server/boot.ts b/src/ts/server/boot.ts index 6200645..2f51b8b 100644 --- a/src/ts/server/boot.ts +++ b/src/ts/server/boot.ts @@ -4,7 +4,7 @@ require('source-map-support').install(); import 'core-js/stable/promise/finally'; import 'reflect-metadata'; -import * as Promise from 'bluebird'; +import * as Bluebird from 'bluebird'; import * as fs from 'fs'; import { argv } from 'yargs'; @@ -16,4 +16,4 @@ import { argv } from 'yargs'; (global as any).TESTS = false; (global as any).performance = Date; -Promise.promisifyAll(fs); +Bluebird.promisifyAll(fs); diff --git a/src/ts/server/characterUtils.ts b/src/ts/server/characterUtils.ts index 1c23cf6..e3f859d 100644 --- a/src/ts/server/characterUtils.ts +++ b/src/ts/server/characterUtils.ts @@ -2,7 +2,7 @@ import { repeat } from 'lodash'; import { toByteArray } from 'base64-js'; import { encodeString } from 'ag-sockets/dist/utf8'; import { PonyOptions, EntityState, UpdateFlags } from '../common/interfaces'; -import { ICharacter, IAccount, Character, MongoQuery, queryCharacter } from './db'; +import { ICharacter, IAccount, Character, queryCharacter } from './db'; import { isForbiddenName } from '../common/security'; import { supporterLevel } from '../common/adminUtils'; import { CharacterFlags, CharacterState, ServerConfig, CharacterStateFlags } from '../common/adminInterfaces'; @@ -22,6 +22,7 @@ import { saySystem } from './chat'; import { isPonyFlying } from '../common/entityUtils'; import { createCharacterState, updateClientCharacter } from './playerUtils'; import { encodeExpression } from '../common/encoders/expressionEncoder'; +import { QueryFilter } from 'mongoose'; export const defaultCharacterState: CharacterState = { x: 0, y: 0 }; @@ -177,7 +178,7 @@ export function logRemovedCharacter({ _id, account, name, info }: ICharacter) { log(systemMessage(`${account}`, `removed pony [${_id}] "${name}" ${info}`)); } -export async function swapCharacter(client: IClient, { server }: World, query: MongoQuery) { +export async function swapCharacter(client: IClient, { server }: World, query: QueryFilter) { if (client.isSwitchingMap) return; diff --git a/src/ts/server/db.ts b/src/ts/server/db.ts index 34c09f5..efa037b 100644 --- a/src/ts/server/db.ts +++ b/src/ts/server/db.ts @@ -1,4 +1,4 @@ -import { model, Schema, Types, Document, Query } from 'mongoose'; +import { model, Schema, Types, Document, Query, QueryFilter, UpdateQuery } from 'mongoose'; import { TimestampsBase, EventBase, CharacterBase, AccountBase, AuthBase, OriginBase, OriginInfoBase, CharacterState, SupporterInviteBase, FriendRequestBase, HideRequestBase, MergeHideData @@ -9,6 +9,7 @@ import { FriendData } from '../common/interfaces'; import { replaceEmojis } from '../common/emoji'; import { filterForbidden } from './characterUtils'; import { filterName } from '../common/swears'; +import { compact, noop } from 'lodash'; //set('debug', true); // debug mongoose @@ -205,13 +206,13 @@ export const Origin = model('Origin', originSchema); export const Session = model('session', sessionSchema); export const Character = model('Character', characterSchema); -accountSchema.post('remove', function (doc: Document) { +accountSchema.post('deleteOne', function (doc: Document) { Promise.all([ - Character.deleteMany({ account: doc._id }).exec(), - Event.deleteMany({ account: doc._id }).exec(), - Auth.deleteMany({ account: doc._id }).exec(), - FriendRequest.deleteMany({ $or: [{ target: doc._id }, { source: doc._id }] }).exec(), - HideRequest.deleteMany({ $or: [{ target: doc._id }, { source: doc._id }] }).exec(), + Character.deleteOne({ account: doc._id }).exec(), + Event.deleteOne({ account: doc._id }).exec(), + Auth.deleteOne({ account: doc._id }).exec(), + FriendRequest.deleteOne({ $or: [{ target: doc._id }, { source: doc._id }] }).exec(), + HideRequest.deleteOne({ $or: [{ target: doc._id }, { source: doc._id }] }).exec(), ]).catch(logger.error); }); @@ -249,15 +250,11 @@ export interface MongoUpdateExpr extends MongoUpdateExprField { $addToSet?: any; } -export type MongoQuery = { - [P in keyof T]?: T[P] | MongoQueryExpr; -}; - export type MongoUpdate = { [P in keyof T]?: T[P] | MongoUpdateExprField; } & MongoUpdateExpr; -export function iterate(query: Query, onData: (doc: T) => void) { +export function iterate(query: Query, onData: (doc: T) => void) { return new Promise(resolve => { query.cursor() .on('data', onData) @@ -290,7 +287,7 @@ export type FindCharacter = (characterId: ID, accountId: ID) => Promise Promise; export type FindCharacters = (accountId: ID, fields?: string) => Promise; export type UpdateCharacterState = (characterId: ID, serverName: string, state: CharacterState) => Promise; -export type QueryCharacter = (query: MongoQuery, fields?: string) => Promise; +export type QueryCharacter = (query: QueryFilter, fields?: string) => Promise; export function createCharacter(account: IAccount) { return new Character({ account: account._id, creator: `${account.name} [${account._id}]` }); @@ -323,12 +320,13 @@ export function findLatestCharacters(account: ID, count: number): Promise { - return Character.findOneAndRemove({ _id: id, account }).exec().then(nullToUndefined); +export async function removeCharacter(id: ID, account: ID): Promise { + const doc = await Character.findOneAndDelete({ _id: id, account }).exec(); + return doc ?? undefined; } export const updateCharacterState: UpdateCharacterState = (characterId, serverName, state) => - Character.updateOne({ _id: characterId }, { [`state.${serverName}`]: state }).exec().then(nullToUndefined); + Character.updateOne({ _id: characterId }, { [`state.${serverName}`]: state }).exec().then(noop); export const queryCharacter: QueryCharacter = (query, fields) => Character.findOne(query, fields).exec() as any; @@ -338,8 +336,8 @@ export const queryCharacter: QueryCharacter = (query, fields) => export type FindAuth = (authId: ID, accountId: ID, fields?: string) => Promise; export type FindAuths = (accountId: ID, fields?: string) => Promise; export type CountAuths = (accountId: ID) => Promise; -export type QueryAuths = (query: MongoQuery, fields?: string) => Promise; -export type UpdateAuth = (authId: ID, update: MongoUpdate) => Promise; +export type QueryAuths = (query: QueryFilter, fields?: string) => Promise; +export type UpdateAuth = (authId: ID, update: UpdateQuery) => Promise; export const findAuthByOpenId = (openId: string, provider: string): Promise => Auth.findOne({ openId, provider }).exec().then(nullToUndefined); @@ -363,22 +361,23 @@ export const queryAuths: QueryAuths = (query, fields) => Auth.find(query, fields).lean().exec(); export const updateAuth: UpdateAuth = (id, update) => - Auth.updateOne({ _id: id }, update).exec(); + Auth.updateOne({ _id: id }, update).exec().then(noop); + // accounts export type FindAccountSafe = (accountId: ID, projection?: string) => Promise; export type UpdateAccount = (accountId: ID, update: MongoUpdate) => Promise; -export type UpdateAccounts = (query: MongoQuery, update: MongoUpdate) => Promise; -export type QueryAccounts = (query: MongoQuery, fields?: string) => Promise; -export type QueryAccount = (query: MongoQuery, fields?: string) => Promise; +export type UpdateAccounts = (query: QueryFilter, update: MongoUpdate) => Promise; +export type QueryAccounts = (query: QueryFilter, fields?: string) => Promise; +export type QueryAccount = (query: QueryFilter, fields?: string) => Promise; export const findAccount = (account: ID, projection?: string): Promise => Account.findById(account, projection).exec().then(nullToUndefined); export function checkIfAdmin(account: ID): Promise { return Account.findOne({ _id: account }, 'roles').lean().exec() - .then(a => a && isAdmin(a)); + .then(a => a && isAdmin(a)).then(r => !!r); } export function findAccountSafe(account: ID, projection?: string): Promise { @@ -387,10 +386,10 @@ export function findAccountSafe(account: ID, projection?: string): Promise - Account.updateOne({ _id: accountId }, update).exec(); + Account.updateOne({ _id: accountId }, update).exec().then(noop); export const updateAccounts: UpdateAccounts = (query, update) => - Account.updateMany(query, update).exec(); + Account.updateMany(query, update).exec().then(noop); export const queryAccounts: QueryAccounts = (query, fields) => Account.find(query, fields).lean().exec(); @@ -428,8 +427,8 @@ export async function findFriends(accountId: ID, withCharacters: boolean): Promi let characters: ICharacter[] = []; if (withCharacters) { - const characterIds = accounts.map(a => a.lastCharacter).filter(id => id); - characters = await Character.find({ _id: { $in: characterIds } }, '_id name info').lean().exec(); + const characterIds = compact(accounts.map(a => a.lastCharacter?.toString())); + characters = await Character.find({ _id: { $in: characterIds } }, '_id name info').lean().exec(); } return accounts.map(a => { diff --git a/src/ts/server/liveEndPoint.ts b/src/ts/server/liveEndPoint.ts index a605eb7..b58329f 100644 --- a/src/ts/server/liveEndPoint.ts +++ b/src/ts/server/liveEndPoint.ts @@ -49,7 +49,7 @@ export function createLiveEndPoint( .tap(item => { if (item) { removedItem(item._id.toString()); - return item.remove() as any; + return item.deleteOne() as any; } }) .tap(item => item && afterDelete && afterDelete(item)) @@ -86,12 +86,12 @@ export function createLiveEndPoint( function findItemsExact(date: Date): Promise { return Promise.resolve(model.find({ updatedAt: date }, fields.join(' ')) - .lean() + .lean() .exec()); } function hasItem(items: T[], id: string) { - return items.some(i => i._id === id); + return items.some(i => i._id.toString() === id); } function addTailItems(items: T[]): Promise<{ items: T[]; more: boolean; }> { @@ -108,7 +108,7 @@ export function createLiveEndPoint( } return findItemsExact(items[items.length - 1].updatedAt) - .then(other => other.filter(i => !hasItem(items, i._id))) + .then(other => other.filter(i => !hasItem(items, i?._id.toString()))) .then(other => [...items, ...other]) .then(items => ({ items, more: true })); } diff --git a/src/ts/server/polling.ts b/src/ts/server/polling.ts index f8d5362..fc351d2 100644 --- a/src/ts/server/polling.ts +++ b/src/ts/server/polling.ts @@ -101,7 +101,7 @@ const cleanupStrayAuths = (removedDocument: RemovedDocument) => const date = fromNow(-1 * DAY); const query = { account: { $exists: false }, updatedAt: { $lt: date }, createdAt: { $lt: date } }; const items = await queryAuths(query, '_id'); - await Auth.deleteMany(query).exec(); + await Auth.deleteOne(query).exec(); await Bluebird.map(items, item => removedDocument('auths', item._id.toString()), { concurrency: 4 }); logPerformance(`[async] cleanupAccountAlerts (${Date.now() - start}ms)`); }; diff --git a/src/ts/server/reporter.ts b/src/ts/server/reporter.ts index 84f555e..94041b4 100644 --- a/src/ts/server/reporter.ts +++ b/src/ts/server/reporter.ts @@ -1,7 +1,7 @@ import { Request } from 'express'; import { truncate } from 'lodash'; import { Reporter } from './serverInterfaces'; -import { Event, IEvent, IOriginInfo, ID, IAccount } from './db'; +import { Event, IOriginInfo, ID, IAccount } from './db'; import { logger, system } from './logger'; import { ServerConfig } from '../common/adminInterfaces'; import { getOrigin } from './originUtils'; @@ -32,7 +32,7 @@ const createLogEvent = return Event.updateOne({ _id: event._id }, { desc: event.desc, count: event.count + 1 }).exec(); } else { - return Event.create({ server, account, pony, type, message, origin, desc }); + return Event.create({ server, account, pony, type, message, origin, desc }) as any; } }) .catch(logger.error); @@ -97,7 +97,7 @@ export function create(server: ServerConfig, account?: ID, pony?: ID, originInfo /* istanbul ignore next */ export function createFromRequest(server: ServerConfig, req: Request, pony?: any) { const user = req && req.user as IAccount | undefined; - const account = user ? user.id : undefined; + const account = user?._id?.toString(); const origin = req ? getOrigin(req) : undefined; return create(server, account, pony, origin); } diff --git a/src/ts/server/requestUtils.ts b/src/ts/server/requestUtils.ts index 84600de..9c49043 100644 --- a/src/ts/server/requestUtils.ts +++ b/src/ts/server/requestUtils.ts @@ -27,7 +27,7 @@ export const validAccount = (server: ServerConfig): RequestHandler => (req, res, const accountId = req.body.accountId as string; const accountName = req.body.accountName as string; - if (!account || account.id !== accountId) { + if (!account || account._id.toString() !== accountId) { if (!/#$/.test(accountId)) { createFromRequest(server, req).warn(ACCOUNT_ERROR, `${accountName} [${accountId}] (${req.path})`); } diff --git a/src/ts/server/routes/api-pony.ts b/src/ts/server/routes/api-pony.ts index 6bed886..f02119b 100644 --- a/src/ts/server/routes/api-pony.ts +++ b/src/ts/server/routes/api-pony.ts @@ -31,7 +31,7 @@ export default function (server: ServerConfig, settings: Settings, removedDocume savePonyHandler(req.user as IAccount, req.body.pony, createFromRequest(server, req)))); app.post('/pony/remove', offline, hash, validAccount, wrap(server, req => - removePonyHandler(req.body.id, (req.user as IAccount).id))); + removePonyHandler(req.body.id, (req.user as IAccount)?._id.toString()))); return app; } diff --git a/src/ts/server/routes/api1.ts b/src/ts/server/routes/api1.ts index 017b198..562f5b0 100644 --- a/src/ts/server/routes/api1.ts +++ b/src/ts/server/routes/api1.ts @@ -1,5 +1,4 @@ import { Router } from 'express'; -import { noop } from 'lodash'; import { findAllCharacters, findAllVisibleAuths, IAccount, Account } from '../db'; import { offline, hash, handleJSON } from '../requestUtils'; import { createGetAccountData } from '../api/account'; @@ -27,7 +26,7 @@ export default function (server: ServerConfig, settings: Settings) { (lastBrowserId && account.lastBrowserId !== lastBrowserId)) { account.lastUserAgent = lastUserAgent; account.lastBrowserId = lastBrowserId; - Account.updateOne({ _id: account._id }, { lastUserAgent, lastBrowserId }, noop); + Account.updateOne({ _id: account._id }, { lastUserAgent, lastBrowserId }); } return await getAccountData(account); diff --git a/src/ts/server/routes/auth.ts b/src/ts/server/routes/auth.ts index b3d327d..4f16d23 100644 --- a/src/ts/server/routes/auth.ts +++ b/src/ts/server/routes/auth.ts @@ -84,8 +84,8 @@ const ignoreErrors = [ function kickCurrentUser(req: Request) { const user = req.user as IAccount | undefined; - if (user) { - kickFromAllServers(user.id) + if (user?._id) { + kickFromAllServers(user._id?.toString()) .catch(e => logger.error(e)); } } @@ -97,7 +97,7 @@ function logIn(req: Request, account: IAccount) { }); } -function isMerge(accountId: string) { +function isMerge(accountId: string | undefined) { const minTime = fromNow(-10 * MINUTE).getTime(); remove(mergeRequests, r => r.time < minTime); return mergeRequests.some(r => r.accountId === accountId); @@ -186,7 +186,7 @@ async function handleAuth( req: Request, res: Response, error: Error | null, account: IAccount | null, ) { const user = req.user as IAccount | undefined; - const merge = isMerge(user && user.id); + const merge = isMerge(user?._id?.toString()); try { if (error) { @@ -359,7 +359,12 @@ export function authRoutes( return [account._id.toString(), account.name]; })); - passport.use(new LocalStrategy((login, _pass, done) => Account.findById(login, done))); + passport.use(new LocalStrategy((login, _pass, done) => + Account.findById(login) + .then(data => done(undefined, data as any)) + .catch(e => done(e))) + ); + app.get('/local', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/failed-login' })); } diff --git a/src/ts/server/server.ts b/src/ts/server/server.ts index cb6a25f..57bdc18 100644 --- a/src/ts/server/server.ts +++ b/src/ts/server/server.ts @@ -9,7 +9,7 @@ import * as expressSession from 'express-session'; import * as serveFavicon from 'serve-favicon'; import * as Rollbar from 'rollbar'; import { Passport } from 'passport'; -import * as connectMongo from 'connect-mongo'; +import MongoStore from 'connect-mongo'; import * as express from 'express'; import { WebSocketServer } from '@encharm/cws'; import { compact, once } from 'lodash'; @@ -67,14 +67,11 @@ function getServiceWorker() { } } -mongoose.connect(config.db, { - reconnectTries: Number.MAX_VALUE, - useNewUrlParser: true, - useCreateIndex: true, - useFindAndModify: false, -}); +const clientP = mongoose.connect(config.db, { + autoIndex: true, + serverSelectionTimeoutMS: 5000, +}).then(m => m.connection.getClient()); -const MongoStore = connectMongo(expressSession); const app = express(); const production = app.get('env') === 'production'; const maxAge = production ? YEAR : 0; @@ -163,8 +160,14 @@ app.use(require('cookie-parser')()); if (args.login || args.admin) { passport.serializeUser((account, done) => done(null, (account as IAccount)._id.toString())); - passport.deserializeUser((id, done) => - Account.findById(id, (err, a) => done(err, a && !isBanned(a) ? a : false))); + passport.deserializeUser(async (id, done) => { + try { + const account = await Account.findById(id).exec(); + done(undefined, account && !isBanned(account) ? account : false); + } catch (error) { + done(error); + } + }); } const ignore = [ @@ -198,7 +201,7 @@ const createSession = () => expressSession({ cookie: { maxAge: WEEK * 2, }, - store: new MongoStore({ mongooseConnection: mongoose.connection }), + store: new MongoStore({ client: clientP }), }); const statsPath = pathTo('logs', `stats-${server.id}.csv`); diff --git a/src/ts/server/services/supporterInvites.ts b/src/ts/server/services/supporterInvites.ts index b8b8fb2..df27f89 100644 --- a/src/ts/server/services/supporterInvites.ts +++ b/src/ts/server/services/supporterInvites.ts @@ -96,12 +96,12 @@ export class SupporterInvitesService { type LeanInvite = ISupporterInvite & { source: IAccount }; export async function updateSupporterInvites(model: Model) { - const invites: LeanInvite[] = await model.find({}, '_id active') + const invites = await model.find({}, '_id active') .populate('source', '_id supporter patreon roles') - .lean() + .lean() .exec(); - const itemsBySource = toPairs(groupBy(invites, i => i.source._id as string)); + const itemsBySource = toPairs(groupBy(invites, i => i.source._id)); const itemsToUpdate = itemsBySource .map(([_, items]) => { const source = items[0].source; @@ -123,5 +123,5 @@ export async function updateSupporterInvites(model: Model) { return model.updateMany({ _id: { $in: ids } }, { active }).exec(); })); - await model.deleteMany({ active: false, updatedAt: { $lt: fromNow(-100 * DAY) } }).exec(); + await model.deleteOne({ active: false, updatedAt: { $lt: fromNow(-100 * DAY) } }).exec(); } diff --git a/src/ts/tests/mocks.ts b/src/ts/tests/mocks.ts index fe2ff34..3f944d7 100644 --- a/src/ts/tests/mocks.ts +++ b/src/ts/tests/mocks.ts @@ -62,7 +62,7 @@ export function genId() { } export function genObjectId() { - return Types.ObjectId(genId()); + return new Types.ObjectId(genId()); } export function mockClient(fields: any = {}): IClient { @@ -81,8 +81,8 @@ export function mockClient(fields: any = {}): IClient { friends: new Set(), accountSettings: {}, originalRequest: { headers: {} }, - account: { id: accountId, _id: Types.ObjectId(accountId), ignores: [] }, - character: { id: characterId, _id: Types.ObjectId(characterId) }, + account: { id: accountId, _id: new Types.ObjectId(accountId), ignores: [] }, + character: { id: characterId, _id: new Types.ObjectId(characterId) }, isMod: false, pony, map: createServerMap('', 0, 1, 1), diff --git a/src/ts/tests/server/api/pony.spec.ts b/src/ts/tests/server/api/pony.spec.ts index e5d8e0a..588d2e9 100644 --- a/src/ts/tests/server/api/pony.spec.ts +++ b/src/ts/tests/server/api/pony.spec.ts @@ -54,7 +54,7 @@ describe('api pony', () => { describe('for existing character', () => { const characterId = genId(); - const characterObjectId = Types.ObjectId(characterId); + const characterObjectId = new Types.ObjectId(characterId); let character: ICharacter; let account = { _id: 'accid' } as any; @@ -212,7 +212,7 @@ describe('api pony', () => { beforeEach(() => { character = { - _id: Types.ObjectId(characterId), + _id: new Types.ObjectId(characterId), save() { return this; } } as any; diff --git a/src/ts/tests/server/authUtils.spec.ts b/src/ts/tests/server/authUtils.spec.ts index e813e62..e0967e1 100644 --- a/src/ts/tests/server/authUtils.spec.ts +++ b/src/ts/tests/server/authUtils.spec.ts @@ -14,7 +14,7 @@ describe('authUtils', () => { describe('updateAuthInfo()', () => { it('updates url and name fields', async () => { const updateAuth = stub(); - const a = auth({ _id: 'bar' }); + const a = auth({ _id: new Types.ObjectId('bar') }); await updateAuthInfo(updateAuth, a, profile({ username: 'foo', url: 'bar' }), undefined); @@ -33,7 +33,7 @@ describe('authUtils', () => { it('updates email field (from empty)', async () => { const updateAuth = stub(); - const a = auth({ _id: 'bar' }); + const a = auth({ _id: new Types.ObjectId('bar') }); await updateAuthInfo(updateAuth, a, profile({ emails: ['b', 'c'] }), undefined); @@ -44,7 +44,7 @@ describe('authUtils', () => { it('saves updated auth', async () => { const updateAuth = stub(); - await updateAuthInfo(updateAuth, auth({ _id: 'bar' }), profile({ username: 'foo' }), undefined); + await updateAuthInfo(updateAuth, auth({ _id: new Types.ObjectId('bar') }), profile({ username: 'foo' }), undefined); assert.calledWith(updateAuth, 'bar', { name: 'foo' }); }); @@ -55,20 +55,20 @@ describe('authUtils', () => { await updateAuthInfo(stub(), a, profile({ username: 'foo', url: 'bar' }), accountId); - expect(a.account).eql(Types.ObjectId(accountId)); + expect(a.account).eql(new Types.ObjectId(accountId)); }); it('does not save auth if nothing changed', async () => { const updateAuth = stub(); - await updateAuthInfo(updateAuth, auth({ _id: 'bar', name: 'foo' }), profile({ username: 'foo' }), undefined); + await updateAuthInfo(updateAuth, auth({ _id: new Types.ObjectId('bar'), name: 'foo' }), profile({ username: 'foo' }), undefined); assert.notCalled(updateAuth); }); it('does nothing if email list is the same', async () => { const updateAuth = stub(); - const a = auth({ _id: 'bar', emails: ['a', 'b'] }); + const a = auth({ _id: new Types.ObjectId('bar'), emails: ['a', 'b'] }); await updateAuthInfo(updateAuth, a, profile({ emails: ['b', 'a'] }), undefined); diff --git a/src/ts/tests/server/characterUtils.spec.ts b/src/ts/tests/server/characterUtils.spec.ts index 338b003..2df3247 100644 --- a/src/ts/tests/server/characterUtils.spec.ts +++ b/src/ts/tests/server/characterUtils.spec.ts @@ -12,13 +12,14 @@ import { createServerMap } from '../../server/serverMap'; import { CounterService } from '../../server/services/counter'; import { createCharacterState } from '../../server/playerUtils'; import { hasFlag } from '../../common/utils'; +import { Types } from 'mongoose'; describe('characterUtils', () => { describe('createPony()', () => { const defaultState: CharacterState = { x: 0, y: 0, flags: 0 }; it('creates pony entity', () => { - const pony = createPony(account({ _id: '' }), character({ name: 'foo' }), defaultState); + const pony = createPony(account({ _id: new Types.ObjectId('') }), character({ name: 'foo' }), defaultState); expect(pony).not.undefined; expect(pony.type).equal(entities.pony.type); @@ -27,7 +28,7 @@ describe('characterUtils', () => { it('sets initial position for character from state', () => { const main: CharacterState = { ...defaultState, x: 1, y: 2 }; - const pony = createPony(account({ _id: '' }), character({ name: 'foo' }), main); + const pony = createPony(account({ _id: new Types.ObjectId('') }), character({ name: 'foo' }), main); expect(pony.x).eql(1, 'x'); expect(pony.y).eql(2, 'y'); @@ -36,7 +37,7 @@ describe('characterUtils', () => { it('sets facing from state', () => { const main: CharacterState = { ...defaultState, flags: CharacterStateFlags.Right }; - const pony = createPony(account({ _id: '' }), character({ name: 'foo' }), main); + const pony = createPony(account({ _id: new Types.ObjectId('') }), character({ name: 'foo' }), main); expect(pony.state).equal(EntityState.FacingRight); }); @@ -44,7 +45,7 @@ describe('characterUtils', () => { it('sets extra flag from state', () => { const main: CharacterState = { ...defaultState, flags: CharacterStateFlags.Extra }; - const pony = createPony(account({ _id: '' }), character({ name: 'foo' }), main); + const pony = createPony(account({ _id: new Types.ObjectId('') }), character({ name: 'foo' }), main); expect(pony.options!.extra).true; }); @@ -52,7 +53,7 @@ describe('characterUtils', () => { it('sets held item from state', () => { const main: CharacterState = { ...defaultState, hold: 'apple' }; - const pony = createPony(account({ _id: '' }), character({ name: 'foo' }), main); + const pony = createPony(account({ _id: new Types.ObjectId('') }), character({ name: 'foo' }), main); expect(pony.options!.hold).equal(entities.apple.type); }); @@ -60,7 +61,9 @@ describe('characterUtils', () => { it('ignores held item from state if type is invalid', () => { const main: CharacterState = { ...defaultState, hold: 'does_not_exist' }; - const pony = createPony(account({ _id: '' }), character({ name: 'foo' }), main); + const pony = createPony(account({ _id: new Types.ObjectId('') + + }), character({ name: 'foo' }), main); expect(pony.options!.hold).undefined; }); @@ -143,7 +146,7 @@ describe('characterUtils', () => { updatePony(entity1, account({ _id: genObjectId() }), character({ name: 'Foo', info: OFFLINE_PONY })); updatePony( - entity2, account({ _id: '' }), character({ name: 'Bar', info: 'DAT/AADapSD/1wC7Li42QAJkJEAT8ADAAxADhAYQFGAQAA==' })); + entity2, account({ _id: new Types.ObjectId('') }), character({ name: 'Bar', info: 'DAT/AADapSD/1wC7Li42QAJkJEAT8ADAAxADhAYQFGAQAA==' })); expect(entity1.canFly).false; expect(entity2.canFly).true; diff --git a/src/ts/tests/server/liveEndPoint.spec.ts b/src/ts/tests/server/liveEndPoint.spec.ts index 8aeb15d..07070ae 100644 --- a/src/ts/tests/server/liveEndPoint.spec.ts +++ b/src/ts/tests/server/liveEndPoint.spec.ts @@ -99,7 +99,7 @@ describe('liveEndPoint', () => { const find = stubFind([{ _id: 'aaa' }, { _id: 'bbb' }]); return liveEndPoint.getAll() - .then(() => assert.calledWithMatch(find, { updatedAt: { $gt: new Date(0) } }, '_id name desc')); + .then(() => assert.calledWithMatch(find as any, { updatedAt: { $gt: new Date(0) } }, '_id name desc')); }); it('passes given timestamp to find method', () => { @@ -107,7 +107,7 @@ describe('liveEndPoint', () => { const find = stubFind([{ _id: 'aaa' }, { _id: 'bbb' }]); return liveEndPoint.getAll(timestamp) - .then(() => assert.calledWithMatch(find, { updatedAt: { $gt: new Date(timestamp) } }, '_id name desc')); + .then(() => assert.calledWithMatch(find as any, { updatedAt: { $gt: new Date(timestamp) } }, '_id name desc')); }); describe('if items exceed limit', () => { diff --git a/src/ts/tests/server/originUtils.spec.ts b/src/ts/tests/server/originUtils.spec.ts index fc1a613..17bb1c4 100644 --- a/src/ts/tests/server/originUtils.spec.ts +++ b/src/ts/tests/server/originUtils.spec.ts @@ -12,7 +12,7 @@ describe('originUtils', () => { beforeEach(() => { clock = useFakeTimers(); - update = stub(Account, 'update').returns({ exec: () => Promise.resolve() } as any); + update = stub(Account as any, 'update').returns({ exec: () => Promise.resolve() } as any); }); afterEach(() => { diff --git a/src/ts/tests/server/serverUtils.spec.ts b/src/ts/tests/server/serverUtils.spec.ts index ee70ee8..f288241 100644 --- a/src/ts/tests/server/serverUtils.spec.ts +++ b/src/ts/tests/server/serverUtils.spec.ts @@ -55,11 +55,11 @@ describe('serverUtils', () => { const id = genId(); expect(toPonyObject(character({ - _id: Types.ObjectId(id), + _id: new Types.ObjectId(id), name: 'foo', desc: 'aaa', info: 'info', - site: Types.ObjectId('000000000000000000000002'), + site: new Types.ObjectId('000000000000000000000002'), tag: 'tag', lastUsed: new Date(123), }))).eql({ @@ -79,7 +79,7 @@ describe('serverUtils', () => { const id = genId(); expect(toPonyObject(character({ - _id: Types.ObjectId(id), + _id: new Types.ObjectId(id), name: 'foo', }))).eql({ id: id, @@ -96,7 +96,7 @@ describe('serverUtils', () => { it('sets hide support field', () => { const output = toPonyObject(character({ - _id: Types.ObjectId(genId()), + _id: new Types.ObjectId(genId()), name: 'foo', flags: CharacterFlags.HideSupport, })); @@ -106,7 +106,7 @@ describe('serverUtils', () => { it('sets respawn at spawn field', () => { const output = toPonyObject(character({ - _id: Types.ObjectId(genId()), + _id: new Types.ObjectId(genId()), name: 'foo', flags: CharacterFlags.RespawnAtSpawn, })); @@ -124,11 +124,11 @@ describe('serverUtils', () => { const id = genId(); expect(toPonyObjectAdmin(character({ - _id: Types.ObjectId(id), + _id: new Types.ObjectId(id), name: 'foo', desc: 'aaa', info: 'info', - site: Types.ObjectId('000000000000000000000001'), + site: new Types.ObjectId('000000000000000000000001'), tag: 'tag', lastUsed: new Date(123), creator: 'foo bar', @@ -156,7 +156,7 @@ describe('serverUtils', () => { const id = genId(); expect(toSocialSite(auth({ - _id: Types.ObjectId(id), + _id: new Types.ObjectId(id), name: 'foo', provider: 'github', url: 'foo.com', diff --git a/src/ts/tests/server/services/supporterInvites.spec.ts b/src/ts/tests/server/services/supporterInvites.spec.ts index bf2f4d0..158506d 100644 --- a/src/ts/tests/server/services/supporterInvites.spec.ts +++ b/src/ts/tests/server/services/supporterInvites.spec.ts @@ -29,7 +29,6 @@ describe('SupporterInvitesService', () => { countDocuments: stub(), create: stub(), deleteOne: stub(), - deleteMany: stub(), updateMany: stub(), } as any; log = stub(); @@ -43,7 +42,7 @@ describe('SupporterInvitesService', () => { describe('getInvites()', () => { it('returns all invites from given client', async () => { const client = mockClient(); - model.find.withArgs({ source: client.account._id }).returns({ + model.find.withArgs({ source: client.account._id } as any).returns({ exec: stub().resolves([ { _id: 'foo', name: 'Foo', info: 'info', active: true, anotherField: 'xyz' }, ]) @@ -292,7 +291,7 @@ describe('SupporterInvitesService', () => { await service.uninvite(requester, 'foobar'); - assert.calledWithMatch(model.deleteOne, { _id: 'foobar', source: requester.account._id }); + assert.calledWithMatch(model.deleteOne as any, { _id: 'foobar', source: requester.account._id }); }); }); @@ -312,12 +311,12 @@ describe('SupporterInvitesService', () => { { _id: 'aaa', active: false, source: { supporter: SupporterFlags.Supporter1 } }, { _id: 'bbb', active: true, source: { supporter: SupporterFlags.Supporter1 } }, ]; - model.find.withArgs({}, '_id active') + model.find.withArgs({} as any, '_id active') .returns({ populate: stub().withArgs('source', '_id supporter patreon roles') .returns({ lean: stub().returns(exec(data)) }) } as any); - model.deleteMany.returns({ exec: stub() } as any); + model.deleteOne.returns({ exec: stub() } as any); model.updateMany.returns({ exec: stub() } as any); await updateSupporterInvites(model as any); @@ -331,7 +330,7 @@ describe('SupporterInvitesService', () => { { _id: 'bbb', active: true, source: {} }, ]; model.find.returns({ populate: stub().returns({ lean: stub().returns(exec(data)) }) } as any); - model.deleteMany.returns({ exec: stub() } as any); + model.deleteOne.returns({ exec: stub() } as any); model.updateMany.returns({ exec: stub() } as any); await updateSupporterInvites(model as any); @@ -345,7 +344,7 @@ describe('SupporterInvitesService', () => { { _id: 'bbb', active: true, source: {} }, ]; model.find.returns({ populate: stub().returns({ lean: stub().returns(exec(data)) }) } as any); - model.deleteMany.returns({ exec: stub() } as any); + model.deleteOne.returns({ exec: stub() } as any); model.updateMany.returns({ exec: stub() } as any); await updateSupporterInvites(model as any); @@ -360,7 +359,7 @@ describe('SupporterInvitesService', () => { { _id: 'bbb', active: false, source: {} }, ]; model.find.returns({ populate: stub().returns({ lean: stub().returns(exec(data)) }) } as any); - model.deleteMany.returns({ exec: stub() } as any); + model.deleteOne.returns({ exec: stub() } as any); model.updateMany.returns({ exec: stub() } as any); await updateSupporterInvites(model as any); @@ -370,12 +369,12 @@ describe('SupporterInvitesService', () => { it('removes old inactive entries', async () => { model.find.returns({ populate: stub().returns({ lean: stub().returns({ exec: stub() }) }) } as any); - model.deleteMany.returns({ exec: stub() } as any); + model.deleteOne.returns({ exec: stub() } as any); clock.setSystemTime(123 * DAY); await updateSupporterInvites(model as any); - assert.calledWithMatch(model.deleteMany, { active: false, updatedAt: { $lt: new Date(23 * DAY) } }); + assert.calledWithMatch(model.deleteOne as any, { active: false, updatedAt: { $lt: new Date(23 * DAY) } }); }); }); });