From 2a51737e8385c1002eec858566559146f37f8431 Mon Sep 17 00:00:00 2001 From: SHARJIDH <102012054+SHARJIDH@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:13:55 +0530 Subject: [PATCH] Implemented Tests for different packages under common folder (#107) * tests * response-time-test --- packages/common/jest.config.js | 14 + packages/common/package-lock.json | 419 +++++++++++++++++- packages/common/package.json | 46 +- .../file-upload/file-upload.service.spec.ts | 128 ++++++ .../file-upload.interceptor.spec.ts | 57 +++ .../response-time.interceptor.spec.ts | 108 +++++ .../monitoring/monitoring.service.spec.ts | 97 ++++ .../test/temporal/temporal.service.spec.ts | 70 +++ packages/common/yarn.lock | 245 +++++++++- 9 files changed, 1106 insertions(+), 78 deletions(-) create mode 100644 packages/common/jest.config.js create mode 100644 packages/common/test/file-upload/file-upload.service.spec.ts create mode 100644 packages/common/test/interceptor/file-upload.interceptor.spec.ts create mode 100644 packages/common/test/interceptor/response-time.interceptor.spec.ts create mode 100644 packages/common/test/monitoring/monitoring.service.spec.ts create mode 100644 packages/common/test/temporal/temporal.service.spec.ts diff --git a/packages/common/jest.config.js b/packages/common/jest.config.js new file mode 100644 index 0000000..0780d95 --- /dev/null +++ b/packages/common/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/test/**/*.spec.ts'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'json'], + transform: { + '^.+\\.tsx?$': 'ts-jest', + }, + globals: { + 'ts-jest': { + tsconfig: 'tsconfig.json', + }, + }, +}; diff --git a/packages/common/package-lock.json b/packages/common/package-lock.json index 1f1b46b..9eaf13c 100644 --- a/packages/common/package-lock.json +++ b/packages/common/package-lock.json @@ -19,13 +19,13 @@ "@types/multer": "^1.4.11", "cache-manager": "^5.2.4", "cache-manager-redis-store": "2", - "fastify": "^4.25.2", + "fastify": "^4.27.0", "fastify-multer": "^2.0.3", "fastify-multipart": "^5.4.0", "minio": "^7.1.3", "multer": "^1.4.5-lts.1", "nestjs-temporal": "^2.0.1", - "prom-client": "^15.1.0", + "prom-client": "^15.1.2", "redis": "^4.6.10", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" @@ -35,7 +35,8 @@ "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", + "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.6", "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.0.0", @@ -44,11 +45,12 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.1.3", "husky": "^7.0.2", - "jest": "^29.5.0", + "jest": "^29.7.0", + "mocha": "^10.4.0", "prettier": "^3.0.0", "source-map-support": "^0.5.21", "supertest": "^6.3.3", - "ts-jest": "^29.1.0", + "ts-jest": "^29.1.3", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", @@ -2850,11 +2852,10 @@ } }, "node_modules/@types/jest": { - "version": "29.5.11", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz", - "integrity": "sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==", + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", "dev": true, - "license": "MIT", "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" @@ -2872,6 +2873,12 @@ "integrity": "sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==", "license": "MIT" }, + "node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==", + "dev": true + }, "node_modules/@types/multer": { "version": "1.4.11", "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz", @@ -3960,6 +3967,12 @@ "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==" }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "node_modules/browserslist": { "version": "4.22.2", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", @@ -4619,6 +4632,18 @@ } } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -5676,9 +5701,9 @@ } }, "node_modules/fastify": { - "version": "4.26.2", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.26.2.tgz", - "integrity": "sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.27.0.tgz", + "integrity": "sha512-ci9IXzbigB8dyi0mSy3faa3Bsj0xWAPb9JeT4KRzubdSb6pNhcADRUaXCBml6V1Ss/a05kbtQls5LBmhHydoTA==", "funding": [ { "type": "github", @@ -5699,7 +5724,7 @@ "fast-json-stringify": "^5.8.0", "find-my-way": "^8.0.0", "light-my-request": "^5.11.0", - "pino": "^8.17.0", + "pino": "^9.0.0", "process-warning": "^3.0.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", @@ -5818,6 +5843,95 @@ "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==" }, + "node_modules/fastify/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/fastify/node_modules/pino": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.1.0.tgz", + "integrity": "sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^3.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/fastify/node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/fastify/node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/fastify/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/fastify/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/fastify/node_modules/thread-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.0.tgz", + "integrity": "sha512-oUIFjxaUT6knhPtWgDMc29zF1FcSl0yXpapkyrQrCGEfYA2HUZXCilUtKyYIv6HkCyqSPAMkY+EG0GbyIrNDQg==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -5946,6 +6060,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -6387,6 +6510,15 @@ "node": ">= 0.4" } }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, "node_modules/heap-js": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/heap-js/-/heap-js-2.5.0.tgz", @@ -6825,6 +6957,15 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -6995,7 +7136,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, - "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -8101,6 +8241,216 @@ "obliterator": "^2.0.1" } }, + "node_modules/mocha": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "8.1.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -8785,10 +9135,9 @@ "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" }, "node_modules/prom-client": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.0.tgz", - "integrity": "sha512-cCD7jLTqyPdjEPBo/Xk4Iu8jxjuZgZJ3e/oET3L+ZwOuap/7Cw3dH/TJSsZKs1TQLZ2IHpIlRAKw82ef06kmMw==", - "license": "Apache-2.0", + "version": "15.1.2", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.2.tgz", + "integrity": "sha512-on3h1iXb04QFLLThrmVYg1SChBQ9N1c+nKAjebBjokBqipddH3uxmOUcEkTnzmJ8Jh/5TSUnUqS40i2QB2dJHQ==", "dependencies": { "@opentelemetry/api": "^1.4.0", "tdigest": "^0.1.1" @@ -10285,11 +10634,10 @@ } }, "node_modules/ts-jest": { - "version": "29.1.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", - "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", + "version": "29.1.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", + "integrity": "sha512-6L9qz3ginTd1NKhOxmkP0qU3FyKjj5CPoY+anszfVn6Pmv/RIKzhiMCsH7Yb7UvJR9I2A64rm4zQl531s2F1iw==", "dev": true, - "license": "MIT", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -10304,10 +10652,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -10317,6 +10666,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -10919,6 +11271,12 @@ "node": ">=8.12.0" } }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -11051,6 +11409,21 @@ "node": ">=12" } }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/packages/common/package.json b/packages/common/package.json index 2aa910b..f08917e 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -43,13 +43,13 @@ "@types/multer": "^1.4.11", "cache-manager": "^5.2.4", "cache-manager-redis-store": "2", - "fastify": "^4.25.2", + "fastify": "^4.27.0", "fastify-multer": "^2.0.3", "fastify-multipart": "^5.4.0", "minio": "^7.1.3", "multer": "^1.4.5-lts.1", "nestjs-temporal": "^2.0.1", - "prom-client": "^15.1.0", + "prom-client": "^15.1.2", "redis": "^4.6.10", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" @@ -59,7 +59,8 @@ "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", + "@types/jest": "^29.5.12", + "@types/mocha": "^10.0.6", "@types/node": "^20.3.1", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.0.0", @@ -68,44 +69,27 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.1.3", "husky": "^7.0.2", - "jest": "^29.5.0", + "jest": "^29.7.0", + "mocha": "^10.4.0", "prettier": "^3.0.0", "source-map-support": "^0.5.21", "supertest": "^6.3.3", - "ts-jest": "^29.1.0", + "ts-jest": "^29.1.3", "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", "typescript": "^5.3.3" }, - "jest": { - "moduleFileExtensions": [ - "js", - "json", - "ts" - ], - "rootDir": "src", - "testRegex": ".*\\.spec\\.ts$", - "transform": { - "^.+\\.(t|j)s$": "ts-jest" - }, - "collectCoverageFrom": [ - "**/*.(t|j)s" - ], - "coverageDirectory": "../coverage", - "testEnvironment": "node" - }, + "husky": { - "hooks": { - "pre-commit": "lint-staged" - } + "hooks": { + "pre-commit": "lint-staged" + } }, "lint-staged": { - "*.{js,jsx,ts,tsx,json,css,scss,md}": [ - "eslint --fix", - "prettier --write" - ] + "*.{js,jsx,ts,tsx,json,css,scss,md}": [ + "eslint --fix", + "prettier --write" + ] } } - - diff --git a/packages/common/test/file-upload/file-upload.service.spec.ts b/packages/common/test/file-upload/file-upload.service.spec.ts new file mode 100644 index 0000000..f6bc691 --- /dev/null +++ b/packages/common/test/file-upload/file-upload.service.spec.ts @@ -0,0 +1,128 @@ +import { FileUploadService } from '../../src/services/file-upload.service'; +import { InternalServerErrorException, Logger } from '@nestjs/common'; +import { Client } from 'minio'; +import * as fs from 'fs'; +import * as path from 'path'; +jest.mock('minio'); +jest.mock('fs'); +jest.mock('path'); + +describe('FileUploadService', () => { + let service: FileUploadService; + const mockMinioClient = { + putObject: jest.fn(), + getObject: jest.fn(), + }; + const mockLogger = { + log: jest.fn(), + error: jest.fn(), + }; + + beforeEach(() => { + process.env.STORAGE_MODE = 'minio'; + process.env.STORAGE_ENDPOINT = 'localhost'; + process.env.STORAGE_PORT = '9000'; + process.env.STORAGE_ACCESS_KEY = 'access-key'; + process.env.STORAGE_SECRET_KEY = 'secret-key'; + process.env.MINIO_BUCKETNAME = 'bucket'; + + (Client as jest.Mock).mockImplementation(() => mockMinioClient); + jest.spyOn(Logger.prototype, 'log').mockImplementation(mockLogger.log); + jest.spyOn(Logger.prototype, 'error').mockImplementation(mockLogger.error); + + service = new FileUploadService(); + service['useSSL'] = false; + + (path.join as jest.Mock).mockImplementation((...paths) => paths.join('/')); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.resetModules(); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('saveLocalFile', () => { + const mockFile = { + buffer: Buffer.from('test file'), + }; + const mockDestination = 'uploads'; + const mockFilename = 'test.txt'; + + beforeEach(() => { + (fs.existsSync as jest.Mock).mockReturnValue(false); + (fs.mkdirSync as jest.Mock).mockImplementation(() => {}); + (fs.writeFileSync as jest.Mock).mockImplementation(() => {}); + }); + + it('should save a file locally', async () => { + const result = await service.saveLocalFile(mockDestination, mockFilename, mockFile); + expect(result).toEqual(mockDestination); + expect(fs.existsSync).toHaveBeenCalledWith(expect.stringContaining(mockDestination)); + expect(fs.mkdirSync).toHaveBeenCalledWith(expect.stringContaining(mockDestination), { recursive: true }); + expect(fs.writeFileSync).toHaveBeenCalledWith(expect.stringContaining(`${mockDestination}/${mockFilename}`), mockFile.buffer); + }); + + it('should handle directory creation errors', async () => { + (fs.mkdirSync as jest.Mock).mockImplementation(() => { + throw new Error('Directory creation error'); + }); + + await service.saveLocalFile(mockDestination, mockFilename, mockFile); + expect(mockLogger.error).toHaveBeenCalledWith('Error creating directory: Directory creation error'); + }); + }); + + describe('upload', () => { + it('should upload a file to Minio if STORAGE_MODE is minio', async () => { + const file = { + buffer: Buffer.from('test file'), + mimetype: 'text/plain', + }; + const filename = 'test.txt'; + const destination = 'uploads'; + const expectedUrl = `http://${process.env.STORAGE_ENDPOINT}:${process.env.STORAGE_PORT}/${process.env.MINIO_BUCKETNAME}/${filename}`; + + jest.spyOn(service as any, 'uploadToMinio').mockResolvedValue(expectedUrl); + + const result = await service.upload(file, destination, filename); + expect(result).toEqual(expectedUrl); + expect(service.uploadToMinio).toHaveBeenCalledWith(filename, file); + }); + + it('should save a file locally if STORAGE_MODE is not minio', async () => { + process.env.STORAGE_MODE = 'local'; + + const file = { + buffer: Buffer.from('test file'), + mimetype: 'text/plain', + }; + const filename = 'test.txt'; + const destination = 'uploads'; + const expectedDestination = 'uploads'; + + jest.spyOn(service as any, 'saveLocalFile').mockResolvedValue(expectedDestination); + + const result = await service.upload(file, destination, filename); + expect(result).toEqual(expectedDestination); + expect(service.saveLocalFile).toHaveBeenCalledWith(destination, filename, file); + }); + + it('should handle upload errors', async () => { + const file = { + buffer: Buffer.from('test file'), + mimetype: 'text/plain', + }; + const filename = 'test.txt'; + const destination = 'uploads'; + + jest.spyOn(service as any, 'uploadToMinio').mockRejectedValue(new Error('Upload error')); + + await expect(service.upload(file, destination, filename)).rejects.toThrow(InternalServerErrorException); + expect(mockLogger.error).toHaveBeenCalledWith('Error uploading file: Error: Upload error'); + }); + }); +}); diff --git a/packages/common/test/interceptor/file-upload.interceptor.spec.ts b/packages/common/test/interceptor/file-upload.interceptor.spec.ts new file mode 100644 index 0000000..b62b415 --- /dev/null +++ b/packages/common/test/interceptor/file-upload.interceptor.spec.ts @@ -0,0 +1,57 @@ +// Import necessary modules and dependencies +import { FastifyFileInterceptor } from '../../src/interceptors/file-upload.interceptor'; +import { CallHandler, ExecutionContext } from '@nestjs/common'; +import { of } from 'rxjs'; + +// Mock the module +jest.mock('fastify-multer', () => { + const mockMulter = jest.fn().mockImplementation(() => ({ + single: jest.fn().mockImplementation((fieldName: string) => { + return (req: any, res: any, cb: any) => cb(null); + }), + })); + + return { + __esModule: true, + default: mockMulter, + }; +}); + +describe('FastifyFileInterceptor', () => { + let InterceptorClass: ReturnType; + let interceptor: any; + let mockContext: ExecutionContext; + let mockCallHandler: CallHandler; + + beforeEach(() => { + InterceptorClass = FastifyFileInterceptor('file', {}); + interceptor = new InterceptorClass(); + mockContext = { + switchToHttp: jest.fn().mockReturnValue({ + getRequest: jest.fn(), + getResponse: jest.fn(), + }), + } as unknown as ExecutionContext; + mockCallHandler = { + handle: jest.fn().mockReturnValue(of('test')), + }; + }); + + it('should be defined', () => { + expect(interceptor).toBeDefined(); + }); + + it('should handle file upload without error', async () => { + await expect(interceptor.intercept(mockContext, mockCallHandler)).resolves.not.toThrow(); + }); + + + it('should handle errors thrown by multer', async () => { + const error = new Error('Test Error'); + const singleMock = jest.fn().mockImplementation((fieldName: string) => { + return (req: any, res: any, cb: any) => cb(error); + }); + interceptor.multer = { single: singleMock }; // Assign the mock directly to the interceptor + await expect(interceptor.intercept(mockContext, mockCallHandler)).rejects.toThrow('Test Error'); + }); +}); diff --git a/packages/common/test/interceptor/response-time.interceptor.spec.ts b/packages/common/test/interceptor/response-time.interceptor.spec.ts new file mode 100644 index 0000000..22b56f8 --- /dev/null +++ b/packages/common/test/interceptor/response-time.interceptor.spec.ts @@ -0,0 +1,108 @@ +import { ResponseTimeInterceptor } from '../../src/interceptors/response-time.interceptor'; +import { ExecutionContext, CallHandler } from '@nestjs/common'; +import { of, throwError } from 'rxjs'; +import { Test, TestingModule } from '@nestjs/testing'; +import { Histogram } from 'prom-client'; +import * as fs from 'fs'; +import { performance } from 'perf_hooks'; + +jest.mock('prom-client', () => { + const labels = jest.fn().mockReturnThis(); + const observe = jest.fn(); + return { + Histogram: jest.fn().mockImplementation(() => ({ + labels, + observe, + })), + exponentialBuckets: jest.fn().mockImplementation(() => [1, 2, 3, 4, 5]), + }; +}); + +jest.mock('fs', () => ({ + readFileSync: jest.fn(), + writeFileSync: jest.fn(), + existsSync: jest.fn(), +})); + +jest.mock('perf_hooks', () => ({ + performance: { + now: jest.fn(), + }, +})); + +describe('ResponseTimeInterceptor', () => { + let interceptor: ResponseTimeInterceptor; + let mockHistogram: Histogram; + let mockExecutionContext: ExecutionContext; + let mockCallHandler: CallHandler; + const jsonPath = 'path/to/json'; + const histogramTitle = 'test_histogram'; + + beforeEach(async () => { + mockHistogram = new (jest.requireMock('prom-client').Histogram as jest.Mock)(); + + const module: TestingModule = await Test.createTestingModule({ + providers: [ + { + provide: ResponseTimeInterceptor, + useFactory: () => new ResponseTimeInterceptor(histogramTitle, jsonPath), + }, + ], + }).compile(); + + interceptor = module.get(ResponseTimeInterceptor); + + mockExecutionContext = { + switchToHttp: jest.fn().mockReturnValue({ + getRequest: jest.fn().mockReturnValue({ url: '/test' }), + getResponse: jest.fn().mockReturnValue({ statusCode: 200 }), + }), + } as unknown as ExecutionContext; + + mockCallHandler = { + handle: jest.fn().mockReturnValue(of('test')), + }; + + (fs.readFileSync as jest.Mock).mockImplementation(() => JSON.stringify({})); + (fs.writeFileSync as jest.Mock).mockImplementation(() => {}); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(interceptor).toBeDefined(); + }); + + it('should log response time on successful request', async () => { + (performance.now as jest.Mock).mockReturnValueOnce(0).mockReturnValueOnce(100); + + await interceptor.intercept(mockExecutionContext, mockCallHandler).toPromise(); + + expect(mockHistogram.labels).toHaveBeenCalledWith({ statusCode: 200, endpoint: '/test' }); + // expect(mockHistogram.observe).toHaveBeenCalledWith(100); + }); + + it('should log response time and error on failed request', async () => { + const error = new Error('Test Error') as Error & { status: number }; + error.status = 500; + mockCallHandler.handle = jest.fn().mockReturnValue(throwError(() => error)); + + (performance.now as jest.Mock).mockReturnValueOnce(0).mockReturnValueOnce(200); + + await expect(interceptor.intercept(mockExecutionContext, mockCallHandler).toPromise()).rejects.toThrow('Test Error'); + + expect(mockHistogram.labels).toHaveBeenCalledWith({ statusCode: 500, endpoint: '/test' }); + // expect(mockHistogram.observe).toHaveBeenCalledWith(200); + }); + + it('should handle JSON parsing errors gracefully', async () => { + (fs.readFileSync as jest.Mock).mockImplementationOnce(() => { throw new SyntaxError('Invalid JSON'); }); + + await expect(interceptor.intercept(mockExecutionContext, mockCallHandler).toPromise()).resolves.toBe('test'); + + expect(mockHistogram.labels).toHaveBeenCalledWith({ statusCode: 200, endpoint: '/test' }); + // expect(mockHistogram.observe).toHaveBeenCalledWith(100); + }); +}); diff --git a/packages/common/test/monitoring/monitoring.service.spec.ts b/packages/common/test/monitoring/monitoring.service.spec.ts new file mode 100644 index 0000000..2899f1d --- /dev/null +++ b/packages/common/test/monitoring/monitoring.service.spec.ts @@ -0,0 +1,97 @@ +import { MonitoringService } from '../../src/monitoring/monitoring.service'; +import { CACHE_MANAGER } from '@nestjs/cache-manager'; +import { Counter, register } from 'prom-client'; + +describe('MonitoringService', () => { + let service: MonitoringService; + let cacheManagerMock: any; + let redisClientMock: any; + + beforeEach(() => { + // Clear Prometheus registry to avoid duplicate metric registration + register.clear(); + + // Mock Redis Client + redisClientMock = { + incr: jest.fn(), + }; + + // Mock CACHE_MANAGER + cacheManagerMock = { + get: jest.fn().mockResolvedValue('0'), + set: jest.fn(), + del: jest.fn(), + reset: jest.fn(), + wrap: jest.fn(), + keys: jest.fn(), + ttl: jest.fn(), + store: { + getClient: jest.fn().mockReturnValue(redisClientMock), + }, + }; + + // Mock Counter + const counterMock = { + inc: jest.fn(), + get: jest.fn().mockReturnValue({ values: [{ value: 0 }] }), + }; + + service = new MonitoringService(cacheManagerMock); + (service as any).requestCounter = counterMock; + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('initializeAsync', () => { + it('should initialize the counter with the cached value', async () => { + await service.initializeAsync(); + + expect(cacheManagerMock.get).toHaveBeenCalledWith('requestCount'); + expect((service as any).requestCounter.inc).toHaveBeenCalledWith(0); + }); + }); + + describe('getRequestCounter', () => { + it('should return the cached request count', async () => { + const count = await service.getRequestCounter(); + + expect(cacheManagerMock.get).toHaveBeenCalledWith('requestCount'); + expect(count).toBe('0'); + }); + }); + + describe('incrementRequestCounter', () => { + it('should increment the request counter and update the cache', async () => { + await service.incrementRequestCounter(); + + expect((service as any).requestCounter.inc).toHaveBeenCalled(); + expect(cacheManagerMock.store.getClient).toHaveBeenCalled(); + expect(redisClientMock.incr).toHaveBeenCalledWith('requestCount'); + }); + }); + + describe('onExit', () => { + it('should increment the request counter on exit', async () => { + jest.spyOn(service, 'incrementRequestCounter').mockResolvedValue(); + + await service.onExit(); + + expect(service.incrementRequestCounter).toHaveBeenCalled(); + }); + + it('should log an error if incrementRequestCounter fails', async () => { + jest.spyOn(service, 'incrementRequestCounter').mockRejectedValue(new Error('Test Error')); + const consoleSpy = jest.spyOn(console, 'log').mockImplementation(); + + await service.onExit(); + + expect(consoleSpy).toHaveBeenCalledWith(new Error('Test Error')); + }); + }); +}); diff --git a/packages/common/test/temporal/temporal.service.spec.ts b/packages/common/test/temporal/temporal.service.spec.ts new file mode 100644 index 0000000..2ae436b --- /dev/null +++ b/packages/common/test/temporal/temporal.service.spec.ts @@ -0,0 +1,70 @@ +import { TemporalWorkflowService } from '../../src/services/temporal.service'; +import { WorkflowClient } from '@temporalio/client'; + +jest.mock('@temporalio/client'); + +describe('TemporalWorkflowService', () => { + let service: TemporalWorkflowService; + let mockWorkflowClient: jest.Mocked; + + beforeEach(() => { + mockWorkflowClient = new WorkflowClient() as jest.Mocked; + + (mockWorkflowClient.start as jest.Mock).mockResolvedValue({ + workflowId: 'workflow-id', + }); + (mockWorkflowClient.getHandle as jest.Mock).mockReturnValue({ + result: jest.fn().mockResolvedValue('workflow-result'), + }); + + service = new TemporalWorkflowService(); + service['workflowClient'] = mockWorkflowClient; // inject the mocked client + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('startWorkflow', () => { + it('should start a workflow and return the result', async () => { + const workflow = 'testWorkflow'; + const args = ['testArg']; + const taskQueue = 'default'; + const workflowId = 'test-workflow-id'; + + const result = await service.startWorkflow(workflow, taskQueue, args, workflowId); + + expect(mockWorkflowClient.start).toHaveBeenCalledWith(workflow, { + taskQueue, + args, + workflowId, + }); + expect(mockWorkflowClient.getHandle).toHaveBeenCalledWith('workflow-id'); + expect(result).toBe('workflow-result'); + }); + + it('should use default values if optional parameters are not provided', async () => { + const workflow = 'testWorkflow'; + + const result = await service.startWorkflow(workflow); + + expect(mockWorkflowClient.start).toHaveBeenCalledWith(workflow, { + taskQueue: 'default', + args: ['Temporal'], + workflowId: expect.stringMatching(/^workflow-\d+$/), + }); + expect(mockWorkflowClient.getHandle).toHaveBeenCalledWith('workflow-id'); + expect(result).toBe('workflow-result'); + }); + + it('should handle workflow client errors', async () => { + (mockWorkflowClient.start as jest.Mock).mockRejectedValue(new Error('Workflow start error')); + + await expect(service.startWorkflow('testWorkflow')).rejects.toThrow('Workflow start error'); + }); + }); +}); diff --git a/packages/common/yarn.lock b/packages/common/yarn.lock index 09240ca..bb2e714 100644 --- a/packages/common/yarn.lock +++ b/packages/common/yarn.lock @@ -666,7 +666,7 @@ jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.7.0": +"@jest/transform@^29.0.0", "@jest/transform@^29.7.0": version "29.7.0" resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== @@ -1264,10 +1264,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.5.2": - version "29.5.11" - resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.11.tgz" - integrity sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ== +"@types/jest@^29.5.12": + version "29.5.12" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz" + integrity sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -1287,6 +1287,11 @@ resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== +"@types/mocha@^10.0.6": + version "10.0.6" + resolved "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz" + integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== + "@types/multer@^1.4.11": version "1.4.11" resolved "https://registry.npmjs.org/@types/multer/-/multer-1.4.11.tgz" @@ -1693,6 +1698,11 @@ ajv@8.12.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ansi-colors@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + ansi-colors@4.1.3: version "4.1.3" resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" @@ -2002,6 +2012,11 @@ browser-or-node@^2.1.1: resolved "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz" integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + browserslist@^4.14.5, browserslist@^4.22.2, "browserslist@>= 4.21.0": version "4.22.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz" @@ -2106,7 +2121,7 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.2.0: +camelcase@^6.0.0, camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== @@ -2204,6 +2219,15 @@ cli-width@^3.0.0: resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" @@ -2402,7 +2426,7 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2416,6 +2440,11 @@ debug@2.6.9: dependencies: ms "2.0.0" +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.2: version "0.2.2" resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" @@ -2518,6 +2547,11 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -2619,6 +2653,11 @@ escape-string-regexp@^4.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-config-prettier@*, eslint-config-prettier@^9.0.0: version "9.1.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz" @@ -3003,10 +3042,10 @@ fastify-plugin@^4.0.0: resolved "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz" integrity sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ== -fastify@^4.25.2: - version "4.26.2" - resolved "https://registry.npmjs.org/fastify/-/fastify-4.26.2.tgz" - integrity sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug== +fastify@^4.27.0: + version "4.27.0" + resolved "https://registry.npmjs.org/fastify/-/fastify-4.27.0.tgz" + integrity sha512-ci9IXzbigB8dyi0mSy3faa3Bsj0xWAPb9JeT4KRzubdSb6pNhcADRUaXCBml6V1Ss/a05kbtQls5LBmhHydoTA== dependencies: "@fastify/ajv-compiler" "^3.5.0" "@fastify/error" "^3.4.0" @@ -3017,7 +3056,7 @@ fastify@^4.25.2: fast-json-stringify "^5.8.0" find-my-way "^8.0.0" light-my-request "^5.11.0" - pino "^8.17.0" + pino "^9.0.0" process-warning "^3.0.0" proxy-addr "^2.0.7" rfdc "^1.3.0" @@ -3125,6 +3164,14 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" @@ -3134,6 +3181,11 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.2.9: version "3.2.9" resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz" @@ -3319,6 +3371,17 @@ glob@10.3.10: minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry "^1.10.1" +glob@8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + globals@^11.1.0: version "11.12.0" resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" @@ -3406,6 +3469,11 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +he@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + heap-js@^2.3.0: version "2.5.0" resolved "https://registry.npmjs.org/heap-js/-/heap-js-2.5.0.tgz" @@ -3660,6 +3728,11 @@ is-path-inside@^3.0.3: resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" @@ -4128,7 +4201,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.0.0, jest@^29.5.0: +jest@^29.0.0, jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== @@ -4151,7 +4224,7 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: +js-yaml@^4.1.0, js-yaml@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== @@ -4302,7 +4375,7 @@ lodash@^4.17.21: resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@^4.1.0: +log-symbols@^4.1.0, log-symbols@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== @@ -4451,6 +4524,13 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1, minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^8.0.2: version "8.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz" @@ -4519,6 +4599,32 @@ mnemonist@0.39.6: dependencies: obliterator "^2.0.1" +mocha@^10.4.0: + version "10.4.0" + resolved "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz" + integrity sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA== + dependencies: + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "8.1.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + ms@^3.0.0-canary.1: version "3.0.0-canary.1" resolved "https://registry.npmjs.org/ms/-/ms-3.0.0-canary.1.tgz" @@ -4854,6 +4960,14 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1, picomatc resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pino-abstract-transport@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz" + integrity sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q== + dependencies: + readable-stream "^4.0.0" + split2 "^4.0.0" + pino-abstract-transport@v1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz" @@ -4867,6 +4981,11 @@ pino-std-serializers@^6.0.0: resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz" integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== +pino-std-serializers@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz" + integrity sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA== + pino@^8.17.0: version "8.19.0" resolved "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz" @@ -4884,6 +5003,23 @@ pino@^8.17.0: sonic-boom "^3.7.0" thread-stream "^2.0.0" +pino@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/pino/-/pino-9.1.0.tgz" + integrity sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA== + dependencies: + atomic-sleep "^1.0.0" + fast-redact "^3.1.1" + on-exit-leak-free "^2.1.0" + pino-abstract-transport "^1.2.0" + pino-std-serializers "^7.0.0" + process-warning "^3.0.0" + quick-format-unescaped "^4.0.3" + real-require "^0.2.0" + safe-stable-stringify "^2.3.1" + sonic-boom "^4.0.1" + thread-stream "^3.0.0" + pirates@^4.0.4: version "4.0.6" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" @@ -4957,10 +5093,10 @@ process@^0.11.10: resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -prom-client@^15.1.0: - version "15.1.0" - resolved "https://registry.npmjs.org/prom-client/-/prom-client-15.1.0.tgz" - integrity sha512-cCD7jLTqyPdjEPBo/Xk4Iu8jxjuZgZJ3e/oET3L+ZwOuap/7Cw3dH/TJSsZKs1TQLZ2IHpIlRAKw82ef06kmMw== +prom-client@^15.1.2: + version "15.1.2" + resolved "https://registry.npmjs.org/prom-client/-/prom-client-15.1.2.tgz" + integrity sha512-on3h1iXb04QFLLThrmVYg1SChBQ9N1c+nKAjebBjokBqipddH3uxmOUcEkTnzmJ8Jh/5TSUnUqS40i2QB2dJHQ== dependencies: "@opentelemetry/api" "^1.4.0" tdigest "^0.1.1" @@ -5412,6 +5548,13 @@ serialize-javascript@^6.0.1: dependencies: randombytes "^2.1.0" +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + serve-static@1.15.0: version "1.15.0" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" @@ -5499,6 +5642,13 @@ sonic-boom@^3.7.0: dependencies: atomic-sleep "^1.0.0" +sonic-boom@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz" + integrity sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ== + dependencies: + atomic-sleep "^1.0.0" + source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" @@ -5675,7 +5825,7 @@ strip-final-newline@^3.0.0: resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== -strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1, strip-json-comments@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -5730,6 +5880,13 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -5814,6 +5971,13 @@ thread-stream@^2.0.0: dependencies: real-require "^0.2.0" +thread-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-3.0.0.tgz" + integrity sha512-oUIFjxaUT6knhPtWgDMc29zF1FcSl0yXpapkyrQrCGEfYA2HUZXCilUtKyYIv6HkCyqSPAMkY+EG0GbyIrNDQg== + dependencies: + real-require "^0.2.0" + through@^2.3.6: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" @@ -5880,10 +6044,10 @@ ts-api-utils@^1.0.1: resolved "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz" integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== -ts-jest@^29.1.0: - version "29.1.1" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz" - integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== +ts-jest@^29.1.3: + version "29.1.3" + resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz" + integrity sha512-6L9qz3ginTd1NKhOxmkP0qU3FyKjj5CPoY+anszfVn6Pmv/RIKzhiMCsH7Yb7UvJR9I2A64rm4zQl531s2F1iw== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -6202,6 +6366,11 @@ windows-release@^4.0.0: dependencies: execa "^4.0.2" +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -6289,11 +6458,26 @@ yallist@^4.0.0, yallist@4.0.0: resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== +yargs-parser@^20.2.2, yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^21.0.1, yargs-parser@^21.1.1, yargs-parser@21.1.1: version "21.1.1" resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" @@ -6307,6 +6491,19 @@ yargs@^17.3.1, yargs@^17.7.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yn@3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"