diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..76add87 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +node_modules +dist \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..fbd3c36 --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "env": { + "es2021": true, + "node": true + }, + "extends": "standard-with-typescript", + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module", + "project": [ + "./tsconfig.json" + ] + }, + "rules": { + "@typescript-eslint/no-misused-promises": "off", + "@typescript-eslint/explicit-function-return-type": 1 + } +} \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..56fd103 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "useTabs": false, + "endOfLine": "lf", + "tabWidth": 2 +} diff --git a/.swcrc b/.swcrc index 377811f..b057ffa 100644 --- a/.swcrc +++ b/.swcrc @@ -1,20 +1,17 @@ { - "jsc": { - "parser": { - "syntax": "typescript", - "tsx": false, - "decorators": true, - "dynamicImport": true - }, - "target": "es2020", - "baseUrl": "./" + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false, + "decorators": true, + "dynamicImport": true }, - "exclude": [ - "@types/", - "interfaces/" - ], - "module": { - "type": "commonjs" - }, - "minify": true -} \ No newline at end of file + "target": "es2020", + "baseUrl": "./" + }, + "exclude": ["@types/", "interfaces/"], + "module": { + "type": "commonjs" + }, + "minify": true +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ee8ccd3 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "json.schemaDownload.enable": true +} \ No newline at end of file diff --git a/README.md b/README.md index 1a052cb..eabddd9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,3 @@ - # Project Knedita An open-source social media. @@ -21,7 +20,6 @@ An open-source social media. - Image compression ✅ - Following/unfollowing features ✅ - Like posts ✅ -- Probably pinned posts - Authentication ✅ - Add more verification (like, if the password is too short) ✅ - Set display name ✅ diff --git a/docker-compose.db.yml b/docker-compose.db.yml index 3bdcded..5a7cbd7 100644 --- a/docker-compose.db.yml +++ b/docker-compose.db.yml @@ -11,7 +11,7 @@ services: - .env volumes: - postgres:/var/lib/postgresql/data - + redis: image: redis:alpine restart: unless-stopped @@ -24,4 +24,4 @@ services: volumes: postgres: - name: backend-db \ No newline at end of file + name: backend-db diff --git a/docker-compose.yml b/docker-compose.yml index f663386..555a22d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,7 @@ services: - .env volumes: - postgres:/var/lib/postgresql/data - + localstack: image: localstack/localstack container_name: localstack_main @@ -45,7 +45,7 @@ services: - .env volumes: - localstack:/data - - "/var/run/docker.sock:/var/run/docker.sock" + - '/var/run/docker.sock:/var/run/docker.sock' redis: image: redis:alpine @@ -62,4 +62,4 @@ volumes: name: backend-db redis: driver: local - localstack: \ No newline at end of file + localstack: diff --git a/package-lock.json b/package-lock.json index dc38dee..3ce55e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,16 +39,24 @@ "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@types/validator": "^13.7.17", - "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "^8.46.0", + "eslint-config-prettier": "^8.9.0", + "eslint-config-standard-with-typescript": "^37.0.0", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-n": "^16.0.1", + "eslint-plugin-promise": "^6.1.1", "jest": "^29.5.0", "nodemon": "^3.0.1", "pm2": "^4.2.3", + "prettier": "^3.0.0", "prisma": "^5.0.0", "supertest": "^6.3.3", "ts-jest": "^29.1.0", "ts-node-dev": "^2.0.0", - "ts-standard": "^12.0.2", - "typescript": "^5.1.3" + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.6" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -1738,21 +1746,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1768,9 +1778,10 @@ } }, "node_modules/@eslint/js": { - "version": "8.43.0", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -3681,13 +3692,15 @@ }, "node_modules/@types/json-schema": { "version": "7.0.12", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/jsonwebtoken": { "version": "9.0.2", @@ -3759,8 +3772,9 @@ }, "node_modules/@types/semver": { "version": "7.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, "node_modules/@types/send": { "version": "0.17.1", @@ -3832,16 +3846,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -3865,13 +3880,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -3891,12 +3907,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3907,12 +3924,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -3933,9 +3951,10 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3945,12 +3964,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3971,16 +3991,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3995,12 +4016,26 @@ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.60.0", + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.60.0", + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4039,8 +4074,9 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -4065,8 +4101,9 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4205,13 +4242,15 @@ }, "node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -4226,8 +4265,9 @@ }, "node_modules/array-includes": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4244,16 +4284,37 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4269,8 +4330,9 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4284,16 +4346,24 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, - "license": "MIT", "dependencies": { + "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/asap": { @@ -4881,8 +4951,9 @@ }, "node_modules/builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.0.0" } @@ -5493,8 +5564,9 @@ }, "node_modules/define-properties": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, - "license": "MIT", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -5597,8 +5669,9 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -5709,17 +5782,19 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -5739,14 +5814,18 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -5757,8 +5836,9 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -5770,16 +5850,18 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, - "license": "MIT", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -5889,26 +5971,27 @@ } }, "node_modules/eslint": { - "version": "8.43.0", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5918,7 +6001,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -5928,9 +6010,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -5943,8 +6024,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-prettier": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz", + "integrity": "sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, "node_modules/eslint-config-standard": { - "version": "17.0.0", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -5960,58 +6055,39 @@ "url": "https://feross.org/support" } ], - "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0" } }, - "node_modules/eslint-config-standard-jsx": { - "version": "11.0.0", - "dev": true, - "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", - "peerDependencies": { - "eslint": "^8.8.0", - "eslint-plugin-react": "^7.28.0" - } - }, "node_modules/eslint-config-standard-with-typescript": { - "version": "23.0.0", + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-37.0.0.tgz", + "integrity": "sha512-V8I/Q1eFf9tiOuFHkbksUdWO3p1crFmewecfBtRxXdnvb71BCJx+1xAknlIRZMwZioMX3/bPtMVCZsf1+AjjOw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint-config-standard": "17.0.0" + "@typescript-eslint/parser": "^5.52.0", + "eslint-config-standard": "17.1.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^5.52.0", "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0", "typescript": "*" } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.11.0", @@ -6020,16 +6096,18 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -6044,72 +6122,56 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", + "node_modules/eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" }, "engines": { - "node": ">=8.10.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" + "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.12.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -6120,16 +6182,18 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6137,6 +6201,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -6146,22 +6222,44 @@ "semver": "bin/semver.js" } }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, - "license": "MIT", "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "engines": { - "node": ">=12.22.0" + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -6172,8 +6270,9 @@ }, "node_modules/eslint-plugin-promise": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, - "license": "ISC", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -6181,130 +6280,11 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-scope": { - "version": "5.1.1", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6316,20 +6296,34 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { + "node_modules/eslint-scope/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/espree": { - "version": "9.5.2", + "node_modules/eslint-visitor-keys": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -6373,8 +6367,9 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -6384,8 +6379,9 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } @@ -6603,8 +6599,9 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-fifo": { "version": "1.3.0", @@ -6994,8 +6991,9 @@ }, "node_modules/function.prototype.name": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -7011,8 +7009,9 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7072,17 +7071,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "dev": true, @@ -7096,8 +7084,9 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -7174,8 +7163,9 @@ }, "node_modules/globals": { "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -7188,8 +7178,9 @@ }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -7202,8 +7193,9 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7258,11 +7250,6 @@ "dev": true, "license": "ISC" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" - }, "node_modules/graphemer": { "version": "1.4.0", "dev": true, @@ -7280,8 +7267,9 @@ }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7296,8 +7284,9 @@ }, "node_modules/has-property-descriptors": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -7454,8 +7443,9 @@ }, "node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -7467,8 +7457,9 @@ }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7524,8 +7515,9 @@ }, "node_modules/internal-slot": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -7588,8 +7580,9 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -7606,8 +7599,9 @@ }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -7628,8 +7622,9 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7664,8 +7659,9 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7726,8 +7722,9 @@ }, "node_modules/is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -7745,8 +7742,9 @@ }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7775,8 +7773,9 @@ }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -7790,8 +7789,9 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -7812,8 +7812,9 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -7826,8 +7827,9 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -7857,8 +7859,9 @@ }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -8504,8 +8507,9 @@ }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -8529,11 +8533,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "dev": true, @@ -8541,8 +8540,9 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -8588,18 +8588,6 @@ "npm": ">=6" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/jwa": { "version": "1.4.1", "license": "MIT", @@ -8667,17 +8655,6 @@ "dev": true, "license": "MIT" }, - "node_modules/load-json-file": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/locate-path": { "version": "6.0.0", "dev": true, @@ -8725,17 +8702,6 @@ "node": ">=0.8.6" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lowercase-keys": { "version": "2.0.0", "dev": true, @@ -9037,8 +9003,9 @@ }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, "node_modules/needle": { "version": "2.4.0", @@ -9266,16 +9233,18 @@ }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -9289,23 +9258,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/object.fromentries": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -9318,22 +9275,23 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.hasown": { - "version": "1.1.2", + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", "dev": true, - "license": "MIT", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" } }, "node_modules/object.values": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -9506,8 +9464,9 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -9573,8 +9532,9 @@ }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -9639,14 +9599,6 @@ } ] }, - "node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/pirates": { "version": "4.0.6", "dev": true, @@ -9655,97 +9607,6 @@ "node": ">= 6" } }, - "node_modules/pkg-conf": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^6.0.0", - "load-json-file": "^7.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/find-up": { - "version": "6.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/locate-path": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-limit": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/p-locate": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-conf/node_modules/path-exists": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-conf/node_modules/yocto-queue": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "dev": true, @@ -9987,6 +9848,21 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-format": { "version": "29.5.0", "dev": true, @@ -10052,21 +9928,6 @@ "node": ">= 6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "dev": true, - "license": "MIT" - }, "node_modules/proxy-addr": { "version": "2.0.7", "license": "MIT", @@ -10132,8 +9993,9 @@ }, "node_modules/punycode": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -10344,8 +10206,9 @@ }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -10358,17 +10221,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/require-directory": { "version": "2.1.1", "dev": true, @@ -10392,11 +10244,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", "dev": true, - "license": "MIT", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.12.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -10433,8 +10286,9 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -10521,14 +10375,39 @@ } ] }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.1.2", "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -10924,145 +10803,6 @@ "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" }, - "node_modules/standard-engine": { - "version": "15.1.0", - "dev": true, - "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", - "dependencies": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/standard-engine/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/load-json-file": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/standard-engine/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/pkg-conf": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/standard-engine/node_modules/type-fest": { - "version": "0.3.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=6" - } - }, "node_modules/statuses": { "version": "2.0.1", "license": "MIT", @@ -11145,28 +10885,11 @@ "node": ">=8" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trim": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11181,8 +10904,9 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11194,8 +10918,9 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -11635,34 +11360,6 @@ "rimraf": "bin.js" } }, - "node_modules/ts-standard": { - "version": "12.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^8.0.1", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-config-standard-with-typescript": "^23.0.0", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-react": "^7.28.0", - "minimist": "^1.2.6", - "pkg-conf": "^4.0.0", - "standard-engine": "^15.0.0" - }, - "bin": { - "ts-standard": "cli.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "typescript": "*" - } - }, "node_modules/tsconfig": { "version": "7.0.0", "dev": true, @@ -11675,31 +11372,24 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } @@ -11727,8 +11417,9 @@ }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -11780,8 +11471,9 @@ }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -11800,10 +11492,62 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -11819,9 +11563,10 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.1.3", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11832,8 +11577,9 @@ }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -11896,8 +11642,9 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } @@ -12046,8 +11793,9 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -12060,15 +11808,15 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "license": "MIT", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -12146,14 +11894,6 @@ } } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", @@ -13723,16 +13463,20 @@ } }, "@eslint-community/regexpp": { - "version": "4.5.1", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", "dev": true }, "@eslint/eslintrc": { - "version": "2.0.3", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -13742,7 +13486,9 @@ } }, "@eslint/js": { - "version": "8.43.0", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", "dev": true }, "@faker-js/faker": { @@ -15308,10 +15054,14 @@ }, "@types/json-schema": { "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/json5": { "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/jsonwebtoken": { @@ -15376,6 +15126,8 @@ }, "@types/semver": { "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/send": { @@ -15438,15 +15190,17 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/type-utils": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -15454,43 +15208,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/type-utils": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.60.0", - "@typescript-eslint/utils": "5.60.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/visitor-keys": "5.60.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15499,24 +15263,40 @@ } }, "@typescript-eslint/utils": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.60.0", - "@typescript-eslint/types": "5.60.0", - "@typescript-eslint/typescript-estree": "5.60.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" + }, + "dependencies": { + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + } } }, "@typescript-eslint/visitor-keys": { - "version": "5.60.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.60.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } }, @@ -15536,6 +15316,8 @@ }, "acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, @@ -15551,6 +15333,8 @@ }, "ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -15634,10 +15418,14 @@ }, "argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "array-buffer-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -15649,6 +15437,8 @@ }, "array-includes": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -15660,10 +15450,27 @@ }, "array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, "array.prototype.flat": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -15674,6 +15481,8 @@ }, "array.prototype.flatmap": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -15682,15 +15491,18 @@ "es-shim-unscopables": "^1.0.0" } }, - "array.prototype.tosorted": { - "version": "1.1.1", + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" } }, "asap": { @@ -16100,6 +15912,8 @@ }, "builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "requires": { "semver": "^7.0.0" @@ -16502,6 +16316,8 @@ }, "define-properties": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "requires": { "has-property-descriptors": "^1.0.0", @@ -16562,6 +16378,8 @@ }, "dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { "path-type": "^4.0.0" @@ -16637,16 +16455,19 @@ } }, "es-abstract": { - "version": "1.21.2", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -16666,18 +16487,24 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" } }, "es-set-tostringtag": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, "requires": { "get-intrinsic": "^1.1.3", @@ -16687,6 +16514,8 @@ }, "es-shim-unscopables": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, "requires": { "has": "^1.0.3" @@ -16694,6 +16523,8 @@ }, "es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -16767,25 +16598,27 @@ } }, "eslint": { - "version": "8.43.0", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.43.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -16795,7 +16628,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -16805,46 +16637,39 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "dev": true - } } }, - "eslint-config-standard": { - "version": "17.0.0", + "eslint-config-prettier": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz", + "integrity": "sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==", "dev": true, "requires": {} }, - "eslint-config-standard-jsx": { - "version": "11.0.0", + "eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "requires": {} }, "eslint-config-standard-with-typescript": { - "version": "23.0.0", + "version": "37.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-37.0.0.tgz", + "integrity": "sha512-V8I/Q1eFf9tiOuFHkbksUdWO3p1crFmewecfBtRxXdnvb71BCJx+1xAknlIRZMwZioMX3/bPtMVCZsf1+AjjOw==", "dev": true, "requires": { - "@typescript-eslint/parser": "^5.0.0", - "eslint-config-standard": "17.0.0" + "@typescript-eslint/parser": "^5.52.0", + "eslint-config-standard": "17.1.0" } }, "eslint-import-resolver-node": { "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, "requires": { "debug": "^3.2.7", @@ -16854,6 +16679,8 @@ "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -16863,6 +16690,8 @@ }, "eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -16870,6 +16699,8 @@ "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -16877,50 +16708,46 @@ } } }, - "eslint-plugin-es": { - "version": "4.1.0", + "eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", "dev": true, "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "dev": true - } + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" } }, "eslint-plugin-import": { - "version": "2.27.5", + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", "dev": true, "requires": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.12.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "dependencies": { "debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" @@ -16928,117 +16755,102 @@ }, "doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" } }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } } } }, "eslint-plugin-n": { - "version": "15.7.0", + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.1.tgz", + "integrity": "sha512-CDmHegJN0OF3L5cz5tATH84RPQm9kG+Yx39wIqIwPR2C0uhBGMWfbbOtetR83PQjjidA5aXMu+LEFw1jaSwvTA==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" } }, "eslint-plugin-promise": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", "dev": true, "requires": {} }, - "eslint-plugin-react": { - "version": "7.32.2", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "estraverse": { - "version": "5.3.0", - "dev": true - }, - "resolve": { - "version": "2.0.0-next.4", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - } - } - }, "eslint-scope": { - "version": "5.1.1", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" + "estraverse": "^5.2.0" }, "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "eslint-visitor-keys": { - "version": "3.4.1", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", "dev": true }, "espree": { - "version": "9.5.2", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } @@ -17062,6 +16874,8 @@ }, "esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" @@ -17069,6 +16883,8 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -17216,6 +17032,8 @@ }, "fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-fifo": { @@ -17483,6 +17301,8 @@ }, "function.prototype.name": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -17493,6 +17313,8 @@ }, "functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gauge": { @@ -17530,16 +17352,14 @@ "version": "0.1.0", "dev": true }, - "get-stdin": { - "version": "8.0.0", - "dev": true - }, "get-stream": { "version": "6.0.1", "dev": true }, "get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -17597,6 +17417,8 @@ }, "globals": { "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -17604,6 +17426,8 @@ }, "globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, "requires": { "define-properties": "^1.1.3" @@ -17611,6 +17435,8 @@ }, "globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -17648,10 +17474,6 @@ "version": "4.2.11", "dev": true }, - "grapheme-splitter": { - "version": "1.0.4", - "dev": true - }, "graphemer": { "version": "1.4.0", "dev": true @@ -17664,6 +17486,8 @@ }, "has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { @@ -17672,6 +17496,8 @@ }, "has-property-descriptors": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, "requires": { "get-intrinsic": "^1.1.1" @@ -17760,6 +17586,8 @@ }, "ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "ignore-by-default": { @@ -17768,6 +17596,8 @@ }, "import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -17801,6 +17631,8 @@ }, "internal-slot": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, "requires": { "get-intrinsic": "^1.2.0", @@ -17844,6 +17676,8 @@ }, "is-array-buffer": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -17857,6 +17691,8 @@ }, "is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, "requires": { "has-bigints": "^1.0.1" @@ -17871,6 +17707,8 @@ }, "is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -17889,6 +17727,8 @@ }, "is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -17922,6 +17762,8 @@ }, "is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { @@ -17930,6 +17772,8 @@ }, "is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -17945,6 +17789,8 @@ }, "is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -17953,6 +17799,8 @@ }, "is-shared-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, "requires": { "call-bind": "^1.0.2" @@ -17964,6 +17812,8 @@ }, "is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, "requires": { "has-tostringtag": "^1.0.0" @@ -17971,6 +17821,8 @@ }, "is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { "has-symbols": "^1.0.2" @@ -17988,6 +17840,8 @@ }, "is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "requires": { "call-bind": "^1.0.2" @@ -18448,6 +18302,8 @@ }, "js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "requires": { "argparse": "^2.0.1" @@ -18461,16 +18317,14 @@ "version": "3.0.1", "dev": true }, - "json-parse-better-errors": { - "version": "1.0.2", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "dev": true }, "json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { @@ -18503,14 +18357,6 @@ "semver": "^7.3.8" } }, - "jsx-ast-utils": { - "version": "3.3.3", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, "jwa": { "version": "1.4.1", "requires": { @@ -18559,10 +18405,6 @@ "version": "1.2.4", "dev": true }, - "load-json-file": { - "version": "7.0.1", - "dev": true - }, "locate-path": { "version": "6.0.0", "dev": true, @@ -18597,13 +18439,6 @@ "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, "lowercase-keys": { "version": "2.0.0", "dev": true @@ -18803,6 +18638,8 @@ }, "natural-compare-lite": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "needle": { @@ -18951,10 +18788,14 @@ }, "object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -18963,17 +18804,10 @@ "object-keys": "^1.1.1" } }, - "object.entries": { - "version": "1.1.6", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, "object.fromentries": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -18981,16 +18815,22 @@ "es-abstract": "^1.20.4" } }, - "object.hasown": { - "version": "1.1.2", + "object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", "dev": true, "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" } }, "object.values": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -19103,6 +18943,8 @@ }, "parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -19141,6 +18983,8 @@ }, "path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, "peek-readable": { @@ -19172,61 +19016,10 @@ } } }, - "pify": { - "version": "4.0.1", - "dev": true - }, "pirates": { "version": "4.0.6", "dev": true }, - "pkg-conf": { - "version": "4.0.0", - "dev": true, - "requires": { - "find-up": "^6.0.0", - "load-json-file": "^7.0.0" - }, - "dependencies": { - "find-up": { - "version": "6.3.0", - "dev": true, - "requires": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - } - }, - "locate-path": { - "version": "7.2.0", - "dev": true, - "requires": { - "p-locate": "^6.0.0" - } - }, - "p-limit": { - "version": "4.0.0", - "dev": true, - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "p-locate": { - "version": "6.0.0", - "dev": true, - "requires": { - "p-limit": "^4.0.0" - } - }, - "path-exists": { - "version": "5.0.0", - "dev": true - }, - "yocto-queue": { - "version": "1.0.0", - "dev": true - } - } - }, "pkg-dir": { "version": "4.2.0", "dev": true, @@ -19416,6 +19209,12 @@ "version": "1.2.1", "dev": true }, + "prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "dev": true + }, "pretty-format": { "version": "29.5.0", "dev": true, @@ -19460,21 +19259,6 @@ "sisteransi": "^1.0.5" } }, - "prop-types": { - "version": "15.8.1", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "dev": true - } - } - }, "proxy-addr": { "version": "2.0.7", "requires": { @@ -19527,6 +19311,8 @@ }, "punycode": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, "pure-rand": { @@ -19645,6 +19431,8 @@ }, "regexp.prototype.flags": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -19652,10 +19440,6 @@ "functions-have-names": "^1.2.3" } }, - "regexpp": { - "version": "3.2.0", - "dev": true - }, "require-directory": { "version": "2.1.1", "dev": true @@ -19672,10 +19456,12 @@ } }, "resolve": { - "version": "1.22.2", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", "dev": true, "requires": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.12.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -19699,6 +19485,8 @@ }, "resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve.exports": { @@ -19734,11 +19522,33 @@ "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", "dev": true }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "safe-buffer": { "version": "5.1.2" }, "safe-regex-test": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20019,86 +19829,6 @@ "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" }, - "standard-engine": { - "version": "15.1.0", - "dev": true, - "requires": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.6", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "load-json-file": { - "version": "5.3.0", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - } - }, - "locate-path": { - "version": "3.0.0", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "dev": true - }, - "pkg-conf": { - "version": "3.1.0", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "dev": true - }, - "type-fest": { - "version": "0.3.1", - "dev": true - } - } - }, "statuses": { "version": "2.0.1" }, @@ -20152,22 +19882,10 @@ "strip-ansi": "^6.0.1" } }, - "string.prototype.matchall": { - "version": "4.0.8", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - } - }, "string.prototype.trim": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20177,6 +19895,8 @@ }, "string.prototype.trimend": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20186,6 +19906,8 @@ }, "string.prototype.trimstart": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20442,24 +20164,6 @@ } } }, - "ts-standard": { - "version": "12.0.2", - "dev": true, - "requires": { - "@typescript-eslint/eslint-plugin": "^5.0.0", - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^8.0.1", - "eslint-config-standard-jsx": "^11.0.0", - "eslint-config-standard-with-typescript": "^23.0.0", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-react": "^7.28.0", - "minimist": "^1.2.6", - "pkg-conf": "^4.0.0", - "standard-engine": "^15.0.0" - } - }, "tsconfig": { "version": "7.0.0", "dev": true, @@ -20481,24 +20185,20 @@ } }, "tsconfig-paths": { - "version": "3.14.2", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { - "json5": { - "version": "1.0.2", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } @@ -20509,6 +20209,8 @@ }, "tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -20541,6 +20243,8 @@ }, "type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "type-is": { @@ -20550,8 +20254,46 @@ "mime-types": "~2.1.24" } }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20565,11 +20307,15 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "typescript": { - "version": "5.1.3", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true }, "unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "requires": { "call-bind": "^1.0.2", @@ -20601,6 +20347,8 @@ }, "uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -20720,6 +20468,8 @@ }, "which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, "requires": { "is-bigint": "^1.0.1", @@ -20730,14 +20480,15 @@ } }, "which-typed-array": { - "version": "1.1.9", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "wide-align": { @@ -20779,10 +20530,6 @@ "dev": true, "requires": {} }, - "xdg-basedir": { - "version": "4.0.0", - "dev": true - }, "xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", diff --git a/package.json b/package.json index 1f12f83..05486ad 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,12 @@ "description": "A social media", "scripts": { "build": "swc src -d dist", - "dev:start": "ts-node-dev --transpile-only --respawn src/server.ts", + "dev:start": "ts-node-dev -r tsconfig-paths/register --transpile-only --respawn src/server.ts", "docker": "docker compose up -d", "docker:build": "docker build -t api . && docker compose up -d", "docker:db": "docker compose -f docker-compose.db.yml up -d", "docker:seed": "docker exec -it api npm run prisma:seed", + "lint": "eslint --ignore-path .eslintignore --ext .js,.ts .", "migrate:dev": "prisma migrate dev", "migrate:dev:create": "prisma migrate dev --create-only", "migrate:reset": "prisma migrate reset", @@ -43,16 +44,24 @@ "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@types/validator": "^13.7.17", - "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "^8.46.0", + "eslint-config-prettier": "^8.9.0", + "eslint-config-standard-with-typescript": "^37.0.0", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-n": "^16.0.1", + "eslint-plugin-promise": "^6.1.1", "jest": "^29.5.0", "nodemon": "^3.0.1", "pm2": "^4.2.3", + "prettier": "^3.0.0", "prisma": "^5.0.0", "supertest": "^6.3.3", "ts-jest": "^29.1.0", "ts-node-dev": "^2.0.0", - "ts-standard": "^12.0.2", - "typescript": "^5.1.3" + "tsconfig-paths": "^4.2.0", + "typescript": "^5.1.6" }, "dependencies": { "@prisma/client": "^5.0.0", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index df8ae8e..72da87a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -45,6 +45,8 @@ model PostLike { createdAt DateTime @default(now()) } +// I should join these two up? Yeah, but I will not do it since it didn't work on the first time. + model CommentLike { id String @id @default(uuid()) commentId String diff --git a/src/clients/redis-client.ts b/src/clients/redis-client.ts index f1f62ff..e759369 100644 --- a/src/clients/redis-client.ts +++ b/src/clients/redis-client.ts @@ -4,6 +4,8 @@ const redisPassword = process.env.REDIS_PASSWORD ?? '' const redisHost = process.env.REDIS_HOST ?? '' const redisPort = process.env.REDIS_PORT ?? '' -const redis = new RedisClient(`redis://:${redisPassword}@${redisHost}:${redisPort}/0`) +const redis = new RedisClient( + `redis://:${redisPassword}@${redisHost}:${redisPort}/0` +) export default redis diff --git a/src/config/multer.ts b/src/config/multer.ts index f3788e7..df317b3 100644 --- a/src/config/multer.ts +++ b/src/config/multer.ts @@ -1,7 +1,7 @@ import multer from 'multer' -import { Request } from 'express' +import { type Request } from 'express' import path from 'path' -import s3 from '../clients/s3-client' +import s3 from 'clients/s3-client' import multerS3 from 'multer-s3' const tempFolder = path.resolve(__dirname, '..', '..', 'temp', 'uploads') @@ -18,7 +18,7 @@ const storageTypes = { const fileName: string = `${folder}/${req.user!.id}.webp` callback(null, fileName) - } + }, }), s3: multerS3({ @@ -37,21 +37,22 @@ const storageTypes = { const fileName: string = `${folder}/${req.user!.id}.jpg` callback(null, fileName) - } - }) + }, + }), } const multerConfig = { dest: tempFolder, storage: storageTypes.s3, limits: { - fileSize: 15 * 1024 * 1024 // 1mb + fileSize: 15 * 1024 * 1024, // 1mb }, - fileFilter: (req: Request, file: Express.Multer.File, callback: multer.FileFilterCallback) => { - const allowedMimes = [ - 'image/jpeg', - 'image/png' - ] + fileFilter: ( + req: Request, + file: Express.Multer.File, + callback: multer.FileFilterCallback, + ) => { + const allowedMimes = ['image/jpeg', 'image/png'] if (allowedMimes.includes(file.mimetype)) { callback(null, true) diff --git a/src/controllers/comments-router.ts b/src/controllers/comments-router.ts index 96404b8..c1eea9f 100644 --- a/src/controllers/comments-router.ts +++ b/src/controllers/comments-router.ts @@ -1,11 +1,10 @@ -/* eslint-disable @typescript-eslint/no-misused-promises */ import { Router } from 'express' // Controllers import comments from './comments' // Middlewares -import authenticated from '../middlewares/authenticated' +import authenticated from 'middlewares/authenticated' const commentsRouter = Router() diff --git a/src/controllers/comments/create.ts b/src/controllers/comments/create.ts index 2565bce..01217e5 100644 --- a/src/controllers/comments/create.ts +++ b/src/controllers/comments/create.ts @@ -1,23 +1,26 @@ -import comment from '../../services/comments' +import comment from 'services/comments' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function commentCreateController (req: Request, res: Response): Promise { +async function commentCreateController ( + req: Request, + res: Response +): Promise { const { content, postId } = req.body const id = req.user?.id ?? '' if (postId === undefined) { - return badRequest(res, 'Expected post id') + badRequest(res, 'Expected post id'); return } if (content === undefined) { - return badRequest(res, 'Expected comment content') + badRequest(res, 'Expected comment content'); return } const result = await comment.create(postId, content, id) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/comments/delete.ts b/src/controllers/comments/delete.ts index 0358b83..32f7b86 100644 --- a/src/controllers/comments/delete.ts +++ b/src/controllers/comments/delete.ts @@ -1,19 +1,22 @@ -import comment from '../../services/comments' +import comment from 'services/comments' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function commentDeleteController (req: Request, res: Response): Promise { +async function commentDeleteController ( + req: Request, + res: Response +): Promise { const { commentId } = req.body const id = req.user?.id ?? '' if (commentId === undefined) { - return badRequest(res, 'Expected comment id') + badRequest(res, 'Expected comment id'); return } const result = await comment.delete(commentId, id) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/comments/fetch-info.ts b/src/controllers/comments/fetch-info.ts index 73b1a04..059229a 100644 --- a/src/controllers/comments/fetch-info.ts +++ b/src/controllers/comments/fetch-info.ts @@ -1,18 +1,21 @@ -import comment from '../../services/comments' +import comment from 'services/comments' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function commentFetchController (req: Request, res: Response): Promise { +async function commentFetchController ( + req: Request, + res: Response +): Promise { const commentId = req.query.id as string if (commentId === undefined) { - return badRequest(res, 'Expected comment id') + badRequest(res, 'Expected comment id'); return } const result = await comment.fetch(commentId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/comments/fetch-likes.ts b/src/controllers/comments/fetch-likes.ts index a2b95e2..19fcc01 100644 --- a/src/controllers/comments/fetch-likes.ts +++ b/src/controllers/comments/fetch-likes.ts @@ -1,18 +1,21 @@ -import comment from '../../services/comments' +import comment from 'services/comments' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function commentFetchLikesController (req: Request, res: Response): Promise { +async function commentFetchLikesController ( + req: Request, + res: Response +): Promise { const commentId = req.query.id as string if (commentId === undefined) { - return badRequest(res, 'Expected comment id') + badRequest(res, 'Expected comment id'); return } const result = await comment.fetchLikes(commentId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/comments/update.ts b/src/controllers/comments/update.ts index 88e9045..1ca3bb2 100644 --- a/src/controllers/comments/update.ts +++ b/src/controllers/comments/update.ts @@ -1,23 +1,26 @@ -import comment from '../../services/comments' +import comment from 'services/comments' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function commentUpdateController (req: Request, res: Response): Promise { +async function commentUpdateController ( + req: Request, + res: Response +): Promise { const { commentId, content } = req.body const id = req.user?.id ?? '' if (commentId === undefined) { - return badRequest(res, 'Expected comment content') + badRequest(res, 'Expected comment content'); return } if (content === undefined) { - return badRequest(res, 'Expected content to update') + badRequest(res, 'Expected content to update'); return } const result = await comment.update(content, id, commentId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/posts-router.ts b/src/controllers/posts-router.ts index aec334d..f068433 100644 --- a/src/controllers/posts-router.ts +++ b/src/controllers/posts-router.ts @@ -1,11 +1,10 @@ -/* eslint-disable @typescript-eslint/no-misused-promises */ import { Router } from 'express' // Controllers import post from './posts' // Middlewares -import authenticated from '../middlewares/authenticated' +import authenticated from 'middlewares/authenticated' const postsRouter = Router() diff --git a/src/controllers/posts/create.ts b/src/controllers/posts/create.ts index 35ca6ad..665bc56 100644 --- a/src/controllers/posts/create.ts +++ b/src/controllers/posts/create.ts @@ -1,19 +1,22 @@ -import post from '../../services/posts' +import post from 'services/posts' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function postCreateController (req: Request, res: Response): Promise { +async function postCreateController ( + req: Request, + res: Response +): Promise { const { content } = req.body const id: string = req.user?.id ?? '' if (content === undefined) { - return badRequest(res, 'Expected post content') + badRequest(res, 'Expected post content'); return } const result = await post.create(content, id) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/posts/delete.ts b/src/controllers/posts/delete.ts index f2347af..4329827 100644 --- a/src/controllers/posts/delete.ts +++ b/src/controllers/posts/delete.ts @@ -1,15 +1,18 @@ -import post from '../../services/posts' +import post from 'services/posts' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function postDeleteController (req: Request, res: Response): Promise { +async function postDeleteController ( + req: Request, + res: Response +): Promise { const userId = req.user?.id ?? '' const postId = req.body.postId const result = await post.delete(postId, userId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/posts/fetch-info.ts b/src/controllers/posts/fetch-info.ts index 648cca4..eda3275 100644 --- a/src/controllers/posts/fetch-info.ts +++ b/src/controllers/posts/fetch-info.ts @@ -1,18 +1,21 @@ -import post from '../../services/posts' +import post from 'services/posts' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function postFetchInfoController (req: Request, res: Response): Promise { +async function postFetchInfoController ( + req: Request, + res: Response +): Promise { const id = req.query.id as string if (id === undefined) { - return badRequest(res, 'Missing post id') + badRequest(res, 'Missing post id'); return } const result = await post.fetch(id) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/posts/fetch-likes.ts b/src/controllers/posts/fetch-likes.ts index e44acac..4c35daf 100644 --- a/src/controllers/posts/fetch-likes.ts +++ b/src/controllers/posts/fetch-likes.ts @@ -1,18 +1,21 @@ -import post from '../../services/posts' +import post from 'services/posts' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function postFetchLikesController (req: Request, res: Response): Promise { +async function postFetchLikesController ( + req: Request, + res: Response +): Promise { const id = req.query.id as string if (id === undefined) { - return badRequest(res, 'Missing post id') + badRequest(res, 'Missing post id'); return } const result = await post.fetchLikes(id) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/posts/update.ts b/src/controllers/posts/update.ts index fcca44a..ae18caf 100644 --- a/src/controllers/posts/update.ts +++ b/src/controllers/posts/update.ts @@ -1,15 +1,18 @@ -import post from '../../services/posts' +import post from 'services/posts' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function postUpdateController (req: Request, res: Response): Promise { +async function postUpdateController ( + req: Request, + res: Response +): Promise { const { postId, content } = req.body const userId = req.user?.id ?? '' const result = await post.update(postId, content, userId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users-router.ts b/src/controllers/users-router.ts index a144f51..4ed6242 100644 --- a/src/controllers/users-router.ts +++ b/src/controllers/users-router.ts @@ -1,12 +1,11 @@ -/* eslint-disable @typescript-eslint/no-misused-promises */ import { Router } from 'express' // Controllers import user from './users' // Middlewares -import authenticated from '../middlewares/authenticated' -import uploadFile from '../middlewares/upload-image' +import authenticated from 'middlewares/authenticated' +import uploadFile from 'middlewares/upload-image' const usersRouter = Router() @@ -24,7 +23,12 @@ usersRouter.post('/like-post', authenticated, user.likePost) usersRouter.post('/signup', user.signup) // PUT -usersRouter.put('/profile-picture/upload', authenticated, uploadFile, user.uploadPicture) +usersRouter.put( + '/profile-picture/upload', + authenticated, + uploadFile, + user.uploadPicture +) usersRouter.put('/update', authenticated, user.update) export default usersRouter diff --git a/src/controllers/users/auth.ts b/src/controllers/users/auth.ts index 8f6cda8..b788b26 100644 --- a/src/controllers/users/auth.ts +++ b/src/controllers/users/auth.ts @@ -1,14 +1,14 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' async function userAuthController (req: Request, res: Response): Promise { const { email, password } = req.body - const result = await user.auth(email, password) + const result = await user.auth({ email, password }) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/delete.ts b/src/controllers/users/delete.ts index d2190ce..63c5211 100644 --- a/src/controllers/users/delete.ts +++ b/src/controllers/users/delete.ts @@ -1,13 +1,16 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userDeleteController (req: Request, res: Response): Promise { +async function userDeleteController ( + req: Request, + res: Response +): Promise { const userId = req.user?.id ?? '' const result = await user.delete(userId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/fetch-info.ts b/src/controllers/users/fetch-info.ts index 5c2515c..c9fe709 100644 --- a/src/controllers/users/fetch-info.ts +++ b/src/controllers/users/fetch-info.ts @@ -1,18 +1,21 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userFetchInfoController (req: Request, res: Response): Promise { +async function userFetchInfoController ( + req: Request, + res: Response +): Promise { const username = req.query.u as string if (username === undefined) { - return badRequest(res, 'Missing username') + badRequest(res, 'Missing username'); return } const result = await user.fetchInfo(username.toLowerCase()) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/fetch-posts.ts b/src/controllers/users/fetch-posts.ts index fee957c..ca4dea0 100644 --- a/src/controllers/users/fetch-posts.ts +++ b/src/controllers/users/fetch-posts.ts @@ -1,12 +1,15 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userFetchPostsController (req: Request, res: Response): Promise { +async function userFetchPostsController ( + req: Request, + res: Response +): Promise { const username = req.query.u as string if (username === undefined) { - return badRequest(res, 'Missing username') + badRequest(res, 'Missing username'); return } const result = await user.fetchPosts(username) diff --git a/src/controllers/users/follow-user.ts b/src/controllers/users/follow-user.ts index c61ed76..a089b3d 100644 --- a/src/controllers/users/follow-user.ts +++ b/src/controllers/users/follow-user.ts @@ -1,15 +1,18 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userFollowController (req: Request, res: Response): Promise { +async function userFollowController ( + req: Request, + res: Response +): Promise { const userId = req.user?.id ?? '' const { userToFollow } = req.body const result = await user.follow(userId, userToFollow) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/like-comment.ts b/src/controllers/users/like-comment.ts index 64d1922..79fcd41 100644 --- a/src/controllers/users/like-comment.ts +++ b/src/controllers/users/like-comment.ts @@ -1,15 +1,18 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userLikeCommentController (req: Request, res: Response): Promise { +async function userLikeCommentController ( + req: Request, + res: Response +): Promise { const userId = req.user?.id ?? '' - const { commentId, postId } = req.body + const { commentId } = req.body - const result = await user.likeComment(postId, commentId, userId) + const result = await user.likeComment(commentId, userId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/like-post.ts b/src/controllers/users/like-post.ts index 9c8971e..2d72de1 100644 --- a/src/controllers/users/like-post.ts +++ b/src/controllers/users/like-post.ts @@ -1,15 +1,18 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userLikePostController (req: Request, res: Response): Promise { +async function userLikePostController ( + req: Request, + res: Response +): Promise { const userId = req.user?.id ?? '' const { postId } = req.body const result = await user.likePost(postId, userId) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/search-user.ts b/src/controllers/users/search-user.ts index d52cfae..2224457 100644 --- a/src/controllers/users/search-user.ts +++ b/src/controllers/users/search-user.ts @@ -1,12 +1,15 @@ -import user from '../../services/users' -import { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import user from 'services/users' +import type { Request, Response } from 'express' +import { badRequest } from 'lib/http-errors' -async function userSearchController (req: Request, res: Response): Promise { +async function userSearchController ( + req: Request, + res: Response +): Promise { const username = req.query.u as string if (username === undefined) { - return badRequest(res, 'Missing username') + badRequest(res, 'Missing username'); return } const result = await user.searchUser(username) diff --git a/src/controllers/users/signup.ts b/src/controllers/users/signup.ts index 90f0622..cbd68c2 100644 --- a/src/controllers/users/signup.ts +++ b/src/controllers/users/signup.ts @@ -1,14 +1,17 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userSignupController (req: Request, res: Response): Promise { +async function userSignupController ( + req: Request, + res: Response +): Promise { const { username, email, password } = req.body - const result = await user.signup(username, email, password) + const result = await user.signup({ username, email, password }) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/update.ts b/src/controllers/users/update.ts index 900f1f4..2d4f6a6 100644 --- a/src/controllers/users/update.ts +++ b/src/controllers/users/update.ts @@ -1,15 +1,18 @@ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' -async function userUpdateController (req: Request, res: Response): Promise { +async function userUpdateController ( + req: Request, + res: Response +): Promise { const { email, displayName, username } = req.body const id = req.user?.id ?? '' const result = await user.update({ id, email, displayName, username }) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/controllers/users/upload-picture.ts b/src/controllers/users/upload-picture.ts index ae51eca..3b8a736 100644 --- a/src/controllers/users/upload-picture.ts +++ b/src/controllers/users/upload-picture.ts @@ -1,13 +1,16 @@ /* eslint-disable @typescript-eslint/restrict-template-expressions */ -import user from '../../services/users' +import user from 'services/users' import type { Request, Response } from 'express' -import { badRequest } from '../../lib/http-errors' +import { badRequest } from 'lib/http-errors' let url -async function userUploadPictureController (req: Request, res: Response): Promise { +async function userUploadPictureController ( + req: Request, + res: Response +): Promise { if (req.file === undefined) { - return badRequest(res, 'Expected a JPG or PNG file') + badRequest(res, 'Expected a JPG or PNG file'); return } const userId = req.user?.id ?? '' @@ -23,7 +26,7 @@ async function userUploadPictureController (req: Request, res: Response): Promis const result = await user.uploadPicture(userId, url) if (result instanceof Error) { - return badRequest(res, result.message) + badRequest(res, result.message); return } res.json(result) diff --git a/src/interfaces/user.ts b/src/interfaces/user.ts index 8c79438..8b2598a 100644 --- a/src/interfaces/user.ts +++ b/src/interfaces/user.ts @@ -2,8 +2,8 @@ interface userPayload { id?: string displayName?: string | null username?: string - password?: string email?: string + password?: string token?: string } diff --git a/src/lib/compress-image.ts b/src/lib/compress-image.ts index 4d02e10..c614ec9 100644 --- a/src/lib/compress-image.ts +++ b/src/lib/compress-image.ts @@ -1,17 +1,26 @@ import sharp from 'sharp' -import s3 from '../clients/s3-client' +import s3 from 'clients/s3-client' import { GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3' -export default async function compressImage (imageName: string): Promise { +export default async function compressImage ( + imageName: string, + isProfilePicture: string +): Promise> { // Get file from s3 - const { Body } = await s3.send(new GetObjectCommand({ - Bucket: process.env.AWS_BUCKET ?? '', - Key: imageName - })) + const { Body } = await s3.send( + new GetObjectCommand({ + Bucket: process.env.AWS_BUCKET ?? '', + Key: imageName + }) + ) const imageBuffer = await Body?.transformToByteArray() const compressedImageBuffer = await sharp(imageBuffer) + .resize( + isProfilePicture === 'true' ? 200 : undefined, + isProfilePicture === 'true' ? 200 : undefined + ) .jpeg({ quality: 65 }) .toBuffer() diff --git a/src/lib/create-notification.ts b/src/lib/create-notification.ts new file mode 100644 index 0000000..61aca7a --- /dev/null +++ b/src/lib/create-notification.ts @@ -0,0 +1,29 @@ +import { type NotificationType } from '@prisma/client' +import prisma from 'clients/prisma-client' + +export default async function createNotification ( + fromUserId: string, + toUserId: string, + content: string, + type: NotificationType +): Promise | Error> { + await prisma.notifications.create({ + data: { + type, + fromUserId, + toUserId, + content + }, + include: { + fromUser: { + select: { + id: true, + displayName: true, + username: true, + profileImage: true + } + } + } + }) + return {} +} diff --git a/src/lib/http-errors.ts b/src/lib/http-errors.ts index 9c0cdf4..bd79b9d 100644 --- a/src/lib/http-errors.ts +++ b/src/lib/http-errors.ts @@ -1,6 +1,10 @@ -import { Response } from 'express' +import { type Response } from 'express' -const sendErrorResponse = (res: Response, status: number, message: string): void => { +const sendErrorResponse = ( + res: Response, + status: number, + message: string +): void => { res.status(status).json({ error: message }) } @@ -16,6 +20,9 @@ export const forbidden = (res: Response, message = 'Forbidden'): void => { sendErrorResponse(res, 403, message) } -export const internalServerError = (res: Response, message = 'Internal Server Error'): void => { +export const internalServerError = ( + res: Response, + message = 'Internal Server Error' +): void => { sendErrorResponse(res, 500, message) } diff --git a/src/middlewares/authenticated.ts b/src/middlewares/authenticated.ts index cc6b41f..87cdd71 100644 --- a/src/middlewares/authenticated.ts +++ b/src/middlewares/authenticated.ts @@ -1,29 +1,38 @@ import { verify } from 'jsonwebtoken' -import prisma from '../clients/prisma-client' +import prisma from 'clients/prisma-client' import type { Response, Request, NextFunction } from 'express' -import jwtPayload from '../interfaces/jwt' -import { unauthorized } from '../lib/http-errors' +import type jwtPayload from 'interfaces/jwt' +import { unauthorized } from 'lib/http-errors' -async function authenticated (req: Request, res: Response, next: NextFunction): Promise { - if (req.headers.authorization === undefined || req.headers.authorization.length === 0) { - return unauthorized(res, 'Missing token') +async function authenticated ( + req: Request, + res: Response, + next: NextFunction +): Promise { + if ( + req.headers.authorization === undefined || + req.headers.authorization.length === 0 + ) { + unauthorized(res, 'Missing token'); return } const token = req.headers.authorization.split(' ')[1] try { - const decoded = await new Promise((resolve, reject) => { - verify(token, process.env.JWT_ACCESS_SECRET ?? '', (error, decoded) => { - if (error != null) { - reject(error) - } else { - resolve(decoded as jwtPayload) - } - }) - }) + const decoded = await new Promise( + (resolve, reject) => { + verify(token, process.env.JWT_ACCESS_SECRET ?? '', (error, decoded) => { + if (error != null) { + reject(error) + } else { + resolve(decoded as jwtPayload) + } + }) + } + ) if (decoded == null) { - return unauthorized(res, 'Invalid token') + unauthorized(res, 'Invalid token'); return } const user = await prisma.user.findFirst({ @@ -33,12 +42,12 @@ async function authenticated (req: Request, res: Response, next: NextFunction): }) if (user == null) { - return unauthorized(res, 'User does not exists') + unauthorized(res, 'User does not exists'); return } req.user = decoded - return next() + next() } catch (error) { unauthorized(res, `JWT Error: ${(error as Error).message}`) } diff --git a/src/middlewares/rate-limit.ts b/src/middlewares/rate-limit.ts index e1a4af4..844bb85 100644 --- a/src/middlewares/rate-limit.ts +++ b/src/middlewares/rate-limit.ts @@ -1,6 +1,6 @@ import rateLimit from 'express-rate-limit' import RedisStore from 'rate-limit-redis' -import redis from '../clients/redis-client' +import redis from 'clients/redis-client' let maxConnections diff --git a/src/middlewares/upload-image.ts b/src/middlewares/upload-image.ts index 513ae22..0a72ac6 100644 --- a/src/middlewares/upload-image.ts +++ b/src/middlewares/upload-image.ts @@ -1,29 +1,30 @@ -/* eslint-disable @typescript-eslint/no-misused-promises */ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ import type { Response, Request, NextFunction } from 'express' import multer from 'multer' -import multerConfig from '../config/multer' -import compressImage from '../lib/compress-image' -import { badRequest } from '../lib/http-errors' +import multerConfig from 'config/multer' +import compressImage from 'lib/compress-image' +import { badRequest } from 'lib/http-errors' function uploadImage (req: Request, res: Response, next: NextFunction) { const upload = multer(multerConfig).single('image') upload(req, res, async (cb: multer.MulterError | Error | any) => { if (req.user == null) { - return badRequest(res, 'You must be logged in to upload a profile picture') + badRequest( + res, + 'You must be logged in to upload a profile picture' + ); return } if (cb instanceof multer.MulterError || cb instanceof Error) { - return badRequest(res, cb.message) + badRequest(res, cb.message); return } if (req.file === undefined) { - return badRequest(res, 'Expected file') + badRequest(res, 'Expected file'); return } // @ts-expect-error property `key` does not exists in types - await compressImage(req.file?.key) + await compressImage(req.file?.key, req.body.isProfilePicture) next() }) diff --git a/src/services/comments/create.ts b/src/services/comments/create.ts index c77725a..96b2de4 100644 --- a/src/services/comments/create.ts +++ b/src/services/comments/create.ts @@ -1,6 +1,10 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function commentCreateService (postId: string, content: string, authorId: string): Promise { +async function commentCreateService ( + postId: string, + content: string, + authorId: string +): Promise | Error> { const post = await prisma.post.findFirst({ where: { id: postId diff --git a/src/services/comments/delete.ts b/src/services/comments/delete.ts index 6c53f26..204a16f 100644 --- a/src/services/comments/delete.ts +++ b/src/services/comments/delete.ts @@ -1,6 +1,9 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function commentDeleteService (commentId: string, authorId: string): Promise { +async function commentDeleteService ( + commentId: string, + authorId: string +): Promise | Error> { const user = await prisma.user.findFirst({ where: { id: authorId diff --git a/src/services/comments/fetch-info.ts b/src/services/comments/fetch-info.ts index 577825a..d89f9b2 100644 --- a/src/services/comments/fetch-info.ts +++ b/src/services/comments/fetch-info.ts @@ -1,6 +1,6 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function commentFetchService (commentId: string): Promise { +async function commentFetchService (commentId: string): Promise | Error> { const comment = await prisma.comments.findFirst({ where: { id: commentId diff --git a/src/services/comments/fetch-likes.ts b/src/services/comments/fetch-likes.ts index 80986fe..989474e 100644 --- a/src/services/comments/fetch-likes.ts +++ b/src/services/comments/fetch-likes.ts @@ -1,6 +1,6 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function commentFetchLikesService (id: string): Promise { +async function commentFetchLikesService (id: string): Promise { const post = await prisma.commentLike.findMany({ where: { commentId: id diff --git a/src/services/comments/update.ts b/src/services/comments/update.ts index 2df3a71..f5b3b18 100644 --- a/src/services/comments/update.ts +++ b/src/services/comments/update.ts @@ -1,6 +1,10 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function commentUpdateService (content: string, authorId: string, commentId: string): Promise { +async function commentUpdateService ( + content: string, + authorId: string, + commentId: string +): Promise | Error> { const comment = await prisma.comments.findFirst({ where: { id: commentId, diff --git a/src/services/posts/create.ts b/src/services/posts/create.ts index c971e14..97431cd 100644 --- a/src/services/posts/create.ts +++ b/src/services/posts/create.ts @@ -1,10 +1,13 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function postCreateService (content: string, authorId: string): Promise { +async function postCreateService ( + content: string, + authorId: string +): Promise | Error> { const user = await prisma.user.findFirst({ where: { id: authorId } }) if (user === null) { - return new Error('This user doesn\'t exists') + return new Error("This user doesn't exists") } const post = await prisma.post.create({ diff --git a/src/services/posts/delete.ts b/src/services/posts/delete.ts index 350dc88..9d79daf 100644 --- a/src/services/posts/delete.ts +++ b/src/services/posts/delete.ts @@ -1,13 +1,16 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function postDeleteService (postId: string, userId: string): Promise { +async function postDeleteService ( + postId: string, + userId: string +): Promise | Error> { const post = await prisma.post.findFirst({ where: { id: postId } }) if (post === null) { return new Error('Post not found') } - if (await prisma.user.findFirst({ where: { id: userId } }) === null) { + if ((await prisma.user.findFirst({ where: { id: userId } })) === null) { return new Error('User not found') } diff --git a/src/services/posts/fetch-info.ts b/src/services/posts/fetch-info.ts index 3caf73c..db3b576 100644 --- a/src/services/posts/fetch-info.ts +++ b/src/services/posts/fetch-info.ts @@ -1,6 +1,6 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function postFetchInfoService (id: string): Promise { +async function postFetchInfoService (id: string): Promise | Error> { const post = await prisma.post.findFirst({ where: { id diff --git a/src/services/posts/fetch-likes.ts b/src/services/posts/fetch-likes.ts index 541a085..2f4330f 100644 --- a/src/services/posts/fetch-likes.ts +++ b/src/services/posts/fetch-likes.ts @@ -1,6 +1,6 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function postFetchLikesService (id: string): Promise { +async function postFetchLikesService (id: string): Promise { const post = await prisma.postLike.findMany({ where: { postId: id diff --git a/src/services/posts/update.ts b/src/services/posts/update.ts index 4667cde..ff17cc7 100644 --- a/src/services/posts/update.ts +++ b/src/services/posts/update.ts @@ -1,13 +1,17 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function postUpdateService (postId: string, content: string, userId: string): Promise { +async function postUpdateService ( + postId: string, + content: string, + userId: string +): Promise | Error> { const post = await prisma.post.findFirst({ where: { id: postId } }) if (post === null) { return new Error('Post not found') } - if (await prisma.user.findFirst({ where: { id: userId } }) === null) { + if ((await prisma.user.findFirst({ where: { id: userId } })) === null) { return new Error('User not found') } diff --git a/src/services/users/auth.ts b/src/services/users/auth.ts index d2807d1..671e183 100644 --- a/src/services/users/auth.ts +++ b/src/services/users/auth.ts @@ -1,8 +1,12 @@ import * as bcrypt from 'bcrypt' import jsonwebtoken from 'jsonwebtoken' -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' +import type userPayload from 'interfaces/user' -async function userAuthService (email: string, password: string): Promise { +async function userAuthService ({ + email, + password +}: userPayload): Promise | Error> { const user = await prisma.user.findFirst({ where: { email @@ -17,7 +21,10 @@ async function userAuthService (email: string, password: string): Promise { +async function userDeleteService (userId: string): Promise | Error> { const user = await prisma.user.findFirst({ where: { id: userId } }) if (user === null) { diff --git a/src/services/users/fetch-info.ts b/src/services/users/fetch-info.ts index 181724b..e16584f 100644 --- a/src/services/users/fetch-info.ts +++ b/src/services/users/fetch-info.ts @@ -1,6 +1,6 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userFetchInfoService (username: string): Promise { +async function userFetchInfoService (username: string): Promise | Error> { const user = await prisma.user.findFirst({ where: { username diff --git a/src/services/users/fetch-posts.ts b/src/services/users/fetch-posts.ts index a792633..71d4822 100644 --- a/src/services/users/fetch-posts.ts +++ b/src/services/users/fetch-posts.ts @@ -1,6 +1,8 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userFetchPostsService (username: string): Promise { +async function userFetchPostsService ( + username: string +): Promise { const posts = await prisma.post.findMany({ where: { author: { diff --git a/src/services/users/follow-user.ts b/src/services/users/follow-user.ts index 9b1ae0c..4f0e27d 100644 --- a/src/services/users/follow-user.ts +++ b/src/services/users/follow-user.ts @@ -1,6 +1,9 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userFollowService (userId: string, followingUsername: string): Promise { +async function userFollowService ( + userId: string, + followingUsername: string +): Promise | Error> { if (userId === undefined || followingUsername === undefined) { return new Error('Missing fields') } diff --git a/src/services/users/like-comment.ts b/src/services/users/like-comment.ts index 3a9d11a..e9134d2 100644 --- a/src/services/users/like-comment.ts +++ b/src/services/users/like-comment.ts @@ -1,6 +1,9 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userLikeCommentService (postId: string, commentId: string, userId: string): Promise { +async function userLikeCommentService ( + commentId: string, + userId: string +): Promise | Error> { if (commentId === undefined || userId === undefined) { return new Error('Missing fields') } diff --git a/src/services/users/like-post.ts b/src/services/users/like-post.ts index c0fde8f..b9ce014 100644 --- a/src/services/users/like-post.ts +++ b/src/services/users/like-post.ts @@ -1,6 +1,9 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userLikePostService (postId: string, userId: string): Promise { +async function userLikePostService ( + postId: string, + userId: string +): Promise | Error> { if (postId === undefined || userId === undefined) { return new Error('Missing fields') } diff --git a/src/services/users/search-user.ts b/src/services/users/search-user.ts index b6a1338..f9efe81 100644 --- a/src/services/users/search-user.ts +++ b/src/services/users/search-user.ts @@ -1,6 +1,6 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userSearchService (username: string): Promise { +async function userSearchService (username: string): Promise { const users = await prisma.user.findMany({ where: { username: { diff --git a/src/services/users/signup.ts b/src/services/users/signup.ts index 5f31a31..5ac771f 100644 --- a/src/services/users/signup.ts +++ b/src/services/users/signup.ts @@ -1,17 +1,24 @@ import * as bcrypt from 'bcrypt' import validator from 'validator' -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' +import type userPayload from 'interfaces/user' const passwordRegex = /^(?=.*[0-9])(?=.*[!@#$%^&*_])[a-zA-Z0-9!@#$%^&*_]{8,}$/ const usernameRegex = /^[a-zA-Z0-9_.]{5,15}$/ -async function userSignupService (username: string, email: string, password: string): Promise { +async function userSignupService ({ + username, + email, + password +}: userPayload): Promise | Error> { if (username === undefined || email === undefined || password === undefined) { return new Error('Missing fields') } if (!passwordRegex.test(password)) { - return new Error('Password must have at least 8 characters, one number and one special character.') + return new Error( + 'Password must have at least 8 characters, one number and one special character.' + ) } if (password.trim().length < 8) { @@ -19,7 +26,9 @@ async function userSignupService (username: string, email: string, password: str } if (!usernameRegex.test(username)) { - return new Error('Username not allowed. Only alphanumerics characters (uppercase and lowercase words), underscore, dots and it must be between 5 and 15 characters') + return new Error( + 'Username not allowed. Only alphanumerics characters (uppercase and lowercase words), underscore, dots and it must be between 5 and 15 characters' + ) } if (!validator.isEmail(email)) { diff --git a/src/services/users/update.ts b/src/services/users/update.ts index fceccc3..a3e6d7a 100644 --- a/src/services/users/update.ts +++ b/src/services/users/update.ts @@ -1,7 +1,12 @@ -import userPayload from '../../interfaces/user' -import prisma from '../../clients/prisma-client' +import type userPayload from 'interfaces/user' +import prisma from 'clients/prisma-client' -async function userUpdateService ({ id, email, displayName, username }: userPayload): Promise { +async function userUpdateService ({ + id, + email, + displayName, + username +}: userPayload): Promise | Error> { const user = await prisma.user.findFirst({ where: { id } }) if (user === null) { @@ -13,14 +18,14 @@ async function userUpdateService ({ id, email, displayName, username }: userPayl if (email !== undefined && email.trim() !== user.email) { const existingUser = await prisma.user.findFirst({ where: { email } }) - if ((existingUser != null) && existingUser.email !== user.email) { + if (existingUser != null && existingUser.email !== user.email) { return new Error('Email already in use') } } if (username !== undefined && username.trim() !== user.username) { const existingUser = await prisma.user.findFirst({ where: { username } }) - if ((existingUser != null) && existingUser.username !== user.username) { + if (existingUser != null && existingUser.username !== user.username) { return new Error('Username already in use') } } diff --git a/src/services/users/upload-picture.ts b/src/services/users/upload-picture.ts index abcfb21..8131c4d 100644 --- a/src/services/users/upload-picture.ts +++ b/src/services/users/upload-picture.ts @@ -1,6 +1,9 @@ -import prisma from '../../clients/prisma-client' +import prisma from 'clients/prisma-client' -async function userUploadPictureService (authorId: string, url: string): Promise { +async function userUploadPictureService ( + authorId: string, + url: string +): Promise | Error> { const user = await prisma.user.findFirst({ where: { id: authorId } }) if (user == null) { diff --git a/src/tests/post/post-create.spec.ts b/src/tests/post/post-create.spec.ts index 8d7ed6b..dff7569 100644 --- a/src/tests/post/post-create.spec.ts +++ b/src/tests/post/post-create.spec.ts @@ -2,7 +2,7 @@ import app from '../../app' import request from 'supertest' import signUpNewUser from '../utils/create-user' import deleteUser from '../utils/delete-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -16,17 +16,23 @@ describe('POST /post/create', () => { }) it('should respond with 200 status code if the user send the token and the content', async () => { - const response = await request(app).post('/post/create').send({ - content: 'Hello world' - }).set('Authorization', `Bearer ${user.token ?? ''}`).expect(200) + const response = await request(app) + .post('/post/create') + .send({ + content: 'Hello world' + }) + .set('Authorization', `Bearer ${user.token ?? ''}`) + .expect(200) - expect(response.body).toEqual(expect.objectContaining({ - id: expect.any(String), - content: expect.any(String), - authorId: expect.any(String), - createdAt: expect.any(String), - updatedAt: expect.any(String) - })) + expect(response.body).toEqual( + expect.objectContaining({ + id: expect.any(String), + content: expect.any(String), + authorId: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String) + }) + ) }) it('should respond with 400 status code if the user send no token', async () => { diff --git a/src/tests/post/post-delete.spec.ts b/src/tests/post/post-delete.spec.ts index 40f5a94..b080a76 100644 --- a/src/tests/post/post-delete.spec.ts +++ b/src/tests/post/post-delete.spec.ts @@ -2,7 +2,7 @@ import app from '../../app' import request from 'supertest' import signUpNewUser from '../utils/create-user' import deleteUser from '../utils/delete-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -21,13 +21,15 @@ describe('DELETE /post/delete', () => { .send({ content: 'lorem ipsum' }) - .set('Authorization', `Bearer ${user.token ?? ''}`).expect(200) + .set('Authorization', `Bearer ${user.token ?? ''}`) + .expect(200) await request(app) .post('/post/delete') .send({ postId: response.body.id }) - .set('Authorization', `Bearer ${user.token ?? ''}`).expect(200) + .set('Authorization', `Bearer ${user.token ?? ''}`) + .expect(200) }) }) diff --git a/src/tests/post/post-info.spec.ts b/src/tests/post/post-info.spec.ts index e8a2b24..c1f3094 100644 --- a/src/tests/post/post-info.spec.ts +++ b/src/tests/post/post-info.spec.ts @@ -2,7 +2,7 @@ import app from '../../app' import request from 'supertest' import signUpNewUser from '../utils/create-user' import deleteUser from '../utils/delete-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let postId: string @@ -14,9 +14,13 @@ describe('POST /post/info', () => { const token = user.token ?? '' - const post = await request(app).post('/post/create').send({ - content: 'Hello world' - }).set('Authorization', `Bearer ${token}`).expect(200) + const post = await request(app) + .post('/post/create') + .send({ + content: 'Hello world' + }) + .set('Authorization', `Bearer ${token}`) + .expect(200) postId = post.body.id }) @@ -26,15 +30,19 @@ describe('POST /post/info', () => { }) it('should respond with 200 status code and return some info about the post', async () => { - const response = await request(app).get(`/post/info?id=${postId}`).expect(200) + const response = await request(app) + .get(`/post/info?id=${postId}`) + .expect(200) - expect(response.body).toEqual(expect.objectContaining({ - id: expect.any(String), - content: expect.any(String), - createdAt: expect.any(String), - updatedAt: expect.any(String), - author: expect.any(Object) - })) + expect(response.body).toEqual( + expect.objectContaining({ + id: expect.any(String), + content: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String), + author: expect.any(Object) + }) + ) }) it('should respond with 400 status code if the post does not exists', async () => { diff --git a/src/tests/post/post-update.spec.ts b/src/tests/post/post-update.spec.ts index bd19dec..963adee 100644 --- a/src/tests/post/post-update.spec.ts +++ b/src/tests/post/post-update.spec.ts @@ -2,7 +2,7 @@ import app from '../../app' import request from 'supertest' import signUpNewUser from '../utils/create-user' import deleteUser from '../utils/delete-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -16,9 +16,13 @@ describe('PUT /post/update', () => { }) it('should create a new post and update the content of it', async () => { - const post = await request(app).post('/post/create').send({ - content: 'Lorem' - }).set('Authorization', `Bearer ${user.token ?? ''}`).expect(200) + const post = await request(app) + .post('/post/create') + .send({ + content: 'Lorem' + }) + .set('Authorization', `Bearer ${user.token ?? ''}`) + .expect(200) expect(post.body).toHaveProperty('id') @@ -30,19 +34,22 @@ describe('PUT /post/update', () => { const response = await request(app) .put('/post/update') .send(fieldsToUpdate) - .set('Authorization', `Bearer ${user.token ?? ''}`).expect(200) + .set('Authorization', `Bearer ${user.token ?? ''}`) + .expect(200) // Post content should be Lorem Ipsum if (post.body.content === response.body.content) { - throw new Error('Post didn\'t update') + throw new Error("Post didn't update") } - expect(response.body).toEqual(expect.objectContaining({ - id: expect.any(String), - content: expect.any(String), - createdAt: expect.any(String), - updatedAt: expect.any(String), - author: expect.any(Object) - })) + expect(response.body).toEqual( + expect.objectContaining({ + id: expect.any(String), + content: expect.any(String), + createdAt: expect.any(String), + updatedAt: expect.any(String), + author: expect.any(Object) + }) + ) }) }) diff --git a/src/tests/user/user-auth.spec.ts b/src/tests/user/user-auth.spec.ts index f4a9a3f..20149a9 100644 --- a/src/tests/user/user-auth.spec.ts +++ b/src/tests/user/user-auth.spec.ts @@ -2,7 +2,7 @@ import request from 'supertest' import app from '../../app' import deleteUser from '../utils/delete-user' import signUpNewUser from '../utils/create-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -16,14 +16,20 @@ describe('POST /user/auth', () => { }) it('should respond with a error if the user does not exists', async () => { - const response = await request(app).post('/user/auth').send({ email: 'mm@mm.com', password: 'aa' }).expect(400) + const response = await request(app) + .post('/user/auth') + .send({ email: 'mm@mm.com', password: 'aa' }) + .expect(400) expect(response.body).toHaveProperty('error') expect(response.body.error).toBe('User does not exists') }) it('should respond with a error if receive an invalid email or password', async () => { - const response = await request(app).post('/user/auth').send({ email: user.email, password: 'fake_pass' }).expect(400) + const response = await request(app) + .post('/user/auth') + .send({ email: user.email, password: 'fake_pass' }) + .expect(400) expect(response.body).toHaveProperty('error') expect(response.body.error).toBe('Invalid email or password') diff --git a/src/tests/user/user-delete.spec.ts b/src/tests/user/user-delete.spec.ts index bc81032..cc72a52 100644 --- a/src/tests/user/user-delete.spec.ts +++ b/src/tests/user/user-delete.spec.ts @@ -1,7 +1,7 @@ import app from '../../app' import request from 'supertest' import signUpNewUser from '../utils/create-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -11,7 +11,8 @@ describe('DELETE /user/delete', () => { }) it('should delete the user successfully', async () => { - await request(app).post('/user/delete') + await request(app) + .post('/user/delete') .set('Authorization', `Bearer ${user.token ?? ''}`) .expect(200) }) diff --git a/src/tests/user/user-info.spec.ts b/src/tests/user/user-info.spec.ts index f27a727..68f08e3 100644 --- a/src/tests/user/user-info.spec.ts +++ b/src/tests/user/user-info.spec.ts @@ -2,7 +2,7 @@ import app from '../../app' import request from 'supertest' import deleteUser from '../utils/delete-user' import signUpNewUser from '../utils/create-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -16,7 +16,9 @@ describe('POST /user/info', () => { }) it('should respond with 200 status code and return the user data', async () => { - const response = await request(app).get(`/user/info?u=${user.username ?? ''}`).expect(200) + const response = await request(app) + .get(`/user/info?u=${user.username ?? ''}`) + .expect(200) expect(response.body).toHaveProperty('profileImage') expect(response.body).toHaveProperty('displayName') diff --git a/src/tests/user/user-signup.spec.ts b/src/tests/user/user-signup.spec.ts index b78568b..2ce25c0 100644 --- a/src/tests/user/user-signup.spec.ts +++ b/src/tests/user/user-signup.spec.ts @@ -2,7 +2,7 @@ import request from 'supertest' import app from '../../app' import deleteUser from '../utils/delete-user' import signUpNewUser from '../utils/create-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -17,19 +17,25 @@ describe('POST /user/signup', () => { }) it('should respond with a 400 status code if sent any invalid data', async () => { - await request(app).post('/user/signup').send({ - username: 'username12@', - email: user.email, - password: user.password - }).expect(400) + await request(app) + .post('/user/signup') + .send({ + username: 'username12@', + email: user.email, + password: user.password + }) + .expect(400) }) it('should respond with a 400 status code for an existing username or email', async () => { - await request(app).post('/user/signup').send({ - username: user.username, - email: user.email, - password: user.password - }).expect(400) + await request(app) + .post('/user/signup') + .send({ + username: user.username, + email: user.email, + password: user.password + }) + .expect(400) }) it('should respond with a 400 status code if receive an empty body', async () => { diff --git a/src/tests/user/user-update.spec.ts b/src/tests/user/user-update.spec.ts index abd5731..4e1dd99 100644 --- a/src/tests/user/user-update.spec.ts +++ b/src/tests/user/user-update.spec.ts @@ -2,7 +2,7 @@ import request from 'supertest' import app from '../../app' import signUpNewUser from '../utils/create-user' import deleteUser from '../utils/delete-user' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' let user: userPayload @@ -23,12 +23,15 @@ describe('PUT /user/update', () => { const response = await request(app) .put('/user/update') .send(fieldsToUpdate) - .set('Authorization', `Bearer ${user.token ?? ''}`).expect(200) + .set('Authorization', `Bearer ${user.token ?? ''}`) + .expect(200) - expect(response.body).toEqual(expect.objectContaining({ - displayName: expect.any(String), - username: expect.any(String), - createdAt: expect.any(String) - })) + expect(response.body).toEqual( + expect.objectContaining({ + displayName: expect.any(String), + username: expect.any(String), + createdAt: expect.any(String) + }) + ) }) }) diff --git a/src/tests/utils/create-user.ts b/src/tests/utils/create-user.ts index 15a6e7f..b06bdc7 100644 --- a/src/tests/utils/create-user.ts +++ b/src/tests/utils/create-user.ts @@ -1,7 +1,7 @@ import app from '../../app' import request from 'supertest' import { faker } from '@faker-js/faker' -import userPayload from '../../interfaces/user' +import type userPayload from '../../interfaces/user' async function signUpNewUser (): Promise { // To avoid conflicts with existing usernames or emails @@ -9,18 +9,22 @@ async function signUpNewUser (): Promise { const email = faker.internet.email() const password = faker.internet.password() + '@1' - await request(app).post('/user/signup').send({ - username, - email, - password - }).expect(200) + await request(app) + .post('/user/signup') + .send({ + username, + email, + password + }) + .expect(200) const response = await request(app) .post('/user/auth') .send({ email, password - }).expect(200) + }) + .expect(200) return { username, diff --git a/src/tests/utils/delete-user.ts b/src/tests/utils/delete-user.ts index 95bcb47..372b3e1 100644 --- a/src/tests/utils/delete-user.ts +++ b/src/tests/utils/delete-user.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/explicit-function-return-type */ import prisma from '../../clients/prisma-client' export default async function deleteUser (username: string) { diff --git a/tsconfig.json b/tsconfig.json index eb99b44..e1d0503 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,105 +1,47 @@ { "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + "target": "es2016", /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - "baseUrl": "./src", /* Specify the base directory to resolve non-relative module names. */ - /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + "module": "commonjs", + "rootDir": "./", + "baseUrl": "./src", + "paths": { + "clients/*": [ + "clients/*" + ], + "config/*": [ + "config/*" + ], + "controllers/*": [ + "controllers/*" + ], + "interfaces/*": [ + "interfaces/*" + ], + "lib/*": [ + "lib/*" + ], + "middlewares/*": [ + "middlewares/*" + ], + "services/*": [ + "services/*" + ] + }, "typeRoots": [ "src/@types/express.d.ts", "src/@types/global.d.ts", "node_modules/@types" - ], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + ], /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist", /* Specify an output folder for all emitted files. */ - "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + "outDir": "./dist", + "removeComments": true, /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true, /* Skip type checking all .d.ts files. */ + "strict": true, + "skipLibCheck": true } } \ No newline at end of file