From e1d9488f243e4cb06a5b2831d42807aff5f8d7fc Mon Sep 17 00:00:00 2001 From: Conut-1 <1mim1@naver.com> Date: Wed, 4 Sep 2024 18:32:15 +0900 Subject: [PATCH] =?UTF-8?q?test:=20jest-mock-extended=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PrismaService를 DeepMockProxy 등을 사용하지 않고 필요한 함수만 Mocking한다. --- nestjs-BE/server/package-lock.json | 1035 ++++++++--------- nestjs-BE/server/package.json | 1 - .../server/src/auth/auth.controller.spec.ts | 94 +- .../server/src/auth/auth.service.spec.ts | 44 +- .../src/auth/refresh-tokens.service.spec.ts | 60 +- .../src/boards/boards.controller.spec.ts | 47 +- .../server/src/boards/boards.service.spec.ts | 13 +- .../src/profiles/profiles.controller.spec.ts | 36 +- .../src/profiles/profiles.service.spec.ts | 66 +- .../src/spaces/spaces.controller.spec.ts | 67 +- .../server/src/spaces/spaces.service.spec.ts | 70 +- .../server/src/users/users.service.spec.ts | 44 +- 12 files changed, 777 insertions(+), 800 deletions(-) diff --git a/nestjs-BE/server/package-lock.json b/nestjs-BE/server/package-lock.json index 60809c68..a460b1e0 100644 --- a/nestjs-BE/server/package-lock.json +++ b/nestjs-BE/server/package-lock.json @@ -47,7 +47,6 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.5.0", - "jest-mock-extended": "^3.0.7", "prettier": "^3.0.0", "prisma": "^5.6.0", "source-map-support": "^0.5.21", @@ -127,15 +126,15 @@ } }, "node_modules/@angular-devkit/schematics-cli": { - "version": "16.2.8", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-16.2.8.tgz", - "integrity": "sha512-EXURJCzWTVYCipiTT4vxQQOrF63asOUDbeOy3OtiSh7EwIUvxm3BPG6hquJqngEnI/N6bA75NJ1fBhU6Hrh7eA==", + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics-cli/-/schematics-cli-17.3.8.tgz", + "integrity": "sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.8", - "@angular-devkit/schematics": "16.2.8", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", "ansi-colors": "4.1.3", - "inquirer": "8.2.4", + "inquirer": "9.2.15", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, @@ -143,52 +142,149 @@ "schematics": "bin/schematics.js" }, "engines": { - "node": "^16.14.0 || >=18.10.0", + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics-cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/@angular-devkit/schematics-cli/node_modules/inquirer": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz", - "integrity": "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==", + "version": "9.2.15", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.15.tgz", + "integrity": "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==", "dev": true, "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "@ljharb/through": "^2.3.12", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^3.2.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=18" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@angular-devkit/schematics-cli/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { - "node": ">=10" + "node": ">=12" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@angular-devkit/schematics-cli/node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" } }, "node_modules/@babel/code-frame": { @@ -1486,14 +1582,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1509,22 +1605,22 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -1534,15 +1630,27 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@lukeed/csprng": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", @@ -1560,33 +1668,29 @@ } }, "node_modules/@nestjs/cli": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.2.1.tgz", - "integrity": "sha512-CAJAQwmxFZfB3RTvqz/eaXXWpyU+mZ4QSqfBYzjneTsPgF+uyOAW3yQpaLNn9Dfcv39R9UxSuAhayv6yuFd+Jg==", + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-10.4.5.tgz", + "integrity": "sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.8", - "@angular-devkit/schematics": "16.2.8", - "@angular-devkit/schematics-cli": "16.2.8", + "@angular-devkit/core": "17.3.8", + "@angular-devkit/schematics": "17.3.8", + "@angular-devkit/schematics-cli": "17.3.8", "@nestjs/schematics": "^10.0.1", "chalk": "4.1.2", - "chokidar": "3.5.3", - "cli-table3": "0.6.3", + "chokidar": "3.6.0", + "cli-table3": "0.6.5", "commander": "4.1.1", "fork-ts-checker-webpack-plugin": "9.0.2", - "glob": "10.3.10", + "glob": "10.4.2", "inquirer": "8.2.6", "node-emoji": "1.11.0", "ora": "5.4.1", - "os-name": "4.0.1", - "rimraf": "4.4.1", - "shelljs": "0.8.5", - "source-map-support": "0.5.21", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", - "typescript": "5.2.2", - "webpack": "5.89.0", + "typescript": "5.3.3", + "webpack": "5.94.0", "webpack-node-externals": "3.0.0" }, "bin": { @@ -1596,7 +1700,7 @@ "node": ">= 16.14" }, "peerDependencies": { - "@swc/cli": "^0.1.62", + "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0", "@swc/core": "^1.3.62" }, "peerDependenciesMeta": { @@ -1608,6 +1712,81 @@ } } }, + "node_modules/@nestjs/cli/node_modules/@angular-devkit/core": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-17.3.8.tgz", + "integrity": "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.1", + "picomatch": "4.0.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@nestjs/cli/node_modules/@angular-devkit/schematics": { + "version": "17.3.8", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-17.3.8.tgz", + "integrity": "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "17.3.8", + "jsonc-parser": "3.2.1", + "magic-string": "0.30.8", + "ora": "5.4.1", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^18.13.0 || >=20.9.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@nestjs/cli/node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/@nestjs/cli/node_modules/magic-string": { + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@nestjs/cli/node_modules/picomatch": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.1.tgz", + "integrity": "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@nestjs/common": { "version": "10.2.8", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.2.8.tgz", @@ -1726,15 +1905,15 @@ } }, "node_modules/@nestjs/platform-express": { - "version": "10.2.8", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.8.tgz", - "integrity": "sha512-WoSSVtwIRc5AdGMHWVzWZK4JZLT0f4o2xW8P9gQvcX+omL8W1kXCfY8GQYXNBG84XmBNYH8r0FtC8oMe/lH5NQ==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.1.tgz", + "integrity": "sha512-ccfqIDAq/bg1ShLI5KGtaLaYGykuAdvCi57ohewH7eKJSIpWY1DQjbgKlFfXokALYUq1YOMGqjeZ244OWHfDQg==", "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", - "express": "4.18.2", + "express": "4.19.2", "multer": "1.4.4-lts.1", - "tslib": "2.6.2" + "tslib": "2.6.3" }, "funding": { "type": "opencollective", @@ -1745,6 +1924,11 @@ "@nestjs/core": "^10.0.0" } }, + "node_modules/@nestjs/platform-express/node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, "node_modules/@nestjs/platform-socket.io": { "version": "10.2.8", "resolved": "https://registry.npmjs.org/@nestjs/platform-socket.io/-/platform-socket.io-10.2.8.tgz", @@ -2124,21 +2308,13 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz", "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==", "dev": true, + "optional": true, + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -2584,9 +2760,9 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -2606,9 +2782,9 @@ "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { @@ -2629,15 +2805,15 @@ "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -2665,28 +2841,28 @@ "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -2694,24 +2870,24 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -2720,12 +2896,12 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -2765,10 +2941,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -3258,12 +3434,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -3399,13 +3575,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3480,16 +3661,10 @@ "dev": true }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3502,6 +3677,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -3576,9 +3754,9 @@ } }, "node_modules/cli-table3": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", - "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", "dev": true, "dependencies": { "string-width": "^4.2.0" @@ -3765,9 +3943,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -4084,16 +4262,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -4257,19 +4438,10 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -4280,7 +4452,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" @@ -4303,9 +4475,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -4324,6 +4496,25 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", @@ -4658,16 +4849,16 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -4698,29 +4889,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -4739,20 +4907,6 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -4867,9 +5021,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -4988,9 +5142,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -5143,15 +5297,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5178,22 +5336,23 @@ } }, "node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5227,9 +5386,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -5317,11 +5476,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5538,15 +5697,6 @@ "node": ">=12.0.0" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5884,16 +6034,13 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=14" - }, "funding": { "url": "https://github.com/sponsors/isaacs" }, @@ -6226,19 +6373,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-mock-extended": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/jest-mock-extended/-/jest-mock-extended-3.0.7.tgz", - "integrity": "sha512-7lsKdLFcW9B9l5NzZ66S/yTQ9k8rFtnwYdCNuRU/81fqDWicNDVhitTSPnrGmNeNm0xyw0JHexEOShrIKRCIRQ==", - "dev": true, - "dependencies": { - "ts-essentials": "^10.0.0" - }, - "peerDependencies": { - "jest": "^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 || ^28.0.0 || ^29.0.0", - "typescript": "^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", @@ -6827,18 +6961,6 @@ "node": ">=12" } }, - "node_modules/macos-release": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.1.tgz", - "integrity": "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/magic-string": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", @@ -6935,12 +7057,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -7007,9 +7129,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -7388,22 +7510,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/os-name": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", - "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", - "dev": true, - "dependencies": { - "macos-release": "^2.5.0", - "windows-release": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -7452,6 +7558,12 @@ "node": ">=6" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7558,29 +7670,26 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", - "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", - "dev": true, - "engines": { - "node": "14 || >=16.14" - } + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true }, "node_modules/path-to-regexp": { "version": "3.2.0", @@ -7809,16 +7918,6 @@ "node": ">= 0.10" } }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7954,18 +8053,6 @@ "node": ">=8.10.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", @@ -8083,75 +8170,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", - "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", - "dev": true, - "dependencies": { - "glob": "^9.2.0" - }, - "bin": { - "rimraf": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "9.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", - "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "minimatch": "^8.0.2", - "minipass": "^4.2.4", - "path-scurry": "^1.6.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", - "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/run-applescript": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", @@ -8357,9 +8375,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -8380,14 +8398,16 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -8419,43 +8439,6 @@ "node": ">=8" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -8519,11 +8502,12 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dependencies": { - "ws": "~8.11.0" + "debug": "~4.3.4", + "ws": "~8.17.1" } }, "node_modules/socket.io-parser": { @@ -8836,9 +8820,9 @@ } }, "node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -8854,16 +8838,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -9053,20 +9037,6 @@ "typescript": ">=4.2.0" } }, - "node_modules/ts-essentials": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-10.0.0.tgz", - "integrity": "sha512-77FHNJEyysF9+1s4G6eejuA1lxw7uMchT3ZPy3CIbh7GIunffpshtM8pTe5G6N5dpOzNevqRHew859ceLWVBfw==", - "dev": true, - "peerDependencies": { - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/ts-jest": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", @@ -9266,9 +9236,9 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -9456,9 +9426,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -9483,34 +9453,33 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -9611,74 +9580,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/windows-release": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", - "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", - "dev": true, - "dependencies": { - "execa": "^4.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/windows-release/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/windows-release/node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/windows-release/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -9737,15 +9638,15 @@ "dev": true }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { diff --git a/nestjs-BE/server/package.json b/nestjs-BE/server/package.json index adc41086..4abe9280 100644 --- a/nestjs-BE/server/package.json +++ b/nestjs-BE/server/package.json @@ -58,7 +58,6 @@ "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.5.0", - "jest-mock-extended": "^3.0.7", "prettier": "^3.0.0", "prisma": "^5.6.0", "source-map-support": "^0.5.21", diff --git a/nestjs-BE/server/src/auth/auth.controller.spec.ts b/nestjs-BE/server/src/auth/auth.controller.spec.ts index af77ba17..07cc7907 100644 --- a/nestjs-BE/server/src/auth/auth.controller.spec.ts +++ b/nestjs-BE/server/src/auth/auth.controller.spec.ts @@ -1,8 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { AuthController } from './auth.controller'; -import { PrismaService } from '../prisma/prisma.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { PrismaClient, RefreshToken, User } from '@prisma/client'; +import { RefreshToken, User } from '@prisma/client'; import { AuthService } from './auth.service'; import { UsersService } from '../users/users.service'; import { RefreshTokensService } from './refresh-tokens.service'; @@ -11,37 +9,47 @@ import { BadRequestException, NotFoundException } from '@nestjs/common'; describe('AuthController', () => { let controller: AuthController; - let refreshTokensService: DeepMockProxy; - let usersService: DeepMockProxy; - let authService: DeepMockProxy; + let refreshTokensService: RefreshTokensService; + let usersService: UsersService; + let authService: AuthService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [AuthController], providers: [ - AuthService, - PrismaService, - UsersService, - ProfilesService, - RefreshTokensService, + { + provide: AuthService, + useValue: { + getKakaoAccount: jest.fn(), + login: jest.fn(), + renewAccessToken: jest.fn(), + }, + }, + { + provide: UsersService, + useValue: { + findUserByEmailAndProvider: jest.fn(), + createUser: jest.fn(), + }, + }, + { + provide: ProfilesService, + useValue: { + createProfile: jest.fn(), + }, + }, + { + provide: RefreshTokensService, + useValue: { deleteRefreshToken: jest.fn() }, + }, ], - }) - .overrideProvider(AuthService) - .useValue(mockDeep()) - .overrideProvider(PrismaService) - .useValue(mockDeep()) - .overrideProvider(UsersService) - .useValue(mockDeep()) - .overrideProvider(ProfilesService) - .useValue(mockDeep()) - .overrideProvider(RefreshTokensService) - .useValue(mockDeep()) - .compile(); + }).compile(); controller = module.get(AuthController); - refreshTokensService = module.get(RefreshTokensService); - authService = module.get(AuthService); - usersService = module.get(UsersService); + refreshTokensService = + module.get(RefreshTokensService); + authService = module.get(AuthService); + usersService = module.get(UsersService); }); it('kakaoLogin user have been logged in', async () => { @@ -51,11 +59,13 @@ describe('AuthController', () => { refresh_token: 'refresh token', access_token: 'access token', }; - authService.getKakaoAccount.mockResolvedValue(kakaoUserAccountMock); - usersService.findUserByEmailAndProvider.mockResolvedValue({ + jest + .spyOn(authService, 'getKakaoAccount') + .mockResolvedValue(kakaoUserAccountMock); + jest.spyOn(usersService, 'findUserByEmailAndProvider').mockResolvedValue({ uuid: 'user uuid', } as User); - authService.login.mockResolvedValue(tokenMock); + jest.spyOn(authService, 'login').mockResolvedValue(tokenMock); const response = controller.kakaoLogin(requestMock); @@ -74,9 +84,13 @@ describe('AuthController', () => { refresh_token: 'refresh token', access_token: 'access token', }; - authService.getKakaoAccount.mockResolvedValue(kakaoUserAccountMock); - usersService.createUser.mockResolvedValue({ uuid: 'user uuid' } as User); - authService.login.mockResolvedValue(tokenMock); + jest + .spyOn(authService, 'getKakaoAccount') + .mockResolvedValue(kakaoUserAccountMock); + jest + .spyOn(usersService, 'createUser') + .mockResolvedValue({ uuid: 'user uuid' } as User); + jest.spyOn(authService, 'login').mockResolvedValue(tokenMock); const response = controller.kakaoLogin(requestMock); @@ -90,7 +104,7 @@ describe('AuthController', () => { it('kakaoLogin kakao login fail', async () => { const requestMock = { kakaoUserId: 0 }; - authService.getKakaoAccount.mockResolvedValue(null); + jest.spyOn(authService, 'getKakaoAccount').mockResolvedValue(null); const response = controller.kakaoLogin(requestMock); @@ -99,7 +113,9 @@ describe('AuthController', () => { it('renewAccessToken respond new access token', async () => { const requestMock = { refresh_token: 'refresh token' }; - authService.renewAccessToken.mockResolvedValue('new access token'); + jest + .spyOn(authService, 'renewAccessToken') + .mockResolvedValue('new access token'); const response = controller.renewAccessToken(requestMock); @@ -112,7 +128,7 @@ describe('AuthController', () => { it('renewAccessToken received expired token', async () => { const requestMock = { refresh_token: 'refresh token' }; - authService.renewAccessToken.mockRejectedValue(new Error()); + jest.spyOn(authService, 'renewAccessToken').mockRejectedValue(new Error()); const response = controller.renewAccessToken(requestMock); @@ -122,7 +138,9 @@ describe('AuthController', () => { it('logout received token deleted', async () => { const requestMock = { refresh_token: 'refresh token' }; const token = {} as RefreshToken; - refreshTokensService.deleteRefreshToken.mockResolvedValue(token); + jest + .spyOn(refreshTokensService, 'deleteRefreshToken') + .mockResolvedValue(token); const response = controller.logout(requestMock); @@ -134,7 +152,9 @@ describe('AuthController', () => { it('logout received token not found', async () => { const requestMock = { refresh_token: 'bad refresh token' }; - refreshTokensService.deleteRefreshToken.mockResolvedValue(null); + jest + .spyOn(refreshTokensService, 'deleteRefreshToken') + .mockResolvedValue(null); const response = controller.logout(requestMock); diff --git a/nestjs-BE/server/src/auth/auth.service.spec.ts b/nestjs-BE/server/src/auth/auth.service.spec.ts index 60f044f3..dfc58dc0 100644 --- a/nestjs-BE/server/src/auth/auth.service.spec.ts +++ b/nestjs-BE/server/src/auth/auth.service.spec.ts @@ -1,8 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { AuthService } from './auth.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { PrismaClient, RefreshToken } from '@prisma/client'; -import { PrismaService } from '../prisma/prisma.service'; +import { RefreshToken } from '@prisma/client'; import { JwtModule, JwtService } from '@nestjs/jwt'; import { RefreshTokensService } from './refresh-tokens.service'; @@ -10,27 +8,31 @@ const fetchSpy = jest.spyOn(global, 'fetch'); describe('AuthService', () => { let service: AuthService; - let prisma: DeepMockProxy; - let jwtService: DeepMockProxy; - let refreshTokensService: DeepMockProxy; + let jwtService: JwtService; + let refreshTokensService: RefreshTokensService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [JwtModule], - providers: [AuthService, PrismaService, RefreshTokensService], + providers: [ + AuthService, + { + provide: RefreshTokensService, + useValue: { + createRefreshToken: jest.fn(), + findRefreshToken: jest.fn(), + }, + }, + ], }) - .overrideProvider(PrismaService) - .useValue(mockDeep()) .overrideProvider(JwtService) - .useValue(mockDeep()) - .overrideProvider(RefreshTokensService) - .useValue(mockDeep()) + .useValue({ signAsync: jest.fn(), verify: jest.fn() }) .compile(); service = module.get(AuthService); - prisma = module.get(PrismaService); - jwtService = module.get(JwtService); - refreshTokensService = module.get(RefreshTokensService); + jwtService = module.get(JwtService); + refreshTokensService = + module.get(RefreshTokensService); }); afterEach(() => { @@ -38,8 +40,8 @@ describe('AuthService', () => { }); it('login success', async () => { - jwtService.signAsync.mockResolvedValue('access token'); - refreshTokensService.createRefreshToken.mockResolvedValue({ + jest.spyOn(jwtService, 'signAsync').mockResolvedValue('access token'); + jest.spyOn(refreshTokensService, 'createRefreshToken').mockResolvedValue({ token: 'refresh token', } as unknown as RefreshToken); @@ -52,9 +54,9 @@ describe('AuthService', () => { }); it('renewAccessToken success', async () => { - jwtService.verify.mockReturnValue({}); - jwtService.signAsync.mockResolvedValue('access token'); - refreshTokensService.findRefreshToken.mockResolvedValue({ + jest.spyOn(jwtService, 'verify').mockReturnValue({}); + jest.spyOn(jwtService, 'signAsync').mockResolvedValue('access token'); + jest.spyOn(refreshTokensService, 'findRefreshToken').mockResolvedValue({ user_id: 'user uuid', } as RefreshToken); @@ -64,7 +66,7 @@ describe('AuthService', () => { }); it('renewAccessToken fail', async () => { - jwtService.verify.mockImplementation(() => { + jest.spyOn(jwtService, 'verify').mockImplementation(() => { throw new Error(); }); diff --git a/nestjs-BE/server/src/auth/refresh-tokens.service.spec.ts b/nestjs-BE/server/src/auth/refresh-tokens.service.spec.ts index 0aae4537..1ddc8798 100644 --- a/nestjs-BE/server/src/auth/refresh-tokens.service.spec.ts +++ b/nestjs-BE/server/src/auth/refresh-tokens.service.spec.ts @@ -1,7 +1,5 @@ import { Test, TestingModule } from '@nestjs/testing'; import { RefreshTokensService } from './refresh-tokens.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { PrismaClient } from '@prisma/client'; import { PrismaService } from '../prisma/prisma.service'; import { JwtModule, JwtService } from '@nestjs/jwt'; import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; @@ -10,21 +8,31 @@ jest.useFakeTimers(); describe('RefreshTokensService', () => { let service: RefreshTokensService; - let prisma: DeepMockProxy; + let prisma: PrismaService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [JwtModule], - providers: [RefreshTokensService, PrismaService], + providers: [ + RefreshTokensService, + { + provide: PrismaService, + useValue: { + refreshToken: { + findUnique: jest.fn(), + create: jest.fn(), + delete: jest.fn(), + }, + }, + }, + ], }) - .overrideProvider(PrismaService) - .useValue(mockDeep()) .overrideProvider(JwtService) - .useValue(mockDeep()) + .useValue({ sign: jest.fn() }) .compile(); service = module.get(RefreshTokensService); - prisma = module.get(PrismaService); + prisma = module.get(PrismaService); }); afterEach(() => { @@ -48,7 +56,7 @@ describe('RefreshTokensService', () => { expiry_date: service.getExpiryDate(), user_id: 'UserId', }; - prisma.refreshToken.findUnique.mockResolvedValue(testToken); + jest.spyOn(prisma.refreshToken, 'findUnique').mockResolvedValue(testToken); const token = service.findRefreshToken(testToken.token); @@ -56,7 +64,7 @@ describe('RefreshTokensService', () => { }); it('findRefreshToken not found token', async () => { - prisma.refreshToken.findUnique.mockResolvedValue(null); + jest.spyOn(prisma.refreshToken, 'findUnique').mockResolvedValue(null); const token = service.findRefreshToken('Token'); @@ -70,7 +78,7 @@ describe('RefreshTokensService', () => { expiry_date: service.getExpiryDate(), user_id: 'userId', }; - prisma.refreshToken.create.mockResolvedValue(testToken); + jest.spyOn(prisma.refreshToken, 'create').mockResolvedValue(testToken); const token = service.createRefreshToken('userId'); @@ -78,12 +86,14 @@ describe('RefreshTokensService', () => { }); it('createUser user already exists', async () => { - prisma.refreshToken.create.mockRejectedValue( - new PrismaClientKnownRequestError( - 'Unique constraint failed on the constraint: `RefreshToken_token_key`', - { code: 'P2025', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.refreshToken, 'create') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'Unique constraint failed on the constraint: `RefreshToken_token_key`', + { code: 'P2025', clientVersion: '' }, + ), + ); const token = service.createRefreshToken('userId'); @@ -97,7 +107,7 @@ describe('RefreshTokensService', () => { expiry_date: service.getExpiryDate(), user_id: 'userId', }; - prisma.refreshToken.delete.mockResolvedValue(testToken); + jest.spyOn(prisma.refreshToken, 'delete').mockResolvedValue(testToken); const token = service.deleteRefreshToken(testToken.token); @@ -105,12 +115,14 @@ describe('RefreshTokensService', () => { }); it('deleteRefreshToken not found', async () => { - prisma.refreshToken.delete.mockRejectedValue( - new PrismaClientKnownRequestError( - 'An operation failed because it depends on one or more records that were required but not found. Record to update not found.', - { code: 'P2025', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.refreshToken, 'delete') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'An operation failed because it depends on one or more records that were required but not found. Record to delete not found.', + { code: 'P2025', clientVersion: '' }, + ), + ); const token = service.deleteRefreshToken('Token'); diff --git a/nestjs-BE/server/src/boards/boards.controller.spec.ts b/nestjs-BE/server/src/boards/boards.controller.spec.ts index cca601c2..3231b42e 100644 --- a/nestjs-BE/server/src/boards/boards.controller.spec.ts +++ b/nestjs-BE/server/src/boards/boards.controller.spec.ts @@ -2,7 +2,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { BoardsController } from './boards.controller'; import { BoardsService } from './boards.service'; import { UploadService } from '../upload/upload.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; import { Board } from './schemas/board.schema'; import { CreateBoardDto } from './dto/create-board.dto'; import { HttpStatus, NotFoundException } from '@nestjs/common'; @@ -11,23 +10,33 @@ import { UpdateWriteOpResult } from 'mongoose'; describe('BoardsController', () => { let controller: BoardsController; - let boardsService: DeepMockProxy; - let uploadService: DeepMockProxy; + let boardsService: BoardsService; + let uploadService: UploadService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [BoardsController], - providers: [BoardsService, UploadService], - }) - .overrideProvider(BoardsService) - .useValue(mockDeep()) - .overrideProvider(UploadService) - .useValue(mockDeep()) - .compile(); + providers: [ + { + provide: BoardsService, + useValue: { + create: jest.fn(), + deleteBoard: jest.fn(), + restoreBoard: jest.fn(), + }, + }, + { + provide: UploadService, + useValue: { + uploadFile: jest.fn(), + }, + }, + ], + }).compile(); controller = module.get(BoardsController); - boardsService = module.get(BoardsService); - uploadService = module.get(UploadService); + boardsService = module.get(BoardsService); + uploadService = module.get(UploadService); }); it('createBoard created board', async () => { @@ -36,8 +45,8 @@ describe('BoardsController', () => { spaceId: 'space uuid', } as CreateBoardDto; const imageMock = { filename: 'image' } as Express.Multer.File; - uploadService.uploadFile.mockResolvedValue('image url'); - boardsService.create.mockResolvedValue({ + jest.spyOn(uploadService, 'uploadFile').mockResolvedValue('image url'); + jest.spyOn(boardsService, 'create').mockResolvedValue({ uuid: 'board uuid', createdAt: 'created date' as unknown as Date, } as Board); @@ -61,7 +70,7 @@ describe('BoardsController', () => { boardName: 'board name', spaceId: 'space uuid', } as CreateBoardDto; - boardsService.create.mockResolvedValue({ + jest.spyOn(boardsService, 'create').mockResolvedValue({ uuid: 'board uuid', createdAt: 'created date' as unknown as Date, } as Board); @@ -85,7 +94,7 @@ describe('BoardsController', () => { it('deleteBoard success', async () => { const bodyMock = { boardId: 'board uuid' }; - boardsService.deleteBoard.mockResolvedValue({ + jest.spyOn(boardsService, 'deleteBoard').mockResolvedValue({ matchedCount: 1, } as UpdateWriteOpResult); @@ -99,7 +108,7 @@ describe('BoardsController', () => { it('deleteBoard fail', async () => { const bodyMock = { boardId: 'board uuid' }; - boardsService.deleteBoard.mockResolvedValue({ + jest.spyOn(boardsService, 'deleteBoard').mockResolvedValue({ matchedCount: 0, } as UpdateWriteOpResult); @@ -110,7 +119,7 @@ describe('BoardsController', () => { it('restoreBoard success', async () => { const bodyMock = { boardId: 'board uuid' }; - boardsService.restoreBoard.mockResolvedValue({ + jest.spyOn(boardsService, 'restoreBoard').mockResolvedValue({ matchedCount: 1, } as UpdateWriteOpResult); @@ -124,7 +133,7 @@ describe('BoardsController', () => { it('restoreBoard fail', async () => { const bodyMock = { boardId: 'board uuid' }; - boardsService.restoreBoard.mockResolvedValue({ + jest.spyOn(boardsService, 'restoreBoard').mockResolvedValue({ matchedCount: 0, } as UpdateWriteOpResult); diff --git a/nestjs-BE/server/src/boards/boards.service.spec.ts b/nestjs-BE/server/src/boards/boards.service.spec.ts index 67ef5ffd..f70dc9ef 100644 --- a/nestjs-BE/server/src/boards/boards.service.spec.ts +++ b/nestjs-BE/server/src/boards/boards.service.spec.ts @@ -3,12 +3,11 @@ import { BoardsService } from './boards.service'; import { getModelToken } from '@nestjs/mongoose'; import { Board, BoardDocument } from './schemas/board.schema'; import { Model, Query } from 'mongoose'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; import { CreateBoardDto } from './dto/create-board.dto'; describe('BoardsService', () => { let service: BoardsService; - let model: DeepMockProxy>; + let model: Model; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -16,7 +15,7 @@ describe('BoardsService', () => { BoardsService, { provide: getModelToken(Board.name), - useValue: mockDeep>(), + useValue: { create: jest.fn(), find: jest.fn() }, }, ], }).compile(); @@ -31,9 +30,9 @@ describe('BoardsService', () => { spaceId: 'space uuid', } as CreateBoardDto; const imageMock = 'www.test.com/image'; - model.create.mockResolvedValue( - 'created board' as unknown as BoardDocument[], - ); + jest + .spyOn(model, 'create') + .mockResolvedValue('created board' as unknown as BoardDocument[]); const board = service.create(data, imageMock); @@ -42,7 +41,7 @@ describe('BoardsService', () => { }); it('findBySpaceId', async () => { - model.find.mockReturnValue({ + jest.spyOn(model, 'find').mockReturnValue({ exec: async () => { return 'board list' as unknown as Board[]; }, diff --git a/nestjs-BE/server/src/profiles/profiles.controller.spec.ts b/nestjs-BE/server/src/profiles/profiles.controller.spec.ts index 7af28683..edcce612 100644 --- a/nestjs-BE/server/src/profiles/profiles.controller.spec.ts +++ b/nestjs-BE/server/src/profiles/profiles.controller.spec.ts @@ -1,30 +1,30 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ProfilesController } from './profiles.controller'; import { ProfilesService } from './profiles.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; import { UploadService } from '../upload/upload.service'; import { RequestWithUser } from '../utils/interface'; import { NotFoundException } from '@nestjs/common'; describe('ProfilesController', () => { let controller: ProfilesController; - let profilesService: DeepMockProxy; - let uploadService: DeepMockProxy; + let profilesService: ProfilesService; + let uploadService: UploadService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [ProfilesController], - providers: [ProfilesService, UploadService], - }) - .overrideProvider(ProfilesService) - .useValue(mockDeep()) - .overrideProvider(UploadService) - .useValue(mockDeep()) - .compile(); + providers: [ + { + provide: ProfilesService, + useValue: { findProfile: jest.fn(), updateProfile: jest.fn() }, + }, + { provide: UploadService, useValue: { uploadFile: jest.fn() } }, + ], + }).compile(); controller = module.get(ProfilesController); - profilesService = module.get(ProfilesService); - uploadService = module.get(UploadService); + profilesService = module.get(ProfilesService); + uploadService = module.get(UploadService); }); it('findProfile found profile', async () => { @@ -35,7 +35,7 @@ describe('ProfilesController', () => { image: 'www.test.com/image', nickname: 'test nickname', }; - profilesService.findProfile.mockResolvedValue(testProfile); + jest.spyOn(profilesService, 'findProfile').mockResolvedValue(testProfile); const response = controller.findProfile(requestMock); @@ -51,7 +51,7 @@ describe('ProfilesController', () => { it('findProfile not found profile', async () => { const requestMock = { user: { uuid: 'test uuid' } } as RequestWithUser; - profilesService.findProfile.mockResolvedValue(null); + jest.spyOn(profilesService, 'findProfile').mockResolvedValue(null); const response = controller.findProfile(requestMock); @@ -71,8 +71,8 @@ describe('ProfilesController', () => { image: 'www.test.com/image', nickname: 'test nickname', }; - uploadService.uploadFile.mockResolvedValue(testImageUrl); - profilesService.updateProfile.mockResolvedValue(testProfile); + jest.spyOn(uploadService, 'uploadFile').mockResolvedValue(testImageUrl); + jest.spyOn(profilesService, 'updateProfile').mockResolvedValue(testProfile); const response = controller.update(imageMock, requestMock, bodyMock); @@ -96,8 +96,8 @@ describe('ProfilesController', () => { nickname: 'test nickname', }; const testImageUrl = 'www.test.com/image'; - uploadService.uploadFile.mockResolvedValue(testImageUrl); - profilesService.updateProfile.mockResolvedValue(null); + jest.spyOn(uploadService, 'uploadFile').mockResolvedValue(testImageUrl); + jest.spyOn(profilesService, 'updateProfile').mockResolvedValue(null); const response = controller.update(imageMock, requestMock, bodyMock); diff --git a/nestjs-BE/server/src/profiles/profiles.service.spec.ts b/nestjs-BE/server/src/profiles/profiles.service.spec.ts index 2ead69de..eed7adf2 100644 --- a/nestjs-BE/server/src/profiles/profiles.service.spec.ts +++ b/nestjs-BE/server/src/profiles/profiles.service.spec.ts @@ -1,25 +1,33 @@ import { Test, TestingModule } from '@nestjs/testing'; import { ProfilesService } from './profiles.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { PrismaClient } from '@prisma/client'; import { PrismaService } from '../prisma/prisma.service'; import generateUuid from '../utils/uuid'; import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; describe('ProfilesService', () => { let profilesService: ProfilesService; - let prisma: DeepMockProxy; + let prisma: PrismaService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [ProfilesService, PrismaService], - }) - .overrideProvider(PrismaService) - .useValue(mockDeep()) - .compile(); + providers: [ + ProfilesService, + { + provide: PrismaService, + useValue: { + profile: { + findUnique: jest.fn(), + findMany: jest.fn(), + create: jest.fn(), + update: jest.fn(), + }, + }, + }, + ], + }).compile(); profilesService = module.get(ProfilesService); - prisma = module.get(PrismaService); + prisma = module.get(PrismaService); }); it('findProfile found profile', async () => { @@ -30,7 +38,7 @@ describe('ProfilesService', () => { image: 'www.test.com/image', nickname: 'test nickname', }; - prisma.profile.findUnique.mockResolvedValue(testProfile); + jest.spyOn(prisma.profile, 'findUnique').mockResolvedValue(testProfile); const user = profilesService.findProfile(userId); @@ -39,7 +47,7 @@ describe('ProfilesService', () => { it('findProfile not found profile', async () => { const userId = generateUuid(); - prisma.profile.findUnique.mockResolvedValue(null); + jest.spyOn(prisma.profile, 'findUnique').mockResolvedValue(null); const user = profilesService.findProfile(userId); @@ -59,7 +67,7 @@ describe('ProfilesService', () => { nickname: `nickname${index}`, }; }); - prisma.profile.findMany.mockResolvedValue(testProfiles); + jest.spyOn(prisma.profile, 'findMany').mockResolvedValue(testProfiles); const profiles = profilesService.findProfiles(profileUuids); @@ -68,7 +76,7 @@ describe('ProfilesService', () => { it('findProfiles not found profiles', async () => { const profileUuids = []; - prisma.profile.findMany.mockResolvedValue([]); + jest.spyOn(prisma.profile, 'findMany').mockResolvedValue([]); const profiles = profilesService.findProfiles(profileUuids); @@ -82,7 +90,7 @@ describe('ProfilesService', () => { nickname: 'test nickname', }; const testProfile = { uuid: generateUuid(), ...data }; - prisma.profile.create.mockResolvedValue(testProfile); + jest.spyOn(prisma.profile, 'create').mockResolvedValue(testProfile); const profile = profilesService.createProfile(data); @@ -95,12 +103,14 @@ describe('ProfilesService', () => { image: 'www.test.com/image', nickname: 'test nickname', }; - prisma.profile.create.mockRejectedValue( - new PrismaClientKnownRequestError( - 'Foreign key constraint failed on the field: `user_id`', - { code: 'P2003', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.profile, 'create') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'Foreign key constraint failed on the field: `user_id`', + { code: 'P2003', clientVersion: '' }, + ), + ); const profile = profilesService.createProfile(data); @@ -114,7 +124,7 @@ describe('ProfilesService', () => { }; const uuid = generateUuid(); const testProfile = { uuid: generateUuid(), user_id: uuid, ...data }; - prisma.profile.update.mockResolvedValue(testProfile); + jest.spyOn(prisma.profile, 'update').mockResolvedValue(testProfile); const profile = profilesService.updateProfile(uuid, data); @@ -126,12 +136,14 @@ describe('ProfilesService', () => { image: 'www.test.com', nickname: 'test nickname', }; - prisma.profile.update.mockRejectedValue( - new PrismaClientKnownRequestError( - 'An operation failed because it depends on one or more records that were required but not found. Record to update not found.', - { code: 'P2025', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.profile, 'update') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'An operation failed because it depends on one or more records that were required but not found. Record to update not found.', + { code: 'P2025', clientVersion: '' }, + ), + ); const profile = profilesService.updateProfile(generateUuid(), data); diff --git a/nestjs-BE/server/src/spaces/spaces.controller.spec.ts b/nestjs-BE/server/src/spaces/spaces.controller.spec.ts index f5e97988..1a83b0d0 100644 --- a/nestjs-BE/server/src/spaces/spaces.controller.spec.ts +++ b/nestjs-BE/server/src/spaces/spaces.controller.spec.ts @@ -1,7 +1,6 @@ import { Test, TestingModule } from '@nestjs/testing'; import { SpacesController } from './spaces.controller'; import { SpacesService } from './spaces.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; import { ProfileSpaceService } from '../profile-space/profile-space.service'; import { UploadService } from '../upload/upload.service'; import { ProfilesService } from '../profiles/profiles.service'; @@ -15,34 +14,32 @@ const { APP_ICON_URL } = customEnv; describe('SpacesController', () => { let controller: SpacesController; - let spacesService: DeepMockProxy; - let uploadService: DeepMockProxy; - let profilesService: DeepMockProxy; + let spacesService: SpacesService; + let uploadService: UploadService; + let profilesService: ProfilesService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ controllers: [SpacesController], providers: [ - SpacesService, - UploadService, - ProfileSpaceService, - ProfilesService, + { + provide: SpacesService, + useValue: { + createSpace: jest.fn(), + findSpace: jest.fn(), + updateSpace: jest.fn(), + }, + }, + { provide: UploadService, useValue: { uploadFile: jest.fn() } }, + { provide: ProfileSpaceService, useValue: { joinSpace: jest.fn() } }, + { provide: ProfilesService, useValue: { findProfile: jest.fn() } }, ], - }) - .overrideProvider(SpacesService) - .useValue(mockDeep()) - .overrideProvider(UploadService) - .useValue(mockDeep()) - .overrideProvider(ProfileSpaceService) - .useValue(mockDeep()) - .overrideProvider(ProfilesService) - .useValue(mockDeep()) - .compile(); + }).compile(); controller = module.get(SpacesController); - spacesService = module.get(SpacesService); - uploadService = module.get(UploadService); - profilesService = module.get(ProfilesService); + spacesService = module.get(SpacesService); + uploadService = module.get(UploadService); + profilesService = module.get(ProfilesService); }); it('create created', async () => { @@ -51,9 +48,11 @@ describe('SpacesController', () => { const requestMock = { user: { uuid: 'user uuid' } } as RequestWithUser; const profileMock = { uuid: 'profile uuid' } as Profile; const spaceMock = { uuid: 'space uuid' } as Space; - profilesService.findProfile.mockResolvedValue(profileMock); - uploadService.uploadFile.mockResolvedValue('www.test.com/image'); - spacesService.createSpace.mockResolvedValue(spaceMock); + jest.spyOn(profilesService, 'findProfile').mockResolvedValue(profileMock); + jest + .spyOn(uploadService, 'uploadFile') + .mockResolvedValue('www.test.com/image'); + jest.spyOn(spacesService, 'createSpace').mockResolvedValue(spaceMock); const response = controller.create(iconMock, bodyMock, requestMock); @@ -72,7 +71,7 @@ describe('SpacesController', () => { it('create not found profile', async () => { const bodyMock = { name: 'new space name' } as CreateSpaceDto; const requestMock = { user: { uuid: 'user uuid' } } as RequestWithUser; - profilesService.findProfile.mockResolvedValue(null); + jest.spyOn(profilesService, 'findProfile').mockResolvedValue(null); const response = controller.create( null as unknown as Express.Multer.File, @@ -88,8 +87,8 @@ describe('SpacesController', () => { const requestMock = { user: { uuid: 'user uuid' } } as RequestWithUser; const profileMock = { uuid: 'profile uuid' } as Profile; const spaceMock = { uuid: 'space uuid' } as Space; - profilesService.findProfile.mockResolvedValue(profileMock); - spacesService.createSpace.mockResolvedValue(spaceMock); + jest.spyOn(profilesService, 'findProfile').mockResolvedValue(profileMock); + jest.spyOn(spacesService, 'createSpace').mockResolvedValue(spaceMock); const response = controller.create( null as unknown as Express.Multer.File, @@ -111,7 +110,7 @@ describe('SpacesController', () => { it('findOne found space', async () => { const spaceMock = { uuid: 'space uuid' } as Space; - spacesService.findSpace.mockResolvedValue(spaceMock); + jest.spyOn(spacesService, 'findSpace').mockResolvedValue(spaceMock); const response = controller.findOne('space uuid'); @@ -123,7 +122,7 @@ describe('SpacesController', () => { }); it('findOne not found space', async () => { - spacesService.findSpace.mockResolvedValue(null); + jest.spyOn(spacesService, 'findSpace').mockResolvedValue(null); const response = controller.findOne('space uuid'); @@ -134,8 +133,10 @@ describe('SpacesController', () => { const iconMock = { filename: 'icon' } as Express.Multer.File; const bodyMock = { name: 'new space name' } as UpdateSpaceDto; const spaceMock = { uuid: 'space uuid' } as Space; - spacesService.updateSpace.mockResolvedValue(spaceMock); - uploadService.uploadFile.mockResolvedValue('www.test.com/image'); + jest.spyOn(spacesService, 'updateSpace').mockResolvedValue(spaceMock); + jest + .spyOn(uploadService, 'uploadFile') + .mockResolvedValue('www.test.com/image'); const response = controller.update(iconMock, 'space uuid', bodyMock); @@ -150,7 +151,7 @@ describe('SpacesController', () => { it('update icon not requested', async () => { const bodyMock = { name: 'new space name' } as UpdateSpaceDto; const spaceMock = { uuid: 'space uuid' } as Space; - spacesService.updateSpace.mockResolvedValue(spaceMock); + jest.spyOn(spacesService, 'updateSpace').mockResolvedValue(spaceMock); const response = controller.update( null as unknown as Express.Multer.File, @@ -169,7 +170,7 @@ describe('SpacesController', () => { it('update fail', async () => { const iconMock = { filename: 'icon' } as Express.Multer.File; const bodyMock = { name: 'new space name' } as UpdateSpaceDto; - spacesService.updateSpace.mockResolvedValue(null); + jest.spyOn(spacesService, 'updateSpace').mockResolvedValue(null); const response = controller.update(iconMock, 'space uuid', bodyMock); diff --git a/nestjs-BE/server/src/spaces/spaces.service.spec.ts b/nestjs-BE/server/src/spaces/spaces.service.spec.ts index 10b03afb..2eb30f40 100644 --- a/nestjs-BE/server/src/spaces/spaces.service.spec.ts +++ b/nestjs-BE/server/src/spaces/spaces.service.spec.ts @@ -1,29 +1,39 @@ import { Test, TestingModule } from '@nestjs/testing'; import { SpacesService } from './spaces.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { PrismaClient, Space } from '@prisma/client'; +import { Space } from '@prisma/client'; import { PrismaService } from '../prisma/prisma.service'; import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; describe('SpacesService', () => { let spacesService: SpacesService; - let prisma: DeepMockProxy; + let prisma: PrismaService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [SpacesService, PrismaService], - }) - .overrideProvider(PrismaService) - .useValue(mockDeep()) - .compile(); + providers: [ + SpacesService, + { + provide: PrismaService, + useValue: { + space: { + findUnique: jest.fn(), + findMany: jest.fn(), + create: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + }, + }, + }, + ], + }).compile(); spacesService = module.get(SpacesService); - prisma = module.get(PrismaService); + prisma = module.get(PrismaService); }); it('findSpace found space', async () => { const spaceMock = { uuid: 'space uuid' } as Space; - prisma.space.findUnique.mockResolvedValue(spaceMock); + jest.spyOn(prisma.space, 'findUnique').mockResolvedValue(spaceMock); const space = spacesService.findSpace('space uuid'); @@ -31,7 +41,7 @@ describe('SpacesService', () => { }); it('findSpace not found space', async () => { - prisma.space.findUnique.mockResolvedValue(null); + jest.spyOn(prisma.space, 'findUnique').mockResolvedValue(null); const space = spacesService.findSpace('bad space uuid'); @@ -43,7 +53,7 @@ describe('SpacesService', () => { { uuid: 'space uuid 1' }, { uuid: 'space uuid 2' }, ] as Space[]; - prisma.space.findMany.mockResolvedValue(spaceUuidsMock); + jest.spyOn(prisma.space, 'findMany').mockResolvedValue(spaceUuidsMock); const spaces = spacesService.findSpaces(['space uuid 1', 'space uuid 2']); @@ -51,7 +61,7 @@ describe('SpacesService', () => { }); it('findSpaces not found spaces', async () => { - prisma.space.findMany.mockResolvedValue([]); + jest.spyOn(prisma.space, 'findMany').mockResolvedValue([]); const spaces = spacesService.findSpaces(['space uuid 1', 'space uuid 2']); @@ -61,7 +71,7 @@ describe('SpacesService', () => { it('createSpace created space', async () => { const data = { name: 'new space name', icon: 'new icon' }; const spaceMock = { uuid: 'space uuid', ...data }; - prisma.space.create.mockResolvedValue(spaceMock); + jest.spyOn(prisma.space, 'create').mockResolvedValue(spaceMock); const space = spacesService.createSpace(data); @@ -71,7 +81,7 @@ describe('SpacesService', () => { it('updateSpace updated space', async () => { const data = { name: 'new space name', icon: 'new space icon' }; const spaceMock = { uuid: 'space uuid', ...data }; - prisma.space.update.mockResolvedValue(spaceMock); + jest.spyOn(prisma.space, 'update').mockResolvedValue(spaceMock); const space = spacesService.updateSpace('space uuid', data); @@ -80,12 +90,14 @@ describe('SpacesService', () => { it('updateSpace fail', async () => { const data = { name: 'new space name', icon: 'new space icon' }; - prisma.space.update.mockRejectedValue( - new PrismaClientKnownRequestError( - 'An operation failed because it depends on one or more records that were required but not found. Record to update not found.', - { code: 'P2025', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.space, 'update') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'An operation failed because it depends on one or more records that were required but not found. Record to update not found.', + { code: 'P2025', clientVersion: '' }, + ), + ); const space = spacesService.updateSpace('space uuid', data); @@ -94,7 +106,7 @@ describe('SpacesService', () => { it('deleteSpace deleted spaced', async () => { const spaceMock = { uuid: 'space uuid' } as Space; - prisma.space.delete.mockResolvedValue(spaceMock); + jest.spyOn(prisma.space, 'delete').mockResolvedValue(spaceMock); const space = spacesService.deleteSpace('space uuid'); @@ -102,12 +114,14 @@ describe('SpacesService', () => { }); it('deleteSpace fail', async () => { - prisma.space.delete.mockRejectedValue( - new PrismaClientKnownRequestError( - 'An operation failed because it depends on one or more records that were required but not found. Record to delete not found.', - { code: 'P2025', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.space, 'delete') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'An operation failed because it depends on one or more records that were required but not found. Record to delete not found.', + { code: 'P2025', clientVersion: '' }, + ), + ); const space = spacesService.deleteSpace('space uuid'); diff --git a/nestjs-BE/server/src/users/users.service.spec.ts b/nestjs-BE/server/src/users/users.service.spec.ts index 5a76966a..f6154742 100644 --- a/nestjs-BE/server/src/users/users.service.spec.ts +++ b/nestjs-BE/server/src/users/users.service.spec.ts @@ -1,25 +1,31 @@ import { Test, TestingModule } from '@nestjs/testing'; import { UsersService } from './users.service'; import { PrismaService } from '../prisma/prisma.service'; -import { DeepMockProxy, mockDeep } from 'jest-mock-extended'; -import { PrismaClient } from '@prisma/client'; import generateUuid from '../utils/uuid'; import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; describe('UsersService', () => { let usersService: UsersService; - let prisma: DeepMockProxy; + let prisma: PrismaService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [UsersService, PrismaService], - }) - .overrideProvider(PrismaService) - .useValue(mockDeep()) - .compile(); + providers: [ + UsersService, + { + provide: PrismaService, + useValue: { + user: { + findUnique: jest.fn(), + create: jest.fn(), + }, + }, + }, + ], + }).compile(); usersService = module.get(UsersService); - prisma = module.get(PrismaService); + prisma = module.get(PrismaService); }); it('findUserByEmailAndProvider found user', async () => { @@ -28,7 +34,7 @@ describe('UsersService', () => { email: 'test@test.com', provider: 'kakao', }; - prisma.user.findUnique.mockResolvedValue(testUser); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValue(testUser); const user = usersService.findUserByEmailAndProvider( 'test@test.com', @@ -39,7 +45,7 @@ describe('UsersService', () => { }); it('findUserByEmailAndProvider not found user', async () => { - prisma.user.findUnique.mockResolvedValue(null); + jest.spyOn(prisma.user, 'findUnique').mockResolvedValue(null); const user = usersService.findUserByEmailAndProvider( 'test@test.com', @@ -55,7 +61,7 @@ describe('UsersService', () => { email: 'test@test.com', provider: 'kakao', }; - prisma.user.create.mockResolvedValue(testUser); + jest.spyOn(prisma.user, 'create').mockResolvedValue(testUser); const user = usersService.createUser({ email: 'test@test.com', @@ -66,12 +72,14 @@ describe('UsersService', () => { }); it('createUser user already exists', async () => { - prisma.user.create.mockRejectedValue( - new PrismaClientKnownRequestError( - 'Unique constraint failed on the constraint: `User_email_provider_key`', - { code: 'P2025', clientVersion: '' }, - ), - ); + jest + .spyOn(prisma.user, 'create') + .mockRejectedValue( + new PrismaClientKnownRequestError( + 'Unique constraint failed on the constraint: `User_email_provider_key`', + { code: 'P2025', clientVersion: '' }, + ), + ); const user = usersService.createUser({ email: 'test@test.com',