From 581e6c6a9022845c619b85c4d706e06453ccb971 Mon Sep 17 00:00:00 2001 From: ssk7594-CRz Date: Thu, 5 Mar 2026 04:21:04 +0000 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EC=8A=A4=ED=94=84=EB=A6=B0?= =?UTF-8?q?=ED=8A=B88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .devcontainer.json | 1 + .gitignore | 1 + .vscode/settings.json | 3 + Acticle.js | 65 - main.js | 104 - package-lock.json | 486 ++++ package.json | 14 + .../.gitignore | 10 + .../.prettierrc | 10 + .../package-lock.json | 1973 +++++++++++++++++ .../package.json | 21 + .../migrations/20250111082621_/migration.sql | 43 + .../migration.sql | 91 + .../migration.sql | 11 + .../prisma/migrations/migration_lock.toml | 3 + .../prisma/schema.prisma | 112 + .../public/.gitkeep | 0 pandamarket-be-sprint-mission-3-main/read.me | 41 + .../src/controllers/articlesController.js | 138 ++ .../src/controllers/authController.js | 88 + .../src/controllers/commentsController.js | 94 + .../src/controllers/errorController.js | 29 + .../src/controllers/imagesController.js | 41 + .../src/controllers/likeController.js | 79 + .../src/controllers/productsController.js | 137 ++ .../src/controllers/userController.js | 141 ++ .../src/lib/constants.js | 7 + .../src/lib/errors/BadRequestError.js | 8 + .../src/lib/errors/NotFoundError.js | 8 + .../src/lib/prismaClient.js | 3 + .../src/lib/socket.js | 35 + .../src/lib/withAsync.js | 9 + .../src/main.js | 36 + .../src/middlewares/authMiddleware.js | 30 + .../src/middlewares/validate.js | 28 + .../src/routers/articlesRouter.js | 26 + .../src/routers/authRoutes.js | 12 + .../src/routers/commentsRouter.js | 11 + .../src/routers/imagesRouter.js | 9 + .../src/routers/productsRouter.js | 26 + .../src/routers/userRoutes.js | 21 + .../src/socket/socket.js | 31 + .../src/structs/articlesStructs.js | 12 + .../src/structs/authStructs.js | 12 + .../src/structs/commentsStruct.js | 10 + .../src/structs/commonStructs.js | 22 + .../src/structs/productsStruct.js | 14 + .../src/structs/userStructs.js | 11 + product-service.js | 102 - simple-fetch.js | 151 -- tsconfig.json | 44 + util.js | 4 - 52 files changed, 3992 insertions(+), 426 deletions(-) create mode 100755 .devcontainer.json create mode 100644 .gitignore create mode 100644 .vscode/settings.json delete mode 100644 Acticle.js delete mode 100644 main.js create mode 100755 package-lock.json create mode 100755 package.json create mode 100755 pandamarket-be-sprint-mission-3-main/.gitignore create mode 100755 pandamarket-be-sprint-mission-3-main/.prettierrc create mode 100755 pandamarket-be-sprint-mission-3-main/package-lock.json create mode 100755 pandamarket-be-sprint-mission-3-main/package.json create mode 100755 pandamarket-be-sprint-mission-3-main/prisma/migrations/20250111082621_/migration.sql create mode 100644 pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226084615_init_notification_system/migration.sql create mode 100644 pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226091616_add_owner_to_product/migration.sql create mode 100755 pandamarket-be-sprint-mission-3-main/prisma/migrations/migration_lock.toml create mode 100644 pandamarket-be-sprint-mission-3-main/prisma/schema.prisma create mode 100755 pandamarket-be-sprint-mission-3-main/public/.gitkeep create mode 100644 pandamarket-be-sprint-mission-3-main/read.me create mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/controllers/authController.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/controllers/userController.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/constants.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/lib/socket.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/main.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/socket/socket.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js create mode 100755 pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js create mode 100644 pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js delete mode 100644 product-service.js delete mode 100644 simple-fetch.js create mode 100755 tsconfig.json delete mode 100644 util.js diff --git a/.devcontainer.json b/.devcontainer.json new file mode 100755 index 00000000..1e61b640 --- /dev/null +++ b/.devcontainer.json @@ -0,0 +1 @@ +{"image":"mcr.microsoft.com/devcontainers/javascript-node"} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c2658d7d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..05cbdd4d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "prisma.pinToPrisma6": true +} \ No newline at end of file diff --git a/Acticle.js b/Acticle.js deleted file mode 100644 index f3e4e0c9..00000000 --- a/Acticle.js +++ /dev/null @@ -1,65 +0,0 @@ -import axios from "axios"; -import { Article } from "./main.js"; - -// ## Article 요청 함수 구현하기 - -// - [https://panda-market-api-crud.vercel.app/docs] -// (https://panda-market-api-crud.vercel.app/docs)의 Article API를 이용하여 아래 함수들을 구현해 주세요. - -// - `getArticleList()`: GET 메소드를 사용해 주세요. -// - `page`,`pageSize`,`keyword`쿼리 파라미터를 이용해 주세요. -// https://panda-market-api-crud.vercel.app/articles - -//catch문 사용위해 error 문 작성 해놓기 -const logAndThrow = (error) => { - console.error("Error fetching article list:", error); //console.error문 설명듣기 - throw error; -}; - -const articleFromInfo = ({ title, content, image }) => - new Article(title, content, image); //인스턴스 선언 - -// getArticleList() : GET 메소드를 사용해 주세요. -// page, pageSize, keyword 쿼리 파라미터를 이용해 주세요 - -function getArticleList(params) { - return axios - .get("https://panda-market-api-crud.vercel.app/articles", { params }) - .then((response) => response.data.list.map(articleFromInfo)) - .catch(logAndThrow); -} - -//`getArticle()`: GET 메소드를 사용해 주세요. -function getArticle(articleId) { - return axios - .get(`https://panda-market-api-crud.vercel.app/articles/${articleId}`) - .then(articleFromInfo) - .catch(logAndThrow); -} -// , 안쓰고 $ 쓴이유 - -// - `createArticle()`: POST 메소드를 사용해 주세요. -// - request body에`title`,`content`,`image`를 포함해 주세요. -function createArticle(article) { - return axios - .post("https://panda-market-api-crud.vercel.app/articles", article) - .catch(logAndThrow); -} - -// - `patchArticle()`: PATCH 메소드를 사용해 주세요. -function patchArticle(id, article) { - return axios - .patch( - `https://panda-market-api-crud.vercel.app/articles/${articleId}`, - article - ) - .catch(logAndThrow); -} - -// - `deleteArticle()`: DELETE 메소드를 사용해 주세요. -function deleteArticle(articleId) { - return axios - .delete(`https://panda-market-api-crud.vercel.app/articles/${articleId}`) - .then(({ id }) => id) - .catch(logAndThrow); -} diff --git a/main.js b/main.js deleted file mode 100644 index a4be03c8..00000000 --- a/main.js +++ /dev/null @@ -1,104 +0,0 @@ -// main.js - -// Product 클래스 - 추상화와 캡슐화를 고려 -export class Product { - //외부에서 가져갈 수 있도록 export 사용, import통해 가져가기 가능 - #favoriteCount; // private 필드로 캡슐화, 밖에서 컨택하지 못하게 함 - - constructor(name, description, price, tags = [], images = []) { - //여기는 객체 아님 {}금지 - // =[]은 기본값 설정한 것임, name, descriptino, price는 필수 값이라는 뜻! - //favoriteCount가 파라미터로 들어가지 않은 이유는 외부에서 받는 정보가 아니기 때문임 - this.name = name; - this.description = description; - this.price = price; - this.tags = tags; - this.images = images; - - this.#favoriteCount = 0; //새로운 객체가 생성될때마다 카운트(초기화)해주기 위해 =0 할당함 - } - - // 찜하기 메소드 - favorite() { - this.#favoriteCount++; - } - //getter 이용해 외부에서도 Count 되는걸 볼 수 있게함, 해당 문제에서는 없어도 ㄱㅊ - get favoriteCount() { - return this.#favoriteCount; - } -} - -/** - * Product 데이터 검증 - * @param {Object} productData - 검증할 Product 데이터 - * @throws {Error} 검증 실패 시 에러 발생 - */ -function validateProduct(name, description, price, tags, images) { - // 필수 필드 존재 여부 확인 - const missingFields = []; - if (name === undefined) missingFields.push("name"); - if (description === undefined) missingFields.push("description"); - if (price === undefined || price === null) missingFields.push("price"); - if (!tags) missingFields.push("tags"); - if (!images) missingFields.push("images"); - //조건이 안맞을때마다 missingFields에 해당 파라미터가 추가되어지고 밑의 함수로 인해 걸러짐 - - if (missingFields.length > 0) { - throw new Error(`필수 필드가 누락되었습니다: ${missingFields.join(", ")}`); - } - // 추가된 파라미터가 하나라도 있을 시 필수필드가 누락되어짐을 알려주는 코드이다 - - // 데이터 타입 검증 - if (typeof name !== "string") { - throw new Error("name은 문자열이어야 합니다."); - } - if (typeof description !== "string") { - throw new Error("description은 문자열이어야 합니다."); - } - if (typeof price !== "number" || price < 0) { - throw new Error("price는 0 이상의 숫자여야 합니다."); - } - if (!Array.isArray(tags)) { - throw new Error("tags는 배열이어야 합니다."); - } - if (!Array.isArray(images)) { - throw new Error("images는 배열이어야 합니다."); - } -} - -// ElectronicProduct 클래스 - 상속 -export class ElectronicProduct extends Product { - constructor(name, description, price, tags = [], images = [], manufacturer) { - super(name, description, price, tags, images); - this.manufacturer = manufacturer; - } - - // 다형성: 부모 클래스의 메소드를 오버라이드할 수 있음 - //favorite()은 메소드, favoriteCount는 필드이므로 상속되어도 favoriteCount 불가능 - favorite() { - super.favorite(); - } -} - -// Article 클래스 -export class Article { - #likeCount; // private 필드로 캡슐화 - #createdAt; // private 필드로 캡슐화 - - constructor(title, content, image) { - this.title = title; - this.content = content; - this.image = image; - this.#likeCount = 0; - this.#createdAt = new Date(); // 현재 시간 저장 - } - - // 좋아요 메소드 - like() { - this.#likeCount++; - } - - // get likeCount() { - // return this.#likeCount; - // } -} diff --git a/package-lock.json b/package-lock.json new file mode 100755 index 00000000..c1d45801 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,486 @@ +{ + "name": "sprint-mission-3", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "bcrypt": "^6.0.0" + }, + "devDependencies": { + "@prisma/client": "^6.19.1", + "prisma": "^6.19.1", + "typescript": "^5.9.3" + } + }, + "node_modules/@prisma/client": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", + "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.1.tgz", + "integrity": "sha512-bUL/aYkGXLwxVGhJmQMtslLT7KPEfUqmRa919fKI4wQFX4bIFUKiY8Jmio/2waAjjPYrtuDHa7EsNCnJTXxiOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "c12": "3.1.0", + "deepmerge-ts": "7.1.5", + "effect": "3.18.4", + "empathic": "2.0.0" + } + }, + "node_modules/@prisma/debug": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.1.tgz", + "integrity": "sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.1.tgz", + "integrity": "sha512-xy95dNJ7DiPf9IJ3oaVfX785nbFl7oNDzclUF+DIiJw6WdWCvPl0LPU0YqQLsrwv8N64uOQkH391ujo3wSo+Nw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.1", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/fetch-engine": "6.19.1", + "@prisma/get-platform": "6.19.1" + } + }, + "node_modules/@prisma/engines-version": { + "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", + "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.1.tgz", + "integrity": "sha512-mmgcotdaq4VtAHO6keov3db+hqlBzQS6X7tR7dFCbvXjLVTxBYdSJFRWz+dq7F9p6dvWyy1X0v8BlfRixyQK6g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.1", + "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", + "@prisma/get-platform": "6.19.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.1.tgz", + "integrity": "sha512-zsg44QUiQAnFUyh6Fbt7c9HjMXHwFTqtrgcX7DAZmRgnkPyYT7Sh8Mn8D5PuuDYNtMOYcpLGg576MLfIORsBYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.19.1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/c12": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", + "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "confbox": "^0.2.2", + "defu": "^6.1.4", + "dotenv": "^16.6.1", + "exsolve": "^1.0.7", + "giget": "^2.0.0", + "jiti": "^2.4.2", + "ohash": "^2.0.11", + "pathe": "^2.0.3", + "perfect-debounce": "^1.0.0", + "pkg-types": "^2.2.0", + "rc9": "^2.1.2" + }, + "peerDependencies": { + "magicast": "^0.3.5" + }, + "peerDependenciesMeta": { + "magicast": { + "optional": true + } + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/deepmerge-ts": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", + "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/effect": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", + "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "fast-check": "^3.23.1" + } + }, + "node_modules/empathic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", + "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.23.2", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", + "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT", + "dependencies": { + "pure-rand": "^6.1.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/giget": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", + "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.0", + "defu": "^6.1.4", + "node-fetch-native": "^1.6.6", + "nypm": "^0.6.0", + "pathe": "^2.0.3" + }, + "bin": { + "giget": "dist/cli.mjs" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/nypm": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", + "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.3.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/prisma": { + "version": "6.19.1", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", + "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@prisma/config": "6.19.1", + "@prisma/engines": "6.19.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + } + } +} diff --git a/package.json b/package.json new file mode 100755 index 00000000..8ab91272 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "scripts": { + "build": "tsc", + "start": "node ./build/main.js" + }, + "devDependencies": { + "@prisma/client": "^6.19.1", + "prisma": "^6.19.1", + "typescript": "^5.9.3" + }, + "dependencies": { + "bcrypt": "^6.0.0" + } +} diff --git a/pandamarket-be-sprint-mission-3-main/.gitignore b/pandamarket-be-sprint-mission-3-main/.gitignore new file mode 100755 index 00000000..b0fc192f --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/.gitignore @@ -0,0 +1,10 @@ +# Local files +.vscode/ +node_modules/ +.env* +!.env.example + +# Uploaded files +public/* +!public/.gitkeep + diff --git a/pandamarket-be-sprint-mission-3-main/.prettierrc b/pandamarket-be-sprint-mission-3-main/.prettierrc new file mode 100755 index 00000000..a1ce23fb --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/.prettierrc @@ -0,0 +1,10 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "semi": true, + "printWidth": 100, + "endOfLine": "auto", + "arrowParens": "always", + "tabWidth": 2 + } + \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/package-lock.json b/pandamarket-be-sprint-mission-3-main/package-lock.json new file mode 100755 index 00000000..90a5f1c5 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/package-lock.json @@ -0,0 +1,1973 @@ +{ + "name": "pandamarket-be-sprint-mission-3-main", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "@prisma/client": "^5.16.2", + "bcrypt": "^6.0.0", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.3", + "multer": "^1.4.5-lts.1", + "superstruct": "^2.0.2", + "uuid": "^11.0.5" + }, + "devDependencies": { + "prettier": "^3.3.2", + "prisma": "^5.16.2" + } + }, + "node_modules/@prisma/client": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", + "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", + "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", + "devOptional": true + }, + "node_modules/@prisma/engines": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", + "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/fetch-engine": "5.16.2", + "@prisma/get-platform": "5.16.2" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", + "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", + "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/get-platform": "5.16.2" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", + "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.16.2" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "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.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/define-data-property": { + "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": { + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "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/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "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.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "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" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "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": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", + "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "devOptional": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@prisma/engines": "5.16.2" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "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/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "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.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.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + } + }, + "dependencies": { + "@prisma/client": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", + "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "requires": {} + }, + "@prisma/debug": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", + "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", + "devOptional": true + }, + "@prisma/engines": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", + "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/fetch-engine": "5.16.2", + "@prisma/get-platform": "5.16.2" + } + }, + "@prisma/engines-version": { + "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", + "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", + "devOptional": true + }, + "@prisma/fetch-engine": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", + "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/get-platform": "5.16.2" + } + }, + "@prisma/get-platform": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", + "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.16.2" + } + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "requires": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + } + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-data-property": { + "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==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "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==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "requires": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "requires": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "requires": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==" + }, + "node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "dev": true + }, + "prisma": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", + "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "devOptional": true, + "peer": true, + "requires": { + "@prisma/engines": "5.16.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-function-length": { + "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==", + "requires": { + "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.2" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "requires": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } +} diff --git a/pandamarket-be-sprint-mission-3-main/package.json b/pandamarket-be-sprint-mission-3-main/package.json new file mode 100755 index 00000000..c880c4f0 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/package.json @@ -0,0 +1,21 @@ +{ + "type": "module", + "scripts": { + "start": "node ./src/main.js" + }, + "devDependencies": { + "prettier": "^3.3.2", + "prisma": "^5.16.2" + }, + "dependencies": { + "@prisma/client": "^5.16.2", + "bcrypt": "^6.0.0", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.3", + "multer": "^1.4.5-lts.1", + "superstruct": "^2.0.2", + "uuid": "^11.0.5" + } +} diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/20250111082621_/migration.sql b/pandamarket-be-sprint-mission-3-main/prisma/migrations/20250111082621_/migration.sql new file mode 100755 index 00000000..fcdea0ea --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/prisma/migrations/20250111082621_/migration.sql @@ -0,0 +1,43 @@ +-- CreateTable +CREATE TABLE "Article" ( + "id" SERIAL NOT NULL, + "title" TEXT NOT NULL, + "content" TEXT NOT NULL, + "image" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Article_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Product" ( + "id" SERIAL NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT NOT NULL, + "price" INTEGER NOT NULL, + "tags" TEXT[], + "images" TEXT[], + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Product_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Comment" ( + "id" SERIAL NOT NULL, + "content" TEXT NOT NULL, + "productId" INTEGER, + "articleId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Comment_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226084615_init_notification_system/migration.sql b/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226084615_init_notification_system/migration.sql new file mode 100644 index 00000000..290b4b89 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226084615_init_notification_system/migration.sql @@ -0,0 +1,91 @@ +/* + Warnings: + + - Added the required column `userId` to the `Article` table without a default value. This is not possible if the table is not empty. + - Added the required column `userId` to the `Comment` table without a default value. This is not possible if the table is not empty. + +*/ +-- CreateEnum +CREATE TYPE "NotificationType" AS ENUM ('COMMENT', 'PRICE_CHANGE'); + +-- AlterTable +ALTER TABLE "Article" ADD COLUMN "userId" INTEGER NOT NULL; + +-- AlterTable +ALTER TABLE "Comment" ADD COLUMN "userId" INTEGER NOT NULL; + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "email" TEXT NOT NULL, + "nickname" TEXT NOT NULL, + "image" TEXT, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "refreshToken" TEXT, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Notification" ( + "id" SERIAL NOT NULL, + "type" "NotificationType" NOT NULL, + "message" TEXT NOT NULL, + "isRead" BOOLEAN NOT NULL DEFAULT false, + "userId" INTEGER NOT NULL, + "articleId" INTEGER, + "productId" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ProductLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "productId" INTEGER NOT NULL, + + CONSTRAINT "ProductLike_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ArticleLike" ( + "id" SERIAL NOT NULL, + "userId" INTEGER NOT NULL, + "articleId" INTEGER NOT NULL, + + CONSTRAINT "ArticleLike_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "ProductLike_userId_productId_key" ON "ProductLike"("userId", "productId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ArticleLike_userId_articleId_key" ON "ArticleLike"("userId", "articleId"); + +-- AddForeignKey +ALTER TABLE "Article" ADD CONSTRAINT "Article_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Comment" ADD CONSTRAINT "Comment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProductLike" ADD CONSTRAINT "ProductLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ProductLike" ADD CONSTRAINT "ProductLike_productId_fkey" FOREIGN KEY ("productId") REFERENCES "Product"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArticleLike" ADD CONSTRAINT "ArticleLike_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArticleLike" ADD CONSTRAINT "ArticleLike_articleId_fkey" FOREIGN KEY ("articleId") REFERENCES "Article"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226091616_add_owner_to_product/migration.sql b/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226091616_add_owner_to_product/migration.sql new file mode 100644 index 00000000..17c6a4f6 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226091616_add_owner_to_product/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - Added the required column `userId` to the `Product` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Product" ADD COLUMN "userId" INTEGER NOT NULL; + +-- AddForeignKey +ALTER TABLE "Product" ADD CONSTRAINT "Product_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/migration_lock.toml b/pandamarket-be-sprint-mission-3-main/prisma/migrations/migration_lock.toml new file mode 100755 index 00000000..fbffa92c --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/prisma/schema.prisma b/pandamarket-be-sprint-mission-3-main/prisma/schema.prisma new file mode 100644 index 00000000..1a77faa2 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/prisma/schema.prisma @@ -0,0 +1,112 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +enum NotificationType { + COMMENT + PRICE_CHANGE +} + +model Article { + id Int @id @default(autoincrement()) + title String + content String + image String? + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + ArticleComment Comment[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + articleLikes ArticleLike[] +} + +model Product { + id Int @id @default(autoincrement()) + name String + description String + price Int + tags String[] + images String[] + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + ProductComment Comment[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + productLikes ProductLike[] +} + +model User { + id Int @id @default(autoincrement()) + email String @unique + nickname String + image String? + password String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + productLikes ProductLike[] + articleLikes ArticleLike[] + refreshToken String? + products Product[] + + articles Article[] + comments Comment[] + notifications Notification[] +} + +model Comment { + id Int @id @default(autoincrement()) + content String + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + + product Product? @relation(fields: [productId], references: [id], onDelete: Cascade) + productId Int? + article Article? @relation(fields: [articleId], references: [id], onDelete: Cascade) + articleId Int? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Notification { + id Int @id @default(autoincrement()) + type NotificationType + message String + isRead Boolean @default(false) + userId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + articleId Int? + productId Int? + createdAt DateTime @default(now()) +} + +model ProductLike { + id Int @id @default(autoincrement()) + userId Int + productId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + product Product @relation(fields: [productId], references: [id], onDelete: Cascade) + + @@unique([userId, productId]) +} + +model ArticleLike { + id Int @id @default(autoincrement()) + userId Int + articleId Int + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + article Article @relation(fields: [articleId], references: [id], onDelete: Cascade) + + @@unique([userId, articleId]) +} \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/public/.gitkeep b/pandamarket-be-sprint-mission-3-main/public/.gitkeep new file mode 100755 index 00000000..e69de29b diff --git a/pandamarket-be-sprint-mission-3-main/read.me b/pandamarket-be-sprint-mission-3-main/read.me new file mode 100644 index 00000000..25f58286 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/read.me @@ -0,0 +1,41 @@ +1. 인증 (Authentication) +[x] User 스키마 작성: id, email, nickname, image, password 등 필드 구성. + +[x] 회원가입 API: 비밀번호 해싱(bcrypt) 저장 기능 포함. + +[x] 로그인 API: 이메일/비밀번호 확인 후 Access Token 발급. + +[ ] 토큰 갱신 (심화): Refresh Token을 이용한 토큰 재발급 기능. + +2. 상품 기능 인가 (Product Authorization) +[x] 등록 권한: 로그인한 유저만 상품 등록 가능. + +[x] 수정/삭제 권한: 상품을 등록한 본인만 해당 상품 수정 및 삭제 가능. + +3. 게시글 기능 인가 (Article Authorization) +[ ] 등록 권한: 로그인한 유저만 게시글 등록 가능. + +[ ] 수정/삭제 권한: 게시글을 등록한 본인만 해당 게시글 수정 및 삭제 가능. + +4. 댓글 기능 인가 (Comment Authorization) +[ ] 등록 권한: 로그인한 유저만 상품 및 게시글에 댓글 등록 가능. + +[ ] 수정/삭제 권한: 댓글을 등록한 본인만 해당 댓글 수정 및 삭제 가능. + +5. 유저 정보 (User Profile) +[ ] 정보 조회: 자신의 프로필 정보 조회. + +[ ] 정보 수정: 닉네임, 이미지 등 프로필 정보 수정. + +[ ] 비밀번호 변경: 기존 비밀번호 확인 후 새 비밀번호로 변경. + +[ ] 내 상품 조회: 본인이 등록한 상품 목록 조회. + +[ ] 보안 사항: 모든 유저 정보 응답 시 비밀번호 노출 금지. + +6. 좋아요 기능 (Likes - 심화) +[ ] 좋아요/취소: 상품 및 게시글에 대한 좋아요 기능. + +[ ] 조회 연동: 목록/상세 조회 시 본인의 좋아요 여부(isLiked) 포함. + +[ ] 관심 목록: 내가 좋아요를 누른 상품 목록 조회. \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js new file mode 100755 index 00000000..63fe7f6b --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js @@ -0,0 +1,138 @@ +import { create } from 'superstruct'; +import { prismaClient } from '../lib/prismaClient.js'; +import NotFoundError from '../lib/errors/NotFoundError.js'; +import { IdParamsStruct } from '../structs/commonStructs.js'; +import { + CreateArticleBodyStruct, + UpdateArticleBodyStruct, + GetArticleListParamsStruct, +} from '../structs/articlesStructs.js'; +import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct.js'; + +export async function createArticle(req, res) { + const { title, content, images } = create(req.body, CreateArticleBodyStruct); + + const article = await prismaClient.article.create({ + data :{ + title, + content, + images, + userId: req.user.id + } + }); + + return res.status(201).send(article); +} + +export async function getArticle(req, res) { + const { id } = create(req.params, IdParamsStruct); + + const article = await prismaClient.article.findUnique({ where: { id } }); + if (!article) { + throw new NotFoundError('article', id); + } + + return res.send(article); +} + + +export async function updateArticle(req, res) { + const { id } = create(req.params, IdParamsStruct); + const { title, content, image } = create(req.body, UpdateArticleBodyStruct); + + const existingArticle = await prismaClient.article.findUnique({ where: { id } }); + + if (!existingArticle) throw new NotFoundError('article', id); + if (existingArticle.userId !== req.user.id) { + return res.status(403).json({ message: '해당 게시글을 수정할 권한이 없습니다.' }); + } + + const updatedArticle = await prismaClient.article.update({ + where: { id }, + data: { title, content, image }, + }); + + res.send(updatedArticle); +} + + +export async function deleteArticle(req, res) { + const { id } = create(req.params, IdParamsStruct); + + const existingArticle = await prismaClient.article.findUnique({ where: { id } }); + if (!existingArticle) { + throw new NotFoundError('article', id); + } + + if (existingArticle.userId !== req.user.id) { + return res.status(403).json({ message: '해당 게시글을 삭제할 권한이 없습니다.' }); + } + + await prismaClient.article.delete({ where: { id } }); + return res.status(204).send(); +} + +export async function getArticleList(req, res) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); + + const where = { + title: keyword ? { contains: keyword } : undefined, + }; + + const totalCount = await prismaClient.article.count({ where }); + const articles = await prismaClient.article.findMany({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { id: 'asc' }, + where, + }); + + return res.send({ + list: articles, + totalCount, + }); +} + +export async function createComment(req, res) { + const { id: articleId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + + const existingArticle = await prismaClient.article.findUnique({ where: { id: articleId } }); + if (!existingArticle) { + throw new NotFoundError('article', articleId); + } + + const comment = await prismaClient.comment.create({ + data: { + articleId, + content, + }, + }); + + return res.status(201).send(comment); +} + +export async function getCommentList(req, res) { + const { id: articleId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + + const article = await prismaClient.article.findUnique({ where: { id: articleId } }); + if (!article) { + throw new NotFoundError('article', articleId); + } + + const commentsWithCursor = await prismaClient.comment.findMany({ + cursor: cursor ? { id: cursor } : undefined, + take: limit + 1, + where: { articleId }, + orderBy: { createdAt: 'desc' }, + }); + const comments = commentsWithCursor.slice(0, limit); + const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; + const nextCursor = cursorComment ? cursorComment.id : null; + + return res.send({ + list: comments, + nextCursor, + }); +} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/authController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/authController.js new file mode 100644 index 00000000..6ff1e562 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/authController.js @@ -0,0 +1,88 @@ +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcrypt'; +import jwt from 'jsonwebtoken'; + +const prisma = new PrismaClient(); + +const generateTokens = (user) => { + const accessToken = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: '15m' }); + const refreshToken = jwt.sign({ id: user.id }, process.env.REFRESH_SECRET, { expiresIn: '7d' }); + return { accessToken, refreshToken }; +}; + +export const signUp = async (req, res) => { + const { email, nickname, password } = req.body; + + const existingUser = await prisma.user.findUnique({ where: { email } }); + if (existingUser) { + return res.status(400).json({ message: '이미 사용 중인 이메일입니다.' }); + } + + const hashedPassword = await bcrypt.hash(password, 10); + const user = await prisma.user.create({ + data: { email, nickname, password: hashedPassword }, + }); + + const { password: _, refreshToken: __, ...userWithoutPassword } = user; + res.status(201).json(userWithoutPassword); +}; + +export const signIn = async (req, res) => { + const { email, password } = req.body; + + const user = await prisma.user.findUnique({ where: { email } }); + if (!user) { + return res.status(401).json({ message: '이메일 또는 비밀번호가 일치하지 않습니다.' }); + } + + const isPasswordValid = await bcrypt.compare(password, user.password); + if (!isPasswordValid) { + return res.status(401).json({ message: '이메일 또는 비밀번호가 일치하지 않습니다.' }); + } + + const { accessToken, refreshToken } = generateTokens(user); + + await prisma.user.update({ + where: { id: user.id }, + data: { refreshToken }, + }); + + const { password: _, refreshToken: __, ...userWithoutPassword } = user; + res.status(200).json({ + accessToken, + refreshToken, + user: userWithoutPassword, + }); +}; + +export const refresh = async (req, res) => { + const { refreshToken } = req.body; + + if (!refreshToken) { + return res.status(401).json({ message: '리프레시 토큰이 없습니다.' }); + } + + try { + const decoded = jwt.verify(refreshToken, process.env.REFRESH_SECRET); + + const user = await prisma.user.findUnique({ where: { id: decoded.id } }); + + if (!user || user.refreshToken !== refreshToken) { + return res.status(403).json({ message: '유효하지 않은 리프레시 토큰입니다.' }); + } + + const tokens = generateTokens(user); + + await prisma.user.update({ + where: { id: user.id }, + data: { refreshToken: tokens.refreshToken }, + }); + + res.json({ + accessToken: tokens.accessToken, + refreshToken: tokens.refreshToken, + }); + } catch (error) { + return res.status(403).json({ message: '토큰이 만료되었거나 올바르지 않습니다.' }); + } +}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js new file mode 100755 index 00000000..c0157860 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js @@ -0,0 +1,94 @@ +import { create } from 'superstruct'; +import { prismaClient } from '../lib/prismaClient.js'; +import { UpdateCommentBodyStruct } from '../structs/commentsStruct.js'; +import NotFoundError from '../lib/errors/NotFoundError.js'; +import { IdParamsStruct } from '../structs/commonStructs.js'; + + + +export async function createComment(req, res) { + const { id: productId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + + const existingProduct = await prismaClient.product.findUnique({ where: { id: productId } }); + if (!existingProduct) { + throw new NotFoundError('product', productId); + } + + const comment = await prismaClient.comment.create({ + data: { + productId, + content, + userId: req.user.id + } + }); + + if (existingProduct.userId && existingProduct.userId !== req.user.id) { + await prismaClient.notification.create({ + data: { + type: 'COMMENT', + userId: existingProduct.userId, + message: `[${existingProduct.name}] 상품에 새로운 댓글이 달렸습니다: ${content.substring(0, 15)}...`, + productId: productId, + }, + }); + } + + return res.status(201).send(comment); +} + + +export async function getCommentList(req, res) { + const { id: productId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + + const existingProduct = await prismaClient.product.findUnique({ where: { id: productId } }); + if (!existingProduct) { + throw new NotFoundError('product', productId); + } + + const commentsWithCursorComment = await prismaClient.comment.findMany({ + cursor: cursor ? { id: cursor } : undefined, + take: limit + 1, + where: { productId }, + }); + const comments = commentsWithCursorComment.slice(0, limit); + const cursorComment = commentsWithCursorComment[comments.length - 1]; + const nextCursor = cursorComment ? cursorComment.id : null; + + return res.send({ + list: comments, + nextCursor, + }); +} + + +export async function updateComment(req, res) { + const { id } = create(req.params, IdParamsStruct); + const { content } = create(req.body, UpdateCommentBodyStruct); + + const existingComment = await prismaClient.comment.findUnique({ where: { id } }); + if (!existingComment) { + throw new NotFoundError('comment', id); + } + + const updatedComment = await prismaClient.comment.update({ + where: { id }, + data: { content }, + }); + + return res.send(updatedComment); +} + +export async function deleteComment(req, res) { + const { id } = create(req.params, IdParamsStruct); + + const existingComment = await prismaClient.comment.findUnique({ where: { id } }); + if (!existingComment) { + throw new NotFoundError('comment', id); + } + + await prismaClient.comment.delete({ where: { id } }); + + return res.status(204).send(); +} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js new file mode 100755 index 00000000..a735b8f1 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js @@ -0,0 +1,29 @@ +import { StructError } from 'superstruct'; +import BadRequestError from '../lib/errors/BadRequestError.js'; +import NotFoundError from '../lib/errors/NotFoundError.js'; + +export function defaultNotFoundHandler(req, res, next) { + return res.status(404).send({ message: 'Not found' }); +} + +export function globalErrorHandler(err, req, res, next) { + if (err instanceof StructError || err instanceof BadRequestError) { + return res.status(400).send({ message: err.message }); + } + + if (err instanceof SyntaxError && err.status === 400 && 'body' in err) { + return res.status(400).send({ message: 'Invalid JSON' }); + } + + if (err.code) { + console.error(err); + return res.status(500).send({ message: 'Failed to process data' }); + } + + if (err instanceof NotFoundError) { + return res.status(404).send({ message: err.message }); + } + + console.error(err); + return res.status(500).send({ message: 'Internal server error' }); +} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js new file mode 100755 index 00000000..4f4adea3 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js @@ -0,0 +1,41 @@ +import multer from 'multer'; +import path from 'path'; +import { v4 as uuidv4 } from 'uuid'; +import { PUBLIC_PATH, STATIC_PATH } from '../lib/constants.js'; +import BadRequestError from '../lib/errors/BadRequestError.js'; + +const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; +const FILE_SIZE_LIMIT = 5 * 1024 * 1024; + +export const upload = multer({ + storage: multer.diskStorage({ + destination(req, file, cb) { + cb(null, PUBLIC_PATH); + }, + filename(req, file, cb) { + const ext = path.extname(file.originalname); + const filename = `${uuidv4()}${ext}`; + cb(null, filename); + }, + }), + + limits: { + fileSize: FILE_SIZE_LIMIT, + }, + + fileFilter: function (req, file, cb) { + if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { + const err = new BadRequestError('Only png, jpeg, and jpg are allowed'); + return cb(err); + } + + cb(null, true); + }, +}); + +export async function uploadImage(req, res) { + const host = req.get('host'); + const filePath = path.join(host, STATIC_PATH, req.file.filename); + const url = `http://${filePath}`; + return res.send({ url }); +} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js new file mode 100644 index 00000000..ee835eb5 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js @@ -0,0 +1,79 @@ +import { PrismaClient } from '@prisma/client'; +const prisma = new PrismaClient(); + +export const toggleProductLike = async (req, res) => { + const { id: productId } = req.params; + const userId = req.user.id; + + const existingLike = await prisma.productLike.findUnique({ + where: { + userId_productId: { + userId: userId, + productId: Number(productId), + }, + }, + }); + + if (existingLike) { + await prisma.productLike.delete({ + where: { id: existingLike.id }, + }); + return res.json({ isLiked: false }); + } else { + await prisma.productLike.create({ + data: { + userId: userId, + productId: Number(productId), + }, + }); + return res.json({ isLiked: true }); + } +}; + +export const toggleArticleLike = async (req, res) => { + const { id: articleId } = req.params; + const userId = req.user.id; + + const existingLike = await prisma.articleLike.findUnique({ + where: { + userId_articleId: { + userId: userId, + articleId: Number(articleId), + }, + }, + }); + + if (existingLike) { + await prisma.articleLike.delete({ where: { id: existingLike.id } }); + return res.json({ isLiked: false }); + } else { + await prisma.articleLike.create({ + data: { userId, articleId: Number(articleId) }, + }); + return res.json({ isLiked: true }); + } +}; + +export const getProductDetail = async (req, res) => { + const { id } = req.params; + const userId = req.user?.id; + + const product = await prisma.product.findUnique({ + where: { id: Number(id) }, + include: { + _count: { select: { productLikes: true } } + } + }); + + if (!product) return res.status(404).json({ message: '상품을 찾을 수 없습니다.' }); + + let isLiked = false; + if (userId) { + const like = await prisma.productLike.findUnique({ + where: { userId_productId: { userId, productId: Number(id) } } + }); + isLiked = !!like; + } + + res.json({ ...product, isLiked }); +}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js new file mode 100755 index 00000000..ce9bb7b8 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js @@ -0,0 +1,137 @@ +import { create } from 'superstruct'; +import { prismaClient } from '../lib/prismaClient.js'; +import NotFoundError from '../lib/errors/NotFoundError.js'; +import { IdParamsStruct } from '../structs/commonStructs.js'; +import { + CreateProductBodyStruct, + GetProductListParamsStruct, + UpdateProductBodyStruct, +} from '../structs/productsStruct.js'; +import { emitNotification } from '../socket/socket.js'; + + +export async function createProduct(req, res) { + try { + const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); + + const product = await prismaClient.product.create({ + data: { + name, + description, + price, + tags, + images, + userId: req.user.id + }, + }); + + res.status(201).send(product); + } catch (error) { + res.status(400).json({ message: error.message }); + } +} + +export async function getProduct(req, res) { + const { id } = create(req.params, IdParamsStruct); + + const product = await prismaClient.product.findUnique({ where: { id } }); + if (!product) { + throw new NotFoundError('product', id); + } + + return res.send(product); +} + + +export async function updateProduct(req, res) { + const { id } = create(req.params, IdParamsStruct); + const { name, description, price, tags, images } = create(req.body, UpdateProductBodyStruct); + + const existingProduct = await prismaClient.product.findUnique({ where: { id } }); + if (!existingProduct) { + throw new NotFoundError('product', id); + } + + if (existingProduct.userId !== req.user.id) { + return res.status(403).json({ message: '해당 상품을 수정할 권한이 없습니다.' }); + } + + const isPriceChanged = price !== undefined && existingProduct.price !== price; + + const updatedProduct = await prismaClient.product.update({ + where: { id }, + data: { name, description, price, tags, images }, + }); + + if (isPriceChanged) { + const likes = await prismaClient.productLike.findMany({ + where: { productId: id }, + select: { userId: true }, + }); + + if (likes.length > 0) { + const message = `관심 상품 [${updatedProduct.name}]의 가격이 ${existingProduct.price}원에서 ${price}원으로 변경되었습니다!`; + + await prismaClient.notification.createMany({ + data: likes.map((like) => ({ + type: 'PRICE_CHANGE', + userId: like.userId, + message: message, + productId: id, + })), + }); + + const io = req.app.get('io'); + likes.forEach((like) => { + emitNotification(io, like.userId, { + type: 'PRICE_CHANGE', + message: message, + productId: id, + createdAt: new Date(), + }); + }); + } + } + + return res.send(updatedProduct); +} + +export async function deleteProduct(req, res) { + const { id } = create(req.params, IdParamsStruct); + const existingProduct = await prismaClient.product.findUnique({ where: { id } }); + + if (!existingProduct) { + throw new NotFoundError('product', id); + } + + if (existingProduct.userId !== req.user.id) { + return res.status(403).json({ message: '해당 상품을 삭제할 권한이 없습니다.' }); + } + + await prismaClient.product.delete({ where: { id } }); + + return res.status(204).send(); +} + +export async function getProductList(req, res) { + const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct); + + const where = keyword + ? { + OR: [{ name: { contains: keyword } }, { description: { contains: keyword } }], + } + : undefined; + const totalCount = await prismaClient.product.count({ where }); + const products = await prismaClient.product.findMany({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { id: 'desc' } : { id: 'asc' }, + where, + }); + + return res.send({ + list: products, + totalCount, + }); +} + diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/userController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/userController.js new file mode 100644 index 00000000..c0f2deed --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/controllers/userController.js @@ -0,0 +1,141 @@ +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcrypt'; +import { create } from 'superstruct'; +import { UpdateUserStruct, ChangePasswordStruct } from '../structs/userStructs.js'; + +const prisma = new PrismaClient(); + + +export const getMe = async (req, res) => { + const { password, ...userWithoutPassword } = req.user; + res.json(userWithoutPassword); +}; + + +export const updateMe = async (req, res) => { + try { + const { nickname, image } = create(req.body, UpdateUserStruct); + + const updatedUser = await prisma.user.update({ + where: { id: req.user.id }, + data: { nickname, image }, + }); + + const { password, ...userWithoutPassword } = updatedUser; + res.json(userWithoutPassword); + } catch (error) { + res.status(400).json({ message: '수정 데이터 형식이 올바르지 않습니다.' }); + } +}; + +export const changePassword = async (req, res) => { + try { + const { currentPassword, newPassword } = create(req.body, ChangePasswordStruct); + + const isMatch = await bcrypt.compare(currentPassword, req.user.password); + if (!isMatch) { + return res.status(401).json({ message: '현재 비밀번호가 일치하지 않습니다.' }); + } + + const hashedNewPassword = await bcrypt.hash(newPassword, 10); + await prisma.user.update({ + where: { id: req.user.id }, + data: { password: hashedNewPassword }, + }); + + res.status(200).json({ message: '비밀번호가 성공적으로 변경되었습니다.' }); + } catch (error) { + res.status(400).json({ message: error.message }); + } +}; + +export const getMyProducts = async (req, res) => { + const products = await prisma.product.findMany({ + where: { userId: req.user.id }, + orderBy: { createdAt: 'desc' }, + }); + res.json(products); +}; + +export const getMyLikedProducts = async (req, res) => { + const userId = req.user.id; + + const likedEntries = await prisma.productLike.findMany({ + where: { userId }, + include: { + product: true, + }, + }); + + const products = likedEntries.map((entry) => ({ + ...entry.product, + isLiked: true, + })); + + res.json(products); +}; + +export const getMyNotifications = async (req, res) => { + const notifications = await prisma.notification.findMany({ + where: { userId: req.user.id }, + orderBy: { createdAt: 'desc' }, + }); + + res.json(notifications); +}; + +export const readNotification = async (req, res) => { + const { id } = req.params; + + const notification = await prisma.notification.updateMany({ + where: { + id: Number(id), + userId: req.user.id, + }, + data: { isRead: true }, + }); + + if (notification.count === 0) { + return res.status(404).json({ message: '알림을 찾을 수 없거나 권한이 없습니다.' }); + } + + res.status(200).json({ message: '알림을 읽음 처리했습니다.' }); +}; + +export const readAllNotifications = async (req, res) => { + await prisma.notification.updateMany({ + where: { + userId: req.user.id, + isRead: false, + }, + data: { isRead: true }, + }); + + res.status(200).json({ message: '모든 알림을 읽음 처리했습니다.' }); +}; + +export const getUnreadNotificationCount = async (req, res) => { + const count = await prisma.notification.count({ + where: { + userId: req.user.id, + isRead: false, + }, + }); + + res.json({ count }); +}; + +export const deleteOldNotifications = async () => { + const thirtyDaysAgo = new Date(); + thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); + + const deleted = await prisma.notification.deleteMany({ + where: { + createdAt: { + lt: thirtyDaysAgo, + }, + }, + }); + + return deleted.count; +}; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/constants.js b/pandamarket-be-sprint-mission-3-main/src/lib/constants.js new file mode 100755 index 00000000..aefa85fe --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/lib/constants.js @@ -0,0 +1,7 @@ +import dotenv from 'dotenv'; +dotenv.config(); + +export const DATABASE_URL = process.env.DATABASE_URL; +export const PORT = process.env.PORT || 3000; +export const PUBLIC_PATH = './public'; +export const STATIC_PATH = '/public'; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js b/pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js new file mode 100755 index 00000000..8e305a10 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js @@ -0,0 +1,8 @@ +class BadRequestError extends Error { + constructor(message) { + super(message); + this.name = 'BadRequestError'; + } +} + +export default BadRequestError; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js b/pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js new file mode 100755 index 00000000..1ebc84d2 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js @@ -0,0 +1,8 @@ +class NotFoundError extends Error { + constructor(modelName, id) { + super(`${modelName} with id ${id} not found`); + this.name = 'NotFoundError'; + } +} + +export default NotFoundError; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js b/pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js new file mode 100755 index 00000000..5e41d6fe --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js @@ -0,0 +1,3 @@ +import { PrismaClient } from '@prisma/client'; + +export const prismaClient = new PrismaClient(); diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/socket.js b/pandamarket-be-sprint-mission-3-main/src/lib/socket.js new file mode 100644 index 00000000..5a5fbfc3 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/lib/socket.js @@ -0,0 +1,35 @@ +import { Server } from 'socket.io'; + +let io; + +export const initSocket = (server) => { + io = new Server(server, { + cors: { + origin: "*", // 실제 서비스 시에는 프론트엔드 도메인으로 제한하세요! + methods: ["GET", "POST"] + } + }); + + io.on('connection', (socket) => { + console.log(`User connected: ${socket.id}`); + + // 사용자가 로그인하면 자신의 userId로 된 Room에 입장하도록 설정 + socket.on('join', (userId) => { + socket.join(`user_${userId}`); + console.log(`User ${userId} joined their private room.`); + }); + + socket.on('disconnect', () => { + console.log('User disconnected'); + }); + }); + + return io; +}; + +export const getIO = () => { + if (!io) { + throw new Error("Socket.io not initialized!"); + } + return io; +}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js b/pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js new file mode 100755 index 00000000..08fea591 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js @@ -0,0 +1,9 @@ +export function withAsync(handler) { + return async function (req, res, next) { + try { + await handler(req, res); + } catch (e) { + next(e); + } + }; +} diff --git a/pandamarket-be-sprint-mission-3-main/src/main.js b/pandamarket-be-sprint-mission-3-main/src/main.js new file mode 100755 index 00000000..641cc0c3 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/main.js @@ -0,0 +1,36 @@ +import express from 'express'; +import http from 'http'; +import cors from 'cors'; +import path from 'path'; +import { initSocket, setupSocket } from './socket/socket.js'; +import { PORT, PUBLIC_PATH, STATIC_PATH } from './lib/constants.js'; +import articlesRouter from './routers/articlesRouter.js'; +import productsRouter from './routers/productsRouter.js'; +import commentsRouter from './routers/commentsRouter.js'; +import imagesRouter from './routers/imagesRouter.js'; +import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController.js'; + + +const app = express(); +const server = http.createServer(app); +const io = setupSocket(server); + +initSocket(server); + +app.use(cors()); +app.use(express.json()); +app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); + +app.use('/articles', articlesRouter); +app.use('/products', productsRouter); +app.use('/comments', commentsRouter); +app.use('/images', imagesRouter); + +app.use(defaultNotFoundHandler); +app.use(globalErrorHandler); + +app.set('io', io); + +server.listen(PORT, () => { + console.log(` Server & WebSocket started on port ${PORT}`); +}); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js b/pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js new file mode 100644 index 00000000..ed070429 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js @@ -0,0 +1,30 @@ +import jwt from 'jsonwebtoken'; +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +export const authenticate = async (req, res, next) => { + try { + const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith('Bearer ')) { + return res.status(401).json({ message: '로그인이 필요한 서비스입니다.' }); + } + + const token = authHeader.split(' ')[1]; + + const decoded = jwt.verify(token, process.env.JWT_SECRET); + + const user = await prisma.user.findUnique({ + where: { id: decoded.userId }, + }); + + if (!user) { + return res.status(401).json({ message: '유효하지 않은 사용자입니다.' }); + } + + req.user = user; + next(); + } catch (error) { + return res.status(401).json({ message: '인증에 실패했습니다. 다시 로그인해 주세요.' }); + } +}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js b/pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js new file mode 100644 index 00000000..4a562862 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js @@ -0,0 +1,28 @@ +// src/middlewares/validate.js + +import { assert } from 'superstruct'; +import { SignUpStruct, SignInStruct } from '../structs/authStructs.js'; + +export const validateSignUp = (req, res, next) => { + try { + assert(req.body, SignUpStruct); + next(); + } catch (error) { + res.status(400).json({ + message: '입력 데이터 형식이 올바르지 않습니다.', + details: error.message + }); + } +}; + +export const validateSignIn = (req, res, next) => { + try { + assert(req.body, SignInStruct); + next(); + } catch (error) { + res.status(400).json({ + message: '로그인 정보 형식이 올바르지 않습니다.', + details: error.message + }); + } +}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js new file mode 100755 index 00000000..606d0358 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js @@ -0,0 +1,26 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync.js'; +import { + createArticle, + getArticleList, + getArticle, + updateArticle, + deleteArticle, + createComment, + getCommentList, +} from '../controllers/articlesController.js'; +import { toggleArticleLike } from '../controllers/likeController.js'; +import { authenticate } from '../middlewares/authMiddleware.js'; + +const articlesRouter = express.Router(); + +articlesRouter.post('/', authenticate, withAsync(createArticle)); +articlesRouter.get('/', authenticate, withAsync(getArticleList)); +articlesRouter.get('/:id', authenticate, withAsync(getArticle)); +articlesRouter.patch('/:id', authenticate, withAsync(updateArticle)); +articlesRouter.delete('/:id', authenticate, withAsync(deleteArticle)); +articlesRouter.post('/:id/comments', authenticate, withAsync(createComment)); +articlesRouter.get('/:id/comments', authenticate, withAsync(getCommentList)); +articlesRouter.post('/:id/like', authenticate, withAsync(toggleArticleLike)); + +export default articlesRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js b/pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js new file mode 100644 index 00000000..5f3765a7 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js @@ -0,0 +1,12 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync.js'; +import * as authController from '../controllers/authController.js'; +import { validateSignUp } from '../middlewares/validate.js'; + +const router = express.Router(); + +router.post('/signup', validateSignUp, withAsync(authController.signUp)); +router.post('/signin', withAsync(authController.signIn)); +router.post('/refresh', withAsync(authController.refresh)); + +export default router; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js new file mode 100755 index 00000000..4298ed7e --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js @@ -0,0 +1,11 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync.js'; +import { updateComment, deleteComment } from '../controllers/commentsController.js'; +import { authenticate } from '../middlewares/authMiddleware.js'; + +const commentsRouter = express.Router(); + +commentsRouter.patch('/:id', authenticate, withAsync(updateComment)); +commentsRouter.delete('/:id', authenticate, withAsync(deleteComment)); + +export default commentsRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js new file mode 100755 index 00000000..163b87ce --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js @@ -0,0 +1,9 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync.js'; +import { upload, uploadImage } from '../controllers/imagesController.js'; + +const imagesRouter = express.Router(); + +imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage)); + +export default imagesRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js new file mode 100755 index 00000000..083b9698 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js @@ -0,0 +1,26 @@ +import express from 'express'; +import { withAsync } from '../lib/withAsync.js'; +import { + createProduct, + getProduct, + updateProduct, + deleteProduct, + getProductList, + createComment, + getCommentList, +} from '../controllers/productsController.js'; +import { toggleProductLike } from '../controllers/likeController.js'; +import { authenticate } from '../middlewares/authMiddleware.js'; + +const productsRouter = express.Router(); + + productsRouter.post('/', authenticate, withAsync(createProduct)); + productsRouter.get('/:id', authenticate, withAsync(getProduct)); + productsRouter.patch('/:id', authenticate, withAsync(updateProduct)); + productsRouter.delete('/:id', authenticate, withAsync(deleteProduct)); + productsRouter.get('/', authenticate, withAsync(getProductList)); + productsRouter.post('/:id/comments', authenticate, withAsync(createComment)); + productsRouter.get('/:id/comments', authenticate, withAsync(getCommentList)); + productsRouter.post('/:id/like', authenticate, withAsync(toggleProductLike)); + +export default productsRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js b/pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js new file mode 100644 index 00000000..3a0fa227 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js @@ -0,0 +1,21 @@ +import express from 'express'; +import * as userController from '../controllers/userController.js'; +import { authenticate } from '../middlewares/authMiddleware.js'; +import { withAsync } from '../lib/withAsync.js'; + +const router = express.Router(); + +router.use(authenticate); + +router.get('/me', authenticate, withAsync(userController.getMe)); +router.patch('/me', authenticate, withAsync(userController.updateMe)); +router.patch('/me/password', authenticate, withAsync(userController.changePassword)); +router.get('/me/products', authenticate, withAsync(userController.getMyProducts)); +router.get('/me/likes', authenticate, withAsync(userController.getMyLikedItems)); +router.get('/me/notifications', authenticate, withAsync(userController.getMyNotifications)); +router.patch('/me/notifications', authenticate, withAsync(userController.readAllNotifications)); +router.get('/me/notifications/unread-count', authenticate, withAsync(userController.getUnreadNotificationCount)); +router.delete('/notifications/cleanup', withAsync(userController.deleteOldNotifications)); +router.patch('/me/notifications/:id', authenticate, withAsync(userController.readNotification)); + +export default router; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/socket/socket.js b/pandamarket-be-sprint-mission-3-main/src/socket/socket.js new file mode 100644 index 00000000..42c3595c --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/socket/socket.js @@ -0,0 +1,31 @@ +import { Server } from 'socket.io'; + +export const setupSocket = (server) => { + const io = new Server(server, { + cors: { + origin: "*", + methods: ["GET", "POST"] + } + }); + + io.on('connection', (socket) => { + console.log('소켓 연결됨:', socket.id); + + socket.on('join', (userId) => { + socket.join(`user_${userId}`); + console.log(`유저 ${userId}가 알림 방(user_${userId})에 입장했습니다.`); + }); + + socket.on('disconnect', () => { + console.log('소켓 연결 해제'); + }); + }); + + return io; +}; + +export const emitNotification = (io, userId, notificationData) => { + if (io) { + io.to(`user_${userId}`).emit('NEW_NOTIFICATION', notificationData); + } +}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js b/pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js new file mode 100755 index 00000000..36a49e4b --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js @@ -0,0 +1,12 @@ +import { coerce, nonempty, nullable, object, partial, string } from 'superstruct'; +import { PageParamsStruct } from './commonStructs.js'; + +export const GetArticleListParamsStruct = PageParamsStruct; + +export const CreateArticleBodyStruct = object({ + title: coerce(nonempty(string()), string(), (value) => value.trim()), + content: nonempty(string()), + image: nullable(string()), +}); + +export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js b/pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js new file mode 100644 index 00000000..73d1bb21 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js @@ -0,0 +1,12 @@ +import { object, string, size } from 'superstruct'; + +export const SignUpStruct = object({ + email: string(), + nickname: string(), + password: size(string(), 8, 20), // 예시: 8~20자 사이 +}); + +export const SignInStruct = object({ + email: string(), + password: string(), +}); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js b/pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js new file mode 100755 index 00000000..9f93a0ec --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js @@ -0,0 +1,10 @@ +import { nonempty, object, partial, string } from 'superstruct'; +import { CursorParamsStruct } from './commonStructs.js'; + +export const CreateCommentBodyStruct = object({ + content: nonempty(string()), +}); + +export const GetCommentListParamsStruct = CursorParamsStruct; + +export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js b/pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js new file mode 100755 index 00000000..605bfa9e --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js @@ -0,0 +1,22 @@ +import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct'; + +/** Convert string to integer then validate it */ +const integerString = coerce(integer(), string(), (value) => parseInt(value)); + +export const IdParamsStruct = object({ + id: integerString, +}); + +export const PageParamsStruct = object({ + page: defaulted(integerString, 1), + pageSize: defaulted(integerString, 10), + orderBy: optional(enums(['recent'])), + keyword: optional(nonempty(string())), +}); + +export const CursorParamsStruct = object({ + cursor: defaulted(integerString, 0), + limit: defaulted(integerString, 10), + orderBy: optional(enums(['recent'])), + keyword: optional(nonempty(string())), +}); diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js b/pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js new file mode 100755 index 00000000..69d416cf --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js @@ -0,0 +1,14 @@ +import { coerce, partial, object, string, min, nonempty, array, integer } from 'superstruct'; +import { PageParamsStruct } from './commonStructs.js'; + +export const CreateProductBodyStruct = object({ + name: coerce(nonempty(string()), string(), (value) => value.trim()), + description: nonempty(string()), + price: min(integer(), 0), + tags: array(nonempty(string())), + images: array(nonempty(string())), +}); + +export const GetProductListParamsStruct = PageParamsStruct; + +export const UpdateProductBodyStruct = partial(CreateProductBodyStruct); diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js b/pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js new file mode 100644 index 00000000..d3519854 --- /dev/null +++ b/pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js @@ -0,0 +1,11 @@ +import { object, string, size, optional } from 'superstruct'; + +export const UpdateUserStruct = object({ + nickname: optional(string()), + image: optional(string()), +}); + +export const ChangePasswordStruct = object({ + currentPassword: string(), + newPassword: size(string(), 8, 20), +}); \ No newline at end of file diff --git a/product-service.js b/product-service.js deleted file mode 100644 index 8702f7b9..00000000 --- a/product-service.js +++ /dev/null @@ -1,102 +0,0 @@ -import axios from "axios"; -import { logAndThrow } from "./util.js"; -import { ElectronicProduct, Product } from "./product.js"; - -// ## Product 요청 함수 구현하기 - -// - [https://panda-market-api-crud.vercel.app/docs](https://panda-market-api-crud.vercel.app/docs) 의 Product API를 이용하여 아래 함수들을 구현해 주세요. - -// - `getProductList()` : GET 메소드를 사용해 주세요. -// - `page`, `pageSize`, `keyword` 쿼리 파라미터를 이용해 주세요. - -const BASE_URL = "https://panda-market-api-crud.vercel.app/products"; - -export async function getProductList(params) { - try { - if (typeof params !== "object") { - throw new Error("invalid parameter", { cause: params }); - } - const response = await axios.get(BASE_URL, { params }); - if (response.status !== 200) { - throw new Error("response failed", { cause: response }); - } - return response.data.list.map(productFromInfo); - } catch (e) { - logAndThrow("getting product list", e); - } -} - -// - `getProduct()` : GET 메소드를 사용해 주세요. -export async function getProduct(productId) { - try { - const response = await axios.get(`${BASE_URL}/${productId}`); - if (response.status !== 200) { - throw new Error("response failed", { cause: response }); - } - return productFromInfo(response.data); - } catch (e) { - logAndThrow("getting product", e); - } -} - -// - `createProduct()` : POST 메소드를 사용해 주세요. -// - request body에 `title`, `content`, `image` 를 포함해 주세요. -export async function createProduct(product) { - try { - const response = await axios.post(BASE_URL); - if (response.status !== 200) { - throw new Error("response failed", { cause: response }); - } - return response.data; - } catch (e) { - logAndThrow("creating product", e); - } -} - -// - `patchProduct()` : PATCH 메소드를 사용해 주세요. -export async function patchProduct(id, product) { - try { - const response = await axios.patch(`${BASE_URL}/${productId}`, product); - if (response.status !== 200) { - throw new Error("response failed", { cause: response }); - } - return response.data; - } catch (e) { - logAndThrow("patching product", e); - } -} - -// - `deleteProduct()` : DELETE 메소드를 사용해 주세요. -export async function deleteProduct(productId) { - try { - const response = await axios.delete(`${BASE_URL}/${productId}`); - if (response.status !== 200) { - throw new Error("response failed", { cause: response }); - } - return response.data.id; - } catch (e) { - logAndThrow("deleting product", e); - } -} // - ElectronicProduct 클래스는 Product를 상속하며, 추가로 `manufacturer`(제조사) 프로퍼티를 가집니다. - -function productFromInfo({ - name, - description, - price, - tags, - images, - manufacturer, -}) { - if (tags.includes("전자제품")) { - return ElectronicProduct( - name, - description, - price, - tags, - images, - manufacturer - ); - } - - return Product(name, description, price, tags, images); -} diff --git a/simple-fetch.js b/simple-fetch.js deleted file mode 100644 index e43ba462..00000000 --- a/simple-fetch.js +++ /dev/null @@ -1,151 +0,0 @@ -import axios from "axios"; //서버 통신을 위한 라이브러리, vscode에서 정의 필요 없음요~ -import { Product } from "./main.js"; //이전에 작성한 코드를 불러옴, 이전에 export해서! - -//url에서 qerry를 뺀주소 = 공통된 주소 = base_url -const BASE_URL = "https://panda-market-api-crud.vercel.app"; - -/** - * Product 리스트 조회c - * @param {Object} params - 쿼리 파라미터 { page, pageSize, keyword } - * @returns {Promise} Product 리스트 데이터 - */ -export async function getProductList(params = {}) { - try { - validateGetProductListParams(params); - - const response = await axios.get(`${BASE_URL}/products`, { params }); - //실제로 서버 전송 시 자동으로 & 형태로 변환 - - console.log("Product 리스트 조회 성공:"); - console.log(`- 총 ${response.data.list.length}개의 상품을 가져왔습니다.`); - - return response.data.list.map(productFromInfo); - } catch (error) { - // 요청 설정 중에 오류가 발생한 경우 - console.error("❌ Product 리스트 조회 실패:", error.message); - throw error; - } -} - -/** - * 특정 Product 조회 - * @param {number} productId - Product ID - * @returns {Promise} Product 데이터 - */ -export async function getProduct(productId) { - try { - const response = await axios.get(`${BASE_URL}/products/${productId}`); - - console.log("Product 조회 성공:"); - console.log(`- ID: ${response.data.id}, 상품명: ${response.data.name}`); - - return productFromInfo(response.data); - } catch (error) { - console.error(`❌ Product 조회 실패 (ID: ${productId}):`, error.message); - throw error; - } -} - -/** - * Product 생성 - * @param {Product} product - * @returns {Promise} 생성된 Product 데이터 - */ -export async function createProduct(product) { - try { - const { name, description, price, tags, images } = product; - //가독성을 위해서임, =product 안하면 name 이런거 쓸때마다 product.name 이렇게 해야함 - const response = await axios.post(`${BASE_URL}/products`, { - name, - description, - price, - tags, - images, - }); - - console.log("Product 생성 성공:"); - console.log(`- ID: ${response.data.id}, 상품명: ${response.data.name}`); - - return response.data; - } catch (error) { - console.error("❌ Product 생성 실패:", error.message); - throw error; - } -} - -/** - * Product 수정 - * @param {number} productId - Product ID - * @param {Object} updateData - 수정할 데이터 (name, description, price, tags, images 중 일부 또는 전부) - * @returns {Promise} 수정된 Product 데이터 - */ -export async function patchProduct(productId, updateData) { - try { - const response = await axios.patch( - `${BASE_URL}/products/${productId}`, - updateData - ); - - console.log("Product 수정 성공:"); - console.log(`- ID: ${response.data.id}, 상품명: ${response.data.name}`); - - return response.data; - } catch (error) { - console.error(`❌ Product 수정 실패 (ID: ${productId}):`, error.message); - throw error; - } -} - -/** - * Product 삭제 - * @param {number} productId - Product ID - * @returns {Promise} - */ -export async function deleteProduct(productId) { - try { - await axios.delete(`${BASE_URL}/products/${productId}`); - - console.log("Product 삭제 성공:"); - console.log(`- ID: ${productId} 상품이 삭제되었습니다.`); - - return null; - } catch (error) { - console.error(`❌ Product 삭제 실패 (ID: ${productId}):`, error.message); - throw error; - } -} - -/** - * GetProductsParams 데이터 검증 - * @param {Object} params - 검증할 GetProductsParams 데이터 - * @throws {Error} 검증 실패 시 에러 발생 - */ -function validateGetProductListParams(params) { - const availableParameters = ["page", "pageSize", "orderBy", "keyword"]; - //사이트에 나와있는 name들 - validatedPropertyName(availableParameters, params); - - // 데이터 타입 검증 - if (typeof keyword !== "string") { - throw new Error("keyword 문자열이어야 합니다."); - } - if (typeof page !== "number" || page < 0) { - throw new Error("page 0 이상의 숫자여야 합니다."); - //false 값이 number가 될 수 있기에 숫자 값을 가지는 파라미터는 ||가 추가로 있다 - } - if (typeof pagesize !== "number" || pagesize < 0) { - throw new Error("pagesize는 0 이상의 숫자여야 합니다."); - } - //orderBy 파라미터는 데이터 타입 검증을 거치지 않은 이유? 거의 항상 string이라서? -} - -function validatedPropertyName(availableNames, targetObject) { - const available = new Set(availableNames); - const propertyNames = Object.keys(targetObject); - if (!propertyNames.every((key) => available.has(key))) { - throw new Error(`${propertyNames} are not in ${availableNames}`); - } -} - -const productFromInfo = ({ name, description, price, tags, images }) => - new Product(name, description, price, tags, images); diff --git a/tsconfig.json b/tsconfig.json new file mode 100755 index 00000000..8343100d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,44 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + "rootDir": "./src", + "outDir": "./dist", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "target": "esnext", + "types": [], + // For nodejs: + // "lib": ["esnext"], + // "types": ["node"], + // and npm install -D @types/node + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true, + } +} diff --git a/util.js b/util.js deleted file mode 100644 index f9dd596e..00000000 --- a/util.js +++ /dev/null @@ -1,4 +0,0 @@ -export const logAndThrow = (messsage, error) => { - console.error(`Error fetching :${messsage}`, error); - throw error; -}; From d532c2456f9af0f0b74ff72f34afcc7290ad6444 Mon Sep 17 00:00:00 2001 From: ssk7594-CRz Date: Mon, 9 Mar 2026 05:48:28 +0000 Subject: [PATCH 2/5] feat: sprint 9 --- .gitignore | 9 + .../.prettierrc => .prettierrc | 0 coverage/base.css | 224 + coverage/block-navigation.js | 87 + coverage/clover.xml | 384 + coverage/coverage-final.json | 23 + coverage/favicon.png | Bin 0 -> 445 bytes coverage/index.html | 221 + coverage/lcov-report/base.css | 224 + coverage/lcov-report/block-navigation.js | 87 + coverage/lcov-report/favicon.png | Bin 0 -> 445 bytes coverage/lcov-report/index.html | 221 + coverage/lcov-report/prettify.css | 1 + coverage/lcov-report/prettify.js | 2 + coverage/lcov-report/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/lcov-report/sorter.js | 210 + .../controllers/articlesController.ts.html | 475 + .../src/controllers/authController.ts.html | 370 + .../controllers/commentsController.ts.html | 397 + .../src/controllers/errorController.ts.html | 172 + .../src/controllers/imagesController.ts.html | 229 + .../lcov-report/src/controllers/index.html | 221 + .../src/controllers/likeController.ts.html | 376 + .../controllers/productsController.ts.html | 469 + .../src/controllers/userController.ts.html | 583 + coverage/lcov-report/src/index.html | 116 + .../lcov-report/src/lib/constants.ts.html | 115 + .../src/lib/errors/BadRequestError.ts.html | 112 + .../src/lib/errors/NotFoundError.ts.html | 115 + .../lcov-report/src/lib/errors/index.html | 131 + coverage/lcov-report/src/lib/index.html | 161 + .../lcov-report/src/lib/prismaClient.ts.html | 124 + coverage/lcov-report/src/lib/socket.ts.html | 190 + .../lcov-report/src/lib/withAsync.ts.html | 115 + .../src/middlewares/authMiddleware.ts.html | 196 + .../lcov-report/src/middlewares/index.html | 131 + .../src/middlewares/validate.ts.html | 172 + .../src/routers/articlesRouter.ts.html | 169 + .../src/routers/authRoutes.ts.html | 118 + .../src/routers/commentsRouter.ts.html | 121 + .../src/routers/imagesRouter.ts.html | 124 + coverage/lcov-report/src/routers/index.html | 191 + .../src/routers/productsRouter.ts.html | 184 + .../src/routers/userRoutes.ts.html | 166 + coverage/lcov-report/src/server.ts.html | 178 + coverage/lcov-report/src/socket/index.html | 116 + .../lcov-report/src/socket/socket.ts.html | 178 + .../src/structs/articlesStructs.ts.html | 130 + .../src/structs/authStructs.ts.html | 127 + .../src/structs/commentsStruct.ts.html | 121 + .../src/structs/commonStructs.ts.html | 160 + coverage/lcov-report/src/structs/index.html | 191 + .../src/structs/productsStruct.ts.html | 139 + .../src/structs/userStructs.ts.html | 124 + coverage/lcov.info | 1149 ++ coverage/prettify.css | 1 + coverage/prettify.js | 2 + coverage/sort-arrow-sprite.png | Bin 0 -> 138 bytes coverage/sorter.js | 210 + .../controllers/articlesController.ts.html | 475 + .../src/controllers/authController.ts.html | 370 + .../controllers/commentsController.ts.html | 397 + .../src/controllers/errorController.ts.html | 172 + .../src/controllers/imagesController.ts.html | 229 + coverage/src/controllers/index.html | 221 + .../src/controllers/likeController.ts.html | 376 + .../controllers/productsController.ts.html | 469 + .../src/controllers/userController.ts.html | 583 + coverage/src/index.html | 116 + coverage/src/lib/constants.ts.html | 115 + .../src/lib/errors/BadRequestError.ts.html | 112 + coverage/src/lib/errors/NotFoundError.ts.html | 115 + coverage/src/lib/errors/index.html | 131 + coverage/src/lib/index.html | 161 + coverage/src/lib/prismaClient.ts.html | 124 + coverage/src/lib/socket.ts.html | 190 + coverage/src/lib/withAsync.ts.html | 115 + .../src/middlewares/authMiddleware.ts.html | 196 + coverage/src/middlewares/index.html | 131 + coverage/src/middlewares/validate.ts.html | 172 + coverage/src/routers/articlesRouter.ts.html | 169 + coverage/src/routers/authRoutes.ts.html | 118 + coverage/src/routers/commentsRouter.ts.html | 121 + coverage/src/routers/imagesRouter.ts.html | 124 + coverage/src/routers/index.html | 191 + coverage/src/routers/productsRouter.ts.html | 184 + coverage/src/routers/userRoutes.ts.html | 166 + coverage/src/server.ts.html | 178 + coverage/src/socket/index.html | 116 + coverage/src/socket/socket.ts.html | 178 + coverage/src/structs/articlesStructs.ts.html | 130 + coverage/src/structs/authStructs.ts.html | 127 + coverage/src/structs/commentsStruct.ts.html | 121 + coverage/src/structs/commonStructs.ts.html | 160 + coverage/src/structs/index.html | 191 + coverage/src/structs/productsStruct.ts.html | 139 + coverage/src/structs/userStructs.ts.html | 124 + jest.config.cjs | 50 + package-lock.json | 11050 +++++++++++++++- package.json | 35 +- .../.gitignore | 10 - .../package-lock.json | 1973 --- .../package.json | 21 - .../src/controllers/articlesController.js | 138 - .../src/controllers/commentsController.js | 94 - .../src/controllers/errorController.js | 29 - .../src/controllers/imagesController.js | 41 - .../src/controllers/userController.js | 141 - .../src/lib/constants.js | 7 - .../src/lib/errors/BadRequestError.js | 8 - .../src/lib/errors/NotFoundError.js | 8 - .../src/lib/prismaClient.js | 3 - .../src/lib/socket.js | 35 - .../src/lib/withAsync.js | 9 - .../src/main.js | 36 - .../src/routers/articlesRouter.js | 26 - .../src/routers/authRoutes.js | 12 - .../src/routers/commentsRouter.js | 11 - .../src/routers/imagesRouter.js | 9 - .../src/routers/productsRouter.js | 26 - .../src/routers/userRoutes.js | 21 - .../src/structs/articlesStructs.js | 12 - .../src/structs/authStructs.js | 12 - .../src/structs/commentsStruct.js | 10 - .../migrations/20250111082621_/migration.sql | 0 .../migration.sql | 0 .../migration.sql | 0 .../migrations/migration_lock.toml | 0 .../prisma => prisma}/schema.prisma | 0 .../public => public}/.gitkeep | 0 .../read.me => read.me | 0 src/controllers/articlesController.ts | 131 + .../controllers/authController.ts | 72 +- src/controllers/commentsController.ts | 105 + src/controllers/errorController.ts | 30 + src/controllers/imagesController.ts | 49 + .../controllers/likeController.ts | 47 +- .../controllers/productsController.ts | 125 +- src/controllers/userController.ts | 167 + src/lib/constants.ts | 11 + src/lib/errors/BadRequestError.ts | 10 + src/lib/errors/NotFoundError.ts | 11 + src/lib/prismaClient.ts | 14 + src/lib/socket.ts | 36 + src/lib/withAsync.ts | 11 + src/main.ts | 34 + .../middlewares/authMiddleware.ts | 14 +- .../middlewares/validate.ts | 16 +- src/routers/articlesRouter.ts | 29 + src/routers/authRoutes.ts | 12 + src/routers/commentsRouter.ts | 12 + src/routers/imagesRouter.ts | 14 + src/routers/productsRouter.ts | 34 + src/routers/userRoutes.ts | 28 + src/server.ts | 32 + .../socket/socket.js => src/socket/socket.ts | 11 +- src/structs/articlesStructs.ts | 16 + src/structs/authStructs.ts | 15 + src/structs/commentsStruct.ts | 13 + .../structs/commonStructs.ts | 10 +- .../structs/productsStruct.ts | 8 +- .../structs/userStructs.ts | 7 +- src/types/express.d.ts | 9 + tests/articles.test.ts | 255 + tests/auth.test.ts | 150 + tests/like.unit.test.ts | 213 + tests/products.test.ts | 282 + tests/products.unit.test.ts | 372 + tests/socket.unit.test | 125 + tests/user.test.ts | 313 + tsconfig.json | 71 +- 171 files changed, 31614 insertions(+), 3196 deletions(-) mode change 100644 => 100755 .gitignore rename pandamarket-be-sprint-mission-3-main/.prettierrc => .prettierrc (100%) create mode 100644 coverage/base.css create mode 100644 coverage/block-navigation.js create mode 100644 coverage/clover.xml create mode 100644 coverage/coverage-final.json create mode 100644 coverage/favicon.png create mode 100644 coverage/index.html create mode 100644 coverage/lcov-report/base.css create mode 100644 coverage/lcov-report/block-navigation.js create mode 100644 coverage/lcov-report/favicon.png create mode 100644 coverage/lcov-report/index.html create mode 100644 coverage/lcov-report/prettify.css create mode 100644 coverage/lcov-report/prettify.js create mode 100644 coverage/lcov-report/sort-arrow-sprite.png create mode 100644 coverage/lcov-report/sorter.js create mode 100644 coverage/lcov-report/src/controllers/articlesController.ts.html create mode 100644 coverage/lcov-report/src/controllers/authController.ts.html create mode 100644 coverage/lcov-report/src/controllers/commentsController.ts.html create mode 100644 coverage/lcov-report/src/controllers/errorController.ts.html create mode 100644 coverage/lcov-report/src/controllers/imagesController.ts.html create mode 100644 coverage/lcov-report/src/controllers/index.html create mode 100644 coverage/lcov-report/src/controllers/likeController.ts.html create mode 100644 coverage/lcov-report/src/controllers/productsController.ts.html create mode 100644 coverage/lcov-report/src/controllers/userController.ts.html create mode 100644 coverage/lcov-report/src/index.html create mode 100644 coverage/lcov-report/src/lib/constants.ts.html create mode 100644 coverage/lcov-report/src/lib/errors/BadRequestError.ts.html create mode 100644 coverage/lcov-report/src/lib/errors/NotFoundError.ts.html create mode 100644 coverage/lcov-report/src/lib/errors/index.html create mode 100644 coverage/lcov-report/src/lib/index.html create mode 100644 coverage/lcov-report/src/lib/prismaClient.ts.html create mode 100644 coverage/lcov-report/src/lib/socket.ts.html create mode 100644 coverage/lcov-report/src/lib/withAsync.ts.html create mode 100644 coverage/lcov-report/src/middlewares/authMiddleware.ts.html create mode 100644 coverage/lcov-report/src/middlewares/index.html create mode 100644 coverage/lcov-report/src/middlewares/validate.ts.html create mode 100644 coverage/lcov-report/src/routers/articlesRouter.ts.html create mode 100644 coverage/lcov-report/src/routers/authRoutes.ts.html create mode 100644 coverage/lcov-report/src/routers/commentsRouter.ts.html create mode 100644 coverage/lcov-report/src/routers/imagesRouter.ts.html create mode 100644 coverage/lcov-report/src/routers/index.html create mode 100644 coverage/lcov-report/src/routers/productsRouter.ts.html create mode 100644 coverage/lcov-report/src/routers/userRoutes.ts.html create mode 100644 coverage/lcov-report/src/server.ts.html create mode 100644 coverage/lcov-report/src/socket/index.html create mode 100644 coverage/lcov-report/src/socket/socket.ts.html create mode 100644 coverage/lcov-report/src/structs/articlesStructs.ts.html create mode 100644 coverage/lcov-report/src/structs/authStructs.ts.html create mode 100644 coverage/lcov-report/src/structs/commentsStruct.ts.html create mode 100644 coverage/lcov-report/src/structs/commonStructs.ts.html create mode 100644 coverage/lcov-report/src/structs/index.html create mode 100644 coverage/lcov-report/src/structs/productsStruct.ts.html create mode 100644 coverage/lcov-report/src/structs/userStructs.ts.html create mode 100644 coverage/lcov.info create mode 100644 coverage/prettify.css create mode 100644 coverage/prettify.js create mode 100644 coverage/sort-arrow-sprite.png create mode 100644 coverage/sorter.js create mode 100644 coverage/src/controllers/articlesController.ts.html create mode 100644 coverage/src/controllers/authController.ts.html create mode 100644 coverage/src/controllers/commentsController.ts.html create mode 100644 coverage/src/controllers/errorController.ts.html create mode 100644 coverage/src/controllers/imagesController.ts.html create mode 100644 coverage/src/controllers/index.html create mode 100644 coverage/src/controllers/likeController.ts.html create mode 100644 coverage/src/controllers/productsController.ts.html create mode 100644 coverage/src/controllers/userController.ts.html create mode 100644 coverage/src/index.html create mode 100644 coverage/src/lib/constants.ts.html create mode 100644 coverage/src/lib/errors/BadRequestError.ts.html create mode 100644 coverage/src/lib/errors/NotFoundError.ts.html create mode 100644 coverage/src/lib/errors/index.html create mode 100644 coverage/src/lib/index.html create mode 100644 coverage/src/lib/prismaClient.ts.html create mode 100644 coverage/src/lib/socket.ts.html create mode 100644 coverage/src/lib/withAsync.ts.html create mode 100644 coverage/src/middlewares/authMiddleware.ts.html create mode 100644 coverage/src/middlewares/index.html create mode 100644 coverage/src/middlewares/validate.ts.html create mode 100644 coverage/src/routers/articlesRouter.ts.html create mode 100644 coverage/src/routers/authRoutes.ts.html create mode 100644 coverage/src/routers/commentsRouter.ts.html create mode 100644 coverage/src/routers/imagesRouter.ts.html create mode 100644 coverage/src/routers/index.html create mode 100644 coverage/src/routers/productsRouter.ts.html create mode 100644 coverage/src/routers/userRoutes.ts.html create mode 100644 coverage/src/server.ts.html create mode 100644 coverage/src/socket/index.html create mode 100644 coverage/src/socket/socket.ts.html create mode 100644 coverage/src/structs/articlesStructs.ts.html create mode 100644 coverage/src/structs/authStructs.ts.html create mode 100644 coverage/src/structs/commentsStruct.ts.html create mode 100644 coverage/src/structs/commonStructs.ts.html create mode 100644 coverage/src/structs/index.html create mode 100644 coverage/src/structs/productsStruct.ts.html create mode 100644 coverage/src/structs/userStructs.ts.html create mode 100644 jest.config.cjs delete mode 100755 pandamarket-be-sprint-mission-3-main/.gitignore delete mode 100755 pandamarket-be-sprint-mission-3-main/package-lock.json delete mode 100755 pandamarket-be-sprint-mission-3-main/package.json delete mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js delete mode 100644 pandamarket-be-sprint-mission-3-main/src/controllers/userController.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/constants.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js delete mode 100644 pandamarket-be-sprint-mission-3-main/src/lib/socket.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/main.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js delete mode 100644 pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js delete mode 100644 pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js delete mode 100644 pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js delete mode 100755 pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js rename {pandamarket-be-sprint-mission-3-main/prisma => prisma}/migrations/20250111082621_/migration.sql (100%) rename {pandamarket-be-sprint-mission-3-main/prisma => prisma}/migrations/20260226084615_init_notification_system/migration.sql (100%) rename {pandamarket-be-sprint-mission-3-main/prisma => prisma}/migrations/20260226091616_add_owner_to_product/migration.sql (100%) rename {pandamarket-be-sprint-mission-3-main/prisma => prisma}/migrations/migration_lock.toml (100%) rename {pandamarket-be-sprint-mission-3-main/prisma => prisma}/schema.prisma (100%) rename {pandamarket-be-sprint-mission-3-main/public => public}/.gitkeep (100%) rename pandamarket-be-sprint-mission-3-main/read.me => read.me (100%) create mode 100755 src/controllers/articlesController.ts rename pandamarket-be-sprint-mission-3-main/src/controllers/authController.js => src/controllers/authController.ts (53%) create mode 100755 src/controllers/commentsController.ts create mode 100755 src/controllers/errorController.ts create mode 100755 src/controllers/imagesController.ts rename pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js => src/controllers/likeController.ts (60%) rename pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js => src/controllers/productsController.ts (50%) create mode 100644 src/controllers/userController.ts create mode 100755 src/lib/constants.ts create mode 100755 src/lib/errors/BadRequestError.ts create mode 100755 src/lib/errors/NotFoundError.ts create mode 100755 src/lib/prismaClient.ts create mode 100644 src/lib/socket.ts create mode 100755 src/lib/withAsync.ts create mode 100755 src/main.ts rename pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js => src/middlewares/authMiddleware.ts (68%) rename pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js => src/middlewares/validate.ts (58%) create mode 100755 src/routers/articlesRouter.ts create mode 100644 src/routers/authRoutes.ts create mode 100755 src/routers/commentsRouter.ts create mode 100755 src/routers/imagesRouter.ts create mode 100755 src/routers/productsRouter.ts create mode 100644 src/routers/userRoutes.ts create mode 100644 src/server.ts rename pandamarket-be-sprint-mission-3-main/src/socket/socket.js => src/socket/socket.ts (57%) create mode 100755 src/structs/articlesStructs.ts create mode 100644 src/structs/authStructs.ts create mode 100755 src/structs/commentsStruct.ts rename pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js => src/structs/commonStructs.ts (71%) rename pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js => src/structs/productsStruct.ts (59%) rename pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js => src/structs/userStructs.ts (51%) create mode 100644 src/types/express.d.ts create mode 100644 tests/articles.test.ts create mode 100644 tests/auth.test.ts create mode 100644 tests/like.unit.test.ts create mode 100644 tests/products.test.ts create mode 100644 tests/products.unit.test.ts create mode 100644 tests/socket.unit.test create mode 100644 tests/user.test.ts diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index c2658d7d..b0fc192f --- a/.gitignore +++ b/.gitignore @@ -1 +1,10 @@ +# Local files +.vscode/ node_modules/ +.env* +!.env.example + +# Uploaded files +public/* +!public/.gitkeep + diff --git a/pandamarket-be-sprint-mission-3-main/.prettierrc b/.prettierrc similarity index 100% rename from pandamarket-be-sprint-mission-3-main/.prettierrc rename to .prettierrc diff --git a/coverage/base.css b/coverage/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/coverage/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/block-navigation.js b/coverage/block-navigation.js new file mode 100644 index 00000000..530d1ed2 --- /dev/null +++ b/coverage/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/clover.xml b/coverage/clover.xml new file mode 100644 index 00000000..f41ee80c --- /dev/null +++ b/coverage/clover.xml @@ -0,0 +1,384 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/coverage/coverage-final.json b/coverage/coverage-final.json new file mode 100644 index 00000000..f86d73d1 --- /dev/null +++ b/coverage/coverage-final.json @@ -0,0 +1,23 @@ +{"/workspaces/sprint-mission-3/src/server.ts": {"path":"/workspaces/sprint-mission-3/src/server.ts","statementMap":{"0":{"start":{"line":11,"column":28},"end":{"line":11,"column":37}},"1":{"start":{"line":14,"column":0},"end":{"line":14,"column":19}},"2":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"3":{"start":{"line":18,"column":0},"end":{"line":18,"column":82}},"4":{"start":{"line":21,"column":0},"end":{"line":21,"column":40}},"5":{"start":{"line":22,"column":0},"end":{"line":22,"column":40}},"6":{"start":{"line":23,"column":0},"end":{"line":23,"column":40}},"7":{"start":{"line":24,"column":0},"end":{"line":24,"column":36}},"8":{"start":{"line":27,"column":0},"end":{"line":27,"column":35}},"9":{"start":{"line":28,"column":0},"end":{"line":28,"column":31}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{}} +,"/workspaces/sprint-mission-3/src/controllers/articlesController.ts": {"path":"/workspaces/sprint-mission-3/src/controllers/articlesController.ts","statementMap":{"0":{"start":{"line":14,"column":29},"end":{"line":27,"column":2}},"1":{"start":{"line":14,"column":77},"end":{"line":27,"column":2}},"2":{"start":{"line":15,"column":36},"end":{"line":15,"column":77}},"3":{"start":{"line":17,"column":18},"end":{"line":24,"column":4}},"4":{"start":{"line":26,"column":2},"end":{"line":26,"column":32}},"5":{"start":{"line":30,"column":26},"end":{"line":37,"column":2}},"6":{"start":{"line":30,"column":74},"end":{"line":37,"column":2}},"7":{"start":{"line":31,"column":17},"end":{"line":31,"column":51}},"8":{"start":{"line":33,"column":18},"end":{"line":33,"column":68}},"9":{"start":{"line":34,"column":2},"end":{"line":34,"column":66}},"10":{"start":{"line":34,"column":16},"end":{"line":34,"column":66}},"11":{"start":{"line":36,"column":2},"end":{"line":36,"column":20}},"12":{"start":{"line":40,"column":29},"end":{"line":57,"column":2}},"13":{"start":{"line":40,"column":77},"end":{"line":57,"column":2}},"14":{"start":{"line":41,"column":17},"end":{"line":41,"column":51}},"15":{"start":{"line":42,"column":36},"end":{"line":42,"column":77}},"16":{"start":{"line":44,"column":26},"end":{"line":44,"column":76}},"17":{"start":{"line":46,"column":2},"end":{"line":46,"column":74}},"18":{"start":{"line":46,"column":24},"end":{"line":46,"column":74}},"19":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"20":{"start":{"line":48,"column":4},"end":{"line":48,"column":70}},"21":{"start":{"line":51,"column":25},"end":{"line":54,"column":4}},"22":{"start":{"line":56,"column":2},"end":{"line":56,"column":27}},"23":{"start":{"line":59,"column":29},"end":{"line":72,"column":2}},"24":{"start":{"line":59,"column":77},"end":{"line":72,"column":2}},"25":{"start":{"line":60,"column":17},"end":{"line":60,"column":51}},"26":{"start":{"line":62,"column":26},"end":{"line":62,"column":76}},"27":{"start":{"line":64,"column":2},"end":{"line":64,"column":74}},"28":{"start":{"line":64,"column":24},"end":{"line":64,"column":74}},"29":{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},"30":{"start":{"line":66,"column":4},"end":{"line":66,"column":70}},"31":{"start":{"line":69,"column":2},"end":{"line":69,"column":49}},"32":{"start":{"line":71,"column":2},"end":{"line":71,"column":25}},"33":{"start":{"line":74,"column":30},"end":{"line":90,"column":2}},"34":{"start":{"line":74,"column":78},"end":{"line":90,"column":2}},"35":{"start":{"line":75,"column":47},"end":{"line":75,"column":92}},"36":{"start":{"line":77,"column":16},"end":{"line":79,"column":4}},"37":{"start":{"line":81,"column":21},"end":{"line":81,"column":58}},"38":{"start":{"line":82,"column":19},"end":{"line":87,"column":4}},"39":{"start":{"line":89,"column":2},"end":{"line":89,"column":43}},"40":{"start":{"line":93,"column":29},"end":{"line":109,"column":2}},"41":{"start":{"line":93,"column":77},"end":{"line":109,"column":2}},"42":{"start":{"line":94,"column":28},"end":{"line":94,"column":62}},"43":{"start":{"line":95,"column":22},"end":{"line":95,"column":63}},"44":{"start":{"line":97,"column":26},"end":{"line":97,"column":87}},"45":{"start":{"line":98,"column":2},"end":{"line":98,"column":81}},"46":{"start":{"line":98,"column":24},"end":{"line":98,"column":81}},"47":{"start":{"line":100,"column":18},"end":{"line":106,"column":4}},"48":{"start":{"line":108,"column":2},"end":{"line":108,"column":32}},"49":{"start":{"line":112,"column":30},"end":{"line":131,"column":2}},"50":{"start":{"line":112,"column":78},"end":{"line":131,"column":2}},"51":{"start":{"line":113,"column":28},"end":{"line":113,"column":62}},"52":{"start":{"line":114,"column":28},"end":{"line":114,"column":73}},"53":{"start":{"line":116,"column":18},"end":{"line":116,"column":79}},"54":{"start":{"line":117,"column":2},"end":{"line":117,"column":73}},"55":{"start":{"line":117,"column":16},"end":{"line":117,"column":73}},"56":{"start":{"line":119,"column":29},"end":{"line":124,"column":4}},"57":{"start":{"line":126,"column":22},"end":{"line":126,"column":55}},"58":{"start":{"line":127,"column":19},"end":{"line":127,"column":53}},"59":{"start":{"line":128,"column":21},"end":{"line":128,"column":70}},"60":{"start":{"line":130,"column":2},"end":{"line":130,"column":43}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":39},"end":{"line":14,"column":46}},"loc":{"start":{"line":14,"column":77},"end":{"line":27,"column":2}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":14,"column":77},"end":{"line":14,"column":null}},"loc":{"start":{"line":14,"column":77},"end":{"line":27,"column":1}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":30,"column":36},"end":{"line":30,"column":43}},"loc":{"start":{"line":30,"column":74},"end":{"line":37,"column":2}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":30,"column":74},"end":{"line":30,"column":null}},"loc":{"start":{"line":30,"column":74},"end":{"line":37,"column":1}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":40,"column":39},"end":{"line":40,"column":46}},"loc":{"start":{"line":40,"column":77},"end":{"line":57,"column":2}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":40,"column":77},"end":{"line":40,"column":null}},"loc":{"start":{"line":40,"column":77},"end":{"line":57,"column":1}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":59,"column":39},"end":{"line":59,"column":46}},"loc":{"start":{"line":59,"column":77},"end":{"line":72,"column":2}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":59,"column":77},"end":{"line":59,"column":null}},"loc":{"start":{"line":59,"column":77},"end":{"line":72,"column":1}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":74,"column":40},"end":{"line":74,"column":47}},"loc":{"start":{"line":74,"column":78},"end":{"line":90,"column":2}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":74,"column":78},"end":{"line":74,"column":null}},"loc":{"start":{"line":74,"column":78},"end":{"line":90,"column":1}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":93,"column":39},"end":{"line":93,"column":46}},"loc":{"start":{"line":93,"column":77},"end":{"line":109,"column":2}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":93,"column":77},"end":{"line":93,"column":null}},"loc":{"start":{"line":93,"column":77},"end":{"line":109,"column":1}}},"12":{"name":"(anonymous_19)","decl":{"start":{"line":112,"column":40},"end":{"line":112,"column":47}},"loc":{"start":{"line":112,"column":78},"end":{"line":131,"column":2}}},"13":{"name":"(anonymous_20)","decl":{"start":{"line":112,"column":78},"end":{"line":112,"column":null}},"loc":{"start":{"line":112,"column":78},"end":{"line":131,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":34,"column":2},"end":{"line":34,"column":66}},"type":"if","locations":[{"start":{"line":34,"column":2},"end":{"line":34,"column":66}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":46,"column":2},"end":{"line":46,"column":74}},"type":"if","locations":[{"start":{"line":46,"column":2},"end":{"line":46,"column":74}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":64,"column":2},"end":{"line":64,"column":74}},"type":"if","locations":[{"start":{"line":64,"column":2},"end":{"line":64,"column":74}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},"type":"if","locations":[{"start":{"line":65,"column":2},"end":{"line":67,"column":3}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":78,"column":11},"end":{"line":78,"column":54}},"type":"cond-expr","locations":[{"start":{"line":78,"column":21},"end":{"line":78,"column":42}},{"start":{"line":78,"column":45},"end":{"line":78,"column":54}}]},"6":{"loc":{"start":{"line":85,"column":13},"end":{"line":85,"column":73}},"type":"cond-expr","locations":[{"start":{"line":85,"column":36},"end":{"line":85,"column":57}},{"start":{"line":85,"column":60},"end":{"line":85,"column":73}}]},"7":{"loc":{"start":{"line":98,"column":2},"end":{"line":98,"column":81}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":98,"column":81}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":117,"column":2},"end":{"line":117,"column":73}},"type":"if","locations":[{"start":{"line":117,"column":2},"end":{"line":117,"column":73}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":120,"column":12},"end":{"line":120,"column":47}},"type":"cond-expr","locations":[{"start":{"line":120,"column":21},"end":{"line":120,"column":35}},{"start":{"line":120,"column":38},"end":{"line":120,"column":47}}]},"10":{"loc":{"start":{"line":128,"column":21},"end":{"line":128,"column":70}},"type":"cond-expr","locations":[{"start":{"line":128,"column":35},"end":{"line":128,"column":63}},{"start":{"line":128,"column":66},"end":{"line":128,"column":70}}]}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":0,"12":1,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":1,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":1,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0},"f":{"0":0,"1":0,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":1,"9":1,"10":0,"11":0,"12":0,"13":0},"b":{"0":[1,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,1],"6":[0,1],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0]}} +,"/workspaces/sprint-mission-3/src/controllers/commentsController.ts": {"path":"/workspaces/sprint-mission-3/src/controllers/commentsController.ts","statementMap":{"0":{"start":{"line":10,"column":29},"end":{"line":39,"column":2}},"1":{"start":{"line":10,"column":77},"end":{"line":39,"column":2}},"2":{"start":{"line":11,"column":28},"end":{"line":11,"column":62}},"3":{"start":{"line":12,"column":22},"end":{"line":12,"column":63}},"4":{"start":{"line":14,"column":26},"end":{"line":14,"column":87}},"5":{"start":{"line":15,"column":2},"end":{"line":17,"column":3}},"6":{"start":{"line":16,"column":4},"end":{"line":16,"column":61}},"7":{"start":{"line":19,"column":18},"end":{"line":25,"column":4}},"8":{"start":{"line":27,"column":2},"end":{"line":36,"column":3}},"9":{"start":{"line":28,"column":4},"end":{"line":35,"column":7}},"10":{"start":{"line":38,"column":2},"end":{"line":38,"column":32}},"11":{"start":{"line":42,"column":30},"end":{"line":66,"column":2}},"12":{"start":{"line":42,"column":78},"end":{"line":66,"column":2}},"13":{"start":{"line":43,"column":28},"end":{"line":43,"column":62}},"14":{"start":{"line":44,"column":28},"end":{"line":44,"column":73}},"15":{"start":{"line":46,"column":26},"end":{"line":46,"column":87}},"16":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"17":{"start":{"line":48,"column":4},"end":{"line":48,"column":61}},"18":{"start":{"line":51,"column":29},"end":{"line":56,"column":4}},"19":{"start":{"line":58,"column":22},"end":{"line":58,"column":55}},"20":{"start":{"line":59,"column":19},"end":{"line":59,"column":53}},"21":{"start":{"line":60,"column":21},"end":{"line":60,"column":70}},"22":{"start":{"line":62,"column":2},"end":{"line":65,"column":5}},"23":{"start":{"line":68,"column":29},"end":{"line":87,"column":2}},"24":{"start":{"line":68,"column":77},"end":{"line":87,"column":2}},"25":{"start":{"line":69,"column":17},"end":{"line":69,"column":51}},"26":{"start":{"line":70,"column":22},"end":{"line":70,"column":63}},"27":{"start":{"line":72,"column":26},"end":{"line":72,"column":76}},"28":{"start":{"line":73,"column":2},"end":{"line":75,"column":3}},"29":{"start":{"line":74,"column":4},"end":{"line":74,"column":54}},"30":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"31":{"start":{"line":78,"column":4},"end":{"line":78,"column":69}},"32":{"start":{"line":81,"column":25},"end":{"line":84,"column":4}},"33":{"start":{"line":86,"column":2},"end":{"line":86,"column":27}},"34":{"start":{"line":90,"column":29},"end":{"line":105,"column":2}},"35":{"start":{"line":90,"column":77},"end":{"line":105,"column":2}},"36":{"start":{"line":91,"column":17},"end":{"line":91,"column":51}},"37":{"start":{"line":93,"column":26},"end":{"line":93,"column":76}},"38":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"39":{"start":{"line":95,"column":4},"end":{"line":95,"column":54}},"40":{"start":{"line":98,"column":2},"end":{"line":100,"column":3}},"41":{"start":{"line":99,"column":4},"end":{"line":99,"column":69}},"42":{"start":{"line":102,"column":2},"end":{"line":102,"column":49}},"43":{"start":{"line":104,"column":2},"end":{"line":104,"column":25}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":10,"column":39},"end":{"line":10,"column":46}},"loc":{"start":{"line":10,"column":77},"end":{"line":39,"column":2}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":10,"column":77},"end":{"line":10,"column":null}},"loc":{"start":{"line":10,"column":77},"end":{"line":39,"column":1}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":42,"column":40},"end":{"line":42,"column":47}},"loc":{"start":{"line":42,"column":78},"end":{"line":66,"column":2}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":42,"column":78},"end":{"line":42,"column":null}},"loc":{"start":{"line":42,"column":78},"end":{"line":66,"column":1}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":68,"column":39},"end":{"line":68,"column":46}},"loc":{"start":{"line":68,"column":77},"end":{"line":87,"column":2}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":68,"column":77},"end":{"line":68,"column":null}},"loc":{"start":{"line":68,"column":77},"end":{"line":87,"column":1}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":90,"column":39},"end":{"line":90,"column":46}},"loc":{"start":{"line":90,"column":77},"end":{"line":105,"column":2}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":90,"column":77},"end":{"line":90,"column":null}},"loc":{"start":{"line":90,"column":77},"end":{"line":105,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":17,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":27,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":27,"column":2},"end":{"line":36,"column":3}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":27,"column":6},"end":{"line":27,"column":70}},"type":"binary-expr","locations":[{"start":{"line":27,"column":6},"end":{"line":27,"column":28}},{"start":{"line":27,"column":32},"end":{"line":27,"column":70}}]},"3":{"loc":{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":49,"column":3}},{"start":{},"end":{}}]},"4":{"loc":{"start":{"line":52,"column":12},"end":{"line":52,"column":47}},"type":"cond-expr","locations":[{"start":{"line":52,"column":21},"end":{"line":52,"column":35}},{"start":{"line":52,"column":38},"end":{"line":52,"column":47}}]},"5":{"loc":{"start":{"line":60,"column":21},"end":{"line":60,"column":70}},"type":"cond-expr","locations":[{"start":{"line":60,"column":35},"end":{"line":60,"column":63}},{"start":{"line":60,"column":66},"end":{"line":60,"column":70}}]},"6":{"loc":{"start":{"line":73,"column":2},"end":{"line":75,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":75,"column":3}},{"start":{},"end":{}}]},"7":{"loc":{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},"type":"if","locations":[{"start":{"line":77,"column":2},"end":{"line":79,"column":3}},{"start":{},"end":{}}]},"8":{"loc":{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},"type":"if","locations":[{"start":{"line":94,"column":2},"end":{"line":96,"column":3}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":98,"column":2},"end":{"line":100,"column":3}},"type":"if","locations":[{"start":{"line":98,"column":2},"end":{"line":100,"column":3}},{"start":{},"end":{}}]}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":1,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":1,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0]}} +,"/workspaces/sprint-mission-3/src/controllers/errorController.ts": {"path":"/workspaces/sprint-mission-3/src/controllers/errorController.ts","statementMap":{"0":{"start":{"line":7,"column":2},"end":{"line":7,"column":56}},"1":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"2":{"start":{"line":12,"column":4},"end":{"line":12,"column":58}},"3":{"start":{"line":15,"column":2},"end":{"line":17,"column":3}},"4":{"start":{"line":16,"column":4},"end":{"line":16,"column":61}},"5":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"6":{"start":{"line":20,"column":4},"end":{"line":20,"column":58}},"7":{"start":{"line":23,"column":2},"end":{"line":26,"column":3}},"8":{"start":{"line":24,"column":4},"end":{"line":24,"column":41}},"9":{"start":{"line":25,"column":4},"end":{"line":25,"column":71}},"10":{"start":{"line":28,"column":2},"end":{"line":28,"column":42}},"11":{"start":{"line":29,"column":2},"end":{"line":29,"column":68}}},"fnMap":{"0":{"name":"defaultNotFoundHandler","decl":{"start":{"line":6,"column":16},"end":{"line":6,"column":38}},"loc":{"start":{"line":6,"column":87},"end":{"line":8,"column":1}}},"1":{"name":"globalErrorHandler","decl":{"start":{"line":10,"column":16},"end":{"line":10,"column":34}},"loc":{"start":{"line":10,"column":93},"end":{"line":30,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":11,"column":6},"end":{"line":11,"column":66}},"type":"binary-expr","locations":[{"start":{"line":11,"column":6},"end":{"line":11,"column":32}},{"start":{"line":11,"column":36},"end":{"line":11,"column":66}}]},"2":{"loc":{"start":{"line":15,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":17,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":15,"column":6},"end":{"line":15,"column":80}},"type":"binary-expr","locations":[{"start":{"line":15,"column":6},"end":{"line":15,"column":32}},{"start":{"line":15,"column":37},"end":{"line":15,"column":63}},{"start":{"line":15,"column":67},"end":{"line":15,"column":80}}]},"4":{"loc":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":23,"column":2},"end":{"line":26,"column":3}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":26,"column":3}},{"start":{},"end":{}}]}},"s":{"0":0,"1":1,"2":0,"3":1,"4":0,"5":1,"6":1,"7":0,"8":0,"9":0,"10":0,"11":0},"f":{"0":0,"1":1},"b":{"0":[0,1],"1":[1,1],"2":[0,1],"3":[1,0,0],"4":[1,0],"5":[0,0]}} +,"/workspaces/sprint-mission-3/src/controllers/imagesController.ts": {"path":"/workspaces/sprint-mission-3/src/controllers/imagesController.ts","statementMap":{"0":{"start":{"line":12,"column":22},"end":{"line":37,"column":2}},"1":{"start":{"line":15,"column":6},"end":{"line":15,"column":28}},"2":{"start":{"line":18,"column":18},"end":{"line":18,"column":49}},"3":{"start":{"line":19,"column":23},"end":{"line":19,"column":42}},"4":{"start":{"line":20,"column":6},"end":{"line":20,"column":25}},"5":{"start":{"line":29,"column":31},"end":{"line":29,"column":71}},"6":{"start":{"line":31,"column":4},"end":{"line":34,"column":5}},"7":{"start":{"line":32,"column":18},"end":{"line":32,"column":76}},"8":{"start":{"line":33,"column":6},"end":{"line":33,"column":35}},"9":{"start":{"line":35,"column":4},"end":{"line":35,"column":19}},"10":{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},"11":{"start":{"line":42,"column":4},"end":{"line":42,"column":50}},"12":{"start":{"line":45,"column":15},"end":{"line":45,"column":30}},"13":{"start":{"line":46,"column":14},"end":{"line":46,"column":66}},"14":{"start":{"line":48,"column":2},"end":{"line":48,"column":27}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":14,"column":4},"end":{"line":14,"column":15}},"loc":{"start":{"line":14,"column":80},"end":{"line":16,"column":5}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":17,"column":4},"end":{"line":17,"column":12}},"loc":{"start":{"line":17,"column":74},"end":{"line":21,"column":5}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":28,"column":14},"end":{"line":28,"column":15}},"loc":{"start":{"line":28,"column":82},"end":{"line":36,"column":3}}},"3":{"name":"uploadImage","decl":{"start":{"line":40,"column":22},"end":{"line":40,"column":33}},"loc":{"start":{"line":40,"column":61},"end":{"line":49,"column":null}}}},"branchMap":{"0":{"loc":{"start":{"line":31,"column":4},"end":{"line":34,"column":5}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":34,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},"type":"if","locations":[{"start":{"line":41,"column":2},"end":{"line":43,"column":3}},{"start":{},"end":{}}]}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0,0],"1":[0,0]}} +,"/workspaces/sprint-mission-3/src/controllers/likeController.ts": {"path":"/workspaces/sprint-mission-3/src/controllers/likeController.ts","statementMap":{"0":{"start":{"line":5,"column":15},"end":{"line":5,"column":33}},"1":{"start":{"line":8,"column":33},"end":{"line":36,"column":2}},"2":{"start":{"line":8,"column":81},"end":{"line":36,"column":2}},"3":{"start":{"line":9,"column":28},"end":{"line":9,"column":38}},"4":{"start":{"line":10,"column":17},"end":{"line":10,"column":28}},"5":{"start":{"line":12,"column":23},"end":{"line":19,"column":4}},"6":{"start":{"line":21,"column":2},"end":{"line":35,"column":3}},"7":{"start":{"line":22,"column":4},"end":{"line":24,"column":7}},"8":{"start":{"line":25,"column":4},"end":{"line":25,"column":33}},"9":{"start":{"line":28,"column":4},"end":{"line":33,"column":7}},"10":{"start":{"line":34,"column":4},"end":{"line":34,"column":32}},"11":{"start":{"line":41,"column":33},"end":{"line":66,"column":2}},"12":{"start":{"line":41,"column":81},"end":{"line":66,"column":2}},"13":{"start":{"line":42,"column":28},"end":{"line":42,"column":38}},"14":{"start":{"line":43,"column":17},"end":{"line":43,"column":28}},"15":{"start":{"line":45,"column":23},"end":{"line":52,"column":4}},"16":{"start":{"line":54,"column":2},"end":{"line":65,"column":3}},"17":{"start":{"line":55,"column":4},"end":{"line":55,"column":72}},"18":{"start":{"line":56,"column":4},"end":{"line":56,"column":33}},"19":{"start":{"line":58,"column":4},"end":{"line":63,"column":7}},"20":{"start":{"line":64,"column":4},"end":{"line":64,"column":32}},"21":{"start":{"line":69,"column":32},"end":{"line":98,"column":2}},"22":{"start":{"line":69,"column":80},"end":{"line":98,"column":2}},"23":{"start":{"line":70,"column":17},"end":{"line":70,"column":27}},"24":{"start":{"line":71,"column":17},"end":{"line":71,"column":29}},"25":{"start":{"line":73,"column":18},"end":{"line":78,"column":4}},"26":{"start":{"line":80,"column":2},"end":{"line":82,"column":3}},"27":{"start":{"line":81,"column":4},"end":{"line":81,"column":63}},"28":{"start":{"line":84,"column":16},"end":{"line":84,"column":21}},"29":{"start":{"line":85,"column":2},"end":{"line":95,"column":3}},"30":{"start":{"line":86,"column":17},"end":{"line":93,"column":6}},"31":{"start":{"line":94,"column":4},"end":{"line":94,"column":21}},"32":{"start":{"line":97,"column":2},"end":{"line":97,"column":36}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":8,"column":43},"end":{"line":8,"column":50}},"loc":{"start":{"line":8,"column":81},"end":{"line":36,"column":2}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":8,"column":81},"end":{"line":8,"column":null}},"loc":{"start":{"line":8,"column":81},"end":{"line":36,"column":1}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":41,"column":43},"end":{"line":41,"column":50}},"loc":{"start":{"line":41,"column":81},"end":{"line":66,"column":2}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":41,"column":81},"end":{"line":41,"column":null}},"loc":{"start":{"line":41,"column":81},"end":{"line":66,"column":1}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":69,"column":42},"end":{"line":69,"column":49}},"loc":{"start":{"line":69,"column":80},"end":{"line":98,"column":2}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":69,"column":80},"end":{"line":69,"column":null}},"loc":{"start":{"line":69,"column":80},"end":{"line":98,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":21,"column":2},"end":{"line":35,"column":3}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":35,"column":3}},{"start":{"line":26,"column":9},"end":{"line":35,"column":3}}]},"1":{"loc":{"start":{"line":54,"column":2},"end":{"line":65,"column":3}},"type":"if","locations":[{"start":{"line":54,"column":2},"end":{"line":65,"column":3}},{"start":{"line":57,"column":9},"end":{"line":65,"column":3}}]},"2":{"loc":{"start":{"line":71,"column":17},"end":{"line":71,"column":29}},"type":"cond-expr","locations":[{"start":{"line":71,"column":25},"end":{"line":71,"column":27}},{"start":{"line":71,"column":25},"end":{"line":71,"column":29}}]},"3":{"loc":{"start":{"line":71,"column":17},"end":{"line":71,"column":27}},"type":"binary-expr","locations":[{"start":{"line":71,"column":17},"end":{"line":71,"column":27}},{"start":{"line":71,"column":25},"end":{"line":71,"column":27}}]},"4":{"loc":{"start":{"line":80,"column":2},"end":{"line":82,"column":3}},"type":"if","locations":[{"start":{"line":80,"column":2},"end":{"line":82,"column":3}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":85,"column":2},"end":{"line":95,"column":3}},"type":"if","locations":[{"start":{"line":85,"column":2},"end":{"line":95,"column":3}},{"start":{},"end":{}}]}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":1,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0]}} +,"/workspaces/sprint-mission-3/src/controllers/productsController.ts": {"path":"/workspaces/sprint-mission-3/src/controllers/productsController.ts","statementMap":{"0":{"start":{"line":15,"column":29},"end":{"line":30,"column":2}},"1":{"start":{"line":15,"column":77},"end":{"line":30,"column":2}},"2":{"start":{"line":16,"column":53},"end":{"line":16,"column":94}},"3":{"start":{"line":18,"column":18},"end":{"line":27,"column":4}},"4":{"start":{"line":29,"column":2},"end":{"line":29,"column":32}},"5":{"start":{"line":33,"column":26},"end":{"line":40,"column":2}},"6":{"start":{"line":33,"column":74},"end":{"line":40,"column":2}},"7":{"start":{"line":34,"column":17},"end":{"line":34,"column":51}},"8":{"start":{"line":36,"column":18},"end":{"line":36,"column":68}},"9":{"start":{"line":37,"column":2},"end":{"line":37,"column":66}},"10":{"start":{"line":37,"column":16},"end":{"line":37,"column":66}},"11":{"start":{"line":39,"column":2},"end":{"line":39,"column":20}},"12":{"start":{"line":43,"column":29},"end":{"line":92,"column":2}},"13":{"start":{"line":43,"column":77},"end":{"line":92,"column":2}},"14":{"start":{"line":44,"column":17},"end":{"line":44,"column":51}},"15":{"start":{"line":45,"column":53},"end":{"line":45,"column":94}},"16":{"start":{"line":47,"column":26},"end":{"line":47,"column":76}},"17":{"start":{"line":48,"column":2},"end":{"line":48,"column":74}},"18":{"start":{"line":48,"column":24},"end":{"line":48,"column":74}},"19":{"start":{"line":50,"column":2},"end":{"line":52,"column":3}},"20":{"start":{"line":51,"column":4},"end":{"line":51,"column":69}},"21":{"start":{"line":54,"column":25},"end":{"line":54,"column":79}},"22":{"start":{"line":56,"column":25},"end":{"line":59,"column":4}},"23":{"start":{"line":61,"column":2},"end":{"line":89,"column":3}},"24":{"start":{"line":62,"column":18},"end":{"line":65,"column":6}},"25":{"start":{"line":67,"column":4},"end":{"line":88,"column":5}},"26":{"start":{"line":68,"column":22},"end":{"line":68,"column":108}},"27":{"start":{"line":70,"column":6},"end":{"line":77,"column":9}},"28":{"start":{"line":71,"column":35},"end":{"line":76,"column":10}},"29":{"start":{"line":79,"column":17},"end":{"line":79,"column":34}},"30":{"start":{"line":80,"column":6},"end":{"line":87,"column":9}},"31":{"start":{"line":81,"column":8},"end":{"line":86,"column":11}},"32":{"start":{"line":91,"column":2},"end":{"line":91,"column":27}},"33":{"start":{"line":95,"column":30},"end":{"line":113,"column":2}},"34":{"start":{"line":95,"column":78},"end":{"line":113,"column":2}},"35":{"start":{"line":96,"column":47},"end":{"line":96,"column":92}},"36":{"start":{"line":98,"column":16},"end":{"line":102,"column":15}},"37":{"start":{"line":104,"column":21},"end":{"line":104,"column":58}},"38":{"start":{"line":105,"column":19},"end":{"line":110,"column":4}},"39":{"start":{"line":112,"column":2},"end":{"line":112,"column":43}},"40":{"start":{"line":115,"column":29},"end":{"line":128,"column":2}},"41":{"start":{"line":115,"column":77},"end":{"line":128,"column":2}},"42":{"start":{"line":116,"column":17},"end":{"line":116,"column":51}},"43":{"start":{"line":118,"column":26},"end":{"line":118,"column":76}},"44":{"start":{"line":119,"column":2},"end":{"line":119,"column":74}},"45":{"start":{"line":119,"column":24},"end":{"line":119,"column":74}},"46":{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},"47":{"start":{"line":122,"column":4},"end":{"line":122,"column":69}},"48":{"start":{"line":125,"column":2},"end":{"line":125,"column":49}},"49":{"start":{"line":127,"column":2},"end":{"line":127,"column":25}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":15,"column":39},"end":{"line":15,"column":46}},"loc":{"start":{"line":15,"column":77},"end":{"line":30,"column":2}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":15,"column":77},"end":{"line":15,"column":null}},"loc":{"start":{"line":15,"column":77},"end":{"line":30,"column":1}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":33,"column":36},"end":{"line":33,"column":43}},"loc":{"start":{"line":33,"column":74},"end":{"line":40,"column":2}}},"3":{"name":"(anonymous_10)","decl":{"start":{"line":33,"column":74},"end":{"line":33,"column":null}},"loc":{"start":{"line":33,"column":74},"end":{"line":40,"column":1}}},"4":{"name":"(anonymous_11)","decl":{"start":{"line":43,"column":39},"end":{"line":43,"column":46}},"loc":{"start":{"line":43,"column":77},"end":{"line":92,"column":2}}},"5":{"name":"(anonymous_12)","decl":{"start":{"line":43,"column":77},"end":{"line":43,"column":null}},"loc":{"start":{"line":43,"column":77},"end":{"line":92,"column":1}}},"6":{"name":"(anonymous_13)","decl":{"start":{"line":71,"column":24},"end":{"line":71,"column":25}},"loc":{"start":{"line":71,"column":35},"end":{"line":76,"column":10}}},"7":{"name":"(anonymous_14)","decl":{"start":{"line":80,"column":20},"end":{"line":80,"column":21}},"loc":{"start":{"line":80,"column":29},"end":{"line":87,"column":7}}},"8":{"name":"(anonymous_15)","decl":{"start":{"line":95,"column":40},"end":{"line":95,"column":47}},"loc":{"start":{"line":95,"column":78},"end":{"line":113,"column":2}}},"9":{"name":"(anonymous_16)","decl":{"start":{"line":95,"column":78},"end":{"line":95,"column":null}},"loc":{"start":{"line":95,"column":78},"end":{"line":113,"column":1}}},"10":{"name":"(anonymous_17)","decl":{"start":{"line":115,"column":39},"end":{"line":115,"column":46}},"loc":{"start":{"line":115,"column":77},"end":{"line":128,"column":2}}},"11":{"name":"(anonymous_18)","decl":{"start":{"line":115,"column":77},"end":{"line":115,"column":null}},"loc":{"start":{"line":115,"column":77},"end":{"line":128,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":37,"column":2},"end":{"line":37,"column":66}},"type":"if","locations":[{"start":{"line":37,"column":2},"end":{"line":37,"column":66}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":74}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":74}},{"start":{},"end":{}}]},"2":{"loc":{"start":{"line":50,"column":2},"end":{"line":52,"column":3}},"type":"if","locations":[{"start":{"line":50,"column":2},"end":{"line":52,"column":3}},{"start":{},"end":{}}]},"3":{"loc":{"start":{"line":54,"column":25},"end":{"line":54,"column":79}},"type":"binary-expr","locations":[{"start":{"line":54,"column":25},"end":{"line":54,"column":44}},{"start":{"line":54,"column":48},"end":{"line":54,"column":79}}]},"4":{"loc":{"start":{"line":61,"column":2},"end":{"line":89,"column":3}},"type":"if","locations":[{"start":{"line":61,"column":2},"end":{"line":89,"column":3}},{"start":{},"end":{}}]},"5":{"loc":{"start":{"line":67,"column":4},"end":{"line":88,"column":5}},"type":"if","locations":[{"start":{"line":67,"column":4},"end":{"line":88,"column":5}},{"start":{},"end":{}}]},"6":{"loc":{"start":{"line":98,"column":16},"end":{"line":102,"column":15}},"type":"cond-expr","locations":[{"start":{"line":99,"column":6},"end":{"line":101,"column":null}},{"start":{"line":102,"column":6},"end":{"line":102,"column":15}}]},"7":{"loc":{"start":{"line":108,"column":13},"end":{"line":108,"column":66}},"type":"cond-expr","locations":[{"start":{"line":108,"column":36},"end":{"line":108,"column":50}},{"start":{"line":108,"column":53},"end":{"line":108,"column":66}}]},"8":{"loc":{"start":{"line":119,"column":2},"end":{"line":119,"column":74}},"type":"if","locations":[{"start":{"line":119,"column":2},"end":{"line":119,"column":74}},{"start":{},"end":{}}]},"9":{"loc":{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":121,"column":2},"end":{"line":123,"column":3}},{"start":{},"end":{}}]}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":1,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":1,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":1,"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":1,"9":1,"10":0,"11":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,1],"7":[0,1],"8":[0,0],"9":[0,0]}} +,"/workspaces/sprint-mission-3/src/lib/constants.ts": {"path":"/workspaces/sprint-mission-3/src/lib/constants.ts","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":16}},"1":{"start":{"line":4,"column":0},"end":{"line":6,"column":1}},"2":{"start":{"line":5,"column":2},"end":{"line":5,"column":59}},"3":{"start":{"line":8,"column":36},"end":{"line":8,"column":60}},"4":{"start":{"line":9,"column":28},"end":{"line":9,"column":60}},"5":{"start":{"line":10,"column":35},"end":{"line":10,"column":45}},"6":{"start":{"line":11,"column":35},"end":{"line":11,"column":44}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":4,"column":0},"end":{"line":6,"column":1}},"type":"if","locations":[{"start":{"line":4,"column":0},"end":{"line":6,"column":1}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":9,"column":28},"end":{"line":9,"column":60}},"type":"binary-expr","locations":[{"start":{"line":9,"column":28},"end":{"line":9,"column":52}},{"start":{"line":9,"column":56},"end":{"line":9,"column":60}}]}},"s":{"0":1,"1":1,"2":0,"3":1,"4":1,"5":1,"6":1},"f":{},"b":{"0":[0,1],"1":[1,0]}} +,"/workspaces/sprint-mission-3/src/lib/prismaClient.ts": {"path":"/workspaces/sprint-mission-3/src/lib/prismaClient.ts","statementMap":{"0":{"start":{"line":4,"column":24},"end":{"line":4,"column":null}},"1":{"start":{"line":10,"column":2},"end":{"line":10,"column":46}},"2":{"start":{"line":12,"column":0},"end":{"line":14,"column":1}},"3":{"start":{"line":13,"column":2},"end":{"line":13,"column":40}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":10,"column":2},"end":{"line":10,"column":46}},"type":"cond-expr","locations":[{"start":{"line":10,"column":24},"end":{"line":10,"column":28}},{"start":{"line":10,"column":28},"end":{"line":10,"column":46}}]},"1":{"loc":{"start":{"line":10,"column":2},"end":{"line":10,"column":28}},"type":"binary-expr","locations":[{"start":{"line":10,"column":2},"end":{"line":10,"column":28}},{"start":{"line":10,"column":24},"end":{"line":10,"column":28}}]},"2":{"loc":{"start":{"line":12,"column":0},"end":{"line":14,"column":1}},"type":"if","locations":[{"start":{"line":12,"column":0},"end":{"line":14,"column":1}},{"start":{},"end":{}}]}},"s":{"0":1,"1":1,"2":1,"3":1},"f":{},"b":{"0":[0,1],"1":[1,1],"2":[1,0]}} +,"/workspaces/sprint-mission-3/src/lib/withAsync.ts": {"path":"/workspaces/sprint-mission-3/src/lib/withAsync.ts","statementMap":{"0":{"start":{"line":3,"column":25},"end":{"line":11,"column":1}},"1":{"start":{"line":4,"column":2},"end":{"line":10,"column":4}},"2":{"start":{"line":4,"column":67},"end":{"line":10,"column":4}},"3":{"start":{"line":5,"column":4},"end":{"line":9,"column":5}},"4":{"start":{"line":6,"column":6},"end":{"line":6,"column":31}},"5":{"start":{"line":8,"column":6},"end":{"line":8,"column":18}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":3,"column":25},"end":{"line":3,"column":26}},"loc":{"start":{"line":3,"column":58},"end":{"line":11,"column":1}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":16}},"loc":{"start":{"line":4,"column":67},"end":{"line":10,"column":4}}},"2":{"name":"(anonymous_9)","decl":{"start":{"line":4,"column":67},"end":{"line":4,"column":null}},"loc":{"start":{"line":4,"column":67},"end":{"line":10,"column":3}}}},"branchMap":{},"s":{"0":1,"1":38,"2":6,"3":6,"4":6,"5":1},"f":{"0":38,"1":6,"2":6},"b":{}} +,"/workspaces/sprint-mission-3/src/lib/errors/BadRequestError.ts": {"path":"/workspaces/sprint-mission-3/src/lib/errors/BadRequestError.ts","statementMap":{"0":{"start":{"line":3,"column":4},"end":{"line":3,"column":19}},"1":{"start":{"line":4,"column":4},"end":{"line":4,"column":34}},"2":{"start":{"line":6,"column":4},"end":{"line":6,"column":59}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":2},"end":{"line":2,"column":14}},"loc":{"start":{"line":2,"column":29},"end":{"line":7,"column":3}}}},"branchMap":{},"s":{"0":0,"1":0,"2":0},"f":{"0":0},"b":{}} +,"/workspaces/sprint-mission-3/src/lib/errors/NotFoundError.ts": {"path":"/workspaces/sprint-mission-3/src/lib/errors/NotFoundError.ts","statementMap":{"0":{"start":{"line":3,"column":4},"end":{"line":3,"column":50}},"1":{"start":{"line":5,"column":4},"end":{"line":5,"column":32}},"2":{"start":{"line":7,"column":4},"end":{"line":7,"column":57}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":2},"end":{"line":2,"column":14}},"loc":{"start":{"line":2,"column":52},"end":{"line":8,"column":3}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{"0":1},"b":{}} +,"/workspaces/sprint-mission-3/src/middlewares/authMiddleware.ts": {"path":"/workspaces/sprint-mission-3/src/middlewares/authMiddleware.ts","statementMap":{"0":{"start":{"line":5,"column":15},"end":{"line":5,"column":33}},"1":{"start":{"line":13,"column":28},"end":{"line":38,"column":2}},"2":{"start":{"line":13,"column":86},"end":{"line":38,"column":2}},"3":{"start":{"line":14,"column":2},"end":{"line":37,"column":3}},"4":{"start":{"line":15,"column":23},"end":{"line":15,"column":48}},"5":{"start":{"line":17,"column":4},"end":{"line":19,"column":5}},"6":{"start":{"line":18,"column":6},"end":{"line":18,"column":67}},"7":{"start":{"line":21,"column":18},"end":{"line":21,"column":42}},"8":{"start":{"line":23,"column":20},"end":{"line":23,"column":98}},"9":{"start":{"line":25,"column":17},"end":{"line":27,"column":6}},"10":{"start":{"line":29,"column":4},"end":{"line":31,"column":5}},"11":{"start":{"line":30,"column":6},"end":{"line":30,"column":66}},"12":{"start":{"line":33,"column":4},"end":{"line":33,"column":20}},"13":{"start":{"line":34,"column":4},"end":{"line":34,"column":11}},"14":{"start":{"line":36,"column":4},"end":{"line":36,"column":73}}},"fnMap":{"0":{"name":"(anonymous_7)","decl":{"start":{"line":13,"column":28},"end":{"line":13,"column":35}},"loc":{"start":{"line":13,"column":86},"end":{"line":38,"column":2}}},"1":{"name":"(anonymous_8)","decl":{"start":{"line":13,"column":86},"end":{"line":13,"column":null}},"loc":{"start":{"line":13,"column":86},"end":{"line":38,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":4},"end":{"line":19,"column":5}},"type":"if","locations":[{"start":{"line":17,"column":4},"end":{"line":19,"column":5}},{"start":{},"end":{}}]},"1":{"loc":{"start":{"line":17,"column":8},"end":{"line":17,"column":56}},"type":"binary-expr","locations":[{"start":{"line":17,"column":8},"end":{"line":17,"column":19}},{"start":{"line":17,"column":23},"end":{"line":17,"column":56}}]},"2":{"loc":{"start":{"line":23,"column":38},"end":{"line":23,"column":72}},"type":"binary-expr","locations":[{"start":{"line":23,"column":38},"end":{"line":23,"column":60}},{"start":{"line":23,"column":64},"end":{"line":23,"column":72}}]},"3":{"loc":{"start":{"line":29,"column":4},"end":{"line":31,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":31,"column":5}},{"start":{},"end":{}}]}},"s":{"0":1,"1":1,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]}} +,"/workspaces/sprint-mission-3/src/routers/articlesRouter.ts": {"path":"/workspaces/sprint-mission-3/src/routers/articlesRouter.ts","statementMap":{"0":{"start":{"line":15,"column":31},"end":{"line":15,"column":47}},"1":{"start":{"line":17,"column":0},"end":{"line":17,"column":51}},"2":{"start":{"line":18,"column":0},"end":{"line":18,"column":50}},"3":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"4":{"start":{"line":22,"column":0},"end":{"line":22,"column":51}},"5":{"start":{"line":23,"column":0},"end":{"line":23,"column":55}},"6":{"start":{"line":24,"column":0},"end":{"line":24,"column":56}},"7":{"start":{"line":25,"column":0},"end":{"line":25,"column":63}},"8":{"start":{"line":26,"column":0},"end":{"line":26,"column":63}},"9":{"start":{"line":27,"column":0},"end":{"line":27,"column":63}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{}} +,"/workspaces/sprint-mission-3/src/routers/commentsRouter.ts": {"path":"/workspaces/sprint-mission-3/src/routers/commentsRouter.ts","statementMap":{"0":{"start":{"line":6,"column":31},"end":{"line":6,"column":47}},"1":{"start":{"line":8,"column":0},"end":{"line":8,"column":33}},"2":{"start":{"line":9,"column":0},"end":{"line":9,"column":55}},"3":{"start":{"line":10,"column":0},"end":{"line":10,"column":56}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{},"b":{}} +,"/workspaces/sprint-mission-3/src/routers/imagesRouter.ts": {"path":"/workspaces/sprint-mission-3/src/routers/imagesRouter.ts","statementMap":{"0":{"start":{"line":5,"column":29},"end":{"line":5,"column":45}},"1":{"start":{"line":8,"column":0},"end":{"line":12,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{}} +,"/workspaces/sprint-mission-3/src/routers/productsRouter.ts": {"path":"/workspaces/sprint-mission-3/src/routers/productsRouter.ts","statementMap":{"0":{"start":{"line":14,"column":31},"end":{"line":14,"column":47}},"1":{"start":{"line":16,"column":0},"end":{"line":16,"column":51}},"2":{"start":{"line":17,"column":0},"end":{"line":17,"column":50}},"3":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}},"4":{"start":{"line":23,"column":0},"end":{"line":23,"column":51}},"5":{"start":{"line":24,"column":0},"end":{"line":24,"column":55}},"6":{"start":{"line":25,"column":0},"end":{"line":25,"column":56}},"7":{"start":{"line":28,"column":0},"end":{"line":28,"column":63}},"8":{"start":{"line":29,"column":0},"end":{"line":29,"column":63}},"9":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1},"f":{},"b":{}} +,"/workspaces/sprint-mission-3/src/socket/socket.ts": {"path":"/workspaces/sprint-mission-3/src/socket/socket.ts","statementMap":{"0":{"start":{"line":4,"column":27},"end":{"line":26,"column":1}},"1":{"start":{"line":5,"column":13},"end":{"line":10,"column":4}},"2":{"start":{"line":12,"column":2},"end":{"line":23,"column":5}},"3":{"start":{"line":13,"column":4},"end":{"line":13,"column":38}},"4":{"start":{"line":15,"column":4},"end":{"line":18,"column":7}},"5":{"start":{"line":16,"column":6},"end":{"line":16,"column":36}},"6":{"start":{"line":17,"column":6},"end":{"line":17,"column":65}},"7":{"start":{"line":20,"column":4},"end":{"line":22,"column":7}},"8":{"start":{"line":21,"column":6},"end":{"line":21,"column":30}},"9":{"start":{"line":25,"column":2},"end":{"line":25,"column":12}},"10":{"start":{"line":28,"column":32},"end":{"line":32,"column":1}},"11":{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},"12":{"start":{"line":30,"column":4},"end":{"line":30,"column":71}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":28}},"loc":{"start":{"line":4,"column":58},"end":{"line":26,"column":1}}},"1":{"name":"(anonymous_1)","decl":{"start":{"line":12,"column":22},"end":{"line":12,"column":23}},"loc":{"start":{"line":12,"column":41},"end":{"line":23,"column":3}}},"2":{"name":"(anonymous_2)","decl":{"start":{"line":15,"column":22},"end":{"line":15,"column":23}},"loc":{"start":{"line":15,"column":50},"end":{"line":18,"column":5}}},"3":{"name":"(anonymous_3)","decl":{"start":{"line":20,"column":28},"end":{"line":20,"column":31}},"loc":{"start":{"line":20,"column":33},"end":{"line":22,"column":5}}},"4":{"name":"(anonymous_4)","decl":{"start":{"line":28,"column":32},"end":{"line":28,"column":33}},"loc":{"start":{"line":28,"column":113},"end":{"line":32,"column":1}}}},"branchMap":{"0":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},{"start":{},"end":{}}]}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":1,"11":0,"12":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0]}} +,"/workspaces/sprint-mission-3/src/structs/articlesStructs.ts": {"path":"/workspaces/sprint-mission-3/src/structs/articlesStructs.ts","statementMap":{"0":{"start":{"line":4,"column":42},"end":{"line":4,"column":58}},"1":{"start":{"line":6,"column":39},"end":{"line":10,"column":2}},"2":{"start":{"line":7,"column":57},"end":{"line":7,"column":69}},"3":{"start":{"line":12,"column":39},"end":{"line":12,"column":71}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":46},"end":{"line":7,"column":47}},"loc":{"start":{"line":7,"column":57},"end":{"line":7,"column":69}}}},"branchMap":{},"s":{"0":1,"1":1,"2":0,"3":1},"f":{"0":0},"b":{}} +,"/workspaces/sprint-mission-3/src/structs/commentsStruct.ts": {"path":"/workspaces/sprint-mission-3/src/structs/commentsStruct.ts","statementMap":{"0":{"start":{"line":4,"column":39},"end":{"line":6,"column":2}},"1":{"start":{"line":8,"column":42},"end":{"line":8,"column":60}},"2":{"start":{"line":9,"column":39},"end":{"line":9,"column":71}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{}} +,"/workspaces/sprint-mission-3/src/structs/commonStructs.ts": {"path":"/workspaces/sprint-mission-3/src/structs/commonStructs.ts","statementMap":{"0":{"start":{"line":3,"column":22},"end":{"line":3,"column":81}},"1":{"start":{"line":3,"column":61},"end":{"line":3,"column":80}},"2":{"start":{"line":5,"column":30},"end":{"line":7,"column":2}},"3":{"start":{"line":9,"column":32},"end":{"line":14,"column":2}},"4":{"start":{"line":16,"column":34},"end":{"line":21,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":50},"end":{"line":3,"column":51}},"loc":{"start":{"line":3,"column":61},"end":{"line":3,"column":80}}}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1},"f":{"0":1},"b":{}} +,"/workspaces/sprint-mission-3/src/structs/productsStruct.ts": {"path":"/workspaces/sprint-mission-3/src/structs/productsStruct.ts","statementMap":{"0":{"start":{"line":4,"column":39},"end":{"line":10,"column":2}},"1":{"start":{"line":5,"column":56},"end":{"line":5,"column":68}},"2":{"start":{"line":12,"column":42},"end":{"line":12,"column":58}},"3":{"start":{"line":14,"column":39},"end":{"line":14,"column":71}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":45},"end":{"line":5,"column":46}},"loc":{"start":{"line":5,"column":56},"end":{"line":5,"column":68}}}},"branchMap":{},"s":{"0":1,"1":0,"2":1,"3":1},"f":{"0":0},"b":{}} +} diff --git a/coverage/favicon.png b/coverage/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 84.57% + Statements + 499/590 +
+ + +
+ 71.24% + Branches + 109/153 +
+ + +
+ 76.28% + Functions + 74/97 +
+ + +
+ 84.21% + Lines + 448/532 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
100%22/22100%0/0100%0/0100%22/22
src/controllers +
+
85.71%318/37173.28%96/13185.33%64/7585.18%276/324
src/lib +
+
50%19/3850%6/1237.5%3/850%17/34
src/lib/errors +
+
62.5%5/8100%0/050%1/262.5%5/8
src/middlewares +
+
84.37%27/3287.5%7/875%3/482.14%23/28
src/routers +
+
100%74/74100%0/0100%0/0100%74/74
src/socket +
+
31.25%5/160%0/20%0/521.42%3/14
src/structs +
+
100%29/29100%0/0100%3/3100%28/28
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/base.css b/coverage/lcov-report/base.css new file mode 100644 index 00000000..f418035b --- /dev/null +++ b/coverage/lcov-report/base.css @@ -0,0 +1,224 @@ +body, html { + margin:0; padding: 0; + height: 100%; +} +body { + font-family: Helvetica Neue, Helvetica, Arial; + font-size: 14px; + color:#333; +} +.small { font-size: 12px; } +*, *:after, *:before { + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + } +h1 { font-size: 20px; margin: 0;} +h2 { font-size: 14px; } +pre { + font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; + margin: 0; + padding: 0; + -moz-tab-size: 2; + -o-tab-size: 2; + tab-size: 2; +} +a { color:#0074D9; text-decoration:none; } +a:hover { text-decoration:underline; } +.strong { font-weight: bold; } +.space-top1 { padding: 10px 0 0 0; } +.pad2y { padding: 20px 0; } +.pad1y { padding: 10px 0; } +.pad2x { padding: 0 20px; } +.pad2 { padding: 20px; } +.pad1 { padding: 10px; } +.space-left2 { padding-left:55px; } +.space-right2 { padding-right:20px; } +.center { text-align:center; } +.clearfix { display:block; } +.clearfix:after { + content:''; + display:block; + height:0; + clear:both; + visibility:hidden; + } +.fl { float: left; } +@media only screen and (max-width:640px) { + .col3 { width:100%; max-width:100%; } + .hide-mobile { display:none!important; } +} + +.quiet { + color: #7f7f7f; + color: rgba(0,0,0,0.5); +} +.quiet a { opacity: 0.7; } + +.fraction { + font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; + font-size: 10px; + color: #555; + background: #E8E8E8; + padding: 4px 5px; + border-radius: 3px; + vertical-align: middle; +} + +div.path a:link, div.path a:visited { color: #333; } +table.coverage { + border-collapse: collapse; + margin: 10px 0 0 0; + padding: 0; +} + +table.coverage td { + margin: 0; + padding: 0; + vertical-align: top; +} +table.coverage td.line-count { + text-align: right; + padding: 0 5px 0 20px; +} +table.coverage td.line-coverage { + text-align: right; + padding-right: 10px; + min-width:20px; +} + +table.coverage td span.cline-any { + display: inline-block; + padding: 0 5px; + width: 100%; +} +.missing-if-branch { + display: inline-block; + margin-right: 5px; + border-radius: 3px; + position: relative; + padding: 0 4px; + background: #333; + color: yellow; +} + +.skip-if-branch { + display: none; + margin-right: 10px; + position: relative; + padding: 0 4px; + background: #ccc; + color: white; +} +.missing-if-branch .typ, .skip-if-branch .typ { + color: inherit !important; +} +.coverage-summary { + border-collapse: collapse; + width: 100%; +} +.coverage-summary tr { border-bottom: 1px solid #bbb; } +.keyline-all { border: 1px solid #ddd; } +.coverage-summary td, .coverage-summary th { padding: 10px; } +.coverage-summary tbody { border: 1px solid #bbb; } +.coverage-summary td { border-right: 1px solid #bbb; } +.coverage-summary td:last-child { border-right: none; } +.coverage-summary th { + text-align: left; + font-weight: normal; + white-space: nowrap; +} +.coverage-summary th.file { border-right: none !important; } +.coverage-summary th.pct { } +.coverage-summary th.pic, +.coverage-summary th.abs, +.coverage-summary td.pct, +.coverage-summary td.abs { text-align: right; } +.coverage-summary td.file { white-space: nowrap; } +.coverage-summary td.pic { min-width: 120px !important; } +.coverage-summary tfoot td { } + +.coverage-summary .sorter { + height: 10px; + width: 7px; + display: inline-block; + margin-left: 0.5em; + background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; +} +.coverage-summary .sorted .sorter { + background-position: 0 -20px; +} +.coverage-summary .sorted-desc .sorter { + background-position: 0 -10px; +} +.status-line { height: 10px; } +/* yellow */ +.cbranch-no { background: yellow !important; color: #111; } +/* dark red */ +.red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } +.low .chart { border:1px solid #C21F39 } +.highlighted, +.highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ + background: #C21F39 !important; +} +/* medium red */ +.cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } +/* light red */ +.low, .cline-no { background:#FCE1E5 } +/* light green */ +.high, .cline-yes { background:rgb(230,245,208) } +/* medium green */ +.cstat-yes { background:rgb(161,215,106) } +/* dark green */ +.status-line.high, .high .cover-fill { background:rgb(77,146,33) } +.high .chart { border:1px solid rgb(77,146,33) } +/* dark yellow (gold) */ +.status-line.medium, .medium .cover-fill { background: #f9cd0b; } +.medium .chart { border:1px solid #f9cd0b; } +/* light yellow */ +.medium { background: #fff4c2; } + +.cstat-skip { background: #ddd; color: #111; } +.fstat-skip { background: #ddd; color: #111 !important; } +.cbranch-skip { background: #ddd !important; color: #111; } + +span.cline-neutral { background: #eaeaea; } + +.coverage-summary td.empty { + opacity: .5; + padding-top: 4px; + padding-bottom: 4px; + line-height: 1; + color: #888; +} + +.cover-fill, .cover-empty { + display:inline-block; + height: 12px; +} +.chart { + line-height: 0; +} +.cover-empty { + background: white; +} +.cover-full { + border-right: none !important; +} +pre.prettyprint { + border: none !important; + padding: 0 !important; + margin: 0 !important; +} +.com { color: #999 !important; } +.ignore-none { color: #999; font-weight: normal; } + +.wrapper { + min-height: 100%; + height: auto !important; + height: 100%; + margin: 0 auto -48px; +} +.footer, .push { + height: 48px; +} diff --git a/coverage/lcov-report/block-navigation.js b/coverage/lcov-report/block-navigation.js new file mode 100644 index 00000000..530d1ed2 --- /dev/null +++ b/coverage/lcov-report/block-navigation.js @@ -0,0 +1,87 @@ +/* eslint-disable */ +var jumpToCode = (function init() { + // Classes of code we would like to highlight in the file view + var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; + + // Elements to highlight in the file listing view + var fileListingElements = ['td.pct.low']; + + // We don't want to select elements that are direct descendants of another match + var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` + + // Selector that finds elements on the page to which we can jump + var selector = + fileListingElements.join(', ') + + ', ' + + notSelector + + missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` + + // The NodeList of matching elements + var missingCoverageElements = document.querySelectorAll(selector); + + var currentIndex; + + function toggleClass(index) { + missingCoverageElements + .item(currentIndex) + .classList.remove('highlighted'); + missingCoverageElements.item(index).classList.add('highlighted'); + } + + function makeCurrent(index) { + toggleClass(index); + currentIndex = index; + missingCoverageElements.item(index).scrollIntoView({ + behavior: 'smooth', + block: 'center', + inline: 'center' + }); + } + + function goToPrevious() { + var nextIndex = 0; + if (typeof currentIndex !== 'number' || currentIndex === 0) { + nextIndex = missingCoverageElements.length - 1; + } else if (missingCoverageElements.length > 1) { + nextIndex = currentIndex - 1; + } + + makeCurrent(nextIndex); + } + + function goToNext() { + var nextIndex = 0; + + if ( + typeof currentIndex === 'number' && + currentIndex < missingCoverageElements.length - 1 + ) { + nextIndex = currentIndex + 1; + } + + makeCurrent(nextIndex); + } + + return function jump(event) { + if ( + document.getElementById('fileSearch') === document.activeElement && + document.activeElement != null + ) { + // if we're currently focused on the search input, we don't want to navigate + return; + } + + switch (event.which) { + case 78: // n + case 74: // j + goToNext(); + break; + case 66: // b + case 75: // k + case 80: // p + goToPrevious(); + break; + } + }; +})(); +window.addEventListener('keydown', jumpToCode); diff --git a/coverage/lcov-report/favicon.png b/coverage/lcov-report/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..c1525b811a167671e9de1fa78aab9f5c0b61cef7 GIT binary patch literal 445 zcmV;u0Yd(XP))rP{nL}Ln%S7`m{0DjX9TLF* zFCb$4Oi7vyLOydb!7n&^ItCzb-%BoB`=x@N2jll2Nj`kauio%aw_@fe&*}LqlFT43 z8doAAe))z_%=P%v^@JHp3Hjhj^6*Kr_h|g_Gr?ZAa&y>wxHE99Gk>A)2MplWz2xdG zy8VD2J|Uf#EAw*bo5O*PO_}X2Tob{%bUoO2G~T`@%S6qPyc}VkhV}UifBuRk>%5v( z)x7B{I~z*k<7dv#5tC+m{km(D087J4O%+<<;K|qwefb6@GSX45wCK}Sn*> + + + + Code coverage report for All files + + + + + + + + + +
+
+

All files

+
+ +
+ 84.57% + Statements + 499/590 +
+ + +
+ 71.24% + Branches + 109/153 +
+ + +
+ 76.28% + Functions + 74/97 +
+ + +
+ 84.21% + Lines + 448/532 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
src +
+
100%22/22100%0/0100%0/0100%22/22
src/controllers +
+
85.71%318/37173.28%96/13185.33%64/7585.18%276/324
src/lib +
+
50%19/3850%6/1237.5%3/850%17/34
src/lib/errors +
+
62.5%5/8100%0/050%1/262.5%5/8
src/middlewares +
+
84.37%27/3287.5%7/875%3/482.14%23/28
src/routers +
+
100%74/74100%0/0100%0/0100%74/74
src/socket +
+
31.25%5/160%0/20%0/521.42%3/14
src/structs +
+
100%29/29100%0/0100%3/3100%28/28
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/prettify.css b/coverage/lcov-report/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/coverage/lcov-report/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/lcov-report/prettify.js b/coverage/lcov-report/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/coverage/lcov-report/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/lcov-report/sort-arrow-sprite.png b/coverage/lcov-report/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/lcov-report/sorter.js b/coverage/lcov-report/sorter.js new file mode 100644 index 00000000..4ed70ae5 --- /dev/null +++ b/coverage/lcov-report/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/lcov-report/src/controllers/articlesController.ts.html b/coverage/lcov-report/src/controllers/articlesController.ts.html new file mode 100644 index 00000000..3cab3f5f --- /dev/null +++ b/coverage/lcov-report/src/controllers/articlesController.ts.html @@ -0,0 +1,475 @@ + + + + + + Code coverage report for src/controllers/articlesController.ts + + + + + + + + + +
+
+

All files / src/controllers articlesController.ts

+
+ +
+ 94.11% + Statements + 64/68 +
+ + +
+ 72.72% + Branches + 16/22 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 96.42% + Lines + 54/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +1312x +2x +2x +2x +2x +2x +  +  +  +  +2x +  +  +3x +3x +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +3x +3x +  +2x +2x +  +1x +  +  +  +2x +2x +2x +  +2x +  +2x +1x +  +  +  +1x +  +  +  +  +1x +  +  +2x +2x +  +2x +  +2x +1x +  +  +  +1x +  +1x +  +  +4x +4x +  +4x +  +  +  +4x +4x +  +  +  +  +  +  +4x +  +  +  +2x +2x +2x +  +1x +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +2x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +1x +1x +1x +  +1x + 
import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient'; 
+import { withAsync } from '../lib/withAsync';
+import NotFoundError from '../lib/errors/NotFoundError';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateArticleBodyStruct,
+  UpdateArticleBodyStruct,
+  GetArticleListParamsStruct,
+} from '../structs/articlesStructs';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import type { Request, Response } from 'express';
+ 
+export const createArticle = withAsync(async (req: Request, res: Response) => {
+  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
+ 
+  const article = await prisma.article.create({ 
+    data: {
+      title,
+      content,
+      image,
+      userId: req.user.id 
+    } 
+  });
+ 
+  res.status(201).send(article);
+});
+ 
+ 
+export const getArticle = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const article = await prisma.article.findUnique({ where: { id } });
+  if (!article) throw new NotFoundError('article', id.toString());
+ 
+  res.send(article);
+});
+ 
+ 
+export const updateArticle = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+  const { title, content, image } = create(req.body, UpdateArticleBodyStruct);
+ 
+  const existingArticle = await prisma.article.findUnique({ where: { id } });
+  
+  if (!existingArticle) throw new NotFoundError('article', id.toString());
+  Iif (existingArticle.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 게시글을 수정할 권한이 없습니다.' });
+  }
+ 
+  const updatedArticle = await prisma.article.update({
+    where: { id },
+    data: { title, content, image },
+  });
+ 
+  res.send(updatedArticle);
+});
+ 
+export const deleteArticle = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const existingArticle = await prisma.article.findUnique({ where: { id } });
+  
+  if (!existingArticle) throw new NotFoundError('article', id.toString());
+  Iif (existingArticle.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 게시글을 삭제할 권한이 없습니다.' });
+  }
+ 
+  await prisma.article.delete({ where: { id } });
+ 
+  res.status(204).send();
+});
+ 
+export const getArticleList = withAsync(async (req: Request, res: Response) => {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
+ 
+  const where = {
+    title: keyword ? { contains: keyword } : undefined,
+  };
+ 
+  const totalCount = await prisma.article.count({ where });
+  const articles = await prisma.article.findMany({
+    skip: (page - 1) * pageSize,
+    take: pageSize,
+    orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { id: 'asc' },
+    where,
+  });
+ 
+  res.send({ list: articles, totalCount });
+});
+ 
+ 
+export const createComment = withAsync(async (req: Request, res: Response) => {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+ 
+  const existingArticle = await prisma.article.findUnique({ where: { id: articleId } });
+  Iif (!existingArticle) throw new NotFoundError('article', articleId.toString());
+ 
+  const comment = await prisma.comment.create({
+    data: {
+      articleId,
+      content,
+      userId: req.user.id, 
+    },
+  });
+ 
+  res.status(201).send(comment);
+});
+ 
+ 
+export const getCommentList = withAsync(async (req: Request, res: Response) => {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+ 
+  const article = await prisma.article.findUnique({ where: { id: articleId } });
+  Iif (!article) throw new NotFoundError('article', articleId.toString());
+ 
+  const commentsWithCursor = await prisma.comment.findMany({
+    cursor: cursor ? { id: cursor } : undefined,
+    take: limit + 1,
+    where: { articleId },
+    orderBy: { createdAt: 'desc' },
+  });
+ 
+  const hasNextPage = commentsWithCursor.length > limit;
+  const comments = commentsWithCursor.slice(0, limit);
+  const nextCursor = hasNextPage ? commentsWithCursor[limit].id : null;
+ 
+  res.send({ list: comments, nextCursor });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/authController.ts.html b/coverage/lcov-report/src/controllers/authController.ts.html new file mode 100644 index 00000000..a04e8703 --- /dev/null +++ b/coverage/lcov-report/src/controllers/authController.ts.html @@ -0,0 +1,370 @@ + + + + + + Code coverage report for src/controllers/authController.ts + + + + + + + + + +
+
+

All files / src/controllers authController.ts

+
+ +
+ 97.95% + Statements + 48/49 +
+ + +
+ 77.77% + Branches + 14/18 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 97.72% + Lines + 43/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +963x +3x +3x +  +3x +  +3x +  +  +3x +2x +2x +  +2x +2x +  +2x +  +  +  +3x +2x +  +2x +2x +1x +  +  +1x +1x +  +  +  +1x +1x +  +  +  +3x +3x +  +3x +3x +1x +  +  +2x +2x +1x +  +  +1x +  +1x +  +  +  +  +1x +1x +  +  +  +  +  +  +  +3x +3x +  +3x +1x +  +  +2x +  +2x +  +1x +  +1x +  +  +  +1x +  +1x +  +  +  +  +1x +  +  +  + 
import { PrismaClient, User } from '@prisma/client';
+import bcrypt from 'bcrypt';
+import jwt from 'jsonwebtoken';
+import type { Request, Response } from 'express';
+import { withAsync } from '../lib/withAsync';
+ 
+const prisma = new PrismaClient();
+ 
+ 
+const generateTokens = (user: User) => {
+  const accessSecret = process.env.JWT_SECRET || 'access_secret';
+  const refreshSecret = process.env.REFRESH_SECRET || 'refresh_secret';
+ 
+  const accessToken = jwt.sign({ id: user.id }, accessSecret, { expiresIn: '15m' });
+  const refreshToken = jwt.sign({ id: user.id }, refreshSecret, { expiresIn: '7d' });
+  
+  return { accessToken, refreshToken };
+};
+ 
+ 
+export const signUp = withAsync(async (req: Request, res: Response) => {
+  const { email, nickname, password } = req.body;
+ 
+  const existingUser = await prisma.user.findUnique({ where: { email } });
+  if (existingUser) {
+    return res.status(400).json({ message: '이미 사용 중인 이메일입니다.' });
+  }
+ 
+  const hashedPassword = await bcrypt.hash(password, 10);
+  const user = await prisma.user.create({
+    data: { email, nickname, password: hashedPassword },
+  });
+ 
+  const { password: _, refreshToken: __, ...userWithoutPassword } = user;
+  res.status(201).json(userWithoutPassword);
+});
+ 
+ 
+export const signIn = withAsync(async (req: Request, res: Response) => {
+  const { email, password } = req.body;
+ 
+  const user = await prisma.user.findUnique({ where: { email } });
+  if (!user) {
+    return res.status(401).json({ message: '이메일 또는 비밀번호가 일치하지 않습니다.' });
+  }
+ 
+  const isPasswordValid = await bcrypt.compare(password, user.password);
+  if (!isPasswordValid) {
+    return res.status(401).json({ message: '이메일 또는 비밀번호가 일치하지 않습니다.' });
+  }
+ 
+  const { accessToken, refreshToken } = generateTokens(user);
+  
+  await prisma.user.update({
+    where: { id: user.id },
+    data: { refreshToken },
+  });
+ 
+  const { password: _, refreshToken: __, ...userWithoutPassword } = user;
+  res.status(200).json({
+    accessToken,
+    refreshToken, 
+    user: userWithoutPassword,
+  });
+});
+ 
+ 
+export const refresh = withAsync(async (req: Request, res: Response) => {
+  const { refreshToken } = req.body;
+ 
+  if (!refreshToken) {
+    return res.status(401).json({ message: '리프레시 토큰이 없습니다.' });
+  }
+ 
+  const refreshSecret = process.env.REFRESH_SECRET || 'refresh_secret';
+ 
+  const decoded = jwt.verify(refreshToken, refreshSecret) as { id: number };
+  
+  const user = await prisma.user.findUnique({ where: { id: decoded.id } });
+  
+  Iif (!user || user.refreshToken !== refreshToken) {
+    return res.status(403).json({ message: '유효하지 않은 리프레시 토큰입니다.' });
+  }
+ 
+  const tokens = generateTokens(user);
+  
+  await prisma.user.update({
+    where: { id: user.id },
+    data: { refreshToken: tokens.refreshToken },
+  });
+ 
+  res.json({
+    accessToken: tokens.accessToken,
+    refreshToken: tokens.refreshToken,
+  });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/commentsController.ts.html b/coverage/lcov-report/src/controllers/commentsController.ts.html new file mode 100644 index 00000000..1ce112c9 --- /dev/null +++ b/coverage/lcov-report/src/controllers/commentsController.ts.html @@ -0,0 +1,397 @@ + + + + + + Code coverage report for src/controllers/commentsController.ts + + + + + + + + + +
+
+

All files / src/controllers commentsController.ts

+
+ +
+ 56% + Statements + 28/50 +
+ + +
+ 35% + Branches + 7/20 +
+ + +
+ 50% + Functions + 4/8 +
+ + +
+ 56.52% + Lines + 26/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +1052x +2x +2x +2x +2x +2x +  +  +  +2x +2x +2x +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +2x +1x +1x +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient'; // 통일된 이름 사용
+import { withAsync } from '../lib/withAsync';
+import { UpdateCommentBodyStruct, CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import NotFoundError from '../lib/errors/NotFoundError';
+import { IdParamsStruct } from '../structs/commonStructs';
+import type { Request, Response } from 'express';
+ 
+ 
+export const createComment = withAsync(async (req: Request, res: Response) => {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id: productId } });
+  Iif (!existingProduct) {
+    throw new NotFoundError('product', productId.toString());
+  }
+ 
+  const comment = await prisma.comment.create({ 
+    data: { 
+      productId, 
+      content,
+      userId: req.user.id 
+    } 
+  });
+ 
+  Iif (existingProduct.userId && existingProduct.userId !== req.user.id) {
+    await prisma.notification.create({
+      data: {
+        type: 'COMMENT',
+        userId: existingProduct.userId,
+        message: `[${existingProduct.name}] 상품에 새로운 댓글이 달렸습니다: ${content.substring(0, 15)}...`,
+        productId: productId,
+      },
+    });
+  }
+ 
+  res.status(201).send(comment);
+});
+ 
+ 
+export const getCommentList = withAsync(async (req: Request, res: Response) => {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id: productId } });
+  Iif (!existingProduct) {
+    throw new NotFoundError('product', productId.toString());
+  }
+ 
+  const commentsWithCursor = await prisma.comment.findMany({
+    cursor: cursor ? { id: cursor } : undefined,
+    take: limit + 1,
+    where: { productId },
+    orderBy: { createdAt: 'desc' }, 
+  });
+ 
+  const hasNextPage = commentsWithCursor.length > limit;
+  const comments = commentsWithCursor.slice(0, limit);
+  const nextCursor = hasNextPage ? commentsWithCursor[limit].id : null;
+ 
+  res.send({
+    list: comments,
+    nextCursor,
+  });
+});
+ 
+export const updateComment = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, UpdateCommentBodyStruct);
+ 
+  const existingComment = await prisma.comment.findUnique({ where: { id } });
+  if (!existingComment) {
+    throw new NotFoundError('comment', id.toString());
+  }
+ 
+  if (existingComment.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 댓글을 수정할 권한이 없습니다.' });
+  }
+ 
+  const updatedComment = await prisma.comment.update({
+    where: { id },
+    data: { content },
+  });
+ 
+  res.send(updatedComment);
+});
+ 
+ 
+export const deleteComment = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const existingComment = await prisma.comment.findUnique({ where: { id } });
+  if (!existingComment) {
+    throw new NotFoundError('comment', id.toString());
+  }
+ 
+  if (existingComment.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 댓글을 삭제할 권한이 없습니다.' });
+  }
+ 
+  await prisma.comment.delete({ where: { id } });
+ 
+  res.status(204).send();
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/errorController.ts.html b/coverage/lcov-report/src/controllers/errorController.ts.html new file mode 100644 index 00000000..8f2a38be --- /dev/null +++ b/coverage/lcov-report/src/controllers/errorController.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/controllers/errorController.ts + + + + + + + + + +
+
+

All files / src/controllers errorController.ts

+
+ +
+ 58.82% + Statements + 10/17 +
+ + +
+ 53.84% + Branches + 7/13 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 58.82% + Lines + 10/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +303x +  +3x +3x +  +3x +  +  +  +3x +15x +9x +  +  +6x +  +  +  +6x +6x +  +  +  +  +  +  +  +  +  + 
import { StructError } from 'superstruct';
+import type { Request, Response, NextFunction } from 'express'; // ✅ Express 타입 임포트
+import BadRequestError from '../lib/errors/BadRequestError';
+import NotFoundError from '../lib/errors/NotFoundError';
+ 
+export function defaultNotFoundHandler(req: Request, res: Response, _next: NextFunction) {
+  return res.status(404).send({ message: 'Not found' });
+}
+ 
+export function globalErrorHandler(err: any, req: Request, res: Response, _next: NextFunction) {
+  if (err instanceof StructError || err instanceof BadRequestError) {
+    return res.status(400).send({ message: err.message });
+  }
+ 
+  Iif (err instanceof SyntaxError && (err as any).status === 400 && 'body' in err) {
+    return res.status(400).send({ message: 'Invalid JSON' });
+  }
+ 
+  Eif (err instanceof NotFoundError) {
+    return res.status(404).send({ message: err.message });
+  }
+ 
+  if (err.code) {
+    console.error('DB/Code Error:', err);
+    return res.status(500).send({ message: 'Failed to process data' });
+  }
+ 
+  console.error('Unexpected Error:', err);
+  return res.status(500).send({ message: 'Internal server error' });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/imagesController.ts.html b/coverage/lcov-report/src/controllers/imagesController.ts.html new file mode 100644 index 00000000..e61663f2 --- /dev/null +++ b/coverage/lcov-report/src/controllers/imagesController.ts.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/controllers/imagesController.ts + + + + + + + + + +
+
+

All files / src/controllers imagesController.ts

+
+ +
+ 33.33% + Statements + 7/21 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 33.33% + Lines + 7/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +492x +2x +2x +2x +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  + 
import multer, { FileFilterCallback } from 'multer';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+import { PUBLIC_PATH, STATIC_PATH } from '../lib/constants';
+import BadRequestError from '../lib/errors/BadRequestError';
+import type { Request, Response } from 'express';
+ 
+type DestinationCallback = (error: Error | null, destination: string) => void;
+type FileNameCallback = (error: Error | null, filename: string) => void;
+ 
+ 
+export const upload = multer({
+  storage: multer.diskStorage({
+    destination(req: Request, file: Express.Multer.File, cb: DestinationCallback) {
+      cb(null, PUBLIC_PATH);
+    },
+    filename(req: Request, file: Express.Multer.File, cb: FileNameCallback) {
+      const ext = path.extname(file.originalname);
+      const filename = `${uuidv4()}${ext}`;
+      cb(null, filename);
+    },
+  }),
+ 
+  limits: {
+    fileSize: 5 * 1024 * 1024, // 5MB 제한
+  },
+ 
+  fileFilter: (req: Request, file: Express.Multer.File, cb: FileFilterCallback) => {
+    const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
+    
+    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
+      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
+      return cb(err as any, false); 
+    }
+    cb(null, true);
+  },
+});
+ 
+ 
+export async function uploadImage(req: Request, res: Response) {
+  if (!req.file) {
+    throw new BadRequestError('파일이 업로드되지 않았습니다.');
+  }
+ 
+  const host = req.get('host');
+  const url = `http://${host}/${STATIC_PATH}/${req.file.filename}`;
+  
+  return res.send({ url });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/index.html b/coverage/lcov-report/src/controllers/index.html new file mode 100644 index 00000000..96aaf9db --- /dev/null +++ b/coverage/lcov-report/src/controllers/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/controllers + + + + + + + + + +
+
+

All files src/controllers

+
+ +
+ 85.71% + Statements + 318/371 +
+ + +
+ 73.28% + Branches + 96/131 +
+ + +
+ 85.33% + Functions + 64/75 +
+ + +
+ 85.18% + Lines + 276/324 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesController.ts +
+
94.11%64/6872.72%16/22100%14/1496.42%54/56
authController.ts +
+
97.95%48/4977.77%14/18100%7/797.72%43/44
commentsController.ts +
+
56%28/5035%7/2050%4/856.52%26/46
errorController.ts +
+
58.82%10/1753.84%7/1350%1/258.82%10/17
imagesController.ts +
+
33.33%7/210%0/40%0/433.33%7/21
likeController.ts +
+
100%35/3583.33%10/12100%6/6100%32/32
productsController.ts +
+
100%57/57100%20/20100%12/12100%49/49
userController.ts +
+
93.24%69/74100%22/2290.9%20/2293.22%55/59
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/likeController.ts.html b/coverage/lcov-report/src/controllers/likeController.ts.html new file mode 100644 index 00000000..797ccb32 --- /dev/null +++ b/coverage/lcov-report/src/controllers/likeController.ts.html @@ -0,0 +1,376 @@ + + + + + + Code coverage report for src/controllers/likeController.ts + + + + + + + + + +
+
+

All files / src/controllers likeController.ts

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 83.33% + Branches + 10/12 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 32/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +983x +  +3x +  +3x +  +  +3x +3x +3x +  +3x +  +  +  +  +  +  +  +  +2x +1x +  +  +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +3x +2x +2x +  +2x +  +  +  +  +  +  +  +  +2x +1x +1x +  +1x +  +  +  +  +  +1x +  +  +  +  +4x +4x +4x +  +4x +  +  +  +  +  +  +4x +1x +  +  +3x +3x +3x +  +  +  +  +  +  +  +3x +  +  +3x + 
import { PrismaClient } from '@prisma/client';
+import type { Request, Response } from 'express';
+import { withAsync } from '../lib/withAsync';
+ 
+const prisma = new PrismaClient();
+ 
+ 
+export const toggleProductLike = withAsync(async (req: Request, res: Response) => {
+  const { id: productId } = req.params;
+  const userId = req.user.id; 
+ 
+  const existingLike = await prisma.productLike.findUnique({
+    where: {
+      userId_productId: {
+        userId: userId,
+        productId: Number(productId),
+      },
+    },
+  });
+ 
+  if (existingLike) {
+    await prisma.productLike.delete({
+      where: { id: existingLike.id },
+    });
+    res.json({ isLiked: false });
+  } else {
+    // 좋아요 생성
+    await prisma.productLike.create({
+      data: {
+        userId: userId,
+        productId: Number(productId),
+      },
+    });
+    res.json({ isLiked: true });
+  }
+});
+ 
+/**
+ * 💡 게시글 좋아요 토글
+ */
+export const toggleArticleLike = withAsync(async (req: Request, res: Response) => {
+  const { id: articleId } = req.params;
+  const userId = req.user.id;
+ 
+  const existingLike = await prisma.articleLike.findUnique({
+    where: {
+      userId_articleId: {
+        userId: userId,
+        articleId: Number(articleId),
+      },
+    },
+  });
+ 
+  if (existingLike) {
+    await prisma.articleLike.delete({ where: { id: existingLike.id } });
+    res.json({ isLiked: false });
+  } else {
+    await prisma.articleLike.create({
+      data: { 
+        userId, 
+        articleId: Number(articleId) 
+      },
+    });
+    res.json({ isLiked: true });
+  }
+});
+ 
+ 
+export const getProductDetail = withAsync(async (req: Request, res: Response) => {
+  const { id } = req.params;
+  const userId = req.user?.id; 
+ 
+  const product = await prisma.product.findUnique({
+    where: { id: Number(id) },
+    include: {
+      _count: { select: { productLikes: true } } 
+    }
+  });
+ 
+  if (!product) {
+    return res.status(404).json({ message: '상품을 찾을 수 없습니다.' });
+  }
+ 
+  let isLiked = false;
+  Eif (userId) {
+    const like = await prisma.productLike.findUnique({
+      where: { 
+        userId_productId: { 
+          userId, 
+          productId: Number(id) 
+        } 
+      }
+    });
+    isLiked = !!like;
+  }
+ 
+  res.json({ ...product, isLiked });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/productsController.ts.html b/coverage/lcov-report/src/controllers/productsController.ts.html new file mode 100644 index 00000000..876df8d0 --- /dev/null +++ b/coverage/lcov-report/src/controllers/productsController.ts.html @@ -0,0 +1,469 @@ + + + + + + Code coverage report for src/controllers/productsController.ts + + + + + + + + + +
+
+

All files / src/controllers productsController.ts

+
+ +
+ 100% + Statements + 57/57 +
+ + +
+ 100% + Branches + 20/20 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +1293x +3x +3x +3x +3x +3x +  +  +  +  +3x +  +  +  +5x +5x +  +3x +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +5x +5x +  +4x +4x +  +2x +  +  +  +6x +6x +6x +  +6x +6x +  +4x +1x +  +  +3x +  +3x +  +  +  +  +3x +2x +  +  +  +  +2x +1x +  +1x +2x +  +  +  +  +  +  +  +1x +1x +2x +  +  +  +  +  +  +  +  +  +3x +  +  +  +8x +8x +  +8x +  +  +  +  +  +8x +8x +  +  +  +  +  +  +8x +  +  +5x +5x +  +5x +5x +  +3x +1x +  +  +2x +  +2x +  + 
import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient'; 
+import { withAsync } from '../lib/withAsync';
+import NotFoundError from '../lib/errors/NotFoundError';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateProductBodyStruct,
+  GetProductListParamsStruct,
+  UpdateProductBodyStruct,
+} from '../structs/productsStruct'; 
+import { emitNotification } from '../socket/socket'; 
+import type { Request, Response } from 'express';
+ 
+ 
+export const createProduct = withAsync(async (req: Request, res: Response) => {
+  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
+ 
+  const product = await prisma.product.create({
+    data: { 
+      name, 
+      description, 
+      price, 
+      tags, 
+      images,
+      userId: req.user.id 
+    },
+  });
+ 
+  res.status(201).send(product);
+});
+ 
+ 
+export const getProduct = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const product = await prisma.product.findUnique({ where: { id } });
+  if (!product) throw new NotFoundError('product', id.toString());
+ 
+  res.send(product);
+});
+ 
+ 
+export const updateProduct = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+  const { name, description, price, tags, images } = create(req.body, UpdateProductBodyStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id } });
+  if (!existingProduct) throw new NotFoundError('product', id.toString());
+ 
+  if (existingProduct.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 상품을 수정할 권한이 없습니다.' });
+  }
+ 
+  const isPriceChanged = price !== undefined && existingProduct.price !== price;
+ 
+  const updatedProduct = await prisma.product.update({
+    where: { id },
+    data: { name, description, price, tags, images },
+  });
+ 
+  if (isPriceChanged) {
+    const likes = await prisma.productLike.findMany({
+      where: { productId: id },
+      select: { userId: true },
+    });
+ 
+    if (likes.length > 0) {
+      const message = `관심 상품 [${updatedProduct.name}]의 가격이 ${existingProduct.price}원에서 ${price}원으로 변경되었습니다!`;
+ 
+      await prisma.notification.createMany({
+        data: likes.map((like) => ({
+          type: 'PRICE_CHANGE',
+          userId: like.userId,
+          message: message,
+          productId: id,
+        })),
+      });
+ 
+      const io = req.app.get('io');
+      likes.forEach((like) => {
+        emitNotification(io, like.userId, {
+          type: 'PRICE_CHANGE',
+          message: message,
+          productId: id,
+          createdAt: new Date(),
+        });
+      });
+    }
+  }
+ 
+  res.send(updatedProduct);
+});
+ 
+ 
+export const getProductList = withAsync(async (req: Request, res: Response) => {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
+ 
+  const where = keyword
+    ? {
+        OR: [{ name: { contains: keyword } }, { description: { contains: keyword } }],
+      }
+    : undefined;
+ 
+  const totalCount = await prisma.product.count({ where });
+  const products = await prisma.product.findMany({
+    skip: (page - 1) * pageSize,
+    take: pageSize,
+    orderBy: orderBy === 'recent' ? { id: 'desc' } : { id: 'asc' },
+    where,
+  });
+ 
+  res.send({ list: products, totalCount });
+});
+ 
+export const deleteProduct = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id } });
+  if (!existingProduct) throw new NotFoundError('product', id.toString());
+ 
+  if (existingProduct.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 상품을 삭제할 권한이 없습니다.' });
+  }
+ 
+  await prisma.product.delete({ where: { id } });
+ 
+  res.status(204).send();
+});
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/controllers/userController.ts.html b/coverage/lcov-report/src/controllers/userController.ts.html new file mode 100644 index 00000000..7fc67579 --- /dev/null +++ b/coverage/lcov-report/src/controllers/userController.ts.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/controllers/userController.ts + + + + + + + + + +
+
+

All files / src/controllers userController.ts

+
+ +
+ 93.24% + Statements + 69/74 +
+ + +
+ 100% + Branches + 22/22 +
+ + +
+ 90.9% + Functions + 20/22 +
+ + +
+ 93.22% + Lines + 55/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +1671x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +2x +2x +  +2x +  +  +  +  +2x +2x +  +  +3x +3x +  +2x +2x +1x +  +  +1x +1x +  +  +  +  +1x +  +  +  +2x +2x +2x +  +2x +  +  +  +  +  +  +  +  +  +2x +  +  +  +4x +4x +4x +4x +  +4x +2x +  +  +  +  +  +  +  +  +  +  +2x +  +  +2x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +  +  +  +  +1x +  +  +  +2x +2x +  +  +  +2x +  +  +  +2x +2x +  +2x +  +  +  +  +  +  +  +2x +1x +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  + 
import bcrypt from 'bcrypt';
+import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient';
+import { withAsync } from '../lib/withAsync';
+import { UpdateUserStruct, ChangePasswordStruct } from '../structs/userStructs';
+import type { Request, Response } from 'express';
+ 
+export const getMe = withAsync(async (req: Request, res: Response) => {
+  const { password, ...userWithoutPassword } = req.user;
+  res.json(userWithoutPassword);
+});
+ 
+export const updateMe = withAsync(async (req: Request, res: Response) => {
+  const { nickname, image } = create(req.body, UpdateUserStruct);
+ 
+  const updatedUser = await prisma.user.update({
+    where: { id: req.user.id },
+    data: { nickname, image },
+  });
+ 
+  const { password, ...userWithoutPassword } = updatedUser;
+  res.json(userWithoutPassword);
+});
+ 
+export const changePassword = withAsync(async (req: Request, res: Response) => {
+  const { currentPassword, newPassword } = create(req.body, ChangePasswordStruct);
+ 
+  const isMatch = await bcrypt.compare(currentPassword, req.user.password);
+  if (!isMatch) {
+    return res.status(401).json({ message: '현재 비밀번호가 일치하지 않습니다.' });
+  }
+ 
+  const hashedNewPassword = await bcrypt.hash(newPassword, 10);
+  await prisma.user.update({
+    where: { id: req.user.id },
+    data: { password: hashedNewPassword },
+  });
+ 
+  res.status(200).json({ message: '비밀번호가 성공적으로 변경되었습니다.' });
+});
+ 
+// ── 내 상품 목록 조회 ────────────────────────────────────────────
+export const getMyProducts = withAsync(async (req: Request, res: Response) => {
+  const page = Number(req.query.page) || 1;
+  const pageSize = Number(req.query.pageSize) || 10;
+ 
+  const [products, totalCount] = await Promise.all([
+    prisma.product.findMany({
+      where: { userId: req.user.id },
+      skip: (page - 1) * pageSize,
+      take: pageSize,
+      orderBy: { createdAt: 'desc' },
+    }),
+    prisma.product.count({ where: { userId: req.user.id } }),
+  ]);
+ 
+  res.json({ list: products, totalCount });
+});
+ 
+// ── 내가 좋아요한 상품/게시글 목록 조회 ─────────────────────────
+export const getMyLikedItems = withAsync(async (req: Request, res: Response) => {
+  const page = Number(req.query.page) || 1;
+  const pageSize = Number(req.query.pageSize) || 10;
+  const type = req.query.type as string | undefined; // 'product' | 'article'
+ 
+  if (!type || type === 'product') {
+    const [likes, totalCount] = await Promise.all([
+      prisma.productLike.findMany({
+        where: { userId: req.user.id },
+        include: { product: true },
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: { id: 'desc' },
+      }),
+      prisma.productLike.count({ where: { userId: req.user.id } }),
+    ]);
+ 
+    return res.json({ list: likes.map((l) => l.product), totalCount });
+  }
+ 
+  if (type === 'article') {
+    const [likes, totalCount] = await Promise.all([
+      prisma.articleLike.findMany({
+        where: { userId: req.user.id },
+        include: { article: true },
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: { id: 'desc' },
+      }),
+      prisma.articleLike.count({ where: { userId: req.user.id } }),
+    ]);
+ 
+    return res.json({ list: likes.map((l) => l.article), totalCount });
+  }
+ 
+  res.status(400).json({ message: 'type은 product 또는 article 이어야 합니다.' });
+});
+ 
+// ── 내 알림 목록 조회 ────────────────────────────────────────────
+export const getMyNotifications = withAsync(async (req: Request, res: Response) => {
+  const page = Number(req.query.page) || 1;
+  const pageSize = Number(req.query.pageSize) || 20;
+ 
+  const [notifications, totalCount] = await Promise.all([
+    prisma.notification.findMany({
+      where: { userId: req.user.id },
+      skip: (page - 1) * pageSize,
+      take: pageSize,
+      orderBy: { createdAt: 'desc' },
+    }),
+    prisma.notification.count({ where: { userId: req.user.id } }),
+  ]);
+ 
+  res.json({ list: notifications, totalCount });
+});
+ 
+// ── 모든 알림 읽음 처리 ──────────────────────────────────────────
+export const readAllNotifications = withAsync(async (req: Request, res: Response) => {
+  await prisma.notification.updateMany({
+    where: { userId: req.user.id, isRead: false },
+    data: { isRead: true },
+  });
+ 
+  res.status(200).json({ message: '모든 알림을 읽음 처리했습니다.' });
+});
+ 
+// ── 읽지 않은 알림 개수 조회 ─────────────────────────────────────
+export const getUnreadNotificationCount = withAsync(async (req: Request, res: Response) => {
+  const count = await prisma.notification.count({
+    where: { userId: req.user.id, isRead: false },
+  });
+ 
+  res.json({ count });
+});
+ 
+// ── 단일 알림 읽음 처리 ──────────────────────────────────────────
+export const readNotification = withAsync(async (req: Request, res: Response) => {
+  const { id } = req.params;
+ 
+  const result = await prisma.notification.updateMany({
+    where: {
+      id: Number(id),
+      userId: req.user.id,
+    },
+    data: { isRead: true },
+  });
+ 
+  if (result.count === 0) {
+    return res.status(404).json({ message: '알림을 찾을 수 없거나 권한이 없습니다.' });
+  }
+ 
+  res.status(200).json({ message: '알림을 읽음 처리했습니다.' });
+});
+ 
+// ── 30일 이상 된 알림 삭제 (스케줄러용) ─────────────────────────
+export const deleteOldNotifications = withAsync(async (req: Request, res: Response) => {
+  const thirtyDaysAgo = new Date();
+  thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
+ 
+  const deleted = await prisma.notification.deleteMany({
+    where: {
+      createdAt: { lt: thirtyDaysAgo },
+    },
+  });
+ 
+  res.status(200).json({ message: `${deleted.count}개의 오래된 알림을 삭제했습니다.` });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/index.html b/coverage/lcov-report/src/index.html new file mode 100644 index 00000000..ec655844 --- /dev/null +++ b/coverage/lcov-report/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
server.ts +
+
100%22/22100%0/0100%0/0100%22/22
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/constants.ts.html b/coverage/lcov-report/src/lib/constants.ts.html new file mode 100644 index 00000000..f894809f --- /dev/null +++ b/coverage/lcov-report/src/lib/constants.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/constants.ts + + + + + + + + + +
+
+

All files / src/lib constants.ts

+
+ +
+ 87.5% + Statements + 7/8 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 87.5% + Lines + 7/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +112x +2x +  +2x +  +  +  +2x +2x +2x +2x
import dotenv from 'dotenv';
+dotenv.config();
+ 
+Iif (!process.env.DATABASE_URL) {
+  throw new Error(' DATABASE_URL is missing in .env file');
+}
+ 
+export const DATABASE_URL: string = process.env.DATABASE_URL;
+export const PORT: number = Number(process.env.PORT) || 3000;
+export const PUBLIC_PATH: string = './public';
+export const STATIC_PATH: string = '/public';
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/errors/BadRequestError.ts.html b/coverage/lcov-report/src/lib/errors/BadRequestError.ts.html new file mode 100644 index 00000000..28cbd356 --- /dev/null +++ b/coverage/lcov-report/src/lib/errors/BadRequestError.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/lib/errors/BadRequestError.ts + + + + + + + + + +
+
+

All files / src/lib/errors BadRequestError.ts

+
+ +
+ 25% + Statements + 1/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 25% + Lines + 1/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +  +  +  +  +  +  +  +  +3x
class BadRequestError extends Error {
+  constructor(message: string) {
+    super(message);
+    this.name = 'BadRequestError';
+ 
+    Object.setPrototypeOf(this, BadRequestError.prototype);
+  }
+}
+ 
+export default BadRequestError;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/errors/NotFoundError.ts.html b/coverage/lcov-report/src/lib/errors/NotFoundError.ts.html new file mode 100644 index 00000000..a4a7aeec --- /dev/null +++ b/coverage/lcov-report/src/lib/errors/NotFoundError.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/errors/NotFoundError.ts + + + + + + + + + +
+
+

All files / src/lib/errors NotFoundError.ts

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +9x +  +9x +  +9x +  +  +  +4x
class NotFoundError extends Error {
+  constructor(modelName: string, id: string | number) {
+    super(`${modelName} with id ${id} not found`);
+    
+    this.name = 'NotFoundError';
+ 
+    Object.setPrototypeOf(this, NotFoundError.prototype);
+  }
+}
+ 
+export default NotFoundError;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/errors/index.html b/coverage/lcov-report/src/lib/errors/index.html new file mode 100644 index 00000000..6cd09500 --- /dev/null +++ b/coverage/lcov-report/src/lib/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/lib/errors + + + + + + + + + +
+
+

All files src/lib/errors

+
+ +
+ 62.5% + Statements + 5/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 62.5% + Lines + 5/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
BadRequestError.ts +
+
25%1/4100%0/00%0/125%1/4
NotFoundError.ts +
+
100%4/4100%0/0100%1/1100%4/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/index.html b/coverage/lcov-report/src/lib/index.html new file mode 100644 index 00000000..4ce39a23 --- /dev/null +++ b/coverage/lcov-report/src/lib/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 50% + Statements + 19/38 +
+ + +
+ 50% + Branches + 6/12 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 50% + Lines + 17/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.ts +
+
87.5%7/850%2/4100%0/087.5%7/8
prismaClient.ts +
+
100%5/566.66%4/6100%0/0100%5/5
socket.ts +
+
0%0/180%0/20%0/50%0/16
withAsync.ts +
+
100%7/7100%0/0100%3/3100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/prismaClient.ts.html b/coverage/lcov-report/src/lib/prismaClient.ts.html new file mode 100644 index 00000000..127fcc53 --- /dev/null +++ b/coverage/lcov-report/src/lib/prismaClient.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/lib/prismaClient.ts + + + + + + + + + +
+
+

All files / src/lib prismaClient.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +143x +  +  +3x +  +  +  +  +3x +  +  +3x +3x + 
import { PrismaClient } from '@prisma/client';
+ 
+ 
+const globalForPrisma = globalThis as unknown as {
+  prisma: PrismaClient | undefined;
+};
+ 
+ 
+export const prismaClient: PrismaClient =
+  globalForPrisma.prisma ?? new PrismaClient();
+ 
+Eif (process.env.NODE_ENV !== 'production') {
+  globalForPrisma.prisma = prismaClient;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/socket.ts.html b/coverage/lcov-report/src/lib/socket.ts.html new file mode 100644 index 00000000..a7b4b5c4 --- /dev/null +++ b/coverage/lcov-report/src/lib/socket.ts.html @@ -0,0 +1,190 @@ + + + + + + Code coverage report for src/lib/socket.ts + + + + + + + + + +
+
+

All files / src/lib socket.ts

+
+ +
+ 0% + Statements + 0/18 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Server } from 'socket.io';
+import type { Socket } from 'socket.io';
+import type { Server as HttpServer } from 'http';
+ 
+let io: Server | null = null;
+ 
+export const initSocket = (server: HttpServer): Server => {
+  io = new Server(server, {
+    cors: {
+      origin: "*",
+      methods: ["GET", "POST"]
+    }
+  });
+ 
+  io.on('connection', (socket: Socket) => {
+    console.log(` User connected: ${socket.id}`);
+ 
+    socket.on('join', (userId: string | number) => {
+      socket.join(`user_${userId}`);
+      console.log(` User ${userId} joined their private room.`);
+    });
+ 
+    socket.on('disconnect', () => {
+      console.log(' User disconnected');
+    });
+  });
+ 
+  return io;
+};
+ 
+export const getIO = (): Server => {
+  if (!io) {
+    throw new Error("⚠️ Socket.io not initialized! Call initSocket first.");
+  }
+  return io;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/lib/withAsync.ts.html b/coverage/lcov-report/src/lib/withAsync.ts.html new file mode 100644 index 00000000..1831f1e9 --- /dev/null +++ b/coverage/lcov-report/src/lib/withAsync.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/withAsync.ts + + + + + + + + + +
+
+

All files / src/lib withAsync.ts

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +6x +144x +144x +144x +  +21x +  +  + 
import { Request, Response, NextFunction, RequestHandler } from 'express';
+ 
+export const withAsync = (fn: Function): RequestHandler => {
+  return async (req: Request, res: Response, next: NextFunction) => {
+    try {
+      await fn(req, res, next);
+    } catch (error) {
+      next(error);
+    }
+  };
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/middlewares/authMiddleware.ts.html b/coverage/lcov-report/src/middlewares/authMiddleware.ts.html new file mode 100644 index 00000000..c7ed53d2 --- /dev/null +++ b/coverage/lcov-report/src/middlewares/authMiddleware.ts.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/middlewares/authMiddleware.ts + + + + + + + + + +
+
+

All files / src/middlewares authMiddleware.ts

+
+ +
+ 94.44% + Statements + 17/18 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 93.75% + Lines + 15/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +383x +3x +  +  +3x +  +  +  +  +  +  +  +50x +50x +50x +  +50x +10x +  +  +40x +  +40x +  +40x +  +  +  +40x +2x +  +  +38x +38x +  +  +  + 
import jwt from 'jsonwebtoken';
+import { PrismaClient } from '@prisma/client';
+import type { Request, Response, NextFunction } from 'express';
+ 
+const prisma = new PrismaClient();
+ 
+ 
+interface JwtPayload {
+  id: number;
+}
+ 
+ 
+export const authenticate = async (req: Request, res: Response, next: NextFunction) => {
+  try {
+    const authHeader = req.headers.authorization;
+    
+    if (!authHeader || !authHeader.startsWith('Bearer ')) {
+      return res.status(401).json({ message: '로그인이 필요한 서비스입니다.' });
+    }
+ 
+    const token = authHeader.split(' ')[1];
+ 
+    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'secret') as unknown as JwtPayload;
+    
+    const user = await prisma.user.findUnique({
+      where: { id: decoded.id },
+    });
+ 
+    if (!user) {
+      return res.status(401).json({ message: '유효하지 않은 사용자입니다.' });
+    }
+ 
+    req.user = user; 
+    next();
+  } catch (error) {
+    return res.status(401).json({ message: '인증에 실패했습니다. 다시 로그인해 주세요.' });
+  }
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/middlewares/index.html b/coverage/lcov-report/src/middlewares/index.html new file mode 100644 index 00000000..631f06b0 --- /dev/null +++ b/coverage/lcov-report/src/middlewares/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/middlewares + + + + + + + + + +
+
+

All files src/middlewares

+
+ +
+ 84.37% + Statements + 27/32 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 82.14% + Lines + 23/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authMiddleware.ts +
+
94.44%17/1887.5%7/8100%2/293.75%15/16
validate.ts +
+
71.42%10/14100%0/050%1/266.66%8/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/middlewares/validate.ts.html b/coverage/lcov-report/src/middlewares/validate.ts.html new file mode 100644 index 00000000..9fbc4c8a --- /dev/null +++ b/coverage/lcov-report/src/middlewares/validate.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/middlewares/validate.ts + + + + + + + + + +
+
+

All files / src/middlewares validate.ts

+
+ +
+ 71.42% + Statements + 10/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 66.66% + Lines + 8/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +303x +3x +  +  +  +3x +4x +  +4x +2x +  +2x +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  + 
import { assert } from 'superstruct';
+import { SignUpStruct, SignInStruct } from '../structs/authStructs'; 
+import type { Request, Response, NextFunction } from 'express';
+ 
+ 
+export const validateSignUp = (req: Request, res: Response, next: NextFunction) => {
+  try {
+    // req.body가 SignUpStruct 구조와 일치하는지 확인
+    assert(req.body, SignUpStruct);
+    next();
+  } catch (error: any) {
+    res.status(400).json({ 
+      message: '입력 데이터 형식이 올바르지 않습니다.', 
+      details: error.message 
+    });
+  }
+};
+ 
+ 
+export const validateSignIn = (req: Request, res: Response, next: NextFunction) => {
+  try {
+    assert(req.body, SignInStruct);
+    next();
+  } catch (error: any) {
+    res.status(400).json({ 
+      message: '로그인 정보 형식이 올바르지 않습니다.', 
+      details: error.message 
+    });
+  }
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/articlesRouter.ts.html b/coverage/lcov-report/src/routers/articlesRouter.ts.html new file mode 100644 index 00000000..7acddb4f --- /dev/null +++ b/coverage/lcov-report/src/routers/articlesRouter.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/routers/articlesRouter.ts + + + + + + + + + +
+
+

All files / src/routers articlesRouter.ts

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +292x +2x +2x +  +  +  +  +  +  +  +  +2x +2x +  +2x +  +2x +2x +  +2x +  +2x +2x +2x +2x +2x +2x +  +2x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createArticle,
+  getArticleList,
+  getArticle,
+  updateArticle,
+  deleteArticle,
+  createComment,
+  getCommentList,
+} from '../controllers/articlesController';
+import { toggleArticleLike } from '../controllers/likeController'; 
+import { authenticate } from '../middlewares/authMiddleware';
+ 
+const articlesRouter: Router = express.Router();
+ 
+articlesRouter.get('/', withAsync(getArticleList));
+articlesRouter.get('/:id', withAsync(getArticle));
+ 
+articlesRouter.use(authenticate);
+ 
+articlesRouter.post('/', withAsync(createArticle));
+articlesRouter.patch('/:id', withAsync(updateArticle));
+articlesRouter.delete('/:id', withAsync(deleteArticle));
+articlesRouter.post('/:id/comments', withAsync(createComment));
+articlesRouter.get('/:id/comments', withAsync(getCommentList));
+articlesRouter.post('/:id/like', withAsync(toggleArticleLike));
+ 
+export default articlesRouter;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/authRoutes.ts.html b/coverage/lcov-report/src/routers/authRoutes.ts.html new file mode 100644 index 00000000..98497c45 --- /dev/null +++ b/coverage/lcov-report/src/routers/authRoutes.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/routers/authRoutes.ts + + + + + + + + + +
+
+

All files / src/routers authRoutes.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +123x +3x +3x +3x +  +3x +  +3x +3x +3x +  +3x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync'; 
+import * as authController from '../controllers/authController'; 
+import { validateSignUp } from '../middlewares/validate'; 
+ 
+const router: Router = express.Router();
+ 
+router.post('/signup', validateSignUp, withAsync(authController.signUp));
+router.post('/signin', withAsync(authController.signIn));
+router.post('/refresh', withAsync(authController.refresh));
+ 
+export default router;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/commentsRouter.ts.html b/coverage/lcov-report/src/routers/commentsRouter.ts.html new file mode 100644 index 00000000..b5f8fb0c --- /dev/null +++ b/coverage/lcov-report/src/routers/commentsRouter.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/routers/commentsRouter.ts + + + + + + + + + +
+
+

All files / src/routers commentsRouter.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +132x +2x +2x +2x +  +2x +  +2x +2x +2x +  +2x + 
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import { updateComment, deleteComment } from '../controllers/commentsController';
+import { authenticate } from '../middlewares/authMiddleware';
+ 
+const commentsRouter: Router = express.Router();
+ 
+commentsRouter.use(authenticate);
+commentsRouter.patch('/:id', withAsync(updateComment));
+commentsRouter.delete('/:id', withAsync(deleteComment));
+ 
+export default commentsRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/imagesRouter.ts.html b/coverage/lcov-report/src/routers/imagesRouter.ts.html new file mode 100644 index 00000000..06327d4e --- /dev/null +++ b/coverage/lcov-report/src/routers/imagesRouter.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/routers/imagesRouter.ts + + + + + + + + + +
+
+

All files / src/routers imagesRouter.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +142x +2x +2x +  +2x +  +  +2x +  +  +  +  +  +2x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import { upload, uploadImage } from '../controllers/imagesController'; 
+ 
+const imagesRouter: Router = express.Router();
+ 
+ 
+imagesRouter.post(
+  '/upload', 
+  upload.single('image'), 
+  withAsync(uploadImage)
+);
+ 
+export default imagesRouter;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/index.html b/coverage/lcov-report/src/routers/index.html new file mode 100644 index 00000000..14eb421b --- /dev/null +++ b/coverage/lcov-report/src/routers/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/routers + + + + + + + + + +
+
+

All files src/routers

+
+ +
+ 100% + Statements + 74/74 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 74/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesRouter.ts +
+
100%16/16100%0/0100%0/0100%16/16
authRoutes.ts +
+
100%9/9100%0/0100%0/0100%9/9
commentsRouter.ts +
+
100%9/9100%0/0100%0/0100%9/9
imagesRouter.ts +
+
100%6/6100%0/0100%0/0100%6/6
productsRouter.ts +
+
100%17/17100%0/0100%0/0100%17/17
userRoutes.ts +
+
100%17/17100%0/0100%0/0100%17/17
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/productsRouter.ts.html b/coverage/lcov-report/src/routers/productsRouter.ts.html new file mode 100644 index 00000000..0122c8cf --- /dev/null +++ b/coverage/lcov-report/src/routers/productsRouter.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/routers/productsRouter.ts + + + + + + + + + +
+
+

All files / src/routers productsRouter.ts

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +342x +2x +2x +  +  +  +  +  +  +2x +2x +2x +  +2x +  +2x +2x +  +  +2x +  +  +2x +2x +2x +  +  +2x +2x +  +  +2x +  +2x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createProduct,
+  getProduct,
+  updateProduct,
+  deleteProduct,
+  getProductList,
+} from '../controllers/productsController'; 
+import { createComment, getCommentList } from '../controllers/commentsController';
+import { toggleProductLike } from '../controllers/likeController'; 
+import { authenticate } from '../middlewares/authMiddleware'; 
+ 
+const productsRouter: Router = express.Router();
+ 
+productsRouter.get('/', withAsync(getProductList));
+productsRouter.get('/:id', withAsync(getProduct));
+ 
+ 
+productsRouter.use(authenticate);
+ 
+// 상품(Product) 관련
+productsRouter.post('/', withAsync(createProduct));
+productsRouter.patch('/:id', withAsync(updateProduct));
+productsRouter.delete('/:id', withAsync(deleteProduct));
+ 
+// 댓글(Comment) 관련
+productsRouter.post('/:id/comments', withAsync(createComment));
+productsRouter.get('/:id/comments', withAsync(getCommentList));
+ 
+// 좋아요(Like) 관련
+productsRouter.post('/:id/like', withAsync(toggleProductLike));
+ 
+export default productsRouter;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/routers/userRoutes.ts.html b/coverage/lcov-report/src/routers/userRoutes.ts.html new file mode 100644 index 00000000..c4c558f2 --- /dev/null +++ b/coverage/lcov-report/src/routers/userRoutes.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/routers/userRoutes.ts + + + + + + + + + +
+
+

All files / src/routers userRoutes.ts

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +  +  +1x +  +  +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +  +1x
import express, { Router } from 'express';
+import * as userController from '../controllers/userController'; 
+import { authenticate } from '../middlewares/authMiddleware'; 
+import { withAsync } from '../lib/withAsync'; 
+const router: Router = express.Router();
+ 
+ 
+router.use(authenticate);
+ 
+ 
+router.get('/me', withAsync(userController.getMe));
+router.patch('/me', withAsync(userController.updateMe));
+router.patch('/me/password', withAsync(userController.changePassword));
+ 
+ 
+router.get('/me/products', withAsync(userController.getMyProducts));
+router.get('/me/likes', withAsync(userController.getMyLikedItems));
+ 
+ 
+router.get('/me/notifications', withAsync(userController.getMyNotifications));
+router.patch('/me/notifications', withAsync(userController.readAllNotifications));
+router.get('/me/notifications/unread-count', withAsync(userController.getUnreadNotificationCount));
+router.patch('/me/notifications/:id', withAsync(userController.readNotification));
+ 
+ 
+router.delete('/notifications/cleanup', withAsync(userController.deleteOldNotifications));
+ 
+export default router;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/server.ts.html b/coverage/lcov-report/src/server.ts.html new file mode 100644 index 00000000..0fe94601 --- /dev/null +++ b/coverage/lcov-report/src/server.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/server.ts + + + + + + + + + +
+
+

All files / src server.ts

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +322x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +  +  +2x +2x +2x +  +  +2x +  +  +2x +2x +2x +2x +  +  +2x +2x +  +2x
import express, { Application } from 'express';
+import cors from 'cors';
+import path from 'path';
+import { PUBLIC_PATH, STATIC_PATH } from './lib/constants';
+import articlesRouter from './routers/articlesRouter';
+import productsRouter from './routers/productsRouter';
+import commentsRouter from './routers/commentsRouter';
+import imagesRouter from './routers/imagesRouter';
+import authRouter from './routers/authRoutes';
+import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController';
+ 
+const server: Application = express();
+ 
+// 💡 기본 설정
+server.use(cors());
+server.use(express.json());
+server.use('/auth', authRouter); 
+ 
+// 💡 정적 파일 설정
+server.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH)));
+ 
+// 💡 라우터 연결
+server.use('/articles', articlesRouter);
+server.use('/products', productsRouter);
+server.use('/comments', commentsRouter);
+server.use('/images', imagesRouter);
+ 
+// 💡 에러 핸들러
+server.use(defaultNotFoundHandler);
+server.use(globalErrorHandler);
+ 
+export default server; // 👈 main.ts에서 가져다 쓸 수 있게 내보냅니다.
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/socket/index.html b/coverage/lcov-report/src/socket/index.html new file mode 100644 index 00000000..c3a6335f --- /dev/null +++ b/coverage/lcov-report/src/socket/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/socket + + + + + + + + + +
+
+

All files src/socket

+
+ +
+ 31.25% + Statements + 5/16 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 21.42% + Lines + 3/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
socket.ts +
+
31.25%5/160%0/20%0/521.42%3/14
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/socket/socket.ts.html b/coverage/lcov-report/src/socket/socket.ts.html new file mode 100644 index 00000000..f3538fa9 --- /dev/null +++ b/coverage/lcov-report/src/socket/socket.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/socket/socket.ts + + + + + + + + + +
+
+

All files / src/socket socket.ts

+
+ +
+ 31.25% + Statements + 5/16 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 21.42% + Lines + 3/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +322x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  + 
import { Server, Socket } from 'socket.io';
+import type { Server as HttpServer } from 'http';
+ 
+export const setupSocket = (server: HttpServer): Server => {
+  const io = new Server(server, {
+    cors: {
+      origin: "*", 
+      methods: ["GET", "POST"]
+    }
+  });
+ 
+  io.on('connection', (socket: Socket) => {
+    console.log('소켓 연결됨:', socket.id);
+ 
+    socket.on('join', (userId: string | number) => {
+      socket.join(`user_${userId}`);
+      console.log(`유저 ${userId}가 알림 방(user_${userId})에 입장했습니다.`);
+    });
+ 
+    socket.on('disconnect', () => {
+      console.log('소켓 연결 해제');
+    });
+  });
+ 
+  return io;
+};
+ 
+export const emitNotification = (io: Server | undefined, userId: string | number, notificationData: any): void => {
+  if (io) {
+    io.to(`user_${userId}`).emit('NEW_NOTIFICATION', notificationData);
+  }
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/articlesStructs.ts.html b/coverage/lcov-report/src/structs/articlesStructs.ts.html new file mode 100644 index 00000000..89f0d406 --- /dev/null +++ b/coverage/lcov-report/src/structs/articlesStructs.ts.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/structs/articlesStructs.ts + + + + + + + + + +
+
+

All files / src/structs articlesStructs.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +162x +2x +  +2x +  +2x +4x +  +  +  +  +2x +  +  +  + 
import { coerce, nonempty, nullable, object, partial, string, type Infer } from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const GetArticleListParamsStruct = PageParamsStruct;
+ 
+export const CreateArticleBodyStruct = object({
+  title: coerce(nonempty(string()), string(), (value) => value.trim()),
+  content: nonempty(string()),
+  image: nullable(string()),
+});
+ 
+export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct);
+ 
+export type CreateArticleBody = Infer<typeof CreateArticleBodyStruct>;
+export type UpdateArticleBody = Infer<typeof UpdateArticleBodyStruct>;
+export type GetArticleListParams = Infer<typeof GetArticleListParamsStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/authStructs.ts.html b/coverage/lcov-report/src/structs/authStructs.ts.html new file mode 100644 index 00000000..25473cdb --- /dev/null +++ b/coverage/lcov-report/src/structs/authStructs.ts.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for src/structs/authStructs.ts + + + + + + + + + +
+
+

All files / src/structs authStructs.ts

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +153x +  +3x +  +  +  +  +  +3x +  +  +  +  +  + 
import { object, string, size, type Infer } from 'superstruct';
+ 
+export const SignUpStruct = object({
+  email: string(), 
+  nickname: string(),
+  password: size(string(), 8, 20),
+});
+ 
+export const SignInStruct = object({
+  email: string(),
+  password: string(),
+});
+ 
+export type SignUpBody = Infer<typeof SignUpStruct>;
+export type SignInBody = Infer<typeof SignInStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/commentsStruct.ts.html b/coverage/lcov-report/src/structs/commentsStruct.ts.html new file mode 100644 index 00000000..6d781b5d --- /dev/null +++ b/coverage/lcov-report/src/structs/commentsStruct.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/structs/commentsStruct.ts + + + + + + + + + +
+
+

All files / src/structs commentsStruct.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +132x +2x +  +2x +  +  +  +2x +2x +  +  +  + 
import { nonempty, object, partial, string, type Infer } from 'superstruct';
+import { CursorParamsStruct } from './commonStructs';
+ 
+export const CreateCommentBodyStruct = object({
+  content: nonempty(string()),
+});
+ 
+export const GetCommentListParamsStruct = CursorParamsStruct;
+export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct);
+ 
+export type CreateCommentBody = Infer<typeof CreateCommentBodyStruct>;
+export type GetCommentListParams = Infer<typeof GetCommentListParamsStruct>;
+export type UpdateCommentBody = Infer<typeof UpdateCommentBodyStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/commonStructs.ts.html b/coverage/lcov-report/src/structs/commonStructs.ts.html new file mode 100644 index 00000000..2c9c703c --- /dev/null +++ b/coverage/lcov-report/src/structs/commonStructs.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/structs/commonStructs.ts + + + + + + + + + +
+
+

All files / src/structs commonStructs.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +263x +  +41x +  +3x +  +  +  +3x +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  + 
import { coerce, integer, object, string, defaulted, optional, enums, nonempty, type Infer } from 'superstruct';
+ 
+const integerString = coerce(integer(), string(), (value) => parseInt(value, 10));
+ 
+export const IdParamsStruct = object({
+  id: integerString,
+});
+ 
+export const PageParamsStruct = object({
+  page: defaulted(integerString, 1),
+  pageSize: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+export const CursorParamsStruct = object({
+  cursor: defaulted(integerString, 0),
+  limit: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+ 
+export type IdParams = Infer<typeof IdParamsStruct>;
+export type PageParams = Infer<typeof PageParamsStruct>;
+export type CursorParams = Infer<typeof CursorParamsStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/index.html b/coverage/lcov-report/src/structs/index.html new file mode 100644 index 00000000..f1801b73 --- /dev/null +++ b/coverage/lcov-report/src/structs/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/structs + + + + + + + + + +
+
+

All files src/structs

+
+ +
+ 100% + Statements + 29/29 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 28/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesStructs.ts +
+
100%6/6100%0/0100%1/1100%6/6
authStructs.ts +
+
100%3/3100%0/0100%0/0100%3/3
commentsStruct.ts +
+
100%5/5100%0/0100%0/0100%5/5
commonStructs.ts +
+
100%6/6100%0/0100%1/1100%5/5
productsStruct.ts +
+
100%6/6100%0/0100%1/1100%6/6
userStructs.ts +
+
100%3/3100%0/0100%0/0100%3/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/productsStruct.ts.html b/coverage/lcov-report/src/structs/productsStruct.ts.html new file mode 100644 index 00000000..3a4f9fdc --- /dev/null +++ b/coverage/lcov-report/src/structs/productsStruct.ts.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for src/structs/productsStruct.ts + + + + + + + + + +
+
+

All files / src/structs productsStruct.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +193x +3x +  +3x +11x +  +  +  +  +  +  +3x +  +3x +  +  +  +  + 
import { coerce, partial, object, string, min, nonempty, array, integer, type Infer } from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const CreateProductBodyStruct = object({
+  name: coerce(nonempty(string()), string(), (value) => value.trim()),
+  description: nonempty(string()),
+  price: min(integer(), 0),
+  tags: array(nonempty(string())),
+  images: array(nonempty(string())),
+});
+ 
+export const GetProductListParamsStruct = PageParamsStruct;
+ 
+export const UpdateProductBodyStruct = partial(CreateProductBodyStruct);
+ 
+export type CreateProductBody = Infer<typeof CreateProductBodyStruct>;
+export type UpdateProductBody = Infer<typeof UpdateProductBodyStruct>;
+export type GetProductListParams = Infer<typeof GetProductListParamsStruct>;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov-report/src/structs/userStructs.ts.html b/coverage/lcov-report/src/structs/userStructs.ts.html new file mode 100644 index 00000000..41c71bb9 --- /dev/null +++ b/coverage/lcov-report/src/structs/userStructs.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/structs/userStructs.ts + + + + + + + + + +
+
+

All files / src/structs userStructs.ts

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +  +1x +  +  +  +  +1x +  +  +  +  +  + 
import { object, string, size, optional, type Infer } from 'superstruct';
+ 
+export const UpdateUserStruct = object({
+  nickname: optional(string()),
+  image: optional(string()),
+});
+ 
+export const ChangePasswordStruct = object({
+  currentPassword: string(),
+  newPassword: size(string(), 8, 20),
+});
+ 
+export type UpdateUserBody = Infer<typeof UpdateUserStruct>;
+export type ChangePasswordBody = Infer<typeof ChangePasswordStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/lcov.info b/coverage/lcov.info new file mode 100644 index 00000000..bf0443b7 --- /dev/null +++ b/coverage/lcov.info @@ -0,0 +1,1149 @@ +TN: +SF:src/server.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:7,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:12,2 +DA:15,2 +DA:16,2 +DA:17,2 +DA:20,2 +DA:23,2 +DA:24,2 +DA:25,2 +DA:26,2 +DA:29,2 +DA:30,2 +DA:32,2 +LF:22 +LH:22 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/controllers/articlesController.ts +FN:14,(anonymous_8) +FN:14,(anonymous_9) +FN:30,(anonymous_10) +FN:30,(anonymous_11) +FN:40,(anonymous_12) +FN:40,(anonymous_13) +FN:59,(anonymous_14) +FN:59,(anonymous_15) +FN:74,(anonymous_16) +FN:74,(anonymous_17) +FN:93,(anonymous_18) +FN:93,(anonymous_19) +FN:112,(anonymous_20) +FN:112,(anonymous_21) +FNF:14 +FNH:14 +FNDA:3,(anonymous_8) +FNDA:3,(anonymous_9) +FNDA:3,(anonymous_10) +FNDA:3,(anonymous_11) +FNDA:2,(anonymous_12) +FNDA:2,(anonymous_13) +FNDA:2,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:4,(anonymous_16) +FNDA:4,(anonymous_17) +FNDA:2,(anonymous_18) +FNDA:2,(anonymous_19) +FNDA:1,(anonymous_20) +FNDA:1,(anonymous_21) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:11,2 +DA:14,3 +DA:15,3 +DA:17,1 +DA:26,1 +DA:30,3 +DA:31,3 +DA:33,2 +DA:34,2 +DA:36,1 +DA:40,2 +DA:41,2 +DA:42,2 +DA:44,2 +DA:46,2 +DA:47,1 +DA:48,0 +DA:51,1 +DA:56,1 +DA:59,2 +DA:60,2 +DA:62,2 +DA:64,2 +DA:65,1 +DA:66,0 +DA:69,1 +DA:71,1 +DA:74,4 +DA:75,4 +DA:77,4 +DA:81,4 +DA:82,4 +DA:89,4 +DA:93,2 +DA:94,2 +DA:95,2 +DA:97,1 +DA:98,1 +DA:100,1 +DA:108,1 +DA:112,2 +DA:113,1 +DA:114,1 +DA:116,1 +DA:117,1 +DA:119,1 +DA:126,1 +DA:127,1 +DA:128,1 +DA:130,1 +LF:56 +LH:54 +BRDA:34,0,0,1 +BRDA:34,0,1,1 +BRDA:46,1,0,1 +BRDA:46,1,1,1 +BRDA:47,2,0,0 +BRDA:47,2,1,1 +BRDA:64,3,0,1 +BRDA:64,3,1,1 +BRDA:65,4,0,0 +BRDA:65,4,1,1 +BRDA:78,5,0,1 +BRDA:78,5,1,3 +BRDA:85,6,0,1 +BRDA:85,6,1,3 +BRDA:98,7,0,0 +BRDA:98,7,1,1 +BRDA:117,8,0,0 +BRDA:117,8,1,1 +BRDA:120,9,0,0 +BRDA:120,9,1,1 +BRDA:128,10,0,0 +BRDA:128,10,1,1 +BRF:22 +BRH:16 +end_of_record +TN: +SF:src/controllers/authController.ts +FN:10,(anonymous_9) +FN:21,(anonymous_10) +FN:21,(anonymous_11) +FN:39,(anonymous_12) +FN:39,(anonymous_13) +FN:68,(anonymous_14) +FN:68,(anonymous_15) +FNF:7 +FNH:7 +FNDA:2,(anonymous_9) +FNDA:2,(anonymous_10) +FNDA:2,(anonymous_11) +FNDA:3,(anonymous_12) +FNDA:3,(anonymous_13) +FNDA:3,(anonymous_14) +FNDA:3,(anonymous_15) +DA:1,3 +DA:2,3 +DA:3,3 +DA:5,3 +DA:7,3 +DA:10,3 +DA:11,2 +DA:12,2 +DA:14,2 +DA:15,2 +DA:17,2 +DA:21,3 +DA:22,2 +DA:24,2 +DA:25,2 +DA:26,1 +DA:29,1 +DA:30,1 +DA:34,1 +DA:35,1 +DA:39,3 +DA:40,3 +DA:42,3 +DA:43,3 +DA:44,1 +DA:47,2 +DA:48,2 +DA:49,1 +DA:52,1 +DA:54,1 +DA:59,1 +DA:60,1 +DA:68,3 +DA:69,3 +DA:71,3 +DA:72,1 +DA:75,2 +DA:77,2 +DA:79,1 +DA:81,1 +DA:82,0 +DA:85,1 +DA:87,1 +DA:92,1 +LF:44 +LH:43 +BRDA:11,0,0,2 +BRDA:11,0,1,0 +BRDA:12,1,0,2 +BRDA:12,1,1,0 +BRDA:25,2,0,1 +BRDA:25,2,1,1 +BRDA:43,3,0,1 +BRDA:43,3,1,2 +BRDA:48,4,0,1 +BRDA:48,4,1,1 +BRDA:71,5,0,1 +BRDA:71,5,1,2 +BRDA:75,6,0,2 +BRDA:75,6,1,0 +BRDA:81,7,0,0 +BRDA:81,7,1,1 +BRDA:81,8,0,1 +BRDA:81,8,1,1 +BRF:18 +BRH:14 +end_of_record +TN: +SF:src/controllers/commentsController.ts +FN:10,(anonymous_8) +FN:10,(anonymous_9) +FN:42,(anonymous_10) +FN:42,(anonymous_11) +FN:68,(anonymous_12) +FN:68,(anonymous_13) +FN:90,(anonymous_14) +FN:90,(anonymous_15) +FNF:8 +FNH:4 +FNDA:2,(anonymous_8) +FNDA:2,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:1,(anonymous_11) +FNDA:0,(anonymous_12) +FNDA:0,(anonymous_13) +FNDA:0,(anonymous_14) +FNDA:0,(anonymous_15) +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:6,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:14,1 +DA:15,1 +DA:16,0 +DA:19,1 +DA:27,1 +DA:28,0 +DA:38,1 +DA:42,2 +DA:43,1 +DA:44,1 +DA:46,1 +DA:47,1 +DA:48,0 +DA:51,1 +DA:58,1 +DA:59,1 +DA:60,1 +DA:62,1 +DA:68,2 +DA:69,0 +DA:70,0 +DA:72,0 +DA:73,0 +DA:74,0 +DA:77,0 +DA:78,0 +DA:81,0 +DA:86,0 +DA:90,2 +DA:91,0 +DA:93,0 +DA:94,0 +DA:95,0 +DA:98,0 +DA:99,0 +DA:102,0 +DA:104,0 +LF:46 +LH:26 +BRDA:15,0,0,0 +BRDA:15,0,1,1 +BRDA:27,1,0,0 +BRDA:27,1,1,1 +BRDA:27,2,0,1 +BRDA:27,2,1,1 +BRDA:47,3,0,0 +BRDA:47,3,1,1 +BRDA:52,4,0,0 +BRDA:52,4,1,1 +BRDA:60,5,0,0 +BRDA:60,5,1,1 +BRDA:73,6,0,0 +BRDA:73,6,1,0 +BRDA:77,7,0,0 +BRDA:77,7,1,0 +BRDA:94,8,0,0 +BRDA:94,8,1,0 +BRDA:98,9,0,0 +BRDA:98,9,1,0 +BRF:20 +BRH:7 +end_of_record +TN: +SF:src/controllers/errorController.ts +FN:6,defaultNotFoundHandler +FN:10,globalErrorHandler +FNF:2 +FNH:1 +FNDA:0,defaultNotFoundHandler +FNDA:15,globalErrorHandler +DA:1,3 +DA:3,3 +DA:4,3 +DA:6,3 +DA:7,0 +DA:10,3 +DA:11,15 +DA:12,9 +DA:15,6 +DA:16,0 +DA:19,6 +DA:20,6 +DA:23,0 +DA:24,0 +DA:25,0 +DA:28,0 +DA:29,0 +LF:17 +LH:10 +BRDA:11,0,0,9 +BRDA:11,0,1,6 +BRDA:11,1,0,15 +BRDA:11,1,1,6 +BRDA:15,2,0,0 +BRDA:15,2,1,6 +BRDA:15,3,0,6 +BRDA:15,3,1,0 +BRDA:15,3,2,0 +BRDA:19,4,0,6 +BRDA:19,4,1,0 +BRDA:23,5,0,0 +BRDA:23,5,1,0 +BRF:13 +BRH:7 +end_of_record +TN: +SF:src/controllers/imagesController.ts +FN:14,(anonymous_8) +FN:17,(anonymous_9) +FN:28,(anonymous_10) +FN:40,uploadImage +FNF:4 +FNH:0 +FNDA:0,(anonymous_8) +FNDA:0,(anonymous_9) +FNDA:0,(anonymous_10) +FNDA:0,uploadImage +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:5,2 +DA:12,2 +DA:15,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:29,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:35,0 +DA:40,2 +DA:41,0 +DA:42,0 +DA:45,0 +DA:46,0 +DA:48,0 +LF:21 +LH:7 +BRDA:31,0,0,0 +BRDA:31,0,1,0 +BRDA:41,1,0,0 +BRDA:41,1,1,0 +BRF:4 +BRH:0 +end_of_record +TN: +SF:src/controllers/likeController.ts +FN:8,(anonymous_7) +FN:8,(anonymous_8) +FN:41,(anonymous_9) +FN:41,(anonymous_10) +FN:69,(anonymous_11) +FN:69,(anonymous_12) +FNF:6 +FNH:6 +FNDA:3,(anonymous_7) +FNDA:3,(anonymous_8) +FNDA:2,(anonymous_9) +FNDA:2,(anonymous_10) +FNDA:4,(anonymous_11) +FNDA:4,(anonymous_12) +DA:1,3 +DA:3,3 +DA:5,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:12,3 +DA:21,2 +DA:22,1 +DA:25,1 +DA:28,1 +DA:34,1 +DA:41,3 +DA:42,2 +DA:43,2 +DA:45,2 +DA:54,2 +DA:55,1 +DA:56,1 +DA:58,1 +DA:64,1 +DA:69,4 +DA:70,4 +DA:71,4 +DA:73,4 +DA:80,4 +DA:81,1 +DA:84,3 +DA:85,3 +DA:86,3 +DA:94,3 +DA:97,3 +LF:32 +LH:32 +BRDA:21,0,0,1 +BRDA:21,0,1,1 +BRDA:54,1,0,1 +BRDA:54,1,1,1 +BRDA:71,2,0,0 +BRDA:71,2,1,4 +BRDA:71,3,0,4 +BRDA:71,3,1,4 +BRDA:80,4,0,1 +BRDA:80,4,1,3 +BRDA:85,5,0,3 +BRDA:85,5,1,0 +BRF:12 +BRH:10 +end_of_record +TN: +SF:src/controllers/productsController.ts +FN:15,(anonymous_8) +FN:15,(anonymous_9) +FN:33,(anonymous_10) +FN:33,(anonymous_11) +FN:43,(anonymous_12) +FN:43,(anonymous_13) +FN:71,(anonymous_14) +FN:80,(anonymous_15) +FN:95,(anonymous_16) +FN:95,(anonymous_17) +FN:115,(anonymous_18) +FN:115,(anonymous_19) +FNF:12 +FNH:12 +FNDA:5,(anonymous_8) +FNDA:5,(anonymous_9) +FNDA:5,(anonymous_10) +FNDA:5,(anonymous_11) +FNDA:6,(anonymous_12) +FNDA:6,(anonymous_13) +FNDA:2,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:8,(anonymous_16) +FNDA:8,(anonymous_17) +FNDA:5,(anonymous_18) +FNDA:5,(anonymous_19) +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:5,3 +DA:6,3 +DA:11,3 +DA:15,5 +DA:16,5 +DA:18,3 +DA:29,2 +DA:33,5 +DA:34,5 +DA:36,4 +DA:37,4 +DA:39,2 +DA:43,6 +DA:44,6 +DA:45,6 +DA:47,6 +DA:48,6 +DA:50,4 +DA:51,1 +DA:54,3 +DA:56,3 +DA:61,3 +DA:62,2 +DA:67,2 +DA:68,1 +DA:70,1 +DA:71,2 +DA:79,1 +DA:80,1 +DA:81,2 +DA:91,3 +DA:95,8 +DA:96,8 +DA:98,8 +DA:104,8 +DA:105,8 +DA:112,8 +DA:115,5 +DA:116,5 +DA:118,5 +DA:119,5 +DA:121,3 +DA:122,1 +DA:125,2 +DA:127,2 +LF:49 +LH:49 +BRDA:37,0,0,2 +BRDA:37,0,1,2 +BRDA:48,1,0,2 +BRDA:48,1,1,4 +BRDA:50,2,0,1 +BRDA:50,2,1,3 +BRDA:54,3,0,3 +BRDA:54,3,1,3 +BRDA:61,4,0,2 +BRDA:61,4,1,1 +BRDA:67,5,0,1 +BRDA:67,5,1,1 +BRDA:98,6,0,2 +BRDA:98,6,1,6 +BRDA:108,7,0,2 +BRDA:108,7,1,6 +BRDA:119,8,0,2 +BRDA:119,8,1,3 +BRDA:121,9,0,1 +BRDA:121,9,1,2 +BRF:20 +BRH:20 +end_of_record +TN: +SF:src/controllers/userController.ts +FN:8,(anonymous_9) +FN:8,(anonymous_10) +FN:13,(anonymous_11) +FN:13,(anonymous_12) +FN:25,(anonymous_13) +FN:25,(anonymous_14) +FN:43,(anonymous_15) +FN:43,(anonymous_16) +FN:61,(anonymous_17) +FN:61,(anonymous_18) +FN:78,(anonymous_19) +FN:93,(anonymous_20) +FN:100,(anonymous_21) +FN:100,(anonymous_22) +FN:118,(anonymous_23) +FN:118,(anonymous_24) +FN:128,(anonymous_25) +FN:128,(anonymous_26) +FN:137,(anonymous_27) +FN:137,(anonymous_28) +FN:156,(anonymous_29) +FN:156,(anonymous_30) +FNF:22 +FNH:20 +FNDA:1,(anonymous_9) +FNDA:1,(anonymous_10) +FNDA:2,(anonymous_11) +FNDA:2,(anonymous_12) +FNDA:3,(anonymous_13) +FNDA:3,(anonymous_14) +FNDA:2,(anonymous_15) +FNDA:2,(anonymous_16) +FNDA:4,(anonymous_17) +FNDA:4,(anonymous_18) +FNDA:2,(anonymous_19) +FNDA:1,(anonymous_20) +FNDA:1,(anonymous_21) +FNDA:1,(anonymous_22) +FNDA:1,(anonymous_23) +FNDA:1,(anonymous_24) +FNDA:2,(anonymous_25) +FNDA:2,(anonymous_26) +FNDA:2,(anonymous_27) +FNDA:2,(anonymous_28) +FNDA:0,(anonymous_29) +FNDA:0,(anonymous_30) +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:9,1 +DA:10,1 +DA:13,2 +DA:14,2 +DA:16,2 +DA:21,2 +DA:22,2 +DA:25,3 +DA:26,3 +DA:28,2 +DA:29,2 +DA:30,1 +DA:33,1 +DA:34,1 +DA:39,1 +DA:43,2 +DA:44,2 +DA:45,2 +DA:47,2 +DA:57,2 +DA:61,4 +DA:62,4 +DA:63,4 +DA:64,4 +DA:66,4 +DA:67,2 +DA:78,2 +DA:81,2 +DA:82,1 +DA:93,1 +DA:96,1 +DA:100,1 +DA:101,1 +DA:102,1 +DA:104,1 +DA:114,1 +DA:118,1 +DA:119,1 +DA:124,1 +DA:128,2 +DA:129,2 +DA:133,2 +DA:137,2 +DA:138,2 +DA:140,2 +DA:148,2 +DA:149,1 +DA:152,1 +DA:156,1 +DA:157,0 +DA:158,0 +DA:160,0 +DA:166,0 +LF:59 +LH:55 +BRDA:29,0,0,1 +BRDA:29,0,1,1 +BRDA:44,1,0,2 +BRDA:44,1,1,2 +BRDA:45,2,0,2 +BRDA:45,2,1,1 +BRDA:62,3,0,4 +BRDA:62,3,1,4 +BRDA:63,4,0,4 +BRDA:63,4,1,4 +BRDA:66,5,0,2 +BRDA:66,5,1,2 +BRDA:66,6,0,4 +BRDA:66,6,1,3 +BRDA:81,7,0,1 +BRDA:81,7,1,1 +BRDA:101,8,0,1 +BRDA:101,8,1,1 +BRDA:102,9,0,1 +BRDA:102,9,1,1 +BRDA:148,10,0,1 +BRDA:148,10,1,1 +BRF:22 +BRH:22 +end_of_record +TN: +SF:src/lib/constants.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:4,2 +DA:5,0 +DA:8,2 +DA:9,2 +DA:10,2 +DA:11,2 +LF:8 +LH:7 +BRDA:4,0,0,0 +BRDA:4,0,1,2 +BRDA:9,1,0,2 +BRDA:9,1,1,0 +BRF:4 +BRH:2 +end_of_record +TN: +SF:src/lib/prismaClient.ts +FNF:0 +FNH:0 +DA:1,3 +DA:4,3 +DA:9,3 +DA:12,3 +DA:13,3 +LF:5 +LH:5 +BRDA:10,0,0,0 +BRDA:10,0,1,3 +BRDA:10,1,0,3 +BRDA:10,1,1,3 +BRDA:12,2,0,3 +BRDA:12,2,1,0 +BRF:6 +BRH:4 +end_of_record +TN: +SF:src/lib/socket.ts +FN:7,(anonymous_0) +FN:15,(anonymous_1) +FN:18,(anonymous_2) +FN:23,(anonymous_3) +FN:31,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:1,0 +DA:5,0 +DA:7,0 +DA:8,0 +DA:15,0 +DA:16,0 +DA:18,0 +DA:19,0 +DA:20,0 +DA:23,0 +DA:24,0 +DA:28,0 +DA:31,0 +DA:32,0 +DA:33,0 +DA:35,0 +LF:16 +LH:0 +BRDA:32,0,0,0 +BRDA:32,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src/lib/withAsync.ts +FN:3,(anonymous_7) +FN:4,(anonymous_8) +FN:4,(anonymous_9) +FNF:3 +FNH:3 +FNDA:122,(anonymous_7) +FNDA:144,(anonymous_8) +FNDA:144,(anonymous_9) +DA:3,6 +DA:4,144 +DA:5,144 +DA:6,144 +DA:8,21 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/lib/errors/BadRequestError.ts +FN:2,(anonymous_0) +FNF:1 +FNH:0 +FNDA:0,(anonymous_0) +DA:3,0 +DA:4,0 +DA:6,0 +DA:10,3 +LF:4 +LH:1 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/lib/errors/NotFoundError.ts +FN:2,(anonymous_0) +FNF:1 +FNH:1 +FNDA:9,(anonymous_0) +DA:3,9 +DA:5,9 +DA:7,9 +DA:11,4 +LF:4 +LH:4 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/middlewares/authMiddleware.ts +FN:13,(anonymous_8) +FN:13,(anonymous_9) +FNF:2 +FNH:2 +FNDA:50,(anonymous_8) +FNDA:50,(anonymous_9) +DA:1,3 +DA:2,3 +DA:5,3 +DA:13,50 +DA:14,50 +DA:15,50 +DA:17,50 +DA:18,10 +DA:21,40 +DA:23,40 +DA:25,40 +DA:29,40 +DA:30,2 +DA:33,38 +DA:34,38 +DA:36,0 +LF:16 +LH:15 +BRDA:17,0,0,10 +BRDA:17,0,1,40 +BRDA:17,1,0,50 +BRDA:17,1,1,40 +BRDA:23,2,0,40 +BRDA:23,2,1,0 +BRDA:29,3,0,2 +BRDA:29,3,1,38 +BRF:8 +BRH:7 +end_of_record +TN: +SF:src/middlewares/validate.ts +FN:6,(anonymous_0) +FN:20,(anonymous_1) +FNF:2 +FNH:1 +FNDA:4,(anonymous_0) +FNDA:0,(anonymous_1) +DA:1,3 +DA:2,3 +DA:6,3 +DA:7,4 +DA:9,4 +DA:10,2 +DA:12,2 +DA:20,3 +DA:21,0 +DA:22,0 +DA:23,0 +DA:25,0 +LF:12 +LH:8 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routers/articlesRouter.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:3,2 +DA:12,2 +DA:13,2 +DA:15,2 +DA:17,2 +DA:18,2 +DA:20,2 +DA:22,2 +DA:23,2 +DA:24,2 +DA:25,2 +DA:26,2 +DA:27,2 +DA:29,2 +LF:16 +LH:16 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routers/authRoutes.ts +FNF:0 +FNH:0 +DA:1,3 +DA:2,3 +DA:3,3 +DA:4,3 +DA:6,3 +DA:8,3 +DA:9,3 +DA:10,3 +DA:12,3 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routers/commentsRouter.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:3,2 +DA:4,2 +DA:6,2 +DA:8,2 +DA:9,2 +DA:10,2 +DA:12,2 +LF:9 +LH:9 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routers/imagesRouter.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:3,2 +DA:5,2 +DA:8,2 +DA:14,2 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routers/productsRouter.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:3,2 +DA:10,2 +DA:11,2 +DA:12,2 +DA:14,2 +DA:16,2 +DA:17,2 +DA:20,2 +DA:23,2 +DA:24,2 +DA:25,2 +DA:28,2 +DA:29,2 +DA:32,2 +DA:34,2 +LF:17 +LH:17 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/routers/userRoutes.ts +FNF:0 +FNH:0 +DA:1,1 +DA:2,1 +DA:3,1 +DA:4,1 +DA:5,1 +DA:8,1 +DA:11,1 +DA:12,1 +DA:13,1 +DA:16,1 +DA:17,1 +DA:20,1 +DA:21,1 +DA:22,1 +DA:23,1 +DA:26,1 +DA:28,1 +LF:17 +LH:17 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/socket/socket.ts +FN:4,(anonymous_0) +FN:12,(anonymous_1) +FN:15,(anonymous_2) +FN:20,(anonymous_3) +FN:28,(anonymous_4) +FNF:5 +FNH:0 +FNDA:0,(anonymous_0) +FNDA:0,(anonymous_1) +FNDA:0,(anonymous_2) +FNDA:0,(anonymous_3) +FNDA:0,(anonymous_4) +DA:1,2 +DA:4,2 +DA:5,0 +DA:12,0 +DA:13,0 +DA:15,0 +DA:16,0 +DA:17,0 +DA:20,0 +DA:21,0 +DA:25,0 +DA:28,2 +DA:29,0 +DA:30,0 +LF:14 +LH:3 +BRDA:29,0,0,0 +BRDA:29,0,1,0 +BRF:2 +BRH:0 +end_of_record +TN: +SF:src/structs/articlesStructs.ts +FN:7,(anonymous_0) +FNF:1 +FNH:1 +FNDA:4,(anonymous_0) +DA:1,2 +DA:2,2 +DA:4,2 +DA:6,2 +DA:7,4 +DA:12,2 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/structs/authStructs.ts +FNF:0 +FNH:0 +DA:1,3 +DA:3,3 +DA:9,3 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/structs/commentsStruct.ts +FNF:0 +FNH:0 +DA:1,2 +DA:2,2 +DA:4,2 +DA:8,2 +DA:9,2 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/structs/commonStructs.ts +FN:3,(anonymous_0) +FNF:1 +FNH:1 +FNDA:41,(anonymous_0) +DA:1,3 +DA:3,41 +DA:5,3 +DA:9,3 +DA:16,3 +LF:5 +LH:5 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/structs/productsStruct.ts +FN:5,(anonymous_0) +FNF:1 +FNH:1 +FNDA:11,(anonymous_0) +DA:1,3 +DA:2,3 +DA:4,3 +DA:5,11 +DA:12,3 +DA:14,3 +LF:6 +LH:6 +BRF:0 +BRH:0 +end_of_record +TN: +SF:src/structs/userStructs.ts +FNF:0 +FNH:0 +DA:1,1 +DA:3,1 +DA:8,1 +LF:3 +LH:3 +BRF:0 +BRH:0 +end_of_record diff --git a/coverage/prettify.css b/coverage/prettify.css new file mode 100644 index 00000000..b317a7cd --- /dev/null +++ b/coverage/prettify.css @@ -0,0 +1 @@ +.pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} diff --git a/coverage/prettify.js b/coverage/prettify.js new file mode 100644 index 00000000..b3225238 --- /dev/null +++ b/coverage/prettify.js @@ -0,0 +1,2 @@ +/* eslint-disable */ +window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;arat[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); diff --git a/coverage/sort-arrow-sprite.png b/coverage/sort-arrow-sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed68316eb3f65dec9063332d2f69bf3093bbfab GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^>_9Bd!3HEZxJ@+%Qh}Z>jv*C{$p!i!8j}?a+@3A= zIAGwzjijN=FBi!|L1t?LM;Q;gkwn>2cAy-KV{dn nf0J1DIvEHQu*n~6U}x}qyky7vi4|9XhBJ7&`njxgN@xNA8m%nc literal 0 HcmV?d00001 diff --git a/coverage/sorter.js b/coverage/sorter.js new file mode 100644 index 00000000..4ed70ae5 --- /dev/null +++ b/coverage/sorter.js @@ -0,0 +1,210 @@ +/* eslint-disable */ +var addSorting = (function() { + 'use strict'; + var cols, + currentSort = { + index: 0, + desc: false + }; + + // returns the summary table element + function getTable() { + return document.querySelector('.coverage-summary'); + } + // returns the thead element of the summary table + function getTableHeader() { + return getTable().querySelector('thead tr'); + } + // returns the tbody element of the summary table + function getTableBody() { + return getTable().querySelector('tbody'); + } + // returns the th element for nth column + function getNthColumn(n) { + return getTableHeader().querySelectorAll('th')[n]; + } + + function onFilterInput() { + const searchValue = document.getElementById('fileSearch').value; + const rows = document.getElementsByTagName('tbody')[0].children; + + // Try to create a RegExp from the searchValue. If it fails (invalid regex), + // it will be treated as a plain text search + let searchRegex; + try { + searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive + } catch (error) { + searchRegex = null; + } + + for (let i = 0; i < rows.length; i++) { + const row = rows[i]; + let isMatch = false; + + if (searchRegex) { + // If a valid regex was created, use it for matching + isMatch = searchRegex.test(row.textContent); + } else { + // Otherwise, fall back to the original plain text search + isMatch = row.textContent + .toLowerCase() + .includes(searchValue.toLowerCase()); + } + + row.style.display = isMatch ? '' : 'none'; + } + } + + // loads the search box + function addSearchBox() { + var template = document.getElementById('filterTemplate'); + var templateClone = template.content.cloneNode(true); + templateClone.getElementById('fileSearch').oninput = onFilterInput; + template.parentElement.appendChild(templateClone); + } + + // loads all columns + function loadColumns() { + var colNodes = getTableHeader().querySelectorAll('th'), + colNode, + cols = [], + col, + i; + + for (i = 0; i < colNodes.length; i += 1) { + colNode = colNodes[i]; + col = { + key: colNode.getAttribute('data-col'), + sortable: !colNode.getAttribute('data-nosort'), + type: colNode.getAttribute('data-type') || 'string' + }; + cols.push(col); + if (col.sortable) { + col.defaultDescSort = col.type === 'number'; + colNode.innerHTML = + colNode.innerHTML + ''; + } + } + return cols; + } + // attaches a data attribute to every tr element with an object + // of data values keyed by column name + function loadRowData(tableRow) { + var tableCols = tableRow.querySelectorAll('td'), + colNode, + col, + data = {}, + i, + val; + for (i = 0; i < tableCols.length; i += 1) { + colNode = tableCols[i]; + col = cols[i]; + val = colNode.getAttribute('data-value'); + if (col.type === 'number') { + val = Number(val); + } + data[col.key] = val; + } + return data; + } + // loads all row data + function loadData() { + var rows = getTableBody().querySelectorAll('tr'), + i; + + for (i = 0; i < rows.length; i += 1) { + rows[i].data = loadRowData(rows[i]); + } + } + // sorts the table using the data for the ith column + function sortByIndex(index, desc) { + var key = cols[index].key, + sorter = function(a, b) { + a = a.data[key]; + b = b.data[key]; + return a < b ? -1 : a > b ? 1 : 0; + }, + finalSorter = sorter, + tableBody = document.querySelector('.coverage-summary tbody'), + rowNodes = tableBody.querySelectorAll('tr'), + rows = [], + i; + + if (desc) { + finalSorter = function(a, b) { + return -1 * sorter(a, b); + }; + } + + for (i = 0; i < rowNodes.length; i += 1) { + rows.push(rowNodes[i]); + tableBody.removeChild(rowNodes[i]); + } + + rows.sort(finalSorter); + + for (i = 0; i < rows.length; i += 1) { + tableBody.appendChild(rows[i]); + } + } + // removes sort indicators for current column being sorted + function removeSortIndicators() { + var col = getNthColumn(currentSort.index), + cls = col.className; + + cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); + col.className = cls; + } + // adds sort indicators for current column being sorted + function addSortIndicators() { + getNthColumn(currentSort.index).className += currentSort.desc + ? ' sorted-desc' + : ' sorted'; + } + // adds event listeners for all sorter widgets + function enableUI() { + var i, + el, + ithSorter = function ithSorter(i) { + var col = cols[i]; + + return function() { + var desc = col.defaultDescSort; + + if (currentSort.index === i) { + desc = !currentSort.desc; + } + sortByIndex(i, desc); + removeSortIndicators(); + currentSort.index = i; + currentSort.desc = desc; + addSortIndicators(); + }; + }; + for (i = 0; i < cols.length; i += 1) { + if (cols[i].sortable) { + // add the click event handler on the th so users + // dont have to click on those tiny arrows + el = getNthColumn(i).querySelector('.sorter').parentElement; + if (el.addEventListener) { + el.addEventListener('click', ithSorter(i)); + } else { + el.attachEvent('onclick', ithSorter(i)); + } + } + } + } + // adds sorting functionality to the UI + return function() { + if (!getTable()) { + return; + } + cols = loadColumns(); + loadData(); + addSearchBox(); + addSortIndicators(); + enableUI(); + }; +})(); + +window.addEventListener('load', addSorting); diff --git a/coverage/src/controllers/articlesController.ts.html b/coverage/src/controllers/articlesController.ts.html new file mode 100644 index 00000000..e4aaace6 --- /dev/null +++ b/coverage/src/controllers/articlesController.ts.html @@ -0,0 +1,475 @@ + + + + + + Code coverage report for src/controllers/articlesController.ts + + + + + + + + + +
+
+

All files / src/controllers articlesController.ts

+
+ +
+ 94.11% + Statements + 64/68 +
+ + +
+ 72.72% + Branches + 16/22 +
+ + +
+ 100% + Functions + 14/14 +
+ + +
+ 96.42% + Lines + 54/56 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +1312x +2x +2x +2x +2x +2x +  +  +  +  +2x +  +  +3x +3x +  +1x +  +  +  +  +  +  +  +  +1x +  +  +  +3x +3x +  +2x +2x +  +1x +  +  +  +2x +2x +2x +  +2x +  +2x +1x +  +  +  +1x +  +  +  +  +1x +  +  +2x +2x +  +2x +  +2x +1x +  +  +  +1x +  +1x +  +  +4x +4x +  +4x +  +  +  +4x +4x +  +  +  +  +  +  +4x +  +  +  +2x +2x +2x +  +1x +1x +  +1x +  +  +  +  +  +  +  +1x +  +  +  +2x +1x +1x +  +1x +1x +  +1x +  +  +  +  +  +  +1x +1x +1x +  +1x + 
import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient'; 
+import { withAsync } from '../lib/withAsync';
+import NotFoundError from '../lib/errors/NotFoundError';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateArticleBodyStruct,
+  UpdateArticleBodyStruct,
+  GetArticleListParamsStruct,
+} from '../structs/articlesStructs';
+import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import type { Request, Response } from 'express';
+ 
+export const createArticle = withAsync(async (req: Request, res: Response) => {
+  const { title, content, image } = create(req.body, CreateArticleBodyStruct);
+ 
+  const article = await prisma.article.create({ 
+    data: {
+      title,
+      content,
+      image,
+      userId: req.user.id 
+    } 
+  });
+ 
+  res.status(201).send(article);
+});
+ 
+ 
+export const getArticle = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const article = await prisma.article.findUnique({ where: { id } });
+  if (!article) throw new NotFoundError('article', id.toString());
+ 
+  res.send(article);
+});
+ 
+ 
+export const updateArticle = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+  const { title, content, image } = create(req.body, UpdateArticleBodyStruct);
+ 
+  const existingArticle = await prisma.article.findUnique({ where: { id } });
+  
+  if (!existingArticle) throw new NotFoundError('article', id.toString());
+  Iif (existingArticle.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 게시글을 수정할 권한이 없습니다.' });
+  }
+ 
+  const updatedArticle = await prisma.article.update({
+    where: { id },
+    data: { title, content, image },
+  });
+ 
+  res.send(updatedArticle);
+});
+ 
+export const deleteArticle = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const existingArticle = await prisma.article.findUnique({ where: { id } });
+  
+  if (!existingArticle) throw new NotFoundError('article', id.toString());
+  Iif (existingArticle.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 게시글을 삭제할 권한이 없습니다.' });
+  }
+ 
+  await prisma.article.delete({ where: { id } });
+ 
+  res.status(204).send();
+});
+ 
+export const getArticleList = withAsync(async (req: Request, res: Response) => {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct);
+ 
+  const where = {
+    title: keyword ? { contains: keyword } : undefined,
+  };
+ 
+  const totalCount = await prisma.article.count({ where });
+  const articles = await prisma.article.findMany({
+    skip: (page - 1) * pageSize,
+    take: pageSize,
+    orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { id: 'asc' },
+    where,
+  });
+ 
+  res.send({ list: articles, totalCount });
+});
+ 
+ 
+export const createComment = withAsync(async (req: Request, res: Response) => {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+ 
+  const existingArticle = await prisma.article.findUnique({ where: { id: articleId } });
+  Iif (!existingArticle) throw new NotFoundError('article', articleId.toString());
+ 
+  const comment = await prisma.comment.create({
+    data: {
+      articleId,
+      content,
+      userId: req.user.id, 
+    },
+  });
+ 
+  res.status(201).send(comment);
+});
+ 
+ 
+export const getCommentList = withAsync(async (req: Request, res: Response) => {
+  const { id: articleId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+ 
+  const article = await prisma.article.findUnique({ where: { id: articleId } });
+  Iif (!article) throw new NotFoundError('article', articleId.toString());
+ 
+  const commentsWithCursor = await prisma.comment.findMany({
+    cursor: cursor ? { id: cursor } : undefined,
+    take: limit + 1,
+    where: { articleId },
+    orderBy: { createdAt: 'desc' },
+  });
+ 
+  const hasNextPage = commentsWithCursor.length > limit;
+  const comments = commentsWithCursor.slice(0, limit);
+  const nextCursor = hasNextPage ? commentsWithCursor[limit].id : null;
+ 
+  res.send({ list: comments, nextCursor });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/authController.ts.html b/coverage/src/controllers/authController.ts.html new file mode 100644 index 00000000..12a3a66b --- /dev/null +++ b/coverage/src/controllers/authController.ts.html @@ -0,0 +1,370 @@ + + + + + + Code coverage report for src/controllers/authController.ts + + + + + + + + + +
+
+

All files / src/controllers authController.ts

+
+ +
+ 97.95% + Statements + 48/49 +
+ + +
+ 77.77% + Branches + 14/18 +
+ + +
+ 100% + Functions + 7/7 +
+ + +
+ 97.72% + Lines + 43/44 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +963x +3x +3x +  +3x +  +3x +  +  +3x +2x +2x +  +2x +2x +  +2x +  +  +  +3x +2x +  +2x +2x +1x +  +  +1x +1x +  +  +  +1x +1x +  +  +  +3x +3x +  +3x +3x +1x +  +  +2x +2x +1x +  +  +1x +  +1x +  +  +  +  +1x +1x +  +  +  +  +  +  +  +3x +3x +  +3x +1x +  +  +2x +  +2x +  +1x +  +1x +  +  +  +1x +  +1x +  +  +  +  +1x +  +  +  + 
import { PrismaClient, User } from '@prisma/client';
+import bcrypt from 'bcrypt';
+import jwt from 'jsonwebtoken';
+import type { Request, Response } from 'express';
+import { withAsync } from '../lib/withAsync';
+ 
+const prisma = new PrismaClient();
+ 
+ 
+const generateTokens = (user: User) => {
+  const accessSecret = process.env.JWT_SECRET || 'access_secret';
+  const refreshSecret = process.env.REFRESH_SECRET || 'refresh_secret';
+ 
+  const accessToken = jwt.sign({ id: user.id }, accessSecret, { expiresIn: '15m' });
+  const refreshToken = jwt.sign({ id: user.id }, refreshSecret, { expiresIn: '7d' });
+  
+  return { accessToken, refreshToken };
+};
+ 
+ 
+export const signUp = withAsync(async (req: Request, res: Response) => {
+  const { email, nickname, password } = req.body;
+ 
+  const existingUser = await prisma.user.findUnique({ where: { email } });
+  if (existingUser) {
+    return res.status(400).json({ message: '이미 사용 중인 이메일입니다.' });
+  }
+ 
+  const hashedPassword = await bcrypt.hash(password, 10);
+  const user = await prisma.user.create({
+    data: { email, nickname, password: hashedPassword },
+  });
+ 
+  const { password: _, refreshToken: __, ...userWithoutPassword } = user;
+  res.status(201).json(userWithoutPassword);
+});
+ 
+ 
+export const signIn = withAsync(async (req: Request, res: Response) => {
+  const { email, password } = req.body;
+ 
+  const user = await prisma.user.findUnique({ where: { email } });
+  if (!user) {
+    return res.status(401).json({ message: '이메일 또는 비밀번호가 일치하지 않습니다.' });
+  }
+ 
+  const isPasswordValid = await bcrypt.compare(password, user.password);
+  if (!isPasswordValid) {
+    return res.status(401).json({ message: '이메일 또는 비밀번호가 일치하지 않습니다.' });
+  }
+ 
+  const { accessToken, refreshToken } = generateTokens(user);
+  
+  await prisma.user.update({
+    where: { id: user.id },
+    data: { refreshToken },
+  });
+ 
+  const { password: _, refreshToken: __, ...userWithoutPassword } = user;
+  res.status(200).json({
+    accessToken,
+    refreshToken, 
+    user: userWithoutPassword,
+  });
+});
+ 
+ 
+export const refresh = withAsync(async (req: Request, res: Response) => {
+  const { refreshToken } = req.body;
+ 
+  if (!refreshToken) {
+    return res.status(401).json({ message: '리프레시 토큰이 없습니다.' });
+  }
+ 
+  const refreshSecret = process.env.REFRESH_SECRET || 'refresh_secret';
+ 
+  const decoded = jwt.verify(refreshToken, refreshSecret) as { id: number };
+  
+  const user = await prisma.user.findUnique({ where: { id: decoded.id } });
+  
+  Iif (!user || user.refreshToken !== refreshToken) {
+    return res.status(403).json({ message: '유효하지 않은 리프레시 토큰입니다.' });
+  }
+ 
+  const tokens = generateTokens(user);
+  
+  await prisma.user.update({
+    where: { id: user.id },
+    data: { refreshToken: tokens.refreshToken },
+  });
+ 
+  res.json({
+    accessToken: tokens.accessToken,
+    refreshToken: tokens.refreshToken,
+  });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/commentsController.ts.html b/coverage/src/controllers/commentsController.ts.html new file mode 100644 index 00000000..215ad565 --- /dev/null +++ b/coverage/src/controllers/commentsController.ts.html @@ -0,0 +1,397 @@ + + + + + + Code coverage report for src/controllers/commentsController.ts + + + + + + + + + +
+
+

All files / src/controllers commentsController.ts

+
+ +
+ 56% + Statements + 28/50 +
+ + +
+ 35% + Branches + 7/20 +
+ + +
+ 50% + Functions + 4/8 +
+ + +
+ 56.52% + Lines + 26/46 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +1052x +2x +2x +2x +2x +2x +  +  +  +2x +2x +2x +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +  +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +  +2x +1x +1x +  +1x +1x +  +  +  +1x +  +  +  +  +  +  +1x +1x +1x +  +1x +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient'; // 통일된 이름 사용
+import { withAsync } from '../lib/withAsync';
+import { UpdateCommentBodyStruct, CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct';
+import NotFoundError from '../lib/errors/NotFoundError';
+import { IdParamsStruct } from '../structs/commonStructs';
+import type { Request, Response } from 'express';
+ 
+ 
+export const createComment = withAsync(async (req: Request, res: Response) => {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, CreateCommentBodyStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id: productId } });
+  Iif (!existingProduct) {
+    throw new NotFoundError('product', productId.toString());
+  }
+ 
+  const comment = await prisma.comment.create({ 
+    data: { 
+      productId, 
+      content,
+      userId: req.user.id 
+    } 
+  });
+ 
+  Iif (existingProduct.userId && existingProduct.userId !== req.user.id) {
+    await prisma.notification.create({
+      data: {
+        type: 'COMMENT',
+        userId: existingProduct.userId,
+        message: `[${existingProduct.name}] 상품에 새로운 댓글이 달렸습니다: ${content.substring(0, 15)}...`,
+        productId: productId,
+      },
+    });
+  }
+ 
+  res.status(201).send(comment);
+});
+ 
+ 
+export const getCommentList = withAsync(async (req: Request, res: Response) => {
+  const { id: productId } = create(req.params, IdParamsStruct);
+  const { cursor, limit } = create(req.query, GetCommentListParamsStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id: productId } });
+  Iif (!existingProduct) {
+    throw new NotFoundError('product', productId.toString());
+  }
+ 
+  const commentsWithCursor = await prisma.comment.findMany({
+    cursor: cursor ? { id: cursor } : undefined,
+    take: limit + 1,
+    where: { productId },
+    orderBy: { createdAt: 'desc' }, 
+  });
+ 
+  const hasNextPage = commentsWithCursor.length > limit;
+  const comments = commentsWithCursor.slice(0, limit);
+  const nextCursor = hasNextPage ? commentsWithCursor[limit].id : null;
+ 
+  res.send({
+    list: comments,
+    nextCursor,
+  });
+});
+ 
+export const updateComment = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+  const { content } = create(req.body, UpdateCommentBodyStruct);
+ 
+  const existingComment = await prisma.comment.findUnique({ where: { id } });
+  if (!existingComment) {
+    throw new NotFoundError('comment', id.toString());
+  }
+ 
+  if (existingComment.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 댓글을 수정할 권한이 없습니다.' });
+  }
+ 
+  const updatedComment = await prisma.comment.update({
+    where: { id },
+    data: { content },
+  });
+ 
+  res.send(updatedComment);
+});
+ 
+ 
+export const deleteComment = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const existingComment = await prisma.comment.findUnique({ where: { id } });
+  if (!existingComment) {
+    throw new NotFoundError('comment', id.toString());
+  }
+ 
+  if (existingComment.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 댓글을 삭제할 권한이 없습니다.' });
+  }
+ 
+  await prisma.comment.delete({ where: { id } });
+ 
+  res.status(204).send();
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/errorController.ts.html b/coverage/src/controllers/errorController.ts.html new file mode 100644 index 00000000..ef27e443 --- /dev/null +++ b/coverage/src/controllers/errorController.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/controllers/errorController.ts + + + + + + + + + +
+
+

All files / src/controllers errorController.ts

+
+ +
+ 58.82% + Statements + 10/17 +
+ + +
+ 53.84% + Branches + 7/13 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 58.82% + Lines + 10/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +303x +  +3x +3x +  +3x +  +  +  +3x +15x +9x +  +  +6x +  +  +  +6x +6x +  +  +  +  +  +  +  +  +  + 
import { StructError } from 'superstruct';
+import type { Request, Response, NextFunction } from 'express'; // ✅ Express 타입 임포트
+import BadRequestError from '../lib/errors/BadRequestError';
+import NotFoundError from '../lib/errors/NotFoundError';
+ 
+export function defaultNotFoundHandler(req: Request, res: Response, _next: NextFunction) {
+  return res.status(404).send({ message: 'Not found' });
+}
+ 
+export function globalErrorHandler(err: any, req: Request, res: Response, _next: NextFunction) {
+  if (err instanceof StructError || err instanceof BadRequestError) {
+    return res.status(400).send({ message: err.message });
+  }
+ 
+  Iif (err instanceof SyntaxError && (err as any).status === 400 && 'body' in err) {
+    return res.status(400).send({ message: 'Invalid JSON' });
+  }
+ 
+  Eif (err instanceof NotFoundError) {
+    return res.status(404).send({ message: err.message });
+  }
+ 
+  if (err.code) {
+    console.error('DB/Code Error:', err);
+    return res.status(500).send({ message: 'Failed to process data' });
+  }
+ 
+  console.error('Unexpected Error:', err);
+  return res.status(500).send({ message: 'Internal server error' });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/imagesController.ts.html b/coverage/src/controllers/imagesController.ts.html new file mode 100644 index 00000000..f33daf1d --- /dev/null +++ b/coverage/src/controllers/imagesController.ts.html @@ -0,0 +1,229 @@ + + + + + + Code coverage report for src/controllers/imagesController.ts + + + + + + + + + +
+
+

All files / src/controllers imagesController.ts

+
+ +
+ 33.33% + Statements + 7/21 +
+ + +
+ 0% + Branches + 0/4 +
+ + +
+ 0% + Functions + 0/4 +
+ + +
+ 33.33% + Lines + 7/21 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +492x +2x +2x +2x +2x +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +  +  +  +  +  + 
import multer, { FileFilterCallback } from 'multer';
+import path from 'path';
+import { v4 as uuidv4 } from 'uuid';
+import { PUBLIC_PATH, STATIC_PATH } from '../lib/constants';
+import BadRequestError from '../lib/errors/BadRequestError';
+import type { Request, Response } from 'express';
+ 
+type DestinationCallback = (error: Error | null, destination: string) => void;
+type FileNameCallback = (error: Error | null, filename: string) => void;
+ 
+ 
+export const upload = multer({
+  storage: multer.diskStorage({
+    destination(req: Request, file: Express.Multer.File, cb: DestinationCallback) {
+      cb(null, PUBLIC_PATH);
+    },
+    filename(req: Request, file: Express.Multer.File, cb: FileNameCallback) {
+      const ext = path.extname(file.originalname);
+      const filename = `${uuidv4()}${ext}`;
+      cb(null, filename);
+    },
+  }),
+ 
+  limits: {
+    fileSize: 5 * 1024 * 1024, // 5MB 제한
+  },
+ 
+  fileFilter: (req: Request, file: Express.Multer.File, cb: FileFilterCallback) => {
+    const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg'];
+    
+    if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) {
+      const err = new BadRequestError('Only png, jpeg, and jpg are allowed');
+      return cb(err as any, false); 
+    }
+    cb(null, true);
+  },
+});
+ 
+ 
+export async function uploadImage(req: Request, res: Response) {
+  if (!req.file) {
+    throw new BadRequestError('파일이 업로드되지 않았습니다.');
+  }
+ 
+  const host = req.get('host');
+  const url = `http://${host}/${STATIC_PATH}/${req.file.filename}`;
+  
+  return res.send({ url });
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/index.html b/coverage/src/controllers/index.html new file mode 100644 index 00000000..6020bae9 --- /dev/null +++ b/coverage/src/controllers/index.html @@ -0,0 +1,221 @@ + + + + + + Code coverage report for src/controllers + + + + + + + + + +
+
+

All files src/controllers

+
+ +
+ 85.71% + Statements + 318/371 +
+ + +
+ 73.28% + Branches + 96/131 +
+ + +
+ 85.33% + Functions + 64/75 +
+ + +
+ 85.18% + Lines + 276/324 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesController.ts +
+
94.11%64/6872.72%16/22100%14/1496.42%54/56
authController.ts +
+
97.95%48/4977.77%14/18100%7/797.72%43/44
commentsController.ts +
+
56%28/5035%7/2050%4/856.52%26/46
errorController.ts +
+
58.82%10/1753.84%7/1350%1/258.82%10/17
imagesController.ts +
+
33.33%7/210%0/40%0/433.33%7/21
likeController.ts +
+
100%35/3583.33%10/12100%6/6100%32/32
productsController.ts +
+
100%57/57100%20/20100%12/12100%49/49
userController.ts +
+
93.24%69/74100%22/2290.9%20/2293.22%55/59
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/likeController.ts.html b/coverage/src/controllers/likeController.ts.html new file mode 100644 index 00000000..5307df48 --- /dev/null +++ b/coverage/src/controllers/likeController.ts.html @@ -0,0 +1,376 @@ + + + + + + Code coverage report for src/controllers/likeController.ts + + + + + + + + + +
+
+

All files / src/controllers likeController.ts

+
+ +
+ 100% + Statements + 35/35 +
+ + +
+ 83.33% + Branches + 10/12 +
+ + +
+ 100% + Functions + 6/6 +
+ + +
+ 100% + Lines + 32/32 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +983x +  +3x +  +3x +  +  +3x +3x +3x +  +3x +  +  +  +  +  +  +  +  +2x +1x +  +  +1x +  +  +1x +  +  +  +  +  +1x +  +  +  +  +  +  +3x +2x +2x +  +2x +  +  +  +  +  +  +  +  +2x +1x +1x +  +1x +  +  +  +  +  +1x +  +  +  +  +4x +4x +4x +  +4x +  +  +  +  +  +  +4x +1x +  +  +3x +3x +3x +  +  +  +  +  +  +  +3x +  +  +3x + 
import { PrismaClient } from '@prisma/client';
+import type { Request, Response } from 'express';
+import { withAsync } from '../lib/withAsync';
+ 
+const prisma = new PrismaClient();
+ 
+ 
+export const toggleProductLike = withAsync(async (req: Request, res: Response) => {
+  const { id: productId } = req.params;
+  const userId = req.user.id; 
+ 
+  const existingLike = await prisma.productLike.findUnique({
+    where: {
+      userId_productId: {
+        userId: userId,
+        productId: Number(productId),
+      },
+    },
+  });
+ 
+  if (existingLike) {
+    await prisma.productLike.delete({
+      where: { id: existingLike.id },
+    });
+    res.json({ isLiked: false });
+  } else {
+    // 좋아요 생성
+    await prisma.productLike.create({
+      data: {
+        userId: userId,
+        productId: Number(productId),
+      },
+    });
+    res.json({ isLiked: true });
+  }
+});
+ 
+/**
+ * 💡 게시글 좋아요 토글
+ */
+export const toggleArticleLike = withAsync(async (req: Request, res: Response) => {
+  const { id: articleId } = req.params;
+  const userId = req.user.id;
+ 
+  const existingLike = await prisma.articleLike.findUnique({
+    where: {
+      userId_articleId: {
+        userId: userId,
+        articleId: Number(articleId),
+      },
+    },
+  });
+ 
+  if (existingLike) {
+    await prisma.articleLike.delete({ where: { id: existingLike.id } });
+    res.json({ isLiked: false });
+  } else {
+    await prisma.articleLike.create({
+      data: { 
+        userId, 
+        articleId: Number(articleId) 
+      },
+    });
+    res.json({ isLiked: true });
+  }
+});
+ 
+ 
+export const getProductDetail = withAsync(async (req: Request, res: Response) => {
+  const { id } = req.params;
+  const userId = req.user?.id; 
+ 
+  const product = await prisma.product.findUnique({
+    where: { id: Number(id) },
+    include: {
+      _count: { select: { productLikes: true } } 
+    }
+  });
+ 
+  if (!product) {
+    return res.status(404).json({ message: '상품을 찾을 수 없습니다.' });
+  }
+ 
+  let isLiked = false;
+  Eif (userId) {
+    const like = await prisma.productLike.findUnique({
+      where: { 
+        userId_productId: { 
+          userId, 
+          productId: Number(id) 
+        } 
+      }
+    });
+    isLiked = !!like;
+  }
+ 
+  res.json({ ...product, isLiked });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/productsController.ts.html b/coverage/src/controllers/productsController.ts.html new file mode 100644 index 00000000..629d0225 --- /dev/null +++ b/coverage/src/controllers/productsController.ts.html @@ -0,0 +1,469 @@ + + + + + + Code coverage report for src/controllers/productsController.ts + + + + + + + + + +
+
+

All files / src/controllers productsController.ts

+
+ +
+ 100% + Statements + 57/57 +
+ + +
+ 100% + Branches + 20/20 +
+ + +
+ 100% + Functions + 12/12 +
+ + +
+ 100% + Lines + 49/49 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +1293x +3x +3x +3x +3x +3x +  +  +  +  +3x +  +  +  +5x +5x +  +3x +  +  +  +  +  +  +  +  +  +  +2x +  +  +  +5x +5x +  +4x +4x +  +2x +  +  +  +6x +6x +6x +  +6x +6x +  +4x +1x +  +  +3x +  +3x +  +  +  +  +3x +2x +  +  +  +  +2x +1x +  +1x +2x +  +  +  +  +  +  +  +1x +1x +2x +  +  +  +  +  +  +  +  +  +3x +  +  +  +8x +8x +  +8x +  +  +  +  +  +8x +8x +  +  +  +  +  +  +8x +  +  +5x +5x +  +5x +5x +  +3x +1x +  +  +2x +  +2x +  + 
import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient'; 
+import { withAsync } from '../lib/withAsync';
+import NotFoundError from '../lib/errors/NotFoundError';
+import { IdParamsStruct } from '../structs/commonStructs';
+import {
+  CreateProductBodyStruct,
+  GetProductListParamsStruct,
+  UpdateProductBodyStruct,
+} from '../structs/productsStruct'; 
+import { emitNotification } from '../socket/socket'; 
+import type { Request, Response } from 'express';
+ 
+ 
+export const createProduct = withAsync(async (req: Request, res: Response) => {
+  const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct);
+ 
+  const product = await prisma.product.create({
+    data: { 
+      name, 
+      description, 
+      price, 
+      tags, 
+      images,
+      userId: req.user.id 
+    },
+  });
+ 
+  res.status(201).send(product);
+});
+ 
+ 
+export const getProduct = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const product = await prisma.product.findUnique({ where: { id } });
+  if (!product) throw new NotFoundError('product', id.toString());
+ 
+  res.send(product);
+});
+ 
+ 
+export const updateProduct = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+  const { name, description, price, tags, images } = create(req.body, UpdateProductBodyStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id } });
+  if (!existingProduct) throw new NotFoundError('product', id.toString());
+ 
+  if (existingProduct.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 상품을 수정할 권한이 없습니다.' });
+  }
+ 
+  const isPriceChanged = price !== undefined && existingProduct.price !== price;
+ 
+  const updatedProduct = await prisma.product.update({
+    where: { id },
+    data: { name, description, price, tags, images },
+  });
+ 
+  if (isPriceChanged) {
+    const likes = await prisma.productLike.findMany({
+      where: { productId: id },
+      select: { userId: true },
+    });
+ 
+    if (likes.length > 0) {
+      const message = `관심 상품 [${updatedProduct.name}]의 가격이 ${existingProduct.price}원에서 ${price}원으로 변경되었습니다!`;
+ 
+      await prisma.notification.createMany({
+        data: likes.map((like) => ({
+          type: 'PRICE_CHANGE',
+          userId: like.userId,
+          message: message,
+          productId: id,
+        })),
+      });
+ 
+      const io = req.app.get('io');
+      likes.forEach((like) => {
+        emitNotification(io, like.userId, {
+          type: 'PRICE_CHANGE',
+          message: message,
+          productId: id,
+          createdAt: new Date(),
+        });
+      });
+    }
+  }
+ 
+  res.send(updatedProduct);
+});
+ 
+ 
+export const getProductList = withAsync(async (req: Request, res: Response) => {
+  const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct);
+ 
+  const where = keyword
+    ? {
+        OR: [{ name: { contains: keyword } }, { description: { contains: keyword } }],
+      }
+    : undefined;
+ 
+  const totalCount = await prisma.product.count({ where });
+  const products = await prisma.product.findMany({
+    skip: (page - 1) * pageSize,
+    take: pageSize,
+    orderBy: orderBy === 'recent' ? { id: 'desc' } : { id: 'asc' },
+    where,
+  });
+ 
+  res.send({ list: products, totalCount });
+});
+ 
+export const deleteProduct = withAsync(async (req: Request, res: Response) => {
+  const { id } = create(req.params, IdParamsStruct);
+ 
+  const existingProduct = await prisma.product.findUnique({ where: { id } });
+  if (!existingProduct) throw new NotFoundError('product', id.toString());
+ 
+  if (existingProduct.userId !== req.user.id) {
+    return res.status(403).json({ message: '해당 상품을 삭제할 권한이 없습니다.' });
+  }
+ 
+  await prisma.product.delete({ where: { id } });
+ 
+  res.status(204).send();
+});
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/controllers/userController.ts.html b/coverage/src/controllers/userController.ts.html new file mode 100644 index 00000000..ab2134db --- /dev/null +++ b/coverage/src/controllers/userController.ts.html @@ -0,0 +1,583 @@ + + + + + + Code coverage report for src/controllers/userController.ts + + + + + + + + + +
+
+

All files / src/controllers userController.ts

+
+ +
+ 93.24% + Statements + 69/74 +
+ + +
+ 100% + Branches + 22/22 +
+ + +
+ 90.9% + Functions + 20/22 +
+ + +
+ 93.22% + Lines + 55/59 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +38 +39 +40 +41 +42 +43 +44 +45 +46 +47 +48 +49 +50 +51 +52 +53 +54 +55 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +66 +67 +68 +69 +70 +71 +72 +73 +74 +75 +76 +77 +78 +79 +80 +81 +82 +83 +84 +85 +86 +87 +88 +89 +90 +91 +92 +93 +94 +95 +96 +97 +98 +99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +1671x +1x +1x +1x +1x +  +  +1x +1x +1x +  +  +2x +2x +  +2x +  +  +  +  +2x +2x +  +  +3x +3x +  +2x +2x +1x +  +  +1x +1x +  +  +  +  +1x +  +  +  +2x +2x +2x +  +2x +  +  +  +  +  +  +  +  +  +2x +  +  +  +4x +4x +4x +4x +  +4x +2x +  +  +  +  +  +  +  +  +  +  +2x +  +  +2x +1x +  +  +  +  +  +  +  +  +  +  +1x +  +  +1x +  +  +  +1x +1x +1x +  +1x +  +  +  +  +  +  +  +  +  +1x +  +  +  +1x +1x +  +  +  +  +1x +  +  +  +2x +2x +  +  +  +2x +  +  +  +2x +2x +  +2x +  +  +  +  +  +  +  +2x +1x +  +  +1x +  +  +  +1x +  +  +  +  +  +  +  +  +  +  + 
import bcrypt from 'bcrypt';
+import { create } from 'superstruct';
+import { prismaClient as prisma } from '../lib/prismaClient';
+import { withAsync } from '../lib/withAsync';
+import { UpdateUserStruct, ChangePasswordStruct } from '../structs/userStructs';
+import type { Request, Response } from 'express';
+ 
+export const getMe = withAsync(async (req: Request, res: Response) => {
+  const { password, ...userWithoutPassword } = req.user;
+  res.json(userWithoutPassword);
+});
+ 
+export const updateMe = withAsync(async (req: Request, res: Response) => {
+  const { nickname, image } = create(req.body, UpdateUserStruct);
+ 
+  const updatedUser = await prisma.user.update({
+    where: { id: req.user.id },
+    data: { nickname, image },
+  });
+ 
+  const { password, ...userWithoutPassword } = updatedUser;
+  res.json(userWithoutPassword);
+});
+ 
+export const changePassword = withAsync(async (req: Request, res: Response) => {
+  const { currentPassword, newPassword } = create(req.body, ChangePasswordStruct);
+ 
+  const isMatch = await bcrypt.compare(currentPassword, req.user.password);
+  if (!isMatch) {
+    return res.status(401).json({ message: '현재 비밀번호가 일치하지 않습니다.' });
+  }
+ 
+  const hashedNewPassword = await bcrypt.hash(newPassword, 10);
+  await prisma.user.update({
+    where: { id: req.user.id },
+    data: { password: hashedNewPassword },
+  });
+ 
+  res.status(200).json({ message: '비밀번호가 성공적으로 변경되었습니다.' });
+});
+ 
+// ── 내 상품 목록 조회 ────────────────────────────────────────────
+export const getMyProducts = withAsync(async (req: Request, res: Response) => {
+  const page = Number(req.query.page) || 1;
+  const pageSize = Number(req.query.pageSize) || 10;
+ 
+  const [products, totalCount] = await Promise.all([
+    prisma.product.findMany({
+      where: { userId: req.user.id },
+      skip: (page - 1) * pageSize,
+      take: pageSize,
+      orderBy: { createdAt: 'desc' },
+    }),
+    prisma.product.count({ where: { userId: req.user.id } }),
+  ]);
+ 
+  res.json({ list: products, totalCount });
+});
+ 
+// ── 내가 좋아요한 상품/게시글 목록 조회 ─────────────────────────
+export const getMyLikedItems = withAsync(async (req: Request, res: Response) => {
+  const page = Number(req.query.page) || 1;
+  const pageSize = Number(req.query.pageSize) || 10;
+  const type = req.query.type as string | undefined; // 'product' | 'article'
+ 
+  if (!type || type === 'product') {
+    const [likes, totalCount] = await Promise.all([
+      prisma.productLike.findMany({
+        where: { userId: req.user.id },
+        include: { product: true },
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: { id: 'desc' },
+      }),
+      prisma.productLike.count({ where: { userId: req.user.id } }),
+    ]);
+ 
+    return res.json({ list: likes.map((l) => l.product), totalCount });
+  }
+ 
+  if (type === 'article') {
+    const [likes, totalCount] = await Promise.all([
+      prisma.articleLike.findMany({
+        where: { userId: req.user.id },
+        include: { article: true },
+        skip: (page - 1) * pageSize,
+        take: pageSize,
+        orderBy: { id: 'desc' },
+      }),
+      prisma.articleLike.count({ where: { userId: req.user.id } }),
+    ]);
+ 
+    return res.json({ list: likes.map((l) => l.article), totalCount });
+  }
+ 
+  res.status(400).json({ message: 'type은 product 또는 article 이어야 합니다.' });
+});
+ 
+// ── 내 알림 목록 조회 ────────────────────────────────────────────
+export const getMyNotifications = withAsync(async (req: Request, res: Response) => {
+  const page = Number(req.query.page) || 1;
+  const pageSize = Number(req.query.pageSize) || 20;
+ 
+  const [notifications, totalCount] = await Promise.all([
+    prisma.notification.findMany({
+      where: { userId: req.user.id },
+      skip: (page - 1) * pageSize,
+      take: pageSize,
+      orderBy: { createdAt: 'desc' },
+    }),
+    prisma.notification.count({ where: { userId: req.user.id } }),
+  ]);
+ 
+  res.json({ list: notifications, totalCount });
+});
+ 
+// ── 모든 알림 읽음 처리 ──────────────────────────────────────────
+export const readAllNotifications = withAsync(async (req: Request, res: Response) => {
+  await prisma.notification.updateMany({
+    where: { userId: req.user.id, isRead: false },
+    data: { isRead: true },
+  });
+ 
+  res.status(200).json({ message: '모든 알림을 읽음 처리했습니다.' });
+});
+ 
+// ── 읽지 않은 알림 개수 조회 ─────────────────────────────────────
+export const getUnreadNotificationCount = withAsync(async (req: Request, res: Response) => {
+  const count = await prisma.notification.count({
+    where: { userId: req.user.id, isRead: false },
+  });
+ 
+  res.json({ count });
+});
+ 
+// ── 단일 알림 읽음 처리 ──────────────────────────────────────────
+export const readNotification = withAsync(async (req: Request, res: Response) => {
+  const { id } = req.params;
+ 
+  const result = await prisma.notification.updateMany({
+    where: {
+      id: Number(id),
+      userId: req.user.id,
+    },
+    data: { isRead: true },
+  });
+ 
+  if (result.count === 0) {
+    return res.status(404).json({ message: '알림을 찾을 수 없거나 권한이 없습니다.' });
+  }
+ 
+  res.status(200).json({ message: '알림을 읽음 처리했습니다.' });
+});
+ 
+// ── 30일 이상 된 알림 삭제 (스케줄러용) ─────────────────────────
+export const deleteOldNotifications = withAsync(async (req: Request, res: Response) => {
+  const thirtyDaysAgo = new Date();
+  thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
+ 
+  const deleted = await prisma.notification.deleteMany({
+    where: {
+      createdAt: { lt: thirtyDaysAgo },
+    },
+  });
+ 
+  res.status(200).json({ message: `${deleted.count}개의 오래된 알림을 삭제했습니다.` });
+});
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/index.html b/coverage/src/index.html new file mode 100644 index 00000000..1772cd38 --- /dev/null +++ b/coverage/src/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src + + + + + + + + + +
+
+

All files src

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
server.ts +
+
100%22/22100%0/0100%0/0100%22/22
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/constants.ts.html b/coverage/src/lib/constants.ts.html new file mode 100644 index 00000000..f28ff75d --- /dev/null +++ b/coverage/src/lib/constants.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/constants.ts + + + + + + + + + +
+
+

All files / src/lib constants.ts

+
+ +
+ 87.5% + Statements + 7/8 +
+ + +
+ 50% + Branches + 2/4 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 87.5% + Lines + 7/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +112x +2x +  +2x +  +  +  +2x +2x +2x +2x
import dotenv from 'dotenv';
+dotenv.config();
+ 
+Iif (!process.env.DATABASE_URL) {
+  throw new Error(' DATABASE_URL is missing in .env file');
+}
+ 
+export const DATABASE_URL: string = process.env.DATABASE_URL;
+export const PORT: number = Number(process.env.PORT) || 3000;
+export const PUBLIC_PATH: string = './public';
+export const STATIC_PATH: string = '/public';
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/errors/BadRequestError.ts.html b/coverage/src/lib/errors/BadRequestError.ts.html new file mode 100644 index 00000000..cb16b518 --- /dev/null +++ b/coverage/src/lib/errors/BadRequestError.ts.html @@ -0,0 +1,112 @@ + + + + + + Code coverage report for src/lib/errors/BadRequestError.ts + + + + + + + + + +
+
+

All files / src/lib/errors BadRequestError.ts

+
+ +
+ 25% + Statements + 1/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 0% + Functions + 0/1 +
+ + +
+ 25% + Lines + 1/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10  +  +  +  +  +  +  +  +  +3x
class BadRequestError extends Error {
+  constructor(message: string) {
+    super(message);
+    this.name = 'BadRequestError';
+ 
+    Object.setPrototypeOf(this, BadRequestError.prototype);
+  }
+}
+ 
+export default BadRequestError;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/errors/NotFoundError.ts.html b/coverage/src/lib/errors/NotFoundError.ts.html new file mode 100644 index 00000000..94863907 --- /dev/null +++ b/coverage/src/lib/errors/NotFoundError.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/errors/NotFoundError.ts + + + + + + + + + +
+
+

All files / src/lib/errors NotFoundError.ts

+
+ +
+ 100% + Statements + 4/4 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 4/4 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +9x +  +9x +  +9x +  +  +  +4x
class NotFoundError extends Error {
+  constructor(modelName: string, id: string | number) {
+    super(`${modelName} with id ${id} not found`);
+    
+    this.name = 'NotFoundError';
+ 
+    Object.setPrototypeOf(this, NotFoundError.prototype);
+  }
+}
+ 
+export default NotFoundError;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/errors/index.html b/coverage/src/lib/errors/index.html new file mode 100644 index 00000000..0ebb1cb2 --- /dev/null +++ b/coverage/src/lib/errors/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/lib/errors + + + + + + + + + +
+
+

All files src/lib/errors

+
+ +
+ 62.5% + Statements + 5/8 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 62.5% + Lines + 5/8 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
BadRequestError.ts +
+
25%1/4100%0/00%0/125%1/4
NotFoundError.ts +
+
100%4/4100%0/0100%1/1100%4/4
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/index.html b/coverage/src/lib/index.html new file mode 100644 index 00000000..0509a4fb --- /dev/null +++ b/coverage/src/lib/index.html @@ -0,0 +1,161 @@ + + + + + + Code coverage report for src/lib + + + + + + + + + +
+
+

All files src/lib

+
+ +
+ 50% + Statements + 19/38 +
+ + +
+ 50% + Branches + 6/12 +
+ + +
+ 37.5% + Functions + 3/8 +
+ + +
+ 50% + Lines + 17/34 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
constants.ts +
+
87.5%7/850%2/4100%0/087.5%7/8
prismaClient.ts +
+
100%5/566.66%4/6100%0/0100%5/5
socket.ts +
+
0%0/180%0/20%0/50%0/16
withAsync.ts +
+
100%7/7100%0/0100%3/3100%5/5
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/prismaClient.ts.html b/coverage/src/lib/prismaClient.ts.html new file mode 100644 index 00000000..e04bf547 --- /dev/null +++ b/coverage/src/lib/prismaClient.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/lib/prismaClient.ts + + + + + + + + + +
+
+

All files / src/lib prismaClient.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 66.66% + Branches + 4/6 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +143x +  +  +3x +  +  +  +  +3x +  +  +3x +3x + 
import { PrismaClient } from '@prisma/client';
+ 
+ 
+const globalForPrisma = globalThis as unknown as {
+  prisma: PrismaClient | undefined;
+};
+ 
+ 
+export const prismaClient: PrismaClient =
+  globalForPrisma.prisma ?? new PrismaClient();
+ 
+Eif (process.env.NODE_ENV !== 'production') {
+  globalForPrisma.prisma = prismaClient;
+}
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/socket.ts.html b/coverage/src/lib/socket.ts.html new file mode 100644 index 00000000..0e514359 --- /dev/null +++ b/coverage/src/lib/socket.ts.html @@ -0,0 +1,190 @@ + + + + + + Code coverage report for src/lib/socket.ts + + + + + + + + + +
+
+

All files / src/lib socket.ts

+
+ +
+ 0% + Statements + 0/18 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 0% + Lines + 0/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  + 
import { Server } from 'socket.io';
+import type { Socket } from 'socket.io';
+import type { Server as HttpServer } from 'http';
+ 
+let io: Server | null = null;
+ 
+export const initSocket = (server: HttpServer): Server => {
+  io = new Server(server, {
+    cors: {
+      origin: "*",
+      methods: ["GET", "POST"]
+    }
+  });
+ 
+  io.on('connection', (socket: Socket) => {
+    console.log(` User connected: ${socket.id}`);
+ 
+    socket.on('join', (userId: string | number) => {
+      socket.join(`user_${userId}`);
+      console.log(` User ${userId} joined their private room.`);
+    });
+ 
+    socket.on('disconnect', () => {
+      console.log(' User disconnected');
+    });
+  });
+ 
+  return io;
+};
+ 
+export const getIO = (): Server => {
+  if (!io) {
+    throw new Error("⚠️ Socket.io not initialized! Call initSocket first.");
+  }
+  return io;
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/lib/withAsync.ts.html b/coverage/src/lib/withAsync.ts.html new file mode 100644 index 00000000..53f6e70f --- /dev/null +++ b/coverage/src/lib/withAsync.ts.html @@ -0,0 +1,115 @@ + + + + + + Code coverage report for src/lib/withAsync.ts + + + + + + + + + +
+
+

All files / src/lib withAsync.ts

+
+ +
+ 100% + Statements + 7/7 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11  +  +6x +144x +144x +144x +  +21x +  +  + 
import { Request, Response, NextFunction, RequestHandler } from 'express';
+ 
+export const withAsync = (fn: Function): RequestHandler => {
+  return async (req: Request, res: Response, next: NextFunction) => {
+    try {
+      await fn(req, res, next);
+    } catch (error) {
+      next(error);
+    }
+  };
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/middlewares/authMiddleware.ts.html b/coverage/src/middlewares/authMiddleware.ts.html new file mode 100644 index 00000000..43e61595 --- /dev/null +++ b/coverage/src/middlewares/authMiddleware.ts.html @@ -0,0 +1,196 @@ + + + + + + Code coverage report for src/middlewares/authMiddleware.ts + + + + + + + + + +
+
+

All files / src/middlewares authMiddleware.ts

+
+ +
+ 94.44% + Statements + 17/18 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 100% + Functions + 2/2 +
+ + +
+ 93.75% + Lines + 15/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +34 +35 +36 +37 +383x +3x +  +  +3x +  +  +  +  +  +  +  +50x +50x +50x +  +50x +10x +  +  +40x +  +40x +  +40x +  +  +  +40x +2x +  +  +38x +38x +  +  +  + 
import jwt from 'jsonwebtoken';
+import { PrismaClient } from '@prisma/client';
+import type { Request, Response, NextFunction } from 'express';
+ 
+const prisma = new PrismaClient();
+ 
+ 
+interface JwtPayload {
+  id: number;
+}
+ 
+ 
+export const authenticate = async (req: Request, res: Response, next: NextFunction) => {
+  try {
+    const authHeader = req.headers.authorization;
+    
+    if (!authHeader || !authHeader.startsWith('Bearer ')) {
+      return res.status(401).json({ message: '로그인이 필요한 서비스입니다.' });
+    }
+ 
+    const token = authHeader.split(' ')[1];
+ 
+    const decoded = jwt.verify(token, process.env.JWT_SECRET || 'secret') as unknown as JwtPayload;
+    
+    const user = await prisma.user.findUnique({
+      where: { id: decoded.id },
+    });
+ 
+    if (!user) {
+      return res.status(401).json({ message: '유효하지 않은 사용자입니다.' });
+    }
+ 
+    req.user = user; 
+    next();
+  } catch (error) {
+    return res.status(401).json({ message: '인증에 실패했습니다. 다시 로그인해 주세요.' });
+  }
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/middlewares/index.html b/coverage/src/middlewares/index.html new file mode 100644 index 00000000..41ff6e2b --- /dev/null +++ b/coverage/src/middlewares/index.html @@ -0,0 +1,131 @@ + + + + + + Code coverage report for src/middlewares + + + + + + + + + +
+
+

All files src/middlewares

+
+ +
+ 84.37% + Statements + 27/32 +
+ + +
+ 87.5% + Branches + 7/8 +
+ + +
+ 75% + Functions + 3/4 +
+ + +
+ 82.14% + Lines + 23/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
authMiddleware.ts +
+
94.44%17/1887.5%7/8100%2/293.75%15/16
validate.ts +
+
71.42%10/14100%0/050%1/266.66%8/12
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/middlewares/validate.ts.html b/coverage/src/middlewares/validate.ts.html new file mode 100644 index 00000000..be1336d1 --- /dev/null +++ b/coverage/src/middlewares/validate.ts.html @@ -0,0 +1,172 @@ + + + + + + Code coverage report for src/middlewares/validate.ts + + + + + + + + + +
+
+

All files / src/middlewares validate.ts

+
+ +
+ 71.42% + Statements + 10/14 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 50% + Functions + 1/2 +
+ + +
+ 66.66% + Lines + 8/12 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +303x +3x +  +  +  +3x +4x +  +4x +2x +  +2x +  +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  + 
import { assert } from 'superstruct';
+import { SignUpStruct, SignInStruct } from '../structs/authStructs'; 
+import type { Request, Response, NextFunction } from 'express';
+ 
+ 
+export const validateSignUp = (req: Request, res: Response, next: NextFunction) => {
+  try {
+    // req.body가 SignUpStruct 구조와 일치하는지 확인
+    assert(req.body, SignUpStruct);
+    next();
+  } catch (error: any) {
+    res.status(400).json({ 
+      message: '입력 데이터 형식이 올바르지 않습니다.', 
+      details: error.message 
+    });
+  }
+};
+ 
+ 
+export const validateSignIn = (req: Request, res: Response, next: NextFunction) => {
+  try {
+    assert(req.body, SignInStruct);
+    next();
+  } catch (error: any) {
+    res.status(400).json({ 
+      message: '로그인 정보 형식이 올바르지 않습니다.', 
+      details: error.message 
+    });
+  }
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/articlesRouter.ts.html b/coverage/src/routers/articlesRouter.ts.html new file mode 100644 index 00000000..7cfd12eb --- /dev/null +++ b/coverage/src/routers/articlesRouter.ts.html @@ -0,0 +1,169 @@ + + + + + + Code coverage report for src/routers/articlesRouter.ts + + + + + + + + + +
+
+

All files / src/routers articlesRouter.ts

+
+ +
+ 100% + Statements + 16/16 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 16/16 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +292x +2x +2x +  +  +  +  +  +  +  +  +2x +2x +  +2x +  +2x +2x +  +2x +  +2x +2x +2x +2x +2x +2x +  +2x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createArticle,
+  getArticleList,
+  getArticle,
+  updateArticle,
+  deleteArticle,
+  createComment,
+  getCommentList,
+} from '../controllers/articlesController';
+import { toggleArticleLike } from '../controllers/likeController'; 
+import { authenticate } from '../middlewares/authMiddleware';
+ 
+const articlesRouter: Router = express.Router();
+ 
+articlesRouter.get('/', withAsync(getArticleList));
+articlesRouter.get('/:id', withAsync(getArticle));
+ 
+articlesRouter.use(authenticate);
+ 
+articlesRouter.post('/', withAsync(createArticle));
+articlesRouter.patch('/:id', withAsync(updateArticle));
+articlesRouter.delete('/:id', withAsync(deleteArticle));
+articlesRouter.post('/:id/comments', withAsync(createComment));
+articlesRouter.get('/:id/comments', withAsync(getCommentList));
+articlesRouter.post('/:id/like', withAsync(toggleArticleLike));
+ 
+export default articlesRouter;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/authRoutes.ts.html b/coverage/src/routers/authRoutes.ts.html new file mode 100644 index 00000000..60bbd00c --- /dev/null +++ b/coverage/src/routers/authRoutes.ts.html @@ -0,0 +1,118 @@ + + + + + + Code coverage report for src/routers/authRoutes.ts + + + + + + + + + +
+
+

All files / src/routers authRoutes.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +123x +3x +3x +3x +  +3x +  +3x +3x +3x +  +3x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync'; 
+import * as authController from '../controllers/authController'; 
+import { validateSignUp } from '../middlewares/validate'; 
+ 
+const router: Router = express.Router();
+ 
+router.post('/signup', validateSignUp, withAsync(authController.signUp));
+router.post('/signin', withAsync(authController.signIn));
+router.post('/refresh', withAsync(authController.refresh));
+ 
+export default router;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/commentsRouter.ts.html b/coverage/src/routers/commentsRouter.ts.html new file mode 100644 index 00000000..98890a91 --- /dev/null +++ b/coverage/src/routers/commentsRouter.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/routers/commentsRouter.ts + + + + + + + + + +
+
+

All files / src/routers commentsRouter.ts

+
+ +
+ 100% + Statements + 9/9 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 9/9 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +132x +2x +2x +2x +  +2x +  +2x +2x +2x +  +2x + 
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import { updateComment, deleteComment } from '../controllers/commentsController';
+import { authenticate } from '../middlewares/authMiddleware';
+ 
+const commentsRouter: Router = express.Router();
+ 
+commentsRouter.use(authenticate);
+commentsRouter.patch('/:id', withAsync(updateComment));
+commentsRouter.delete('/:id', withAsync(deleteComment));
+ 
+export default commentsRouter;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/imagesRouter.ts.html b/coverage/src/routers/imagesRouter.ts.html new file mode 100644 index 00000000..ccb1866f --- /dev/null +++ b/coverage/src/routers/imagesRouter.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/routers/imagesRouter.ts + + + + + + + + + +
+
+

All files / src/routers imagesRouter.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +142x +2x +2x +  +2x +  +  +2x +  +  +  +  +  +2x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import { upload, uploadImage } from '../controllers/imagesController'; 
+ 
+const imagesRouter: Router = express.Router();
+ 
+ 
+imagesRouter.post(
+  '/upload', 
+  upload.single('image'), 
+  withAsync(uploadImage)
+);
+ 
+export default imagesRouter;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/index.html b/coverage/src/routers/index.html new file mode 100644 index 00000000..3d2c9a72 --- /dev/null +++ b/coverage/src/routers/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/routers + + + + + + + + + +
+
+

All files src/routers

+
+ +
+ 100% + Statements + 74/74 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 74/74 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesRouter.ts +
+
100%16/16100%0/0100%0/0100%16/16
authRoutes.ts +
+
100%9/9100%0/0100%0/0100%9/9
commentsRouter.ts +
+
100%9/9100%0/0100%0/0100%9/9
imagesRouter.ts +
+
100%6/6100%0/0100%0/0100%6/6
productsRouter.ts +
+
100%17/17100%0/0100%0/0100%17/17
userRoutes.ts +
+
100%17/17100%0/0100%0/0100%17/17
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/productsRouter.ts.html b/coverage/src/routers/productsRouter.ts.html new file mode 100644 index 00000000..8ab20e02 --- /dev/null +++ b/coverage/src/routers/productsRouter.ts.html @@ -0,0 +1,184 @@ + + + + + + Code coverage report for src/routers/productsRouter.ts + + + + + + + + + +
+
+

All files / src/routers productsRouter.ts

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +32 +33 +342x +2x +2x +  +  +  +  +  +  +2x +2x +2x +  +2x +  +2x +2x +  +  +2x +  +  +2x +2x +2x +  +  +2x +2x +  +  +2x +  +2x
import express, { Router } from 'express';
+import { withAsync } from '../lib/withAsync';
+import {
+  createProduct,
+  getProduct,
+  updateProduct,
+  deleteProduct,
+  getProductList,
+} from '../controllers/productsController'; 
+import { createComment, getCommentList } from '../controllers/commentsController';
+import { toggleProductLike } from '../controllers/likeController'; 
+import { authenticate } from '../middlewares/authMiddleware'; 
+ 
+const productsRouter: Router = express.Router();
+ 
+productsRouter.get('/', withAsync(getProductList));
+productsRouter.get('/:id', withAsync(getProduct));
+ 
+ 
+productsRouter.use(authenticate);
+ 
+// 상품(Product) 관련
+productsRouter.post('/', withAsync(createProduct));
+productsRouter.patch('/:id', withAsync(updateProduct));
+productsRouter.delete('/:id', withAsync(deleteProduct));
+ 
+// 댓글(Comment) 관련
+productsRouter.post('/:id/comments', withAsync(createComment));
+productsRouter.get('/:id/comments', withAsync(getCommentList));
+ 
+// 좋아요(Like) 관련
+productsRouter.post('/:id/like', withAsync(toggleProductLike));
+ 
+export default productsRouter;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/routers/userRoutes.ts.html b/coverage/src/routers/userRoutes.ts.html new file mode 100644 index 00000000..ddf36e5e --- /dev/null +++ b/coverage/src/routers/userRoutes.ts.html @@ -0,0 +1,166 @@ + + + + + + Code coverage report for src/routers/userRoutes.ts + + + + + + + + + +
+
+

All files / src/routers userRoutes.ts

+
+ +
+ 100% + Statements + 17/17 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 17/17 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +281x +1x +1x +1x +1x +  +  +1x +  +  +1x +1x +1x +  +  +1x +1x +  +  +1x +1x +1x +1x +  +  +1x +  +1x
import express, { Router } from 'express';
+import * as userController from '../controllers/userController'; 
+import { authenticate } from '../middlewares/authMiddleware'; 
+import { withAsync } from '../lib/withAsync'; 
+const router: Router = express.Router();
+ 
+ 
+router.use(authenticate);
+ 
+ 
+router.get('/me', withAsync(userController.getMe));
+router.patch('/me', withAsync(userController.updateMe));
+router.patch('/me/password', withAsync(userController.changePassword));
+ 
+ 
+router.get('/me/products', withAsync(userController.getMyProducts));
+router.get('/me/likes', withAsync(userController.getMyLikedItems));
+ 
+ 
+router.get('/me/notifications', withAsync(userController.getMyNotifications));
+router.patch('/me/notifications', withAsync(userController.readAllNotifications));
+router.get('/me/notifications/unread-count', withAsync(userController.getUnreadNotificationCount));
+router.patch('/me/notifications/:id', withAsync(userController.readNotification));
+ 
+ 
+router.delete('/notifications/cleanup', withAsync(userController.deleteOldNotifications));
+ 
+export default router;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/server.ts.html b/coverage/src/server.ts.html new file mode 100644 index 00000000..b330cba9 --- /dev/null +++ b/coverage/src/server.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/server.ts + + + + + + + + + +
+
+

All files / src server.ts

+
+ +
+ 100% + Statements + 22/22 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 22/22 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +322x +2x +2x +2x +2x +2x +2x +2x +2x +2x +  +2x +  +  +2x +2x +2x +  +  +2x +  +  +2x +2x +2x +2x +  +  +2x +2x +  +2x
import express, { Application } from 'express';
+import cors from 'cors';
+import path from 'path';
+import { PUBLIC_PATH, STATIC_PATH } from './lib/constants';
+import articlesRouter from './routers/articlesRouter';
+import productsRouter from './routers/productsRouter';
+import commentsRouter from './routers/commentsRouter';
+import imagesRouter from './routers/imagesRouter';
+import authRouter from './routers/authRoutes';
+import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController';
+ 
+const server: Application = express();
+ 
+// 💡 기본 설정
+server.use(cors());
+server.use(express.json());
+server.use('/auth', authRouter); 
+ 
+// 💡 정적 파일 설정
+server.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH)));
+ 
+// 💡 라우터 연결
+server.use('/articles', articlesRouter);
+server.use('/products', productsRouter);
+server.use('/comments', commentsRouter);
+server.use('/images', imagesRouter);
+ 
+// 💡 에러 핸들러
+server.use(defaultNotFoundHandler);
+server.use(globalErrorHandler);
+ 
+export default server; // 👈 main.ts에서 가져다 쓸 수 있게 내보냅니다.
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/socket/index.html b/coverage/src/socket/index.html new file mode 100644 index 00000000..d8b14711 --- /dev/null +++ b/coverage/src/socket/index.html @@ -0,0 +1,116 @@ + + + + + + Code coverage report for src/socket + + + + + + + + + +
+
+

All files src/socket

+
+ +
+ 31.25% + Statements + 5/16 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 21.42% + Lines + 3/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
socket.ts +
+
31.25%5/160%0/20%0/521.42%3/14
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/socket/socket.ts.html b/coverage/src/socket/socket.ts.html new file mode 100644 index 00000000..d7be287d --- /dev/null +++ b/coverage/src/socket/socket.ts.html @@ -0,0 +1,178 @@ + + + + + + Code coverage report for src/socket/socket.ts + + + + + + + + + +
+
+

All files / src/socket socket.ts

+
+ +
+ 31.25% + Statements + 5/16 +
+ + +
+ 0% + Branches + 0/2 +
+ + +
+ 0% + Functions + 0/5 +
+ + +
+ 21.42% + Lines + 3/14 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +26 +27 +28 +29 +30 +31 +322x +  +  +2x +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +  +2x +  +  +  + 
import { Server, Socket } from 'socket.io';
+import type { Server as HttpServer } from 'http';
+ 
+export const setupSocket = (server: HttpServer): Server => {
+  const io = new Server(server, {
+    cors: {
+      origin: "*", 
+      methods: ["GET", "POST"]
+    }
+  });
+ 
+  io.on('connection', (socket: Socket) => {
+    console.log('소켓 연결됨:', socket.id);
+ 
+    socket.on('join', (userId: string | number) => {
+      socket.join(`user_${userId}`);
+      console.log(`유저 ${userId}가 알림 방(user_${userId})에 입장했습니다.`);
+    });
+ 
+    socket.on('disconnect', () => {
+      console.log('소켓 연결 해제');
+    });
+  });
+ 
+  return io;
+};
+ 
+export const emitNotification = (io: Server | undefined, userId: string | number, notificationData: any): void => {
+  if (io) {
+    io.to(`user_${userId}`).emit('NEW_NOTIFICATION', notificationData);
+  }
+};
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/articlesStructs.ts.html b/coverage/src/structs/articlesStructs.ts.html new file mode 100644 index 00000000..d079f98e --- /dev/null +++ b/coverage/src/structs/articlesStructs.ts.html @@ -0,0 +1,130 @@ + + + + + + Code coverage report for src/structs/articlesStructs.ts + + + + + + + + + +
+
+

All files / src/structs articlesStructs.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +162x +2x +  +2x +  +2x +4x +  +  +  +  +2x +  +  +  + 
import { coerce, nonempty, nullable, object, partial, string, type Infer } from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const GetArticleListParamsStruct = PageParamsStruct;
+ 
+export const CreateArticleBodyStruct = object({
+  title: coerce(nonempty(string()), string(), (value) => value.trim()),
+  content: nonempty(string()),
+  image: nullable(string()),
+});
+ 
+export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct);
+ 
+export type CreateArticleBody = Infer<typeof CreateArticleBodyStruct>;
+export type UpdateArticleBody = Infer<typeof UpdateArticleBodyStruct>;
+export type GetArticleListParams = Infer<typeof GetArticleListParamsStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/authStructs.ts.html b/coverage/src/structs/authStructs.ts.html new file mode 100644 index 00000000..45cae882 --- /dev/null +++ b/coverage/src/structs/authStructs.ts.html @@ -0,0 +1,127 @@ + + + + + + Code coverage report for src/structs/authStructs.ts + + + + + + + + + +
+
+

All files / src/structs authStructs.ts

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +153x +  +3x +  +  +  +  +  +3x +  +  +  +  +  + 
import { object, string, size, type Infer } from 'superstruct';
+ 
+export const SignUpStruct = object({
+  email: string(), 
+  nickname: string(),
+  password: size(string(), 8, 20),
+});
+ 
+export const SignInStruct = object({
+  email: string(),
+  password: string(),
+});
+ 
+export type SignUpBody = Infer<typeof SignUpStruct>;
+export type SignInBody = Infer<typeof SignInStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/commentsStruct.ts.html b/coverage/src/structs/commentsStruct.ts.html new file mode 100644 index 00000000..d52df4d5 --- /dev/null +++ b/coverage/src/structs/commentsStruct.ts.html @@ -0,0 +1,121 @@ + + + + + + Code coverage report for src/structs/commentsStruct.ts + + + + + + + + + +
+
+

All files / src/structs commentsStruct.ts

+
+ +
+ 100% + Statements + 5/5 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +132x +2x +  +2x +  +  +  +2x +2x +  +  +  + 
import { nonempty, object, partial, string, type Infer } from 'superstruct';
+import { CursorParamsStruct } from './commonStructs';
+ 
+export const CreateCommentBodyStruct = object({
+  content: nonempty(string()),
+});
+ 
+export const GetCommentListParamsStruct = CursorParamsStruct;
+export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct);
+ 
+export type CreateCommentBody = Infer<typeof CreateCommentBodyStruct>;
+export type GetCommentListParams = Infer<typeof GetCommentListParamsStruct>;
+export type UpdateCommentBody = Infer<typeof UpdateCommentBodyStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/commonStructs.ts.html b/coverage/src/structs/commonStructs.ts.html new file mode 100644 index 00000000..b6008aa9 --- /dev/null +++ b/coverage/src/structs/commonStructs.ts.html @@ -0,0 +1,160 @@ + + + + + + Code coverage report for src/structs/commonStructs.ts + + + + + + + + + +
+
+

All files / src/structs commonStructs.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 5/5 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +19 +20 +21 +22 +23 +24 +25 +263x +  +41x +  +3x +  +  +  +3x +  +  +  +  +  +  +3x +  +  +  +  +  +  +  +  +  + 
import { coerce, integer, object, string, defaulted, optional, enums, nonempty, type Infer } from 'superstruct';
+ 
+const integerString = coerce(integer(), string(), (value) => parseInt(value, 10));
+ 
+export const IdParamsStruct = object({
+  id: integerString,
+});
+ 
+export const PageParamsStruct = object({
+  page: defaulted(integerString, 1),
+  pageSize: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+export const CursorParamsStruct = object({
+  cursor: defaulted(integerString, 0),
+  limit: defaulted(integerString, 10),
+  orderBy: optional(enums(['recent'])),
+  keyword: optional(nonempty(string())),
+});
+ 
+ 
+export type IdParams = Infer<typeof IdParamsStruct>;
+export type PageParams = Infer<typeof PageParamsStruct>;
+export type CursorParams = Infer<typeof CursorParamsStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/index.html b/coverage/src/structs/index.html new file mode 100644 index 00000000..46c92a71 --- /dev/null +++ b/coverage/src/structs/index.html @@ -0,0 +1,191 @@ + + + + + + Code coverage report for src/structs + + + + + + + + + +
+
+

All files src/structs

+
+ +
+ 100% + Statements + 29/29 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 3/3 +
+ + +
+ 100% + Lines + 28/28 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileStatementsBranchesFunctionsLines
articlesStructs.ts +
+
100%6/6100%0/0100%1/1100%6/6
authStructs.ts +
+
100%3/3100%0/0100%0/0100%3/3
commentsStruct.ts +
+
100%5/5100%0/0100%0/0100%5/5
commonStructs.ts +
+
100%6/6100%0/0100%1/1100%5/5
productsStruct.ts +
+
100%6/6100%0/0100%1/1100%6/6
userStructs.ts +
+
100%3/3100%0/0100%0/0100%3/3
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/productsStruct.ts.html b/coverage/src/structs/productsStruct.ts.html new file mode 100644 index 00000000..b5339c63 --- /dev/null +++ b/coverage/src/structs/productsStruct.ts.html @@ -0,0 +1,139 @@ + + + + + + Code coverage report for src/structs/productsStruct.ts + + + + + + + + + +
+
+

All files / src/structs productsStruct.ts

+
+ +
+ 100% + Statements + 6/6 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 1/1 +
+ + +
+ 100% + Lines + 6/6 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +14 +15 +16 +17 +18 +193x +3x +  +3x +11x +  +  +  +  +  +  +3x +  +3x +  +  +  +  + 
import { coerce, partial, object, string, min, nonempty, array, integer, type Infer } from 'superstruct';
+import { PageParamsStruct } from './commonStructs';
+ 
+export const CreateProductBodyStruct = object({
+  name: coerce(nonempty(string()), string(), (value) => value.trim()),
+  description: nonempty(string()),
+  price: min(integer(), 0),
+  tags: array(nonempty(string())),
+  images: array(nonempty(string())),
+});
+ 
+export const GetProductListParamsStruct = PageParamsStruct;
+ 
+export const UpdateProductBodyStruct = partial(CreateProductBodyStruct);
+ 
+export type CreateProductBody = Infer<typeof CreateProductBodyStruct>;
+export type UpdateProductBody = Infer<typeof UpdateProductBodyStruct>;
+export type GetProductListParams = Infer<typeof GetProductListParamsStruct>;
+ 
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/coverage/src/structs/userStructs.ts.html b/coverage/src/structs/userStructs.ts.html new file mode 100644 index 00000000..0bd49541 --- /dev/null +++ b/coverage/src/structs/userStructs.ts.html @@ -0,0 +1,124 @@ + + + + + + Code coverage report for src/structs/userStructs.ts + + + + + + + + + +
+
+

All files / src/structs userStructs.ts

+
+ +
+ 100% + Statements + 3/3 +
+ + +
+ 100% + Branches + 0/0 +
+ + +
+ 100% + Functions + 0/0 +
+ + +
+ 100% + Lines + 3/3 +
+ + +
+

+ Press n or j to go to the next uncovered block, b, p or k for the previous block. +

+ +
+
+

+
1 +2 +3 +4 +5 +6 +7 +8 +9 +10 +11 +12 +13 +141x +  +1x +  +  +  +  +1x +  +  +  +  +  + 
import { object, string, size, optional, type Infer } from 'superstruct';
+ 
+export const UpdateUserStruct = object({
+  nickname: optional(string()),
+  image: optional(string()),
+});
+ 
+export const ChangePasswordStruct = object({
+  currentPassword: string(),
+  newPassword: size(string(), 8, 20),
+});
+ 
+export type UpdateUserBody = Infer<typeof UpdateUserStruct>;
+export type ChangePasswordBody = Infer<typeof ChangePasswordStruct>;
+ +
+
+ + + + + + + + \ No newline at end of file diff --git a/jest.config.cjs b/jest.config.cjs new file mode 100644 index 00000000..0da738c1 --- /dev/null +++ b/jest.config.cjs @@ -0,0 +1,50 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + + // ── 커버리지 설정 ────────────────────────────────────────────── + collectCoverage: true, + coverageDirectory: 'coverage', + collectCoverageFrom: [ + 'src/**/*.ts', + '!src/main.ts', + '!src/**/*.d.ts', + ], + coverageReporters: ['text', 'lcov', 'html'], + coverageThreshold: { + global: { + branches: 50, + functions: 50, + lines: 50, + statements: 50, + }, + }, + + // ── 변환 설정 (CommonJS 강제) ────────────────────────────────── + transform: { + '^.+\\.tsx?$': [ + 'ts-jest', + { + tsconfig: { + module: 'CommonJS', + moduleResolution: 'node', + esModuleInterop: true, + strict: false, + isolatedModules: false, + }, + }, + ], + }, + + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, + + // ── 테스트 파일 경로 ─────────────────────────────────────────── + testMatch: ['**/tests/**/*.test.ts'], + + // ── 각 테스트 파일 격리 ──────────────────────────────────────── + clearMocks: true, + restoreMocks: true, +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c1d45801..dbe5e14a 100755 --- a/package-lock.json +++ b/package-lock.json @@ -1,486 +1,10884 @@ { "name": "sprint-mission-3", - "lockfileVersion": 3, + "version": "1.0.0", + "lockfileVersion": 2, "requires": true, "packages": { "": { "dependencies": { - "bcrypt": "^6.0.0" + "@prisma/client": "^5.16.2", + "bcrypt": "^6.0.0", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.3", + "multer": "^1.4.5-lts.1", + "socket.io": "^4.8.3", + "superstruct": "^2.0.2", + "uuid": "^11.0.5" }, "devDependencies": { - "@prisma/client": "^6.19.1", - "prisma": "^6.19.1", - "typescript": "^5.9.3" + "@types/bcrypt": "^6.0.0", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/multer": "^2.0.0", + "@types/node": "^25.3.5", + "@types/supertest": "^7.2.0", + "@types/uuid": "^10.0.0", + "jest": "^30.2.0", + "prettier": "^3.3.2", + "prisma": "^5.16.2", + "supertest": "^7.2.2", + "ts-jest": "^29.4.6" } }, - "node_modules/@prisma/client": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.19.1.tgz", - "integrity": "sha512-4SXj4Oo6HyQkLUWT8Ke5R0PTAfVOKip5Roo+6+b2EDTkFg5be0FnBWiuRJc0BC0sRQIWGMLKW1XguhVfW/z3/A==", + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "peerDependencies": { - "prisma": "*", - "typescript": ">=5.1.0" + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - }, - "typescript": { - "optional": true - } + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@prisma/config": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.19.1.tgz", - "integrity": "sha512-bUL/aYkGXLwxVGhJmQMtslLT7KPEfUqmRa919fKI4wQFX4bIFUKiY8Jmio/2waAjjPYrtuDHa7EsNCnJTXxiOw==", + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "c12": "3.1.0", - "deepmerge-ts": "7.1.5", - "effect": "3.18.4", - "empathic": "2.0.0" + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@prisma/debug": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.19.1.tgz", - "integrity": "sha512-h1JImhlAd/s5nhY/e9qkAzausWldbeT+e4nZF7A4zjDYBF4BZmKDt4y0jK7EZapqOm1kW7V0e9agV/iFDy3fWw==", + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, - "license": "Apache-2.0" + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } }, - "node_modules/@prisma/engines": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.19.1.tgz", - "integrity": "sha512-xy95dNJ7DiPf9IJ3oaVfX785nbFl7oNDzclUF+DIiJw6WdWCvPl0LPU0YqQLsrwv8N64uOQkH391ujo3wSo+Nw==", + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@prisma/debug": "6.19.1", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/fetch-engine": "6.19.1", - "@prisma/get-platform": "6.19.1" + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/@prisma/engines-version": { - "version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7.tgz", - "integrity": "sha512-03bgb1VD5gvuumNf+7fVGBzfpJPjmqV423l/WxsWk2cNQ42JD0/SsFBPhN6z8iAvdHs07/7ei77SKu7aZfq8bA==", + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "Apache-2.0" + "license": "MIT" }, - "node_modules/@prisma/fetch-engine": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.19.1.tgz", - "integrity": "sha512-mmgcotdaq4VtAHO6keov3db+hqlBzQS6X7tR7dFCbvXjLVTxBYdSJFRWz+dq7F9p6dvWyy1X0v8BlfRixyQK6g==", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@prisma/debug": "6.19.1", - "@prisma/engines-version": "7.1.1-3.c2990dca591cba766e3b7ef5d9e8a84796e47ab7", - "@prisma/get-platform": "6.19.1" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@prisma/get-platform": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.19.1.tgz", - "integrity": "sha512-zsg44QUiQAnFUyh6Fbt7c9HjMXHwFTqtrgcX7DAZmRgnkPyYT7Sh8Mn8D5PuuDYNtMOYcpLGg576MLfIORsBYw==", + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@prisma/debug": "6.19.1" + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", "dev": true, - "license": "MIT" - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, "license": "MIT", "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": ">= 18" + "node": ">=6.9.0" } }, - "node_modules/c12": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } + "engines": { + "node": ">=6.9.0" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" }, "engines": { - "node": ">= 14.16.0" + "node": ">=6.9.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", "dev": true, "license": "MIT", - "dependencies": { - "consola": "^3.2.3" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", "dev": true, "license": "MIT", "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": ">=6.9.0" } }, - "node_modules/deepmerge-ts": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz", - "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=16.0.0" + "node": ">=6.9.0" } }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, - "funding": { - "url": "https://dotenvx.com" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/effect": { - "version": "3.18.4", - "resolved": "https://registry.npmjs.org/effect/-/effect-3.18.4.tgz", - "integrity": "sha512-b1LXQJLe9D11wfnOKAk3PKxuqYshQ0Heez+y5pnkd3jLj1yx9QhM72zZ9uUrOQyNvrs2GZZd/3maL0ZV18YuDA==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.0.0", - "fast-check": "^3.23.1" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/empathic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.0.0.tgz", - "integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=14" + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/fast-check": { - "version": "3.23.2", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz", - "integrity": "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], "license": "MIT", "dependencies": { - "pure-rand": "^6.1.0" + "@babel/helper-plugin-utils": "^7.28.6" }, "engines": { - "node": ">=8.0.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" + "@babel/helper-plugin-utils": "^7.10.4" }, - "bin": { - "giget": "dist/cli.mjs" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": "^18 || ^20 || >= 21" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/node-fetch-native": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", - "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/nypm": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.2.tgz", - "integrity": "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "license": "MIT", "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.2", - "pathe": "^2.0.3", - "pkg-types": "^2.3.0", - "tinyexec": "^1.0.1" - }, - "bin": { - "nypm": "dist/cli.mjs" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^14.16.0 || >=16.10.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/prisma": { - "version": "6.19.1", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.19.1.tgz", - "integrity": "sha512-XRfmGzh6gtkc/Vq3LqZJcS2884dQQW3UhPo6jNRoiTW95FFQkXFg8vkYEy6og+Pyv0aY7zRQ7Wn1Cvr56XjhQQ==", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "dependencies": { - "@prisma/config": "6.19.1", - "@prisma/engines": "6.19.1" - }, - "bin": { - "prisma": "build/index.js" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=18.18" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=5.1.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0-0" } }, - "node_modules/pure-rand": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", - "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "license": "MIT", "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, "engines": { - "node": ">= 14.18.0" + "node": ">=6.9.0" }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, "engines": { - "node": ">=18" + "node": ">=6.9.0" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" }, "engines": { - "node": ">=14.17" + "node": ">=6.9.0" } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@prisma/client": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", + "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", + "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", + "devOptional": true + }, + "node_modules/@prisma/engines": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", + "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/fetch-engine": "5.16.2", + "@prisma/get-platform": "5.16.2" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", + "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", + "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/get-platform": "5.16.2" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", + "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.16.2" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "license": "MIT" + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/multer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", + "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "25.3.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz", + "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-7.2.0.tgz", + "integrity": "sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "license": "BSD-3-Clause", + "workspaces": [ + "test/babel-8" + ], + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/babel__core": "^7.20.5" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0 || ^8.0.0-beta.1" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", + "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "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-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/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, + "license": "ISC" + }, + "node_modules/exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/express": { + "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.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "esbuild-register": ">=3.4.0", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "esbuild-register": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.3" + } + }, + "node_modules/jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.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", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prisma": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", + "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "devOptional": true, + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@prisma/engines": "5.16.2" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=16.13" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "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/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.18.3" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/supertest/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "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/test-exclude/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0 || ^30.0.0", + "@jest/types": "^29.0.0 || ^30.0.0", + "babel-jest": "^29.0.0 || ^30.0.0", + "jest": "^29.0.0 || ^30.0.0", + "jest-util": "^29.0.0 || ^30.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/transform": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jest-util": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + } + }, + "@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true + }, + "@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "peer": true, + "requires": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "requires": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true + }, + "@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true + }, + "@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true + }, + "@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "requires": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "requires": { + "@babel/types": "^7.29.0" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.28.6" + } + }, + "@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + } + }, + "@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, + "@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "requires": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + } + }, + "@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "requires": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + } + }, + "@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true + }, + "@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "requires": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + } + }, + "@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "requires": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + } + }, + "@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, + "requires": { + "@jest/get-type": "30.1.0" + } + }, + "@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "requires": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + } + }, + "@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true + }, + "@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "requires": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + } + }, + "@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "requires": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + } + }, + "@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "requires": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + } + }, + "@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.34.0" + } + }, + "@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "requires": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + } + }, + "@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + } + }, + "@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "dev": true, + "requires": { + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" + } + }, + "@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "dev": true, + "requires": { + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" + } + }, + "@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "dev": true, + "requires": { + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" + } + }, + "@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "dev": true, + "requires": { + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "requires": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "optional": true, + "requires": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true + }, + "@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "requires": { + "@noble/hashes": "^1.1.5" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, + "@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true + }, + "@prisma/client": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", + "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "requires": {} + }, + "@prisma/debug": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", + "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", + "devOptional": true + }, + "@prisma/engines": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", + "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/fetch-engine": "5.16.2", + "@prisma/get-platform": "5.16.2" + } + }, + "@prisma/engines-version": { + "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", + "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", + "devOptional": true + }, + "@prisma/fetch-engine": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", + "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/get-platform": "5.16.2" + } + }, + "@prisma/get-platform": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", + "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", + "devOptional": true, + "requires": { + "@prisma/debug": "5.16.2" + } + }, + "@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", + "dev": true + }, + "@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "requires": { + "@sinonjs/commons": "^3.0.1" + } + }, + "@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "optional": true, + "requires": { + "tslib": "^2.4.0" + } + }, + "@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "requires": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "requires": { + "@babel/types": "^7.28.2" + } + }, + "@types/bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "requires": { + "@types/node": "*" + } + }, + "@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "@types/express-serve-static-core": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", + "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "30.0.0", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", + "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", + "dev": true, + "requires": { + "expect": "^30.0.0", + "pretty-format": "^30.0.0" + } + }, + "@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "requires": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true + }, + "@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true + }, + "@types/multer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", + "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/node": { + "version": "25.3.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz", + "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", + "requires": { + "undici-types": "~7.18.0" + } + }, + "@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "requires": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "@types/supertest": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-7.2.0.tgz", + "integrity": "sha512-uh2Lv57xvggst6lCqNdFAmDSvoMG7M/HDtX4iUCquxQ5EGPtaPM5PL5Hmi7LCvOG8db7YaCPNJEeoI8s/WzIQw==", + "dev": true, + "requires": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.35", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", + "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true + }, + "@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "dev": true, + "optional": true, + "requires": { + "@napi-rs/wasm-runtime": "^0.2.11" + } + }, + "@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "dev": true, + "optional": true + }, + "@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "dev": true, + "optional": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "babel-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", + "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "dev": true, + "requires": { + "@jest/transform": "30.2.0", + "@types/babel__core": "^7.20.5", + "babel-plugin-istanbul": "^7.0.1", + "babel-preset-jest": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "slash": "^3.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz", + "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-instrument": "^6.0.2", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-jest-hoist": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", + "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "dev": true, + "requires": { + "@types/babel__core": "^7.20.5" + } + }, + "babel-preset-current-node-syntax": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", + "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", + "dev": true, + "requires": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + } + }, + "babel-preset-jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", + "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "baseline-browser-mapping": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "dev": true + }, + "bcrypt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", + "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", + "requires": { + "node-addon-api": "^8.3.0", + "node-gyp-build": "^4.8.4" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "requires": { + "fill-range": "^7.1.1" + } + }, + "browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "peer": true, + "requires": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + } + }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "requires": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001776", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz", + "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true + }, + "ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "dev": true + }, + "cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true + }, + "collect-v8-coverage": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz", + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "dedent": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", + "dev": true, + "requires": {} + }, + "deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" + }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", + "dev": true + }, + "emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "engine.io": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.5.tgz", + "integrity": "sha512-2RZdgEbXmp5+dVbRm0P7HQUImZpICccJy7rN7Tv+SFa55pH+lxnuw6/K1ZxxBfHoYpSkHLAO92oa8O4SwFXA2A==", + "requires": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.18.3" + }, + "dependencies": { + "cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==" + }, + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==" + }, + "error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "requires": { + "es-errors": "^1.3.0" + } + }, + "es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "requires": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + } + }, + "escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "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 + } + } + }, + "exit-x": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", + "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", + "dev": true + }, + "expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "dev": true, + "requires": { + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + } + }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true + }, + "fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + } + }, + "form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + } + }, + "formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "requires": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" + }, + "has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "requires": { + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "requires": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + } + }, + "istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jest": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", + "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "dev": true, + "peer": true, + "requires": { + "@jest/core": "30.2.0", + "@jest/types": "30.2.0", + "import-local": "^3.2.0", + "jest-cli": "30.2.0" + } + }, + "jest-changed-files": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", + "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "dev": true, + "requires": { + "execa": "^5.1.1", + "jest-util": "30.2.0", + "p-limit": "^3.1.0" + } + }, + "jest-circus": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", + "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "dev": true, + "requires": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "co": "^4.6.0", + "dedent": "^1.6.0", + "is-generator-fn": "^2.1.0", + "jest-each": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "p-limit": "^3.1.0", + "pretty-format": "30.2.0", + "pure-rand": "^7.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + } + }, + "jest-cli": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", + "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "dev": true, + "requires": { + "@jest/core": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "exit-x": "^0.2.2", + "import-local": "^3.2.0", + "jest-config": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "yargs": "^17.7.2" + } + }, + "jest-config": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", + "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "dev": true, + "requires": { + "@babel/core": "^7.27.4", + "@jest/get-type": "30.1.0", + "@jest/pattern": "30.0.1", + "@jest/test-sequencer": "30.2.0", + "@jest/types": "30.2.0", + "babel-jest": "30.2.0", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "deepmerge": "^4.3.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-circus": "30.2.0", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-runner": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "micromatch": "^4.0.8", + "parse-json": "^5.2.0", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + } + }, + "jest-diff": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", + "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "dev": true, + "requires": { + "@jest/diff-sequences": "30.0.1", + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "pretty-format": "30.2.0" + } + }, + "jest-docblock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz", + "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==", + "dev": true, + "requires": { + "detect-newline": "^3.1.0" + } + }, + "jest-each": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", + "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "dev": true, + "requires": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "jest-util": "30.2.0", + "pretty-format": "30.2.0" + } + }, + "jest-environment-node": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", + "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "dev": true, + "requires": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0" + } + }, + "jest-haste-map": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", + "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "dev": true, + "requires": { + "@jest/types": "30.2.0", + "@types/node": "*", + "anymatch": "^3.1.3", + "fb-watchman": "^2.0.2", + "fsevents": "^2.3.3", + "graceful-fs": "^4.2.11", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "micromatch": "^4.0.8", + "walker": "^1.0.8" + } + }, + "jest-leak-detector": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", + "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "dev": true, + "requires": { + "@jest/get-type": "30.1.0", + "pretty-format": "30.2.0" + } + }, + "jest-matcher-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", + "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "dev": true, + "requires": { + "@jest/get-type": "30.1.0", + "chalk": "^4.1.2", + "jest-diff": "30.2.0", + "pretty-format": "30.2.0" + } + }, + "jest-message-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", + "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.27.1", + "@jest/types": "30.2.0", + "@types/stack-utils": "^2.0.3", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6" + } + }, + "jest-mock": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", + "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "dev": true, + "requires": { + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-util": "30.2.0" + } + }, + "jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "requires": {} + }, + "jest-regex-util": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", + "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", + "dev": true + }, + "jest-resolve": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", + "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-pnp-resolver": "^1.2.3", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "slash": "^3.0.0", + "unrs-resolver": "^1.7.11" + } + }, + "jest-resolve-dependencies": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", + "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "dev": true, + "requires": { + "jest-regex-util": "30.0.1", + "jest-snapshot": "30.2.0" + } + }, + "jest-runner": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", + "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "dev": true, + "requires": { + "@jest/console": "30.2.0", + "@jest/environment": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-docblock": "30.2.0", + "jest-environment-node": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-leak-detector": "30.2.0", + "jest-message-util": "30.2.0", + "jest-resolve": "30.2.0", + "jest-runtime": "30.2.0", + "jest-util": "30.2.0", + "jest-watcher": "30.2.0", + "jest-worker": "30.2.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + } + }, + "jest-runtime": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", + "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "dev": true, + "requires": { + "@jest/environment": "30.2.0", + "@jest/fake-timers": "30.2.0", + "@jest/globals": "30.2.0", + "@jest/source-map": "30.0.1", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "cjs-module-lexer": "^2.1.0", + "collect-v8-coverage": "^1.0.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + } + }, + "jest-snapshot": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", + "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "dev": true, + "requires": { + "@babel/core": "^7.27.4", + "@babel/generator": "^7.27.5", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1", + "@babel/types": "^7.27.3", + "@jest/expect-utils": "30.2.0", + "@jest/get-type": "30.1.0", + "@jest/snapshot-utils": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "babel-preset-current-node-syntax": "^1.2.0", + "chalk": "^4.1.2", + "expect": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-diff": "30.2.0", + "jest-matcher-utils": "30.2.0", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "pretty-format": "30.2.0", + "semver": "^7.7.2", + "synckit": "^0.11.8" + } + }, + "jest-util": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", + "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "dev": true, + "requires": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "graceful-fs": "^4.2.11", + "picomatch": "^4.0.2" + }, + "dependencies": { + "picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true + } + } + }, + "jest-validate": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", + "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "dev": true, + "requires": { + "@jest/get-type": "30.1.0", + "@jest/types": "30.2.0", + "camelcase": "^6.3.0", + "chalk": "^4.1.2", + "leven": "^3.1.0", + "pretty-format": "30.2.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + } + } + }, + "jest-watcher": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", + "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "dev": true, + "requires": { + "@jest/test-result": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "emittery": "^0.13.1", + "jest-util": "30.2.0", + "string-length": "^4.0.2" + } + }, + "jest-worker": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", + "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "dev": true, + "requires": { + "@types/node": "*", + "@ungap/structured-clone": "^1.3.0", + "jest-util": "30.2.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.1.1" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "requires": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "requires": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "requires": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "requires": { + "semver": "^7.5.3" + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "requires": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.2" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, + "napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==" + }, + "node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + }, + "dependencies": { + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + } + } + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "prettier": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", + "dev": true + }, + "pretty-format": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", + "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "dev": true, + "requires": { + "@jest/schemas": "30.0.5", + "ansi-styles": "^5.2.0", + "react-is": "^18.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, + "prisma": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", + "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", + "devOptional": true, + "peer": true, + "requires": { + "@prisma/engines": "5.16.2" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "pure-rand": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", + "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + } + }, + "side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "requires": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + } + }, + "side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + } + }, + "side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "requires": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "socket.io-adapter": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.6.tgz", + "integrity": "sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==", + "requires": { + "debug": "~4.4.1", + "ws": "~8.18.3" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "socket.io-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.5.tgz", + "integrity": "sha512-bPMmpy/5WWKHea5Y/jYAP6k74A+hvmRCQaJuJB6I/ML5JZq/KfNieUVo/3Mh7SAqn7TyFdIo6wqYHInG1MU1bQ==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "requires": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "requires": { + "ansi-regex": "^6.2.2" + } + }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + } + } + }, + "strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "requires": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "dependencies": { + "debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "qs": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", + "dev": true, + "requires": { + "side-channel": "^1.1.0" + } + } + } + }, + "superstruct": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==" + }, + "supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "requires": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "dependencies": { + "cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "synckit": { + "version": "0.11.12", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz", + "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==", + "dev": true, + "requires": { + "@pkgr/core": "^0.2.9" + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + } + }, + "minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "ts-jest": { + "version": "29.4.6", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.6.tgz", + "integrity": "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA==", + "dev": true, + "requires": { + "bs-logger": "^0.2.6", + "fast-json-stable-stringify": "^2.1.0", + "handlebars": "^4.7.8", + "json5": "^2.2.3", + "lodash.memoize": "^4.1.2", + "make-error": "^1.3.6", + "semver": "^7.7.3", + "type-fest": "^4.41.0", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true + } + } + }, + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "optional": true + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "peer": true + }, + "uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "optional": true + }, + "undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "requires": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1", + "napi-postinstall": "^0.3.0" + } + }, + "update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "requires": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", + "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==" + }, + "v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true + } + } + }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + } + }, + "ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true } } } diff --git a/package.json b/package.json index 8ab91272..df844668 100755 --- a/package.json +++ b/package.json @@ -1,14 +1,37 @@ { + "type": "module", "scripts": { - "build": "tsc", - "start": "node ./build/main.js" + "start": "node ./src/main.js", + "dev": "nodemon --exec ts-node src/main.ts", + "test": "jest --config jest.config.cjs", + "test:coverage": "jest --config jest.config.cjs --coverage" }, "devDependencies": { - "@prisma/client": "^6.19.1", - "prisma": "^6.19.1", - "typescript": "^5.9.3" + "@types/bcrypt": "^6.0.0", + "@types/cors": "^2.8.19", + "@types/express": "^5.0.6", + "@types/jest": "^30.0.0", + "@types/jsonwebtoken": "^9.0.10", + "@types/multer": "^2.0.0", + "@types/node": "^25.3.5", + "@types/supertest": "^7.2.0", + "@types/uuid": "^10.0.0", + "jest": "^30.2.0", + "prettier": "^3.3.2", + "prisma": "^5.16.2", + "supertest": "^7.2.2", + "ts-jest": "^29.4.6" }, "dependencies": { - "bcrypt": "^6.0.0" + "@prisma/client": "^5.16.2", + "bcrypt": "^6.0.0", + "cors": "^2.8.5", + "dotenv": "^16.4.5", + "express": "^4.19.2", + "jsonwebtoken": "^9.0.3", + "multer": "^1.4.5-lts.1", + "socket.io": "^4.8.3", + "superstruct": "^2.0.2", + "uuid": "^11.0.5" } } diff --git a/pandamarket-be-sprint-mission-3-main/.gitignore b/pandamarket-be-sprint-mission-3-main/.gitignore deleted file mode 100755 index b0fc192f..00000000 --- a/pandamarket-be-sprint-mission-3-main/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# Local files -.vscode/ -node_modules/ -.env* -!.env.example - -# Uploaded files -public/* -!public/.gitkeep - diff --git a/pandamarket-be-sprint-mission-3-main/package-lock.json b/pandamarket-be-sprint-mission-3-main/package-lock.json deleted file mode 100755 index 90a5f1c5..00000000 --- a/pandamarket-be-sprint-mission-3-main/package-lock.json +++ /dev/null @@ -1,1973 +0,0 @@ -{ - "name": "pandamarket-be-sprint-mission-3-main", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "dependencies": { - "@prisma/client": "^5.16.2", - "bcrypt": "^6.0.0", - "cors": "^2.8.5", - "dotenv": "^16.4.5", - "express": "^4.19.2", - "jsonwebtoken": "^9.0.3", - "multer": "^1.4.5-lts.1", - "superstruct": "^2.0.2", - "uuid": "^11.0.5" - }, - "devDependencies": { - "prettier": "^3.3.2", - "prisma": "^5.16.2" - } - }, - "node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", - "hasInstallScript": true, - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" - }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } - } - }, - "node_modules/@prisma/debug": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", - "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", - "devOptional": true - }, - "node_modules/@prisma/engines": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", - "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", - "devOptional": true, - "hasInstallScript": true, - "dependencies": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/fetch-engine": "5.16.2", - "@prisma/get-platform": "5.16.2" - } - }, - "node_modules/@prisma/engines-version": { - "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", - "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", - "devOptional": true - }, - "node_modules/@prisma/fetch-engine": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", - "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", - "devOptional": true, - "dependencies": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/get-platform": "5.16.2" - } - }, - "node_modules/@prisma/get-platform": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", - "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", - "devOptional": true, - "dependencies": { - "@prisma/debug": "5.16.2" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "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.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-data-property": { - "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": { - "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/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "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/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "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.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "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" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "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": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", - "devOptional": true, - "hasInstallScript": true, - "peer": true, - "dependencies": { - "@prisma/engines": "5.16.2" - }, - "bin": { - "prisma": "build/index.js" - }, - "engines": { - "node": ">=16.13" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "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/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "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.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.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - } - }, - "dependencies": { - "@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", - "requires": {} - }, - "@prisma/debug": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", - "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", - "devOptional": true - }, - "@prisma/engines": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", - "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", - "devOptional": true, - "requires": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/fetch-engine": "5.16.2", - "@prisma/get-platform": "5.16.2" - } - }, - "@prisma/engines-version": { - "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", - "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", - "devOptional": true - }, - "@prisma/fetch-engine": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", - "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", - "devOptional": true, - "requires": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/get-platform": "5.16.2" - } - }, - "@prisma/get-platform": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", - "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", - "devOptional": true, - "requires": { - "@prisma/debug": "5.16.2" - } - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "requires": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - } - }, - "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "requires": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "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.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "requires": { - "streamsearch": "^1.1.0" - } - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" - }, - "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - } - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" - }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "define-data-property": { - "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==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" - }, - "dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==" - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" - }, - "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==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" - }, - "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "requires": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" - }, - "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "requires": { - "es-define-property": "^1.0.0" - } - }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "requires": { - "function-bind": "^1.1.2" - } - }, - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "requires": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "requires": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "requires": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "requires": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - } - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" - }, - "node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==" - }, - "node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" - }, - "object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==" - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "prettier": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", - "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", - "dev": true - }, - "prisma": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-5.16.2.tgz", - "integrity": "sha512-rFV/xoBR2hBGGlu4LPLQd4U8WVA+tSAmYyFWGPRVfj+xg7N4kiZV4lSk38htSpF+/IuHKzlrbh4SFk8Z18cI8A==", - "devOptional": true, - "peer": true, - "requires": { - "@prisma/engines": "5.16.2" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==" - }, - "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "requires": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - } - } - }, - "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - } - }, - "set-function-length": { - "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==", - "requires": { - "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.2" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "requires": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" - }, - "streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==" - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" - }, - "uuid": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.5.tgz", - "integrity": "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - } - } -} diff --git a/pandamarket-be-sprint-mission-3-main/package.json b/pandamarket-be-sprint-mission-3-main/package.json deleted file mode 100755 index c880c4f0..00000000 --- a/pandamarket-be-sprint-mission-3-main/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "module", - "scripts": { - "start": "node ./src/main.js" - }, - "devDependencies": { - "prettier": "^3.3.2", - "prisma": "^5.16.2" - }, - "dependencies": { - "@prisma/client": "^5.16.2", - "bcrypt": "^6.0.0", - "cors": "^2.8.5", - "dotenv": "^16.4.5", - "express": "^4.19.2", - "jsonwebtoken": "^9.0.3", - "multer": "^1.4.5-lts.1", - "superstruct": "^2.0.2", - "uuid": "^11.0.5" - } -} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js deleted file mode 100755 index 63fe7f6b..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/articlesController.js +++ /dev/null @@ -1,138 +0,0 @@ -import { create } from 'superstruct'; -import { prismaClient } from '../lib/prismaClient.js'; -import NotFoundError from '../lib/errors/NotFoundError.js'; -import { IdParamsStruct } from '../structs/commonStructs.js'; -import { - CreateArticleBodyStruct, - UpdateArticleBodyStruct, - GetArticleListParamsStruct, -} from '../structs/articlesStructs.js'; -import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct.js'; - -export async function createArticle(req, res) { - const { title, content, images } = create(req.body, CreateArticleBodyStruct); - - const article = await prismaClient.article.create({ - data :{ - title, - content, - images, - userId: req.user.id - } - }); - - return res.status(201).send(article); -} - -export async function getArticle(req, res) { - const { id } = create(req.params, IdParamsStruct); - - const article = await prismaClient.article.findUnique({ where: { id } }); - if (!article) { - throw new NotFoundError('article', id); - } - - return res.send(article); -} - - -export async function updateArticle(req, res) { - const { id } = create(req.params, IdParamsStruct); - const { title, content, image } = create(req.body, UpdateArticleBodyStruct); - - const existingArticle = await prismaClient.article.findUnique({ where: { id } }); - - if (!existingArticle) throw new NotFoundError('article', id); - if (existingArticle.userId !== req.user.id) { - return res.status(403).json({ message: '해당 게시글을 수정할 권한이 없습니다.' }); - } - - const updatedArticle = await prismaClient.article.update({ - where: { id }, - data: { title, content, image }, - }); - - res.send(updatedArticle); -} - - -export async function deleteArticle(req, res) { - const { id } = create(req.params, IdParamsStruct); - - const existingArticle = await prismaClient.article.findUnique({ where: { id } }); - if (!existingArticle) { - throw new NotFoundError('article', id); - } - - if (existingArticle.userId !== req.user.id) { - return res.status(403).json({ message: '해당 게시글을 삭제할 권한이 없습니다.' }); - } - - await prismaClient.article.delete({ where: { id } }); - return res.status(204).send(); -} - -export async function getArticleList(req, res) { - const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); - - const where = { - title: keyword ? { contains: keyword } : undefined, - }; - - const totalCount = await prismaClient.article.count({ where }); - const articles = await prismaClient.article.findMany({ - skip: (page - 1) * pageSize, - take: pageSize, - orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { id: 'asc' }, - where, - }); - - return res.send({ - list: articles, - totalCount, - }); -} - -export async function createComment(req, res) { - const { id: articleId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, CreateCommentBodyStruct); - - const existingArticle = await prismaClient.article.findUnique({ where: { id: articleId } }); - if (!existingArticle) { - throw new NotFoundError('article', articleId); - } - - const comment = await prismaClient.comment.create({ - data: { - articleId, - content, - }, - }); - - return res.status(201).send(comment); -} - -export async function getCommentList(req, res) { - const { id: articleId } = create(req.params, IdParamsStruct); - const { cursor, limit } = create(req.query, GetCommentListParamsStruct); - - const article = await prismaClient.article.findUnique({ where: { id: articleId } }); - if (!article) { - throw new NotFoundError('article', articleId); - } - - const commentsWithCursor = await prismaClient.comment.findMany({ - cursor: cursor ? { id: cursor } : undefined, - take: limit + 1, - where: { articleId }, - orderBy: { createdAt: 'desc' }, - }); - const comments = commentsWithCursor.slice(0, limit); - const cursorComment = commentsWithCursor[commentsWithCursor.length - 1]; - const nextCursor = cursorComment ? cursorComment.id : null; - - return res.send({ - list: comments, - nextCursor, - }); -} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js deleted file mode 100755 index c0157860..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/commentsController.js +++ /dev/null @@ -1,94 +0,0 @@ -import { create } from 'superstruct'; -import { prismaClient } from '../lib/prismaClient.js'; -import { UpdateCommentBodyStruct } from '../structs/commentsStruct.js'; -import NotFoundError from '../lib/errors/NotFoundError.js'; -import { IdParamsStruct } from '../structs/commonStructs.js'; - - - -export async function createComment(req, res) { - const { id: productId } = create(req.params, IdParamsStruct); - const { content } = create(req.body, CreateCommentBodyStruct); - - const existingProduct = await prismaClient.product.findUnique({ where: { id: productId } }); - if (!existingProduct) { - throw new NotFoundError('product', productId); - } - - const comment = await prismaClient.comment.create({ - data: { - productId, - content, - userId: req.user.id - } - }); - - if (existingProduct.userId && existingProduct.userId !== req.user.id) { - await prismaClient.notification.create({ - data: { - type: 'COMMENT', - userId: existingProduct.userId, - message: `[${existingProduct.name}] 상품에 새로운 댓글이 달렸습니다: ${content.substring(0, 15)}...`, - productId: productId, - }, - }); - } - - return res.status(201).send(comment); -} - - -export async function getCommentList(req, res) { - const { id: productId } = create(req.params, IdParamsStruct); - const { cursor, limit } = create(req.query, GetCommentListParamsStruct); - - const existingProduct = await prismaClient.product.findUnique({ where: { id: productId } }); - if (!existingProduct) { - throw new NotFoundError('product', productId); - } - - const commentsWithCursorComment = await prismaClient.comment.findMany({ - cursor: cursor ? { id: cursor } : undefined, - take: limit + 1, - where: { productId }, - }); - const comments = commentsWithCursorComment.slice(0, limit); - const cursorComment = commentsWithCursorComment[comments.length - 1]; - const nextCursor = cursorComment ? cursorComment.id : null; - - return res.send({ - list: comments, - nextCursor, - }); -} - - -export async function updateComment(req, res) { - const { id } = create(req.params, IdParamsStruct); - const { content } = create(req.body, UpdateCommentBodyStruct); - - const existingComment = await prismaClient.comment.findUnique({ where: { id } }); - if (!existingComment) { - throw new NotFoundError('comment', id); - } - - const updatedComment = await prismaClient.comment.update({ - where: { id }, - data: { content }, - }); - - return res.send(updatedComment); -} - -export async function deleteComment(req, res) { - const { id } = create(req.params, IdParamsStruct); - - const existingComment = await prismaClient.comment.findUnique({ where: { id } }); - if (!existingComment) { - throw new NotFoundError('comment', id); - } - - await prismaClient.comment.delete({ where: { id } }); - - return res.status(204).send(); -} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js deleted file mode 100755 index a735b8f1..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/errorController.js +++ /dev/null @@ -1,29 +0,0 @@ -import { StructError } from 'superstruct'; -import BadRequestError from '../lib/errors/BadRequestError.js'; -import NotFoundError from '../lib/errors/NotFoundError.js'; - -export function defaultNotFoundHandler(req, res, next) { - return res.status(404).send({ message: 'Not found' }); -} - -export function globalErrorHandler(err, req, res, next) { - if (err instanceof StructError || err instanceof BadRequestError) { - return res.status(400).send({ message: err.message }); - } - - if (err instanceof SyntaxError && err.status === 400 && 'body' in err) { - return res.status(400).send({ message: 'Invalid JSON' }); - } - - if (err.code) { - console.error(err); - return res.status(500).send({ message: 'Failed to process data' }); - } - - if (err instanceof NotFoundError) { - return res.status(404).send({ message: err.message }); - } - - console.error(err); - return res.status(500).send({ message: 'Internal server error' }); -} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js deleted file mode 100755 index 4f4adea3..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/imagesController.js +++ /dev/null @@ -1,41 +0,0 @@ -import multer from 'multer'; -import path from 'path'; -import { v4 as uuidv4 } from 'uuid'; -import { PUBLIC_PATH, STATIC_PATH } from '../lib/constants.js'; -import BadRequestError from '../lib/errors/BadRequestError.js'; - -const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; -const FILE_SIZE_LIMIT = 5 * 1024 * 1024; - -export const upload = multer({ - storage: multer.diskStorage({ - destination(req, file, cb) { - cb(null, PUBLIC_PATH); - }, - filename(req, file, cb) { - const ext = path.extname(file.originalname); - const filename = `${uuidv4()}${ext}`; - cb(null, filename); - }, - }), - - limits: { - fileSize: FILE_SIZE_LIMIT, - }, - - fileFilter: function (req, file, cb) { - if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { - const err = new BadRequestError('Only png, jpeg, and jpg are allowed'); - return cb(err); - } - - cb(null, true); - }, -}); - -export async function uploadImage(req, res) { - const host = req.get('host'); - const filePath = path.join(host, STATIC_PATH, req.file.filename); - const url = `http://${filePath}`; - return res.send({ url }); -} diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/userController.js b/pandamarket-be-sprint-mission-3-main/src/controllers/userController.js deleted file mode 100644 index c0f2deed..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/userController.js +++ /dev/null @@ -1,141 +0,0 @@ -import { PrismaClient } from '@prisma/client'; -import bcrypt from 'bcrypt'; -import { create } from 'superstruct'; -import { UpdateUserStruct, ChangePasswordStruct } from '../structs/userStructs.js'; - -const prisma = new PrismaClient(); - - -export const getMe = async (req, res) => { - const { password, ...userWithoutPassword } = req.user; - res.json(userWithoutPassword); -}; - - -export const updateMe = async (req, res) => { - try { - const { nickname, image } = create(req.body, UpdateUserStruct); - - const updatedUser = await prisma.user.update({ - where: { id: req.user.id }, - data: { nickname, image }, - }); - - const { password, ...userWithoutPassword } = updatedUser; - res.json(userWithoutPassword); - } catch (error) { - res.status(400).json({ message: '수정 데이터 형식이 올바르지 않습니다.' }); - } -}; - -export const changePassword = async (req, res) => { - try { - const { currentPassword, newPassword } = create(req.body, ChangePasswordStruct); - - const isMatch = await bcrypt.compare(currentPassword, req.user.password); - if (!isMatch) { - return res.status(401).json({ message: '현재 비밀번호가 일치하지 않습니다.' }); - } - - const hashedNewPassword = await bcrypt.hash(newPassword, 10); - await prisma.user.update({ - where: { id: req.user.id }, - data: { password: hashedNewPassword }, - }); - - res.status(200).json({ message: '비밀번호가 성공적으로 변경되었습니다.' }); - } catch (error) { - res.status(400).json({ message: error.message }); - } -}; - -export const getMyProducts = async (req, res) => { - const products = await prisma.product.findMany({ - where: { userId: req.user.id }, - orderBy: { createdAt: 'desc' }, - }); - res.json(products); -}; - -export const getMyLikedProducts = async (req, res) => { - const userId = req.user.id; - - const likedEntries = await prisma.productLike.findMany({ - where: { userId }, - include: { - product: true, - }, - }); - - const products = likedEntries.map((entry) => ({ - ...entry.product, - isLiked: true, - })); - - res.json(products); -}; - -export const getMyNotifications = async (req, res) => { - const notifications = await prisma.notification.findMany({ - where: { userId: req.user.id }, - orderBy: { createdAt: 'desc' }, - }); - - res.json(notifications); -}; - -export const readNotification = async (req, res) => { - const { id } = req.params; - - const notification = await prisma.notification.updateMany({ - where: { - id: Number(id), - userId: req.user.id, - }, - data: { isRead: true }, - }); - - if (notification.count === 0) { - return res.status(404).json({ message: '알림을 찾을 수 없거나 권한이 없습니다.' }); - } - - res.status(200).json({ message: '알림을 읽음 처리했습니다.' }); -}; - -export const readAllNotifications = async (req, res) => { - await prisma.notification.updateMany({ - where: { - userId: req.user.id, - isRead: false, - }, - data: { isRead: true }, - }); - - res.status(200).json({ message: '모든 알림을 읽음 처리했습니다.' }); -}; - -export const getUnreadNotificationCount = async (req, res) => { - const count = await prisma.notification.count({ - where: { - userId: req.user.id, - isRead: false, - }, - }); - - res.json({ count }); -}; - -export const deleteOldNotifications = async () => { - const thirtyDaysAgo = new Date(); - thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); - - const deleted = await prisma.notification.deleteMany({ - where: { - createdAt: { - lt: thirtyDaysAgo, - }, - }, - }); - - return deleted.count; -}; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/constants.js b/pandamarket-be-sprint-mission-3-main/src/lib/constants.js deleted file mode 100755 index aefa85fe..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/lib/constants.js +++ /dev/null @@ -1,7 +0,0 @@ -import dotenv from 'dotenv'; -dotenv.config(); - -export const DATABASE_URL = process.env.DATABASE_URL; -export const PORT = process.env.PORT || 3000; -export const PUBLIC_PATH = './public'; -export const STATIC_PATH = '/public'; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js b/pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js deleted file mode 100755 index 8e305a10..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/lib/errors/BadRequestError.js +++ /dev/null @@ -1,8 +0,0 @@ -class BadRequestError extends Error { - constructor(message) { - super(message); - this.name = 'BadRequestError'; - } -} - -export default BadRequestError; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js b/pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js deleted file mode 100755 index 1ebc84d2..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/lib/errors/NotFoundError.js +++ /dev/null @@ -1,8 +0,0 @@ -class NotFoundError extends Error { - constructor(modelName, id) { - super(`${modelName} with id ${id} not found`); - this.name = 'NotFoundError'; - } -} - -export default NotFoundError; diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js b/pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js deleted file mode 100755 index 5e41d6fe..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/lib/prismaClient.js +++ /dev/null @@ -1,3 +0,0 @@ -import { PrismaClient } from '@prisma/client'; - -export const prismaClient = new PrismaClient(); diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/socket.js b/pandamarket-be-sprint-mission-3-main/src/lib/socket.js deleted file mode 100644 index 5a5fbfc3..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/lib/socket.js +++ /dev/null @@ -1,35 +0,0 @@ -import { Server } from 'socket.io'; - -let io; - -export const initSocket = (server) => { - io = new Server(server, { - cors: { - origin: "*", // 실제 서비스 시에는 프론트엔드 도메인으로 제한하세요! - methods: ["GET", "POST"] - } - }); - - io.on('connection', (socket) => { - console.log(`User connected: ${socket.id}`); - - // 사용자가 로그인하면 자신의 userId로 된 Room에 입장하도록 설정 - socket.on('join', (userId) => { - socket.join(`user_${userId}`); - console.log(`User ${userId} joined their private room.`); - }); - - socket.on('disconnect', () => { - console.log('User disconnected'); - }); - }); - - return io; -}; - -export const getIO = () => { - if (!io) { - throw new Error("Socket.io not initialized!"); - } - return io; -}; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js b/pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js deleted file mode 100755 index 08fea591..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/lib/withAsync.js +++ /dev/null @@ -1,9 +0,0 @@ -export function withAsync(handler) { - return async function (req, res, next) { - try { - await handler(req, res); - } catch (e) { - next(e); - } - }; -} diff --git a/pandamarket-be-sprint-mission-3-main/src/main.js b/pandamarket-be-sprint-mission-3-main/src/main.js deleted file mode 100755 index 641cc0c3..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/main.js +++ /dev/null @@ -1,36 +0,0 @@ -import express from 'express'; -import http from 'http'; -import cors from 'cors'; -import path from 'path'; -import { initSocket, setupSocket } from './socket/socket.js'; -import { PORT, PUBLIC_PATH, STATIC_PATH } from './lib/constants.js'; -import articlesRouter from './routers/articlesRouter.js'; -import productsRouter from './routers/productsRouter.js'; -import commentsRouter from './routers/commentsRouter.js'; -import imagesRouter from './routers/imagesRouter.js'; -import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController.js'; - - -const app = express(); -const server = http.createServer(app); -const io = setupSocket(server); - -initSocket(server); - -app.use(cors()); -app.use(express.json()); -app.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); - -app.use('/articles', articlesRouter); -app.use('/products', productsRouter); -app.use('/comments', commentsRouter); -app.use('/images', imagesRouter); - -app.use(defaultNotFoundHandler); -app.use(globalErrorHandler); - -app.set('io', io); - -server.listen(PORT, () => { - console.log(` Server & WebSocket started on port ${PORT}`); -}); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js deleted file mode 100755 index 606d0358..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/routers/articlesRouter.js +++ /dev/null @@ -1,26 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync.js'; -import { - createArticle, - getArticleList, - getArticle, - updateArticle, - deleteArticle, - createComment, - getCommentList, -} from '../controllers/articlesController.js'; -import { toggleArticleLike } from '../controllers/likeController.js'; -import { authenticate } from '../middlewares/authMiddleware.js'; - -const articlesRouter = express.Router(); - -articlesRouter.post('/', authenticate, withAsync(createArticle)); -articlesRouter.get('/', authenticate, withAsync(getArticleList)); -articlesRouter.get('/:id', authenticate, withAsync(getArticle)); -articlesRouter.patch('/:id', authenticate, withAsync(updateArticle)); -articlesRouter.delete('/:id', authenticate, withAsync(deleteArticle)); -articlesRouter.post('/:id/comments', authenticate, withAsync(createComment)); -articlesRouter.get('/:id/comments', authenticate, withAsync(getCommentList)); -articlesRouter.post('/:id/like', authenticate, withAsync(toggleArticleLike)); - -export default articlesRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js b/pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js deleted file mode 100644 index 5f3765a7..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/routers/authRoutes.js +++ /dev/null @@ -1,12 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync.js'; -import * as authController from '../controllers/authController.js'; -import { validateSignUp } from '../middlewares/validate.js'; - -const router = express.Router(); - -router.post('/signup', validateSignUp, withAsync(authController.signUp)); -router.post('/signin', withAsync(authController.signIn)); -router.post('/refresh', withAsync(authController.refresh)); - -export default router; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js deleted file mode 100755 index 4298ed7e..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/routers/commentsRouter.js +++ /dev/null @@ -1,11 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync.js'; -import { updateComment, deleteComment } from '../controllers/commentsController.js'; -import { authenticate } from '../middlewares/authMiddleware.js'; - -const commentsRouter = express.Router(); - -commentsRouter.patch('/:id', authenticate, withAsync(updateComment)); -commentsRouter.delete('/:id', authenticate, withAsync(deleteComment)); - -export default commentsRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js deleted file mode 100755 index 163b87ce..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/routers/imagesRouter.js +++ /dev/null @@ -1,9 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync.js'; -import { upload, uploadImage } from '../controllers/imagesController.js'; - -const imagesRouter = express.Router(); - -imagesRouter.post('/upload', upload.single('image'), withAsync(uploadImage)); - -export default imagesRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js b/pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js deleted file mode 100755 index 083b9698..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/routers/productsRouter.js +++ /dev/null @@ -1,26 +0,0 @@ -import express from 'express'; -import { withAsync } from '../lib/withAsync.js'; -import { - createProduct, - getProduct, - updateProduct, - deleteProduct, - getProductList, - createComment, - getCommentList, -} from '../controllers/productsController.js'; -import { toggleProductLike } from '../controllers/likeController.js'; -import { authenticate } from '../middlewares/authMiddleware.js'; - -const productsRouter = express.Router(); - - productsRouter.post('/', authenticate, withAsync(createProduct)); - productsRouter.get('/:id', authenticate, withAsync(getProduct)); - productsRouter.patch('/:id', authenticate, withAsync(updateProduct)); - productsRouter.delete('/:id', authenticate, withAsync(deleteProduct)); - productsRouter.get('/', authenticate, withAsync(getProductList)); - productsRouter.post('/:id/comments', authenticate, withAsync(createComment)); - productsRouter.get('/:id/comments', authenticate, withAsync(getCommentList)); - productsRouter.post('/:id/like', authenticate, withAsync(toggleProductLike)); - -export default productsRouter; diff --git a/pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js b/pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js deleted file mode 100644 index 3a0fa227..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/routers/userRoutes.js +++ /dev/null @@ -1,21 +0,0 @@ -import express from 'express'; -import * as userController from '../controllers/userController.js'; -import { authenticate } from '../middlewares/authMiddleware.js'; -import { withAsync } from '../lib/withAsync.js'; - -const router = express.Router(); - -router.use(authenticate); - -router.get('/me', authenticate, withAsync(userController.getMe)); -router.patch('/me', authenticate, withAsync(userController.updateMe)); -router.patch('/me/password', authenticate, withAsync(userController.changePassword)); -router.get('/me/products', authenticate, withAsync(userController.getMyProducts)); -router.get('/me/likes', authenticate, withAsync(userController.getMyLikedItems)); -router.get('/me/notifications', authenticate, withAsync(userController.getMyNotifications)); -router.patch('/me/notifications', authenticate, withAsync(userController.readAllNotifications)); -router.get('/me/notifications/unread-count', authenticate, withAsync(userController.getUnreadNotificationCount)); -router.delete('/notifications/cleanup', withAsync(userController.deleteOldNotifications)); -router.patch('/me/notifications/:id', authenticate, withAsync(userController.readNotification)); - -export default router; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js b/pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js deleted file mode 100755 index 36a49e4b..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/structs/articlesStructs.js +++ /dev/null @@ -1,12 +0,0 @@ -import { coerce, nonempty, nullable, object, partial, string } from 'superstruct'; -import { PageParamsStruct } from './commonStructs.js'; - -export const GetArticleListParamsStruct = PageParamsStruct; - -export const CreateArticleBodyStruct = object({ - title: coerce(nonempty(string()), string(), (value) => value.trim()), - content: nonempty(string()), - image: nullable(string()), -}); - -export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js b/pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js deleted file mode 100644 index 73d1bb21..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/structs/authStructs.js +++ /dev/null @@ -1,12 +0,0 @@ -import { object, string, size } from 'superstruct'; - -export const SignUpStruct = object({ - email: string(), - nickname: string(), - password: size(string(), 8, 20), // 예시: 8~20자 사이 -}); - -export const SignInStruct = object({ - email: string(), - password: string(), -}); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js b/pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js deleted file mode 100755 index 9f93a0ec..00000000 --- a/pandamarket-be-sprint-mission-3-main/src/structs/commentsStruct.js +++ /dev/null @@ -1,10 +0,0 @@ -import { nonempty, object, partial, string } from 'superstruct'; -import { CursorParamsStruct } from './commonStructs.js'; - -export const CreateCommentBodyStruct = object({ - content: nonempty(string()), -}); - -export const GetCommentListParamsStruct = CursorParamsStruct; - -export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/20250111082621_/migration.sql b/prisma/migrations/20250111082621_/migration.sql similarity index 100% rename from pandamarket-be-sprint-mission-3-main/prisma/migrations/20250111082621_/migration.sql rename to prisma/migrations/20250111082621_/migration.sql diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226084615_init_notification_system/migration.sql b/prisma/migrations/20260226084615_init_notification_system/migration.sql similarity index 100% rename from pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226084615_init_notification_system/migration.sql rename to prisma/migrations/20260226084615_init_notification_system/migration.sql diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226091616_add_owner_to_product/migration.sql b/prisma/migrations/20260226091616_add_owner_to_product/migration.sql similarity index 100% rename from pandamarket-be-sprint-mission-3-main/prisma/migrations/20260226091616_add_owner_to_product/migration.sql rename to prisma/migrations/20260226091616_add_owner_to_product/migration.sql diff --git a/pandamarket-be-sprint-mission-3-main/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml similarity index 100% rename from pandamarket-be-sprint-mission-3-main/prisma/migrations/migration_lock.toml rename to prisma/migrations/migration_lock.toml diff --git a/pandamarket-be-sprint-mission-3-main/prisma/schema.prisma b/prisma/schema.prisma similarity index 100% rename from pandamarket-be-sprint-mission-3-main/prisma/schema.prisma rename to prisma/schema.prisma diff --git a/pandamarket-be-sprint-mission-3-main/public/.gitkeep b/public/.gitkeep similarity index 100% rename from pandamarket-be-sprint-mission-3-main/public/.gitkeep rename to public/.gitkeep diff --git a/pandamarket-be-sprint-mission-3-main/read.me b/read.me similarity index 100% rename from pandamarket-be-sprint-mission-3-main/read.me rename to read.me diff --git a/src/controllers/articlesController.ts b/src/controllers/articlesController.ts new file mode 100755 index 00000000..624b55df --- /dev/null +++ b/src/controllers/articlesController.ts @@ -0,0 +1,131 @@ +import { create } from 'superstruct'; +import { prismaClient as prisma } from '../lib/prismaClient'; +import { withAsync } from '../lib/withAsync'; +import NotFoundError from '../lib/errors/NotFoundError'; +import { IdParamsStruct } from '../structs/commonStructs'; +import { + CreateArticleBodyStruct, + UpdateArticleBodyStruct, + GetArticleListParamsStruct, +} from '../structs/articlesStructs'; +import { CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; +import type { Request, Response } from 'express'; + +export const createArticle = withAsync(async (req: Request, res: Response) => { + const { title, content, image } = create(req.body, CreateArticleBodyStruct); + + const article = await prisma.article.create({ + data: { + title, + content, + image, + userId: req.user.id + } + }); + + res.status(201).send(article); +}); + + +export const getArticle = withAsync(async (req: Request, res: Response) => { + const { id } = create(req.params, IdParamsStruct); + + const article = await prisma.article.findUnique({ where: { id } }); + if (!article) throw new NotFoundError('article', id.toString()); + + res.send(article); +}); + + +export const updateArticle = withAsync(async (req: Request, res: Response) => { + const { id } = create(req.params, IdParamsStruct); + const { title, content, image } = create(req.body, UpdateArticleBodyStruct); + + const existingArticle = await prisma.article.findUnique({ where: { id } }); + + if (!existingArticle) throw new NotFoundError('article', id.toString()); + if (existingArticle.userId !== req.user.id) { + return res.status(403).json({ message: '해당 게시글을 수정할 권한이 없습니다.' }); + } + + const updatedArticle = await prisma.article.update({ + where: { id }, + data: { title, content, image }, + }); + + res.send(updatedArticle); +}); + +export const deleteArticle = withAsync(async (req: Request, res: Response) => { + const { id } = create(req.params, IdParamsStruct); + + const existingArticle = await prisma.article.findUnique({ where: { id } }); + + if (!existingArticle) throw new NotFoundError('article', id.toString()); + if (existingArticle.userId !== req.user.id) { + return res.status(403).json({ message: '해당 게시글을 삭제할 권한이 없습니다.' }); + } + + await prisma.article.delete({ where: { id } }); + + res.status(204).send(); +}); + +export const getArticleList = withAsync(async (req: Request, res: Response) => { + const { page, pageSize, orderBy, keyword } = create(req.query, GetArticleListParamsStruct); + + const where = { + title: keyword ? { contains: keyword } : undefined, + }; + + const totalCount = await prisma.article.count({ where }); + const articles = await prisma.article.findMany({ + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: orderBy === 'recent' ? { createdAt: 'desc' } : { id: 'asc' }, + where, + }); + + res.send({ list: articles, totalCount }); +}); + + +export const createComment = withAsync(async (req: Request, res: Response) => { + const { id: articleId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + + const existingArticle = await prisma.article.findUnique({ where: { id: articleId } }); + if (!existingArticle) throw new NotFoundError('article', articleId.toString()); + + const comment = await prisma.comment.create({ + data: { + articleId, + content, + userId: req.user.id, + }, + }); + + res.status(201).send(comment); +}); + + +export const getCommentList = withAsync(async (req: Request, res: Response) => { + const { id: articleId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + + const article = await prisma.article.findUnique({ where: { id: articleId } }); + if (!article) throw new NotFoundError('article', articleId.toString()); + + const commentsWithCursor = await prisma.comment.findMany({ + cursor: cursor ? { id: cursor } : undefined, + take: limit + 1, + where: { articleId }, + orderBy: { createdAt: 'desc' }, + }); + + const hasNextPage = commentsWithCursor.length > limit; + const comments = commentsWithCursor.slice(0, limit); + const nextCursor = hasNextPage ? commentsWithCursor[limit].id : null; + + res.send({ list: comments, nextCursor }); +}); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/authController.js b/src/controllers/authController.ts similarity index 53% rename from pandamarket-be-sprint-mission-3-main/src/controllers/authController.js rename to src/controllers/authController.ts index 6ff1e562..d2d48243 100644 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/authController.js +++ b/src/controllers/authController.ts @@ -1,16 +1,24 @@ -import { PrismaClient } from '@prisma/client'; +import { PrismaClient, User } from '@prisma/client'; import bcrypt from 'bcrypt'; import jwt from 'jsonwebtoken'; +import type { Request, Response } from 'express'; +import { withAsync } from '../lib/withAsync'; const prisma = new PrismaClient(); -const generateTokens = (user) => { - const accessToken = jwt.sign({ id: user.id }, process.env.JWT_SECRET, { expiresIn: '15m' }); - const refreshToken = jwt.sign({ id: user.id }, process.env.REFRESH_SECRET, { expiresIn: '7d' }); + +const generateTokens = (user: User) => { + const accessSecret = process.env.JWT_SECRET || 'access_secret'; + const refreshSecret = process.env.REFRESH_SECRET || 'refresh_secret'; + + const accessToken = jwt.sign({ id: user.id }, accessSecret, { expiresIn: '15m' }); + const refreshToken = jwt.sign({ id: user.id }, refreshSecret, { expiresIn: '7d' }); + return { accessToken, refreshToken }; }; -export const signUp = async (req, res) => { + +export const signUp = withAsync(async (req: Request, res: Response) => { const { email, nickname, password } = req.body; const existingUser = await prisma.user.findUnique({ where: { email } }); @@ -25,9 +33,10 @@ export const signUp = async (req, res) => { const { password: _, refreshToken: __, ...userWithoutPassword } = user; res.status(201).json(userWithoutPassword); -}; +}); -export const signIn = async (req, res) => { + +export const signIn = withAsync(async (req: Request, res: Response) => { const { email, password } = req.body; const user = await prisma.user.findUnique({ where: { email } }); @@ -53,36 +62,35 @@ export const signIn = async (req, res) => { refreshToken, user: userWithoutPassword, }); -}; +}); -export const refresh = async (req, res) => { + +export const refresh = withAsync(async (req: Request, res: Response) => { const { refreshToken } = req.body; if (!refreshToken) { return res.status(401).json({ message: '리프레시 토큰이 없습니다.' }); } - try { - const decoded = jwt.verify(refreshToken, process.env.REFRESH_SECRET); - - const user = await prisma.user.findUnique({ where: { id: decoded.id } }); - - if (!user || user.refreshToken !== refreshToken) { - return res.status(403).json({ message: '유효하지 않은 리프레시 토큰입니다.' }); - } - - const tokens = generateTokens(user); - - await prisma.user.update({ - where: { id: user.id }, - data: { refreshToken: tokens.refreshToken }, - }); - - res.json({ - accessToken: tokens.accessToken, - refreshToken: tokens.refreshToken, - }); - } catch (error) { - return res.status(403).json({ message: '토큰이 만료되었거나 올바르지 않습니다.' }); + const refreshSecret = process.env.REFRESH_SECRET || 'refresh_secret'; + + const decoded = jwt.verify(refreshToken, refreshSecret) as { id: number }; + + const user = await prisma.user.findUnique({ where: { id: decoded.id } }); + + if (!user || user.refreshToken !== refreshToken) { + return res.status(403).json({ message: '유효하지 않은 리프레시 토큰입니다.' }); } -}; \ No newline at end of file + + const tokens = generateTokens(user); + + await prisma.user.update({ + where: { id: user.id }, + data: { refreshToken: tokens.refreshToken }, + }); + + res.json({ + accessToken: tokens.accessToken, + refreshToken: tokens.refreshToken, + }); +}); \ No newline at end of file diff --git a/src/controllers/commentsController.ts b/src/controllers/commentsController.ts new file mode 100755 index 00000000..e0efca47 --- /dev/null +++ b/src/controllers/commentsController.ts @@ -0,0 +1,105 @@ +import { create } from 'superstruct'; +import { prismaClient as prisma } from '../lib/prismaClient'; // 통일된 이름 사용 +import { withAsync } from '../lib/withAsync'; +import { UpdateCommentBodyStruct, CreateCommentBodyStruct, GetCommentListParamsStruct } from '../structs/commentsStruct'; +import NotFoundError from '../lib/errors/NotFoundError'; +import { IdParamsStruct } from '../structs/commonStructs'; +import type { Request, Response } from 'express'; + + +export const createComment = withAsync(async (req: Request, res: Response) => { + const { id: productId } = create(req.params, IdParamsStruct); + const { content } = create(req.body, CreateCommentBodyStruct); + + const existingProduct = await prisma.product.findUnique({ where: { id: productId } }); + if (!existingProduct) { + throw new NotFoundError('product', productId.toString()); + } + + const comment = await prisma.comment.create({ + data: { + productId, + content, + userId: req.user.id + } + }); + + if (existingProduct.userId && existingProduct.userId !== req.user.id) { + await prisma.notification.create({ + data: { + type: 'COMMENT', + userId: existingProduct.userId, + message: `[${existingProduct.name}] 상품에 새로운 댓글이 달렸습니다: ${content.substring(0, 15)}...`, + productId: productId, + }, + }); + } + + res.status(201).send(comment); +}); + + +export const getCommentList = withAsync(async (req: Request, res: Response) => { + const { id: productId } = create(req.params, IdParamsStruct); + const { cursor, limit } = create(req.query, GetCommentListParamsStruct); + + const existingProduct = await prisma.product.findUnique({ where: { id: productId } }); + if (!existingProduct) { + throw new NotFoundError('product', productId.toString()); + } + + const commentsWithCursor = await prisma.comment.findMany({ + cursor: cursor ? { id: cursor } : undefined, + take: limit + 1, + where: { productId }, + orderBy: { createdAt: 'desc' }, + }); + + const hasNextPage = commentsWithCursor.length > limit; + const comments = commentsWithCursor.slice(0, limit); + const nextCursor = hasNextPage ? commentsWithCursor[limit].id : null; + + res.send({ + list: comments, + nextCursor, + }); +}); + +export const updateComment = withAsync(async (req: Request, res: Response) => { + const { id } = create(req.params, IdParamsStruct); + const { content } = create(req.body, UpdateCommentBodyStruct); + + const existingComment = await prisma.comment.findUnique({ where: { id } }); + if (!existingComment) { + throw new NotFoundError('comment', id.toString()); + } + + if (existingComment.userId !== req.user.id) { + return res.status(403).json({ message: '해당 댓글을 수정할 권한이 없습니다.' }); + } + + const updatedComment = await prisma.comment.update({ + where: { id }, + data: { content }, + }); + + res.send(updatedComment); +}); + + +export const deleteComment = withAsync(async (req: Request, res: Response) => { + const { id } = create(req.params, IdParamsStruct); + + const existingComment = await prisma.comment.findUnique({ where: { id } }); + if (!existingComment) { + throw new NotFoundError('comment', id.toString()); + } + + if (existingComment.userId !== req.user.id) { + return res.status(403).json({ message: '해당 댓글을 삭제할 권한이 없습니다.' }); + } + + await prisma.comment.delete({ where: { id } }); + + res.status(204).send(); +}); \ No newline at end of file diff --git a/src/controllers/errorController.ts b/src/controllers/errorController.ts new file mode 100755 index 00000000..c1535d97 --- /dev/null +++ b/src/controllers/errorController.ts @@ -0,0 +1,30 @@ +import { StructError } from 'superstruct'; +import type { Request, Response, NextFunction } from 'express'; // ✅ Express 타입 임포트 +import BadRequestError from '../lib/errors/BadRequestError'; +import NotFoundError from '../lib/errors/NotFoundError'; + +export function defaultNotFoundHandler(req: Request, res: Response, _next: NextFunction) { + return res.status(404).send({ message: 'Not found' }); +} + +export function globalErrorHandler(err: any, req: Request, res: Response, _next: NextFunction) { + if (err instanceof StructError || err instanceof BadRequestError) { + return res.status(400).send({ message: err.message }); + } + + if (err instanceof SyntaxError && (err as any).status === 400 && 'body' in err) { + return res.status(400).send({ message: 'Invalid JSON' }); + } + + if (err instanceof NotFoundError) { + return res.status(404).send({ message: err.message }); + } + + if (err.code) { + console.error('DB/Code Error:', err); + return res.status(500).send({ message: 'Failed to process data' }); + } + + console.error('Unexpected Error:', err); + return res.status(500).send({ message: 'Internal server error' }); +} \ No newline at end of file diff --git a/src/controllers/imagesController.ts b/src/controllers/imagesController.ts new file mode 100755 index 00000000..46c758dd --- /dev/null +++ b/src/controllers/imagesController.ts @@ -0,0 +1,49 @@ +import multer, { FileFilterCallback } from 'multer'; +import path from 'path'; +import { v4 as uuidv4 } from 'uuid'; +import { PUBLIC_PATH, STATIC_PATH } from '../lib/constants'; +import BadRequestError from '../lib/errors/BadRequestError'; +import type { Request, Response } from 'express'; + +type DestinationCallback = (error: Error | null, destination: string) => void; +type FileNameCallback = (error: Error | null, filename: string) => void; + + +export const upload = multer({ + storage: multer.diskStorage({ + destination(req: Request, file: Express.Multer.File, cb: DestinationCallback) { + cb(null, PUBLIC_PATH); + }, + filename(req: Request, file: Express.Multer.File, cb: FileNameCallback) { + const ext = path.extname(file.originalname); + const filename = `${uuidv4()}${ext}`; + cb(null, filename); + }, + }), + + limits: { + fileSize: 5 * 1024 * 1024, // 5MB 제한 + }, + + fileFilter: (req: Request, file: Express.Multer.File, cb: FileFilterCallback) => { + const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; + + if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { + const err = new BadRequestError('Only png, jpeg, and jpg are allowed'); + return cb(err as any, false); + } + cb(null, true); + }, +}); + + +export async function uploadImage(req: Request, res: Response) { + if (!req.file) { + throw new BadRequestError('파일이 업로드되지 않았습니다.'); + } + + const host = req.get('host'); + const url = `http://${host}/${STATIC_PATH}/${req.file.filename}`; + + return res.send({ url }); +} \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js b/src/controllers/likeController.ts similarity index 60% rename from pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js rename to src/controllers/likeController.ts index ee835eb5..6ec91b6b 100644 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/likeController.js +++ b/src/controllers/likeController.ts @@ -1,9 +1,13 @@ import { PrismaClient } from '@prisma/client'; +import type { Request, Response } from 'express'; +import { withAsync } from '../lib/withAsync'; + const prisma = new PrismaClient(); -export const toggleProductLike = async (req, res) => { + +export const toggleProductLike = withAsync(async (req: Request, res: Response) => { const { id: productId } = req.params; - const userId = req.user.id; + const userId = req.user.id; const existingLike = await prisma.productLike.findUnique({ where: { @@ -18,19 +22,23 @@ export const toggleProductLike = async (req, res) => { await prisma.productLike.delete({ where: { id: existingLike.id }, }); - return res.json({ isLiked: false }); + res.json({ isLiked: false }); } else { + // 좋아요 생성 await prisma.productLike.create({ data: { userId: userId, productId: Number(productId), }, }); - return res.json({ isLiked: true }); + res.json({ isLiked: true }); } -}; +}); -export const toggleArticleLike = async (req, res) => { +/** + * 💡 게시글 좋아요 토글 + */ +export const toggleArticleLike = withAsync(async (req: Request, res: Response) => { const { id: articleId } = req.params; const userId = req.user.id; @@ -45,16 +53,20 @@ export const toggleArticleLike = async (req, res) => { if (existingLike) { await prisma.articleLike.delete({ where: { id: existingLike.id } }); - return res.json({ isLiked: false }); + res.json({ isLiked: false }); } else { await prisma.articleLike.create({ - data: { userId, articleId: Number(articleId) }, + data: { + userId, + articleId: Number(articleId) + }, }); - return res.json({ isLiked: true }); + res.json({ isLiked: true }); } -}; +}); + -export const getProductDetail = async (req, res) => { +export const getProductDetail = withAsync(async (req: Request, res: Response) => { const { id } = req.params; const userId = req.user?.id; @@ -65,15 +77,22 @@ export const getProductDetail = async (req, res) => { } }); - if (!product) return res.status(404).json({ message: '상품을 찾을 수 없습니다.' }); + if (!product) { + return res.status(404).json({ message: '상품을 찾을 수 없습니다.' }); + } let isLiked = false; if (userId) { const like = await prisma.productLike.findUnique({ - where: { userId_productId: { userId, productId: Number(id) } } + where: { + userId_productId: { + userId, + productId: Number(id) + } + } }); isLiked = !!like; } res.json({ ...product, isLiked }); -}; \ No newline at end of file +}); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js b/src/controllers/productsController.ts similarity index 50% rename from pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js rename to src/controllers/productsController.ts index ce9bb7b8..ded3141f 100755 --- a/pandamarket-be-sprint-mission-3-main/src/controllers/productsController.js +++ b/src/controllers/productsController.ts @@ -1,56 +1,51 @@ import { create } from 'superstruct'; -import { prismaClient } from '../lib/prismaClient.js'; -import NotFoundError from '../lib/errors/NotFoundError.js'; -import { IdParamsStruct } from '../structs/commonStructs.js'; +import { prismaClient as prisma } from '../lib/prismaClient'; +import { withAsync } from '../lib/withAsync'; +import NotFoundError from '../lib/errors/NotFoundError'; +import { IdParamsStruct } from '../structs/commonStructs'; import { CreateProductBodyStruct, GetProductListParamsStruct, UpdateProductBodyStruct, -} from '../structs/productsStruct.js'; -import { emitNotification } from '../socket/socket.js'; - - -export async function createProduct(req, res) { - try { - const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); - - const product = await prismaClient.product.create({ - data: { - name, - description, - price, - tags, - images, - userId: req.user.id - }, - }); +} from '../structs/productsStruct'; +import { emitNotification } from '../socket/socket'; +import type { Request, Response } from 'express'; + + +export const createProduct = withAsync(async (req: Request, res: Response) => { + const { name, description, price, tags, images } = create(req.body, CreateProductBodyStruct); + + const product = await prisma.product.create({ + data: { + name, + description, + price, + tags, + images, + userId: req.user.id + }, + }); + + res.status(201).send(product); +}); - res.status(201).send(product); - } catch (error) { - res.status(400).json({ message: error.message }); - } -} -export async function getProduct(req, res) { +export const getProduct = withAsync(async (req: Request, res: Response) => { const { id } = create(req.params, IdParamsStruct); - const product = await prismaClient.product.findUnique({ where: { id } }); - if (!product) { - throw new NotFoundError('product', id); - } + const product = await prisma.product.findUnique({ where: { id } }); + if (!product) throw new NotFoundError('product', id.toString()); - return res.send(product); -} + res.send(product); +}); -export async function updateProduct(req, res) { +export const updateProduct = withAsync(async (req: Request, res: Response) => { const { id } = create(req.params, IdParamsStruct); const { name, description, price, tags, images } = create(req.body, UpdateProductBodyStruct); - const existingProduct = await prismaClient.product.findUnique({ where: { id } }); - if (!existingProduct) { - throw new NotFoundError('product', id); - } + const existingProduct = await prisma.product.findUnique({ where: { id } }); + if (!existingProduct) throw new NotFoundError('product', id.toString()); if (existingProduct.userId !== req.user.id) { return res.status(403).json({ message: '해당 상품을 수정할 권한이 없습니다.' }); @@ -58,13 +53,13 @@ export async function updateProduct(req, res) { const isPriceChanged = price !== undefined && existingProduct.price !== price; - const updatedProduct = await prismaClient.product.update({ + const updatedProduct = await prisma.product.update({ where: { id }, data: { name, description, price, tags, images }, }); if (isPriceChanged) { - const likes = await prismaClient.productLike.findMany({ + const likes = await prisma.productLike.findMany({ where: { productId: id }, select: { userId: true }, }); @@ -72,7 +67,7 @@ export async function updateProduct(req, res) { if (likes.length > 0) { const message = `관심 상품 [${updatedProduct.name}]의 가격이 ${existingProduct.price}원에서 ${price}원으로 변경되었습니다!`; - await prismaClient.notification.createMany({ + await prisma.notification.createMany({ data: likes.map((like) => ({ type: 'PRICE_CHANGE', userId: like.userId, @@ -93,27 +88,11 @@ export async function updateProduct(req, res) { } } - return res.send(updatedProduct); -} + res.send(updatedProduct); +}); -export async function deleteProduct(req, res) { - const { id } = create(req.params, IdParamsStruct); - const existingProduct = await prismaClient.product.findUnique({ where: { id } }); - - if (!existingProduct) { - throw new NotFoundError('product', id); - } - - if (existingProduct.userId !== req.user.id) { - return res.status(403).json({ message: '해당 상품을 삭제할 권한이 없습니다.' }); - } - await prismaClient.product.delete({ where: { id } }); - - return res.status(204).send(); -} - -export async function getProductList(req, res) { +export const getProductList = withAsync(async (req: Request, res: Response) => { const { page, pageSize, orderBy, keyword } = create(req.query, GetProductListParamsStruct); const where = keyword @@ -121,17 +100,29 @@ export async function getProductList(req, res) { OR: [{ name: { contains: keyword } }, { description: { contains: keyword } }], } : undefined; - const totalCount = await prismaClient.product.count({ where }); - const products = await prismaClient.product.findMany({ + + const totalCount = await prisma.product.count({ where }); + const products = await prisma.product.findMany({ skip: (page - 1) * pageSize, take: pageSize, orderBy: orderBy === 'recent' ? { id: 'desc' } : { id: 'asc' }, where, }); - return res.send({ - list: products, - totalCount, - }); -} + res.send({ list: products, totalCount }); +}); + +export const deleteProduct = withAsync(async (req: Request, res: Response) => { + const { id } = create(req.params, IdParamsStruct); + + const existingProduct = await prisma.product.findUnique({ where: { id } }); + if (!existingProduct) throw new NotFoundError('product', id.toString()); + + if (existingProduct.userId !== req.user.id) { + return res.status(403).json({ message: '해당 상품을 삭제할 권한이 없습니다.' }); + } + + await prisma.product.delete({ where: { id } }); + res.status(204).send(); +}); diff --git a/src/controllers/userController.ts b/src/controllers/userController.ts new file mode 100644 index 00000000..beb10fff --- /dev/null +++ b/src/controllers/userController.ts @@ -0,0 +1,167 @@ +import bcrypt from 'bcrypt'; +import { create } from 'superstruct'; +import { prismaClient as prisma } from '../lib/prismaClient'; +import { withAsync } from '../lib/withAsync'; +import { UpdateUserStruct, ChangePasswordStruct } from '../structs/userStructs'; +import type { Request, Response } from 'express'; + +export const getMe = withAsync(async (req: Request, res: Response) => { + const { password, ...userWithoutPassword } = req.user; + res.json(userWithoutPassword); +}); + +export const updateMe = withAsync(async (req: Request, res: Response) => { + const { nickname, image } = create(req.body, UpdateUserStruct); + + const updatedUser = await prisma.user.update({ + where: { id: req.user.id }, + data: { nickname, image }, + }); + + const { password, ...userWithoutPassword } = updatedUser; + res.json(userWithoutPassword); +}); + +export const changePassword = withAsync(async (req: Request, res: Response) => { + const { currentPassword, newPassword } = create(req.body, ChangePasswordStruct); + + const isMatch = await bcrypt.compare(currentPassword, req.user.password); + if (!isMatch) { + return res.status(401).json({ message: '현재 비밀번호가 일치하지 않습니다.' }); + } + + const hashedNewPassword = await bcrypt.hash(newPassword, 10); + await prisma.user.update({ + where: { id: req.user.id }, + data: { password: hashedNewPassword }, + }); + + res.status(200).json({ message: '비밀번호가 성공적으로 변경되었습니다.' }); +}); + +// ── 내 상품 목록 조회 ──────────────────────────────────────────── +export const getMyProducts = withAsync(async (req: Request, res: Response) => { + const page = Number(req.query.page) || 1; + const pageSize = Number(req.query.pageSize) || 10; + + const [products, totalCount] = await Promise.all([ + prisma.product.findMany({ + where: { userId: req.user.id }, + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: { createdAt: 'desc' }, + }), + prisma.product.count({ where: { userId: req.user.id } }), + ]); + + res.json({ list: products, totalCount }); +}); + +// ── 내가 좋아요한 상품/게시글 목록 조회 ───────────────────────── +export const getMyLikedItems = withAsync(async (req: Request, res: Response) => { + const page = Number(req.query.page) || 1; + const pageSize = Number(req.query.pageSize) || 10; + const type = req.query.type as string | undefined; // 'product' | 'article' + + if (!type || type === 'product') { + const [likes, totalCount] = await Promise.all([ + prisma.productLike.findMany({ + where: { userId: req.user.id }, + include: { product: true }, + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: { id: 'desc' }, + }), + prisma.productLike.count({ where: { userId: req.user.id } }), + ]); + + return res.json({ list: likes.map((l) => l.product), totalCount }); + } + + if (type === 'article') { + const [likes, totalCount] = await Promise.all([ + prisma.articleLike.findMany({ + where: { userId: req.user.id }, + include: { article: true }, + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: { id: 'desc' }, + }), + prisma.articleLike.count({ where: { userId: req.user.id } }), + ]); + + return res.json({ list: likes.map((l) => l.article), totalCount }); + } + + res.status(400).json({ message: 'type은 product 또는 article 이어야 합니다.' }); +}); + +// ── 내 알림 목록 조회 ──────────────────────────────────────────── +export const getMyNotifications = withAsync(async (req: Request, res: Response) => { + const page = Number(req.query.page) || 1; + const pageSize = Number(req.query.pageSize) || 20; + + const [notifications, totalCount] = await Promise.all([ + prisma.notification.findMany({ + where: { userId: req.user.id }, + skip: (page - 1) * pageSize, + take: pageSize, + orderBy: { createdAt: 'desc' }, + }), + prisma.notification.count({ where: { userId: req.user.id } }), + ]); + + res.json({ list: notifications, totalCount }); +}); + +// ── 모든 알림 읽음 처리 ────────────────────────────────────────── +export const readAllNotifications = withAsync(async (req: Request, res: Response) => { + await prisma.notification.updateMany({ + where: { userId: req.user.id, isRead: false }, + data: { isRead: true }, + }); + + res.status(200).json({ message: '모든 알림을 읽음 처리했습니다.' }); +}); + +// ── 읽지 않은 알림 개수 조회 ───────────────────────────────────── +export const getUnreadNotificationCount = withAsync(async (req: Request, res: Response) => { + const count = await prisma.notification.count({ + where: { userId: req.user.id, isRead: false }, + }); + + res.json({ count }); +}); + +// ── 단일 알림 읽음 처리 ────────────────────────────────────────── +export const readNotification = withAsync(async (req: Request, res: Response) => { + const { id } = req.params; + + const result = await prisma.notification.updateMany({ + where: { + id: Number(id), + userId: req.user.id, + }, + data: { isRead: true }, + }); + + if (result.count === 0) { + return res.status(404).json({ message: '알림을 찾을 수 없거나 권한이 없습니다.' }); + } + + res.status(200).json({ message: '알림을 읽음 처리했습니다.' }); +}); + +// ── 30일 이상 된 알림 삭제 (스케줄러용) ───────────────────────── +export const deleteOldNotifications = withAsync(async (req: Request, res: Response) => { + const thirtyDaysAgo = new Date(); + thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30); + + const deleted = await prisma.notification.deleteMany({ + where: { + createdAt: { lt: thirtyDaysAgo }, + }, + }); + + res.status(200).json({ message: `${deleted.count}개의 오래된 알림을 삭제했습니다.` }); +}); \ No newline at end of file diff --git a/src/lib/constants.ts b/src/lib/constants.ts new file mode 100755 index 00000000..4e7d8f8b --- /dev/null +++ b/src/lib/constants.ts @@ -0,0 +1,11 @@ +import dotenv from 'dotenv'; +dotenv.config(); + +if (!process.env.DATABASE_URL) { + throw new Error(' DATABASE_URL is missing in .env file'); +} + +export const DATABASE_URL: string = process.env.DATABASE_URL; +export const PORT: number = Number(process.env.PORT) || 3000; +export const PUBLIC_PATH: string = './public'; +export const STATIC_PATH: string = '/public'; \ No newline at end of file diff --git a/src/lib/errors/BadRequestError.ts b/src/lib/errors/BadRequestError.ts new file mode 100755 index 00000000..80c34805 --- /dev/null +++ b/src/lib/errors/BadRequestError.ts @@ -0,0 +1,10 @@ +class BadRequestError extends Error { + constructor(message: string) { + super(message); + this.name = 'BadRequestError'; + + Object.setPrototypeOf(this, BadRequestError.prototype); + } +} + +export default BadRequestError; \ No newline at end of file diff --git a/src/lib/errors/NotFoundError.ts b/src/lib/errors/NotFoundError.ts new file mode 100755 index 00000000..c80137fd --- /dev/null +++ b/src/lib/errors/NotFoundError.ts @@ -0,0 +1,11 @@ +class NotFoundError extends Error { + constructor(modelName: string, id: string | number) { + super(`${modelName} with id ${id} not found`); + + this.name = 'NotFoundError'; + + Object.setPrototypeOf(this, NotFoundError.prototype); + } +} + +export default NotFoundError; \ No newline at end of file diff --git a/src/lib/prismaClient.ts b/src/lib/prismaClient.ts new file mode 100755 index 00000000..c89d55f5 --- /dev/null +++ b/src/lib/prismaClient.ts @@ -0,0 +1,14 @@ +import { PrismaClient } from '@prisma/client'; + + +const globalForPrisma = globalThis as unknown as { + prisma: PrismaClient | undefined; +}; + + +export const prismaClient: PrismaClient = + globalForPrisma.prisma ?? new PrismaClient(); + +if (process.env.NODE_ENV !== 'production') { + globalForPrisma.prisma = prismaClient; +} \ No newline at end of file diff --git a/src/lib/socket.ts b/src/lib/socket.ts new file mode 100644 index 00000000..f1036da1 --- /dev/null +++ b/src/lib/socket.ts @@ -0,0 +1,36 @@ +import { Server } from 'socket.io'; +import type { Socket } from 'socket.io'; +import type { Server as HttpServer } from 'http'; + +let io: Server | null = null; + +export const initSocket = (server: HttpServer): Server => { + io = new Server(server, { + cors: { + origin: "*", + methods: ["GET", "POST"] + } + }); + + io.on('connection', (socket: Socket) => { + console.log(` User connected: ${socket.id}`); + + socket.on('join', (userId: string | number) => { + socket.join(`user_${userId}`); + console.log(` User ${userId} joined their private room.`); + }); + + socket.on('disconnect', () => { + console.log(' User disconnected'); + }); + }); + + return io; +}; + +export const getIO = (): Server => { + if (!io) { + throw new Error("⚠️ Socket.io not initialized! Call initSocket first."); + } + return io; +}; \ No newline at end of file diff --git a/src/lib/withAsync.ts b/src/lib/withAsync.ts new file mode 100755 index 00000000..504f536c --- /dev/null +++ b/src/lib/withAsync.ts @@ -0,0 +1,11 @@ +import { Request, Response, NextFunction, RequestHandler } from 'express'; + +export const withAsync = (fn: Function): RequestHandler => { + return async (req: Request, res: Response, next: NextFunction) => { + try { + await fn(req, res, next); + } catch (error) { + next(error); + } + }; +}; \ No newline at end of file diff --git a/src/main.ts b/src/main.ts new file mode 100755 index 00000000..e663f40d --- /dev/null +++ b/src/main.ts @@ -0,0 +1,34 @@ +import http from 'http'; +import serverApp from './server'; // server.ts를 가져옵니다. +import { setupSocket } from './socket/socket'; +import { PORT } from './lib/constants'; +import { PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient(); + +async function bootstrap() { + try { + // 1. DB 연결 확인 + await prisma.$connect(); + console.log('✅ Database connected'); + + // 2. HTTP 서버 생성 (serverApp 사용) + const httpServer: http.Server = http.createServer(serverApp); + + // 3. 소켓 설정 및 저장 + const io = setupSocket(httpServer); + serverApp.set('io', io); // 이제 컨트롤러에서 req.app.get('io') 가능! + + // 4. 리스닝 시작 + httpServer.listen(PORT, () => { + console.log(`🚀 Server started on port ${PORT}`); + }); + + } catch (error) { + console.error('❌ Server start failed:', error); + await prisma.$disconnect(); + process.exit(1); + } +} + +bootstrap(); \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js b/src/middlewares/authMiddleware.ts similarity index 68% rename from pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js rename to src/middlewares/authMiddleware.ts index ed070429..16b2ea4c 100644 --- a/pandamarket-be-sprint-mission-3-main/src/middlewares/authMiddleware.js +++ b/src/middlewares/authMiddleware.ts @@ -1,21 +1,29 @@ import jwt from 'jsonwebtoken'; import { PrismaClient } from '@prisma/client'; +import type { Request, Response, NextFunction } from 'express'; const prisma = new PrismaClient(); -export const authenticate = async (req, res, next) => { + +interface JwtPayload { + id: number; +} + + +export const authenticate = async (req: Request, res: Response, next: NextFunction) => { try { const authHeader = req.headers.authorization; + if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).json({ message: '로그인이 필요한 서비스입니다.' }); } const token = authHeader.split(' ')[1]; - const decoded = jwt.verify(token, process.env.JWT_SECRET); + const decoded = jwt.verify(token, process.env.JWT_SECRET || 'secret') as unknown as JwtPayload; const user = await prisma.user.findUnique({ - where: { id: decoded.userId }, + where: { id: decoded.id }, }); if (!user) { diff --git a/pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js b/src/middlewares/validate.ts similarity index 58% rename from pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js rename to src/middlewares/validate.ts index 4a562862..4723316e 100644 --- a/pandamarket-be-sprint-mission-3-main/src/middlewares/validate.js +++ b/src/middlewares/validate.ts @@ -1,13 +1,14 @@ -// src/middlewares/validate.js - import { assert } from 'superstruct'; -import { SignUpStruct, SignInStruct } from '../structs/authStructs.js'; +import { SignUpStruct, SignInStruct } from '../structs/authStructs'; +import type { Request, Response, NextFunction } from 'express'; + -export const validateSignUp = (req, res, next) => { +export const validateSignUp = (req: Request, res: Response, next: NextFunction) => { try { + // req.body가 SignUpStruct 구조와 일치하는지 확인 assert(req.body, SignUpStruct); next(); - } catch (error) { + } catch (error: any) { res.status(400).json({ message: '입력 데이터 형식이 올바르지 않습니다.', details: error.message @@ -15,11 +16,12 @@ export const validateSignUp = (req, res, next) => { } }; -export const validateSignIn = (req, res, next) => { + +export const validateSignIn = (req: Request, res: Response, next: NextFunction) => { try { assert(req.body, SignInStruct); next(); - } catch (error) { + } catch (error: any) { res.status(400).json({ message: '로그인 정보 형식이 올바르지 않습니다.', details: error.message diff --git a/src/routers/articlesRouter.ts b/src/routers/articlesRouter.ts new file mode 100755 index 00000000..2f7f4874 --- /dev/null +++ b/src/routers/articlesRouter.ts @@ -0,0 +1,29 @@ +import express, { Router } from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + createArticle, + getArticleList, + getArticle, + updateArticle, + deleteArticle, + createComment, + getCommentList, +} from '../controllers/articlesController'; +import { toggleArticleLike } from '../controllers/likeController'; +import { authenticate } from '../middlewares/authMiddleware'; + +const articlesRouter: Router = express.Router(); + +articlesRouter.get('/', withAsync(getArticleList)); +articlesRouter.get('/:id', withAsync(getArticle)); + +articlesRouter.use(authenticate); + +articlesRouter.post('/', withAsync(createArticle)); +articlesRouter.patch('/:id', withAsync(updateArticle)); +articlesRouter.delete('/:id', withAsync(deleteArticle)); +articlesRouter.post('/:id/comments', withAsync(createComment)); +articlesRouter.get('/:id/comments', withAsync(getCommentList)); +articlesRouter.post('/:id/like', withAsync(toggleArticleLike)); + +export default articlesRouter; \ No newline at end of file diff --git a/src/routers/authRoutes.ts b/src/routers/authRoutes.ts new file mode 100644 index 00000000..d1a6de36 --- /dev/null +++ b/src/routers/authRoutes.ts @@ -0,0 +1,12 @@ +import express, { Router } from 'express'; +import { withAsync } from '../lib/withAsync'; +import * as authController from '../controllers/authController'; +import { validateSignUp } from '../middlewares/validate'; + +const router: Router = express.Router(); + +router.post('/signup', validateSignUp, withAsync(authController.signUp)); +router.post('/signin', withAsync(authController.signIn)); +router.post('/refresh', withAsync(authController.refresh)); + +export default router; \ No newline at end of file diff --git a/src/routers/commentsRouter.ts b/src/routers/commentsRouter.ts new file mode 100755 index 00000000..495978e6 --- /dev/null +++ b/src/routers/commentsRouter.ts @@ -0,0 +1,12 @@ +import express, { Router } from 'express'; +import { withAsync } from '../lib/withAsync'; +import { updateComment, deleteComment } from '../controllers/commentsController'; +import { authenticate } from '../middlewares/authMiddleware'; + +const commentsRouter: Router = express.Router(); + +commentsRouter.use(authenticate); +commentsRouter.patch('/:id', withAsync(updateComment)); +commentsRouter.delete('/:id', withAsync(deleteComment)); + +export default commentsRouter; diff --git a/src/routers/imagesRouter.ts b/src/routers/imagesRouter.ts new file mode 100755 index 00000000..44547297 --- /dev/null +++ b/src/routers/imagesRouter.ts @@ -0,0 +1,14 @@ +import express, { Router } from 'express'; +import { withAsync } from '../lib/withAsync'; +import { upload, uploadImage } from '../controllers/imagesController'; + +const imagesRouter: Router = express.Router(); + + +imagesRouter.post( + '/upload', + upload.single('image'), + withAsync(uploadImage) +); + +export default imagesRouter; \ No newline at end of file diff --git a/src/routers/productsRouter.ts b/src/routers/productsRouter.ts new file mode 100755 index 00000000..2c5655cc --- /dev/null +++ b/src/routers/productsRouter.ts @@ -0,0 +1,34 @@ +import express, { Router } from 'express'; +import { withAsync } from '../lib/withAsync'; +import { + createProduct, + getProduct, + updateProduct, + deleteProduct, + getProductList, +} from '../controllers/productsController'; +import { createComment, getCommentList } from '../controllers/commentsController'; +import { toggleProductLike } from '../controllers/likeController'; +import { authenticate } from '../middlewares/authMiddleware'; + +const productsRouter: Router = express.Router(); + +productsRouter.get('/', withAsync(getProductList)); +productsRouter.get('/:id', withAsync(getProduct)); + + +productsRouter.use(authenticate); + +// 상품(Product) 관련 +productsRouter.post('/', withAsync(createProduct)); +productsRouter.patch('/:id', withAsync(updateProduct)); +productsRouter.delete('/:id', withAsync(deleteProduct)); + +// 댓글(Comment) 관련 +productsRouter.post('/:id/comments', withAsync(createComment)); +productsRouter.get('/:id/comments', withAsync(getCommentList)); + +// 좋아요(Like) 관련 +productsRouter.post('/:id/like', withAsync(toggleProductLike)); + +export default productsRouter; \ No newline at end of file diff --git a/src/routers/userRoutes.ts b/src/routers/userRoutes.ts new file mode 100644 index 00000000..83eab23a --- /dev/null +++ b/src/routers/userRoutes.ts @@ -0,0 +1,28 @@ +import express, { Router } from 'express'; +import * as userController from '../controllers/userController'; +import { authenticate } from '../middlewares/authMiddleware'; +import { withAsync } from '../lib/withAsync'; +const router: Router = express.Router(); + + +router.use(authenticate); + + +router.get('/me', withAsync(userController.getMe)); +router.patch('/me', withAsync(userController.updateMe)); +router.patch('/me/password', withAsync(userController.changePassword)); + + +router.get('/me/products', withAsync(userController.getMyProducts)); +router.get('/me/likes', withAsync(userController.getMyLikedItems)); + + +router.get('/me/notifications', withAsync(userController.getMyNotifications)); +router.patch('/me/notifications', withAsync(userController.readAllNotifications)); +router.get('/me/notifications/unread-count', withAsync(userController.getUnreadNotificationCount)); +router.patch('/me/notifications/:id', withAsync(userController.readNotification)); + + +router.delete('/notifications/cleanup', withAsync(userController.deleteOldNotifications)); + +export default router; \ No newline at end of file diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 00000000..c4594fa5 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,32 @@ +import express, { Application } from 'express'; +import cors from 'cors'; +import path from 'path'; +import { PUBLIC_PATH, STATIC_PATH } from './lib/constants'; +import articlesRouter from './routers/articlesRouter'; +import productsRouter from './routers/productsRouter'; +import commentsRouter from './routers/commentsRouter'; +import imagesRouter from './routers/imagesRouter'; +import authRouter from './routers/authRoutes'; +import { defaultNotFoundHandler, globalErrorHandler } from './controllers/errorController'; + +const server: Application = express(); + +// 💡 기본 설정 +server.use(cors()); +server.use(express.json()); +server.use('/auth', authRouter); + +// 💡 정적 파일 설정 +server.use(STATIC_PATH, express.static(path.resolve(process.cwd(), PUBLIC_PATH))); + +// 💡 라우터 연결 +server.use('/articles', articlesRouter); +server.use('/products', productsRouter); +server.use('/comments', commentsRouter); +server.use('/images', imagesRouter); + +// 💡 에러 핸들러 +server.use(defaultNotFoundHandler); +server.use(globalErrorHandler); + +export default server; // 👈 main.ts에서 가져다 쓸 수 있게 내보냅니다. \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/socket/socket.js b/src/socket/socket.ts similarity index 57% rename from pandamarket-be-sprint-mission-3-main/src/socket/socket.js rename to src/socket/socket.ts index 42c3595c..a1902d66 100644 --- a/pandamarket-be-sprint-mission-3-main/src/socket/socket.js +++ b/src/socket/socket.ts @@ -1,6 +1,7 @@ -import { Server } from 'socket.io'; +import { Server, Socket } from 'socket.io'; +import type { Server as HttpServer } from 'http'; -export const setupSocket = (server) => { +export const setupSocket = (server: HttpServer): Server => { const io = new Server(server, { cors: { origin: "*", @@ -8,10 +9,10 @@ export const setupSocket = (server) => { } }); - io.on('connection', (socket) => { + io.on('connection', (socket: Socket) => { console.log('소켓 연결됨:', socket.id); - socket.on('join', (userId) => { + socket.on('join', (userId: string | number) => { socket.join(`user_${userId}`); console.log(`유저 ${userId}가 알림 방(user_${userId})에 입장했습니다.`); }); @@ -24,7 +25,7 @@ export const setupSocket = (server) => { return io; }; -export const emitNotification = (io, userId, notificationData) => { +export const emitNotification = (io: Server | undefined, userId: string | number, notificationData: any): void => { if (io) { io.to(`user_${userId}`).emit('NEW_NOTIFICATION', notificationData); } diff --git a/src/structs/articlesStructs.ts b/src/structs/articlesStructs.ts new file mode 100755 index 00000000..6f65114d --- /dev/null +++ b/src/structs/articlesStructs.ts @@ -0,0 +1,16 @@ +import { coerce, nonempty, nullable, object, partial, string, type Infer } from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; + +export const GetArticleListParamsStruct = PageParamsStruct; + +export const CreateArticleBodyStruct = object({ + title: coerce(nonempty(string()), string(), (value) => value.trim()), + content: nonempty(string()), + image: nullable(string()), +}); + +export const UpdateArticleBodyStruct = partial(CreateArticleBodyStruct); + +export type CreateArticleBody = Infer; +export type UpdateArticleBody = Infer; +export type GetArticleListParams = Infer; \ No newline at end of file diff --git a/src/structs/authStructs.ts b/src/structs/authStructs.ts new file mode 100644 index 00000000..fc8c3534 --- /dev/null +++ b/src/structs/authStructs.ts @@ -0,0 +1,15 @@ +import { object, string, size, type Infer } from 'superstruct'; + +export const SignUpStruct = object({ + email: string(), + nickname: string(), + password: size(string(), 8, 20), +}); + +export const SignInStruct = object({ + email: string(), + password: string(), +}); + +export type SignUpBody = Infer; +export type SignInBody = Infer; \ No newline at end of file diff --git a/src/structs/commentsStruct.ts b/src/structs/commentsStruct.ts new file mode 100755 index 00000000..53acaf28 --- /dev/null +++ b/src/structs/commentsStruct.ts @@ -0,0 +1,13 @@ +import { nonempty, object, partial, string, type Infer } from 'superstruct'; +import { CursorParamsStruct } from './commonStructs'; + +export const CreateCommentBodyStruct = object({ + content: nonempty(string()), +}); + +export const GetCommentListParamsStruct = CursorParamsStruct; +export const UpdateCommentBodyStruct = partial(CreateCommentBodyStruct); + +export type CreateCommentBody = Infer; +export type GetCommentListParams = Infer; +export type UpdateCommentBody = Infer; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js b/src/structs/commonStructs.ts similarity index 71% rename from pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js rename to src/structs/commonStructs.ts index 605bfa9e..9ecff92f 100755 --- a/pandamarket-be-sprint-mission-3-main/src/structs/commonStructs.js +++ b/src/structs/commonStructs.ts @@ -1,7 +1,6 @@ -import { coerce, integer, object, string, defaulted, optional, enums, nonempty } from 'superstruct'; +import { coerce, integer, object, string, defaulted, optional, enums, nonempty, type Infer } from 'superstruct'; -/** Convert string to integer then validate it */ -const integerString = coerce(integer(), string(), (value) => parseInt(value)); +const integerString = coerce(integer(), string(), (value) => parseInt(value, 10)); export const IdParamsStruct = object({ id: integerString, @@ -20,3 +19,8 @@ export const CursorParamsStruct = object({ orderBy: optional(enums(['recent'])), keyword: optional(nonempty(string())), }); + + +export type IdParams = Infer; +export type PageParams = Infer; +export type CursorParams = Infer; \ No newline at end of file diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js b/src/structs/productsStruct.ts similarity index 59% rename from pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js rename to src/structs/productsStruct.ts index 69d416cf..2227041f 100755 --- a/pandamarket-be-sprint-mission-3-main/src/structs/productsStruct.js +++ b/src/structs/productsStruct.ts @@ -1,5 +1,5 @@ -import { coerce, partial, object, string, min, nonempty, array, integer } from 'superstruct'; -import { PageParamsStruct } from './commonStructs.js'; +import { coerce, partial, object, string, min, nonempty, array, integer, type Infer } from 'superstruct'; +import { PageParamsStruct } from './commonStructs'; export const CreateProductBodyStruct = object({ name: coerce(nonempty(string()), string(), (value) => value.trim()), @@ -12,3 +12,7 @@ export const CreateProductBodyStruct = object({ export const GetProductListParamsStruct = PageParamsStruct; export const UpdateProductBodyStruct = partial(CreateProductBodyStruct); + +export type CreateProductBody = Infer; +export type UpdateProductBody = Infer; +export type GetProductListParams = Infer; diff --git a/pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js b/src/structs/userStructs.ts similarity index 51% rename from pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js rename to src/structs/userStructs.ts index d3519854..7a05103b 100644 --- a/pandamarket-be-sprint-mission-3-main/src/structs/userStructs.js +++ b/src/structs/userStructs.ts @@ -1,4 +1,4 @@ -import { object, string, size, optional } from 'superstruct'; +import { object, string, size, optional, type Infer } from 'superstruct'; export const UpdateUserStruct = object({ nickname: optional(string()), @@ -8,4 +8,7 @@ export const UpdateUserStruct = object({ export const ChangePasswordStruct = object({ currentPassword: string(), newPassword: size(string(), 8, 20), -}); \ No newline at end of file +}); + +export type UpdateUserBody = Infer; +export type ChangePasswordBody = Infer; \ No newline at end of file diff --git a/src/types/express.d.ts b/src/types/express.d.ts new file mode 100644 index 00000000..2b3dbd55 --- /dev/null +++ b/src/types/express.d.ts @@ -0,0 +1,9 @@ +import { User } from '@prisma/client'; + +declare global { + namespace Express { + interface Request { + user: User; + } + } +} \ No newline at end of file diff --git a/tests/articles.test.ts b/tests/articles.test.ts new file mode 100644 index 00000000..5e419891 --- /dev/null +++ b/tests/articles.test.ts @@ -0,0 +1,255 @@ +import request from 'supertest'; +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcrypt'; +import jwt from 'jsonwebtoken'; +import server from '../src/server'; + +const prisma = new PrismaClient(); + +let testUserId: number; +let accessToken: string; +let createdArticleId: number; + +const TEST_EMAIL = `article_test_${Date.now()}@example.com`; + +beforeAll(async () => { + const hashed = await bcrypt.hash('password123', 10); + const user = await prisma.user.create({ + data: { email: TEST_EMAIL, nickname: 'ArticleTester', password: hashed }, + }); + testUserId = user.id; + + accessToken = jwt.sign({ id: testUserId }, process.env.JWT_SECRET || 'access_secret', { + expiresIn: '1h', + }); +}); + +afterAll(async () => { + await prisma.comment.deleteMany({ where: { articleId: { in: [createdArticleId] } } }); + await prisma.article.deleteMany({ where: { userId: testUserId } }); + await prisma.user.delete({ where: { id: testUserId } }).catch(() => {}); + await prisma.$disconnect(); +}); + +// ────────────────────────────────────────────────────────────────── +// 인증 불필요 API +// ────────────────────────────────────────────────────────────────── +describe('[Articles API - 공개] 인증 불필요 테스트', () => { + describe('GET /articles - 게시글 목록 조회', () => { + it('200 반환 + list, totalCount 포함', async () => { + const res = await request(server).get('/articles'); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(res.body).toHaveProperty('totalCount'); + expect(Array.isArray(res.body.list)).toBe(true); + }); + + it('keyword 쿼리로 필터링 가능', async () => { + const res = await request(server).get('/articles?keyword=없는게시글xyz'); + + expect(res.status).toBe(200); + expect(res.body.list).toHaveLength(0); + }); + + it('page, pageSize 파라미터 적용', async () => { + const res = await request(server).get('/articles?page=1&pageSize=3'); + + expect(res.status).toBe(200); + expect(res.body.list.length).toBeLessThanOrEqual(3); + }); + + it('orderBy=recent 정렬 가능', async () => { + const res = await request(server).get('/articles?orderBy=recent'); + expect(res.status).toBe(200); + }); + }); + + describe('GET /articles/:id - 게시글 단건 조회', () => { + it('존재하지 않는 ID 조회 시 404 반환', async () => { + const res = await request(server).get('/articles/999999999'); + expect(res.status).toBe(404); + }); + + it('유효하지 않은 ID 형식이면 400 반환', async () => { + const res = await request(server).get('/articles/notanumber'); + expect(res.status).toBe(400); + }); + }); +}); + +// ────────────────────────────────────────────────────────────────── +// 인증 필요 API +// ────────────────────────────────────────────────────────────────── +describe('[Articles API - 인증] 인증 필요 테스트', () => { + // ── 게시글 생성 ── + describe('POST /articles - 게시글 생성', () => { + it('인증 없이 요청 시 401 반환', async () => { + const res = await request(server).post('/articles').send({ + title: '무인증 게시글', + content: '내용', + image: null, + }); + expect(res.status).toBe(401); + }); + + it('인증 후 게시글 생성 시 201 반환', async () => { + const res = await request(server) + .post('/articles') + .set('Authorization', `Bearer ${accessToken}`) + .send({ + title: '테스트 게시글', + content: '테스트 게시글 내용입니다.', + image: null, + }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body.title).toBe('테스트 게시글'); + expect(res.body.userId).toBe(testUserId); + + createdArticleId = res.body.id; + }); + + it('제목 누락 시 400 반환', async () => { + const res = await request(server) + .post('/articles') + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: '내용만있음', image: null }); + + expect(res.status).toBe(400); + }); + + it('제목이 공백 문자열이면 400 반환', async () => { + const res = await request(server) + .post('/articles') + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: ' ', content: '내용', image: null }); + + expect(res.status).toBe(400); + }); + }); + + // ── 단건 조회 (생성 후) ── + describe('GET /articles/:id - 생성된 게시글 조회', () => { + it('생성된 게시글 ID로 조회 시 200 반환', async () => { + const res = await request(server).get(`/articles/${createdArticleId}`); + + expect(res.status).toBe(200); + expect(res.body.id).toBe(createdArticleId); + expect(res.body.title).toBe('테스트 게시글'); + }); + }); + + // ── 게시글 수정 ── + describe('PATCH /articles/:id - 게시글 수정', () => { + it('인증 없이 수정 시 401 반환', async () => { + const res = await request(server) + .patch(`/articles/${createdArticleId}`) + .send({ title: '수정 시도' }); + + expect(res.status).toBe(401); + }); + + it('본인 게시글 수정 시 200 반환', async () => { + const res = await request(server) + .patch(`/articles/${createdArticleId}`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: '수정된 제목', content: '수정된 내용' }); + + expect(res.status).toBe(200); + expect(res.body.title).toBe('수정된 제목'); + }); + + it('다른 유저 토큰으로 수정 시 401 또는 403 반환', async () => { + const otherToken = jwt.sign( + { id: 99999 }, + process.env.JWT_SECRET || 'access_secret', + { expiresIn: '1h' } + ); + + const res = await request(server) + .patch(`/articles/${createdArticleId}`) + .set('Authorization', `Bearer ${otherToken}`) + .send({ title: '해킹 시도' }); + + expect([401, 403]).toContain(res.status); + }); + + it('존재하지 않는 게시글 수정 시 404 반환', async () => { + const res = await request(server) + .patch('/articles/999999999') + .set('Authorization', `Bearer ${accessToken}`) + .send({ title: '없는게시글' }); + + expect(res.status).toBe(404); + }); + }); + + // ── 댓글 ── + describe('POST /articles/:id/comments - 댓글 생성', () => { + it('인증 없이 댓글 생성 시 401 반환', async () => { + const res = await request(server) + .post(`/articles/${createdArticleId}/comments`) + .send({ content: '댓글' }); + + expect(res.status).toBe(401); + }); + + it('인증 후 댓글 생성 시 201 반환', async () => { + const res = await request(server) + .post(`/articles/${createdArticleId}/comments`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: '게시글 댓글입니다.' }); + + expect(res.status).toBe(201); + expect(res.body.content).toBe('게시글 댓글입니다.'); + expect(res.body.articleId).toBe(createdArticleId); + }); + + it('내용 누락 시 400 반환', async () => { + const res = await request(server) + .post(`/articles/${createdArticleId}/comments`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: '' }); + + expect(res.status).toBe(400); + }); + }); + + describe('GET /articles/:id/comments - 댓글 목록 조회', () => { + it('인증 후 댓글 목록 조회 시 list, nextCursor 포함', async () => { + const res = await request(server) + .get(`/articles/${createdArticleId}/comments`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(res.body).toHaveProperty('nextCursor'); + }); + }); + + // ── 게시글 삭제 ── + describe('DELETE /articles/:id - 게시글 삭제', () => { + it('인증 없이 삭제 시 401 반환', async () => { + const res = await request(server).delete(`/articles/${createdArticleId}`); + expect(res.status).toBe(401); + }); + + it('본인 게시글 삭제 시 204 반환', async () => { + const res = await request(server) + .delete(`/articles/${createdArticleId}`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(204); + }); + + it('이미 삭제된 게시글 삭제 시 404 반환', async () => { + const res = await request(server) + .delete(`/articles/${createdArticleId}`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(404); + }); + }); +}); \ No newline at end of file diff --git a/tests/auth.test.ts b/tests/auth.test.ts new file mode 100644 index 00000000..135dc2be --- /dev/null +++ b/tests/auth.test.ts @@ -0,0 +1,150 @@ +import request from 'supertest'; +import { PrismaClient } from '@prisma/client'; +import server from '../src/server'; + +// auth 라우터가 server.ts에 없으므로 테스트용으로 직접 마운트 +import authRouter from '../src/routers/authRoutes'; +import express from 'express'; + +const prisma = new PrismaClient(); + +// auth 라우터를 포함한 테스트용 앱 생성 +const app = express(); +app.use(express.json()); +app.use('/auth', authRouter); + +const TEST_EMAIL = `auth_test_${Date.now()}@example.com`; +const TEST_PASSWORD = 'password123'; +const TEST_NICKNAME = 'AuthTester'; + +let createdUserId: number; +let refreshToken: string; + +afterAll(async () => { + // 테스트 데이터 정리 + if (createdUserId) { + await prisma.user.delete({ where: { id: createdUserId } }).catch(() => {}); + } + await prisma.$disconnect(); +}); + +describe('[Auth API] 회원가입 / 로그인 통합 테스트', () => { + // ────────────────────────────────────────── + // 회원가입 + // ────────────────────────────────────────── + describe('POST /auth/signup - 회원가입', () => { + it('정상적인 데이터로 회원가입 시 201 반환', async () => { + const res = await request(app).post('/auth/signup').send({ + email: TEST_EMAIL, + nickname: TEST_NICKNAME, + password: TEST_PASSWORD, + }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body).toHaveProperty('email', TEST_EMAIL); + expect(res.body).toHaveProperty('nickname', TEST_NICKNAME); + expect(res.body).not.toHaveProperty('password'); + expect(res.body).not.toHaveProperty('refreshToken'); + + createdUserId = res.body.id; + }); + + it('이미 존재하는 이메일로 회원가입 시 400 반환', async () => { + const res = await request(app).post('/auth/signup').send({ + email: TEST_EMAIL, + nickname: TEST_NICKNAME, + password: TEST_PASSWORD, + }); + + expect(res.status).toBe(400); + expect(res.body).toHaveProperty('message'); + }); + + it('비밀번호가 8자 미만이면 400 반환', async () => { + const res = await request(app).post('/auth/signup').send({ + email: 'short@example.com', + nickname: 'ShortPw', + password: '1234567', // 7자 + }); + + expect(res.status).toBe(400); + }); + + it('이메일 누락 시 400 반환', async () => { + const res = await request(app).post('/auth/signup').send({ + nickname: 'NoEmail', + password: 'password123', + }); + + expect(res.status).toBe(400); + }); + }); + + // ────────────────────────────────────────── + // 로그인 + // ────────────────────────────────────────── + describe('POST /auth/signin - 로그인', () => { + it('올바른 이메일/비밀번호로 로그인 시 200 + 토큰 반환', async () => { + const res = await request(app).post('/auth/signin').send({ + email: TEST_EMAIL, + password: TEST_PASSWORD, + }); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('accessToken'); + expect(res.body).toHaveProperty('refreshToken'); + expect(res.body).toHaveProperty('user'); + expect(res.body.user).not.toHaveProperty('password'); + + refreshToken = res.body.refreshToken; + }); + + it('존재하지 않는 이메일로 로그인 시 401 반환', async () => { + const res = await request(app).post('/auth/signin').send({ + email: 'notexist@example.com', + password: TEST_PASSWORD, + }); + + expect(res.status).toBe(401); + expect(res.body).toHaveProperty('message'); + }); + + it('비밀번호가 틀리면 401 반환', async () => { + const res = await request(app).post('/auth/signin').send({ + email: TEST_EMAIL, + password: 'wrongpassword', + }); + + expect(res.status).toBe(401); + expect(res.body).toHaveProperty('message'); + }); + }); + + // ────────────────────────────────────────── + // 토큰 갱신 + // ────────────────────────────────────────── + describe('POST /auth/refresh - 토큰 갱신', () => { + it('유효한 리프레시 토큰으로 새 토큰 발급', async () => { + const res = await request(app).post('/auth/refresh').send({ refreshToken }); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('accessToken'); + expect(res.body).toHaveProperty('refreshToken'); + }); + + it('리프레시 토큰 없이 요청 시 401 반환', async () => { + const res = await request(app).post('/auth/refresh').send({}); + + expect(res.status).toBe(401); + }); + + it('유효하지 않은 리프레시 토큰으로 요청 시 401/403 반환', async () => { + const res = await request(app) + .post('/auth/refresh') + .send({ refreshToken: 'invalid.token.here' }); + + expect([401, 403, 500]).toContain(res.status); + }); + }); +}); \ No newline at end of file diff --git a/tests/like.unit.test.ts b/tests/like.unit.test.ts new file mode 100644 index 00000000..d7ba25c7 --- /dev/null +++ b/tests/like.unit.test.ts @@ -0,0 +1,213 @@ +/** + * likeController 유닛 테스트 + * Mock을 활용해 DB 없이 좋아요 토글 로직 검증 + */ + +import { Request, Response, NextFunction } from 'express'; + +// ── Prisma Mock ────────────────────────────────────────────────── +jest.mock('@prisma/client', () => { + const mockPrisma = { + productLike: { + findUnique: jest.fn(), + create: jest.fn(), + delete: jest.fn(), + }, + articleLike: { + findUnique: jest.fn(), + create: jest.fn(), + delete: jest.fn(), + }, + product: { + findUnique: jest.fn(), + }, + }; + return { PrismaClient: jest.fn(() => mockPrisma) }; +}); + +import { PrismaClient } from '@prisma/client'; +import { + toggleProductLike, + toggleArticleLike, + getProductDetail, +} from '../src/controllers/likeController'; + +const prisma = new PrismaClient() as any; + +// ── Mock req / res / next ──────────────────────────────────────── +const makeMockReq = (overrides: Partial = {}): Request => + ({ + params: {}, + body: {}, + query: {}, + user: { id: 1, email: 'test@test.com', nickname: 'Tester', password: 'hashed', image: null, createdAt: new Date(), updatedAt: new Date(), refreshToken: null }, + ...overrides, + } as unknown as Request); + +const makeMockRes = (): Response => { + const res = {} as Response; + res.status = jest.fn().mockReturnValue(res); + res.json = jest.fn().mockReturnValue(res); + res.send = jest.fn().mockReturnValue(res); + return res; +}; + +const mockNext = jest.fn() as unknown as NextFunction; + +beforeEach(() => jest.clearAllMocks()); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] toggleProductLike', () => { +// ══════════════════════════════════════════════════════════════════ + + it('좋아요 없는 상태 → productLike.create 호출 + { isLiked: true }', async () => { + prisma.productLike.findUnique.mockResolvedValue(null); // 좋아요 없음 + prisma.productLike.create.mockResolvedValue({ id: 1, userId: 1, productId: 10 }); + + const req = makeMockReq({ params: { id: '10' } }); + const res = makeMockRes(); + + await (toggleProductLike as any)(req, res, mockNext); + + expect(prisma.productLike.findUnique).toHaveBeenCalledWith({ + where: { userId_productId: { userId: 1, productId: 10 } }, + }); + expect(prisma.productLike.create).toHaveBeenCalledWith({ + data: { userId: 1, productId: 10 }, + }); + expect(res.json).toHaveBeenCalledWith({ isLiked: true }); + }); + + it('이미 좋아요 상태 → productLike.delete 호출 + { isLiked: false }', async () => { + const existingLike = { id: 5, userId: 1, productId: 10 }; + prisma.productLike.findUnique.mockResolvedValue(existingLike); + prisma.productLike.delete.mockResolvedValue(existingLike); + + const req = makeMockReq({ params: { id: '10' } }); + const res = makeMockRes(); + + await (toggleProductLike as any)(req, res, mockNext); + + expect(prisma.productLike.delete).toHaveBeenCalledWith({ + where: { id: 5 }, + }); + expect(prisma.productLike.create).not.toHaveBeenCalled(); + expect(res.json).toHaveBeenCalledWith({ isLiked: false }); + }); + + it('DB 오류 → next(error) 호출', async () => { + prisma.productLike.findUnique.mockRejectedValue(new Error('DB error')); + + const req = makeMockReq({ params: { id: '10' } }); + const res = makeMockRes(); + + await (toggleProductLike as any)(req, res, mockNext); + + expect(mockNext).toHaveBeenCalled(); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] toggleArticleLike', () => { +// ══════════════════════════════════════════════════════════════════ + + it('좋아요 없는 상태 → articleLike.create 호출 + { isLiked: true }', async () => { + prisma.articleLike.findUnique.mockResolvedValue(null); + prisma.articleLike.create.mockResolvedValue({ id: 1, userId: 1, articleId: 20 }); + + const req = makeMockReq({ params: { id: '20' } }); + const res = makeMockRes(); + + await (toggleArticleLike as any)(req, res, mockNext); + + expect(prisma.articleLike.findUnique).toHaveBeenCalledWith({ + where: { userId_articleId: { userId: 1, articleId: 20 } }, + }); + expect(prisma.articleLike.create).toHaveBeenCalledWith({ + data: { userId: 1, articleId: 20 }, + }); + expect(res.json).toHaveBeenCalledWith({ isLiked: true }); + }); + + it('이미 좋아요 상태 → articleLike.delete 호출 + { isLiked: false }', async () => { + const existingLike = { id: 7, userId: 1, articleId: 20 }; + prisma.articleLike.findUnique.mockResolvedValue(existingLike); + prisma.articleLike.delete.mockResolvedValue(existingLike); + + const req = makeMockReq({ params: { id: '20' } }); + const res = makeMockRes(); + + await (toggleArticleLike as any)(req, res, mockNext); + + expect(prisma.articleLike.delete).toHaveBeenCalledWith({ where: { id: 7 } }); + expect(prisma.articleLike.create).not.toHaveBeenCalled(); + expect(res.json).toHaveBeenCalledWith({ isLiked: false }); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] getProductDetail', () => { +// ══════════════════════════════════════════════════════════════════ + + const fakeProduct = { + id: 10, name: '테스트 상품', description: '설명', price: 5000, + tags: [], images: [], userId: 99, + _count: { productLikes: 3 }, + createdAt: new Date(), updatedAt: new Date(), + }; + + it('상품 존재 + 로그인 유저가 좋아요한 경우 → isLiked: true', async () => { + prisma.product.findUnique.mockResolvedValue(fakeProduct); + prisma.productLike.findUnique.mockResolvedValue({ id: 1, userId: 1, productId: 10 }); + + const req = makeMockReq({ params: { id: '10' } }); + const res = makeMockRes(); + + await (getProductDetail as any)(req, res, mockNext); + + expect(res.json).toHaveBeenCalledWith( + expect.objectContaining({ isLiked: true }) + ); + }); + + it('상품 존재 + 좋아요 안 한 경우 → isLiked: false', async () => { + prisma.product.findUnique.mockResolvedValue(fakeProduct); + prisma.productLike.findUnique.mockResolvedValue(null); + + const req = makeMockReq({ params: { id: '10' } }); + const res = makeMockRes(); + + await (getProductDetail as any)(req, res, mockNext); + + expect(res.json).toHaveBeenCalledWith( + expect.objectContaining({ isLiked: false }) + ); + }); + + it('상품 존재하지 않으면 → 404', async () => { + prisma.product.findUnique.mockResolvedValue(null); + + const req = makeMockReq({ params: { id: '999' } }); + const res = makeMockRes(); + + await (getProductDetail as any)(req, res, mockNext); + + expect(res.status).toHaveBeenCalledWith(404); + }); + + it('좋아요 수 포함해서 반환', async () => { + prisma.product.findUnique.mockResolvedValue(fakeProduct); + prisma.productLike.findUnique.mockResolvedValue(null); + + const req = makeMockReq({ params: { id: '10' } }); + const res = makeMockRes(); + + await (getProductDetail as any)(req, res, mockNext); + + expect(res.json).toHaveBeenCalledWith( + expect.objectContaining({ + _count: { productLikes: 3 }, + }) + ); + }); +}); \ No newline at end of file diff --git a/tests/products.test.ts b/tests/products.test.ts new file mode 100644 index 00000000..3fa5afec --- /dev/null +++ b/tests/products.test.ts @@ -0,0 +1,282 @@ +import request from 'supertest'; +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcrypt'; +import jwt from 'jsonwebtoken'; +import server from '../src/server'; + +const prisma = new PrismaClient(); + +// ────────────────────────────────────────────────────────────────── +// 테스트 데이터 준비 +// ────────────────────────────────────────────────────────────────── +let testUserId: number; +let accessToken: string; +let createdProductId: number; + +const TEST_EMAIL = `product_test_${Date.now()}@example.com`; + +beforeAll(async () => { + // 테스트 유저 생성 + const hashed = await bcrypt.hash('password123', 10); + const user = await prisma.user.create({ + data: { email: TEST_EMAIL, nickname: 'ProductTester', password: hashed }, + }); + testUserId = user.id; + + // JWT 토큰 생성 (authController의 generateTokens와 동일한 payload: { id }) + accessToken = jwt.sign({ id: testUserId }, process.env.JWT_SECRET || 'access_secret', { + expiresIn: '1h', + }); +}); + +afterAll(async () => { + await prisma.comment.deleteMany({ where: { productId: { in: [createdProductId] } } }); + await prisma.product.deleteMany({ where: { userId: testUserId } }); + await prisma.user.delete({ where: { id: testUserId } }).catch(() => {}); + await prisma.$disconnect(); +}); + +// ────────────────────────────────────────────────────────────────── +// 인증 불필요 API +// ────────────────────────────────────────────────────────────────── +describe('[Products API - 공개] 인증 불필요 테스트', () => { + describe('GET /products - 상품 목록 조회', () => { + it('200 반환 + list, totalCount 포함', async () => { + const res = await request(server).get('/products'); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(res.body).toHaveProperty('totalCount'); + expect(Array.isArray(res.body.list)).toBe(true); + }); + + it('keyword 쿼리로 필터링 가능', async () => { + const res = await request(server).get('/products?keyword=없는상품명xyz'); + + expect(res.status).toBe(200); + expect(res.body.list).toHaveLength(0); + expect(res.body.totalCount).toBe(0); + }); + + it('page, pageSize 쿼리 파라미터 적용', async () => { + const res = await request(server).get('/products?page=1&pageSize=5'); + + expect(res.status).toBe(200); + expect(res.body.list.length).toBeLessThanOrEqual(5); + }); + + it('orderBy=recent 정렬 가능', async () => { + const res = await request(server).get('/products?orderBy=recent'); + expect(res.status).toBe(200); + }); + }); + + describe('GET /products/:id - 상품 단건 조회', () => { + it('존재하지 않는 ID 조회 시 404 반환', async () => { + const res = await request(server).get('/products/999999999'); + expect(res.status).toBe(404); + }); + + it('유효하지 않은 ID 형식이면 400 반환', async () => { + const res = await request(server).get('/products/notanumber'); + expect(res.status).toBe(400); + }); + }); +}); + +// ────────────────────────────────────────────────────────────────── +// 인증 필요 API +// ────────────────────────────────────────────────────────────────── +describe('[Products API - 인증] 인증 필요 테스트', () => { + // ── 상품 생성 ── + describe('POST /products - 상품 생성', () => { + it('인증 없이 요청 시 401 반환', async () => { + const res = await request(server).post('/products').send({ + name: '무인증 상품', + description: '설명', + price: 1000, + tags: [], + images: [], + }); + expect(res.status).toBe(401); + }); + + it('인증 후 상품 생성 시 201 반환', async () => { + const res = await request(server) + .post('/products') + .set('Authorization', `Bearer ${accessToken}`) + .send({ + name: '테스트 상품', + description: '테스트 상품 설명입니다.', + price: 10000, + tags: ['태그1', '태그2'], + images: ['https://example.com/image.jpg'], + }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body.name).toBe('테스트 상품'); + expect(res.body.price).toBe(10000); + expect(res.body.userId).toBe(testUserId); + + createdProductId = res.body.id; + }); + + it('필수 필드 누락 시 400 반환', async () => { + const res = await request(server) + .post('/products') + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: '이름만있음' }); // description, price 등 누락 + + expect(res.status).toBe(400); + }); + + it('price가 음수이면 400 반환', async () => { + const res = await request(server) + .post('/products') + .set('Authorization', `Bearer ${accessToken}`) + .send({ + name: '음수상품', + description: '설명', + price: -100, + tags: [], + images: [], + }); + + expect(res.status).toBe(400); + }); + }); + + // ── 상품 단건 조회 (생성 후) ── + describe('GET /products/:id - 상품 단건 조회 (생성 후)', () => { + it('생성된 상품 ID로 조회 시 200 반환', async () => { + const res = await request(server).get(`/products/${createdProductId}`); + + expect(res.status).toBe(200); + expect(res.body.id).toBe(createdProductId); + expect(res.body.name).toBe('테스트 상품'); + }); + }); + + // ── 상품 수정 ── + describe('PATCH /products/:id - 상품 수정', () => { + it('인증 없이 수정 시 401 반환', async () => { + const res = await request(server) + .patch(`/products/${createdProductId}`) + .send({ name: '수정된 이름' }); + + expect(res.status).toBe(401); + }); + + it('본인 상품 수정 시 200 반환', async () => { + const res = await request(server) + .patch(`/products/${createdProductId}`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: '수정된 상품명', price: 20000 }); + + expect(res.status).toBe(200); + expect(res.body.name).toBe('수정된 상품명'); + expect(res.body.price).toBe(20000); + }); + + it('다른 유저가 수정 시도 시 403 반환', async () => { + // 다른 유저 토큰 생성 + const otherToken = jwt.sign( + { id: 99999 }, + process.env.JWT_SECRET || 'access_secret', + { expiresIn: '1h' } + ); + + const res = await request(server) + .patch(`/products/${createdProductId}`) + .set('Authorization', `Bearer ${otherToken}`) + .send({ name: '해킹 시도' }); + + // 유저가 DB에 없으므로 401 또는 403 + expect([401, 403]).toContain(res.status); + }); + + it('존재하지 않는 상품 수정 시 404 반환', async () => { + const res = await request(server) + .patch('/products/999999999') + .set('Authorization', `Bearer ${accessToken}`) + .send({ name: '없는상품' }); + + expect(res.status).toBe(404); + }); + }); + + // ── 댓글 ── + describe('POST /products/:id/comments - 댓글 생성', () => { + it('인증 없이 댓글 생성 시 401 반환', async () => { + const res = await request(server) + .post(`/products/${createdProductId}/comments`) + .send({ content: '댓글내용' }); + + expect(res.status).toBe(401); + }); + + it('인증 후 댓글 생성 시 201 반환', async () => { + const res = await request(server) + .post(`/products/${createdProductId}/comments`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: '테스트 댓글입니다.' }); + + expect(res.status).toBe(201); + expect(res.body).toHaveProperty('id'); + expect(res.body.content).toBe('테스트 댓글입니다.'); + }); + + it('빈 댓글 생성 시 400 반환', async () => { + const res = await request(server) + .post(`/products/${createdProductId}/comments`) + .set('Authorization', `Bearer ${accessToken}`) + .send({ content: '' }); + + expect(res.status).toBe(400); + }); + }); + + describe('GET /products/:id/comments - 댓글 목록 조회', () => { + it('인증 없이도 댓글 목록 조회 시 401 (authenticate 미들웨어 적용됨)', async () => { + const res = await request(server).get(`/products/${createdProductId}/comments`); + // productsRouter는 authenticate 후 get comments → 인증 필요 + expect(res.status).toBe(401); + }); + + it('인증 후 댓글 목록 조회 시 list, nextCursor 포함', async () => { + const res = await request(server) + .get(`/products/${createdProductId}/comments`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(res.body).toHaveProperty('nextCursor'); + expect(Array.isArray(res.body.list)).toBe(true); + }); + }); + + // ── 상품 삭제 ── + describe('DELETE /products/:id - 상품 삭제', () => { + it('인증 없이 삭제 시 401 반환', async () => { + const res = await request(server).delete(`/products/${createdProductId}`); + expect(res.status).toBe(401); + }); + + it('본인 상품 삭제 시 204 반환', async () => { + const res = await request(server) + .delete(`/products/${createdProductId}`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(204); + }); + + it('이미 삭제된 상품 삭제 시 404 반환', async () => { + const res = await request(server) + .delete(`/products/${createdProductId}`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(404); + }); + }); +}); \ No newline at end of file diff --git a/tests/products.unit.test.ts b/tests/products.unit.test.ts new file mode 100644 index 00000000..1d2da380 --- /dev/null +++ b/tests/products.unit.test.ts @@ -0,0 +1,372 @@ +/** + * 상품 API 비즈니스 로직 유닛 테스트 + * jest.mock + jest.spyOn 활용, DB 연결 불필요 + */ + +import { Request, Response, NextFunction } from 'express'; + +// ── Prisma 전체 Mock ───────────────────────────────────────────── +jest.mock('../src/lib/prismaClient', () => ({ + prismaClient: { + product: { + create: jest.fn(), + findUnique: jest.fn(), + findMany: jest.fn(), + update: jest.fn(), + delete: jest.fn(), + count: jest.fn(), + }, + productLike: { + findMany: jest.fn(), + }, + notification: { + createMany: jest.fn(), + }, + }, +})); + +// ── socket Mock ────────────────────────────────────────────────── +jest.mock('../src/socket/socket', () => ({ + emitNotification: jest.fn(), +})); + +import { prismaClient as prismaMock } from '../src/lib/prismaClient'; +import * as socketModule from '../src/socket/socket'; +import { + createProduct, + getProduct, + getProductList, + updateProduct, + deleteProduct, +} from '../src/controllers/productsController'; + +// ── 타입 편의상 any 캐스팅 ─────────────────────────────────────── +const db = prismaMock as any; + +// ── Mock req / res / next 팩토리 ───────────────────────────────── +const makeMockReq = (overrides: Partial = {}): Request => + ({ + body: {}, + params: {}, + query: {}, + user: { + id: 1, + email: 'test@test.com', + nickname: 'Tester', + password: 'hashed', + image: null, + createdAt: new Date(), + updatedAt: new Date(), + refreshToken: null, + }, + app: { get: jest.fn().mockReturnValue(undefined) }, + ...overrides, + } as unknown as Request); + +const makeMockRes = (): Response => { + const res = {} as Response; + res.status = jest.fn().mockReturnValue(res); + res.send = jest.fn().mockReturnValue(res); + res.json = jest.fn().mockReturnValue(res); + return res; +}; + +const mockNext = jest.fn() as unknown as NextFunction; + +beforeEach(() => jest.clearAllMocks()); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] createProduct', () => { +// ══════════════════════════════════════════════════════════════════ + + it('정상 데이터 → prisma.product.create 호출 + 201 반환', async () => { + const fakeProduct = { + id: 1, name: '테스트 상품', description: '설명', + price: 10000, tags: ['tag1'], images: ['img.jpg'], + userId: 1, createdAt: new Date(), updatedAt: new Date(), + }; + db.product.create.mockResolvedValue(fakeProduct); + + const req = makeMockReq({ + body: { name: '테스트 상품', description: '설명', price: 10000, tags: ['tag1'], images: ['img.jpg'] }, + }); + const res = makeMockRes(); + + await (createProduct as any)(req, res, mockNext); + + expect(db.product.create).toHaveBeenCalledTimes(1); + expect(db.product.create).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.objectContaining({ name: '테스트 상품', price: 10000, userId: 1 }), + }) + ); + expect(res.status).toHaveBeenCalledWith(201); + expect(res.send).toHaveBeenCalledWith(fakeProduct); + }); + + it('DB 오류 발생 → next(error) 호출', async () => { + const dbError = new Error('DB connection failed'); + db.product.create.mockRejectedValue(dbError); + + const req = makeMockReq({ + body: { name: '상품', description: '설명', price: 100, tags: [], images: [] }, + }); + const res = makeMockRes(); + + await (createProduct as any)(req, res, mockNext); + + expect(mockNext).toHaveBeenCalledWith(dbError); + expect(res.status).not.toHaveBeenCalled(); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] getProduct', () => { +// ══════════════════════════════════════════════════════════════════ + + it('존재하는 ID → prisma.findUnique 호출 + res.send', async () => { + const fakeProduct = { + id: 1, name: '상품', description: '설명', price: 5000, + tags: [], images: [], userId: 1, createdAt: new Date(), updatedAt: new Date(), + }; + db.product.findUnique.mockResolvedValue(fakeProduct); + + const req = makeMockReq({ params: { id: '1' } }); + const res = makeMockRes(); + + await (getProduct as any)(req, res, mockNext); + + expect(db.product.findUnique).toHaveBeenCalledWith({ where: { id: 1 } }); + expect(res.send).toHaveBeenCalledWith(fakeProduct); + }); + + it('존재하지 않는 ID → NotFoundError → next 호출', async () => { + db.product.findUnique.mockResolvedValue(null); + + const req = makeMockReq({ params: { id: '999' } }); + const res = makeMockRes(); + + await (getProduct as any)(req, res, mockNext); + + expect(mockNext).toHaveBeenCalled(); + const err = (mockNext as jest.Mock).mock.calls[0][0]; + expect(err.name).toBe('NotFoundError'); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] getProductList', () => { +// ══════════════════════════════════════════════════════════════════ + + it('기본 쿼리 → product.count + product.findMany 호출 + { list, totalCount } 반환', async () => { + const fakeList = [ + { id: 1, name: '상품1', description: '설명1', price: 1000, tags: [], images: [], userId: 1, createdAt: new Date(), updatedAt: new Date() }, + { id: 2, name: '상품2', description: '설명2', price: 2000, tags: [], images: [], userId: 1, createdAt: new Date(), updatedAt: new Date() }, + ]; + db.product.count.mockResolvedValue(2); + db.product.findMany.mockResolvedValue(fakeList); + + const req = makeMockReq({ query: { page: '1', pageSize: '10' } }); + const res = makeMockRes(); + + await (getProductList as any)(req, res, mockNext); + + expect(db.product.count).toHaveBeenCalledTimes(1); + expect(db.product.findMany).toHaveBeenCalledTimes(1); + expect(res.send).toHaveBeenCalledWith({ list: fakeList, totalCount: 2 }); + }); + + it('keyword 있으면 findMany에 OR 필터 포함', async () => { + db.product.count.mockResolvedValue(0); + db.product.findMany.mockResolvedValue([]); + + const req = makeMockReq({ query: { page: '1', pageSize: '10', keyword: '검색어' } }); + const res = makeMockRes(); + + await (getProductList as any)(req, res, mockNext); + + expect(db.product.findMany).toHaveBeenCalledWith( + expect.objectContaining({ + where: { + OR: [ + { name: { contains: '검색어' } }, + { description: { contains: '검색어' } }, + ], + }, + }) + ); + }); + + it('orderBy=recent → findMany에 { id: desc } 정렬', async () => { + db.product.count.mockResolvedValue(0); + db.product.findMany.mockResolvedValue([]); + + const req = makeMockReq({ query: { page: '1', pageSize: '10', orderBy: 'recent' } }); + const res = makeMockRes(); + + await (getProductList as any)(req, res, mockNext); + + expect(db.product.findMany).toHaveBeenCalledWith( + expect.objectContaining({ orderBy: { id: 'desc' } }) + ); + }); + + it('page=2, pageSize=5 → skip=5 적용', async () => { + db.product.count.mockResolvedValue(10); + db.product.findMany.mockResolvedValue([]); + + const req = makeMockReq({ query: { page: '2', pageSize: '5' } }); + const res = makeMockRes(); + + await (getProductList as any)(req, res, mockNext); + + expect(db.product.findMany).toHaveBeenCalledWith( + expect.objectContaining({ skip: 5, take: 5 }) + ); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] updateProduct', () => { +// ══════════════════════════════════════════════════════════════════ + + const existingProduct = { + id: 1, name: '기존 상품', description: '설명', price: 5000, + tags: [], images: [], userId: 1, createdAt: new Date(), updatedAt: new Date(), + }; + + it('가격 변경 시 → productLike 조회 + notification.createMany + emitNotification Spy 호출', async () => { + db.product.findUnique.mockResolvedValue(existingProduct); + const updatedProduct = { ...existingProduct, name: '수정 상품', price: 9999 }; + db.product.update.mockResolvedValue(updatedProduct); + db.productLike.findMany.mockResolvedValue([{ userId: 2 }, { userId: 3 }]); + db.notification.createMany.mockResolvedValue({ count: 2 }); + + // Spy: emitNotification이 몇 번 호출되는지 검증 + const emitSpy = jest.spyOn(socketModule, 'emitNotification'); + + const req = makeMockReq({ + params: { id: '1' }, + body: { name: '수정 상품', price: 9999 }, + }); + const res = makeMockRes(); + + await (updateProduct as any)(req, res, mockNext); + + // 알림 대상 조회 검증 + expect(db.productLike.findMany).toHaveBeenCalledWith({ + where: { productId: 1 }, + select: { userId: true }, + }); + + // 알림 DB 저장 검증 + expect(db.notification.createMany).toHaveBeenCalledTimes(1); + expect(db.notification.createMany).toHaveBeenCalledWith( + expect.objectContaining({ + data: expect.arrayContaining([ + expect.objectContaining({ type: 'PRICE_CHANGE', userId: 2 }), + expect.objectContaining({ type: 'PRICE_CHANGE', userId: 3 }), + ]), + }) + ); + + // 소켓 알림 Spy 검증 (유저 2명 → 2회 호출) + expect(emitSpy).toHaveBeenCalledTimes(2); + + expect(res.send).toHaveBeenCalledWith(updatedProduct); + }); + + it('가격 변경 없으면 → 알림/소켓 호출 없음', async () => { + db.product.findUnique.mockResolvedValue(existingProduct); + db.product.update.mockResolvedValue({ ...existingProduct, name: '이름만 변경' }); + + const emitSpy = jest.spyOn(socketModule, 'emitNotification'); + + const req = makeMockReq({ + params: { id: '1' }, + body: { name: '이름만 변경', price: 5000 }, // 가격 동일 + }); + const res = makeMockRes(); + + await (updateProduct as any)(req, res, mockNext); + + expect(db.productLike.findMany).not.toHaveBeenCalled(); + expect(db.notification.createMany).not.toHaveBeenCalled(); + expect(emitSpy).not.toHaveBeenCalled(); + }); + + it('다른 유저 소유 상품 수정 시도 → 403 + product.update 미호출', async () => { + db.product.findUnique.mockResolvedValue({ ...existingProduct, userId: 99 }); + + const req = makeMockReq({ params: { id: '1' }, body: { name: '해킹 시도' } }); + const res = makeMockRes(); + + await (updateProduct as any)(req, res, mockNext); + + expect(res.status).toHaveBeenCalledWith(403); + expect(db.product.update).not.toHaveBeenCalled(); + }); + + it('존재하지 않는 상품 수정 → NotFoundError → next 호출', async () => { + db.product.findUnique.mockResolvedValue(null); + + const req = makeMockReq({ params: { id: '999' }, body: { name: '없음' } }); + const res = makeMockRes(); + + await (updateProduct as any)(req, res, mockNext); + + expect(mockNext).toHaveBeenCalled(); + const err = (mockNext as jest.Mock).mock.calls[0][0]; + expect(err.name).toBe('NotFoundError'); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] deleteProduct', () => { +// ══════════════════════════════════════════════════════════════════ + + it('본인 상품 삭제 → product.delete 호출 + 204 반환', async () => { + db.product.findUnique.mockResolvedValue({ + id: 1, name: '삭제할 상품', description: '설명', price: 1000, + tags: [], images: [], userId: 1, createdAt: new Date(), updatedAt: new Date(), + }); + db.product.delete.mockResolvedValue({}); + + const req = makeMockReq({ params: { id: '1' } }); + const res = makeMockRes(); + + await (deleteProduct as any)(req, res, mockNext); + + expect(db.product.delete).toHaveBeenCalledWith({ where: { id: 1 } }); + expect(res.status).toHaveBeenCalledWith(204); + expect(res.send).toHaveBeenCalled(); + }); + + it('다른 유저 소유 상품 삭제 시도 → 403 + product.delete 미호출', async () => { + db.product.findUnique.mockResolvedValue({ + id: 1, name: '남의 상품', description: '설명', price: 1000, + tags: [], images: [], userId: 99, createdAt: new Date(), updatedAt: new Date(), + }); + + const req = makeMockReq({ params: { id: '1' } }); + const res = makeMockRes(); + + await (deleteProduct as any)(req, res, mockNext); + + expect(res.status).toHaveBeenCalledWith(403); + expect(db.product.delete).not.toHaveBeenCalled(); + }); + + it('존재하지 않는 상품 삭제 → NotFoundError → next 호출', async () => { + db.product.findUnique.mockResolvedValue(null); + + const req = makeMockReq({ params: { id: '999' } }); + const res = makeMockRes(); + + await (deleteProduct as any)(req, res, mockNext); + + expect(mockNext).toHaveBeenCalled(); + const err = (mockNext as jest.Mock).mock.calls[0][0]; + expect(err.name).toBe('NotFoundError'); + }); +}); \ No newline at end of file diff --git a/tests/socket.unit.test b/tests/socket.unit.test new file mode 100644 index 00000000..8eda59e0 --- /dev/null +++ b/tests/socket.unit.test @@ -0,0 +1,125 @@ +/** + * socket.ts 유닛 테스트 + * socket.io Server를 Mock하여 소켓 로직 검증 + */ + +// ── socket.io Mock ─────────────────────────────────────────────── +const mockEmit = jest.fn(); +const mockJoin = jest.fn(); +const mockTo = jest.fn().mockReturnValue({ emit: mockEmit }); +const mockOn = jest.fn(); + +const mockSocket = { + id: 'socket-test-id', + join: mockJoin, + on: mockOn, +}; + +const mockIo = { + on: jest.fn(), + to: mockTo, + emit: mockEmit, +}; + +jest.mock('socket.io', () => ({ + Server: jest.fn().mockImplementation(() => mockIo), +})); + +import { Server } from 'socket.io'; +import { setupSocket, emitNotification } from '../src/socket/socket'; +import http from 'http'; + +beforeEach(() => jest.clearAllMocks()); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] setupSocket', () => { +// ══════════════════════════════════════════════════════════════════ + + it('setupSocket 호출 → socket.io Server 생성 + io 반환', () => { + const httpServer = http.createServer(); + const io = setupSocket(httpServer); + + expect(Server).toHaveBeenCalledWith( + httpServer, + expect.objectContaining({ + cors: expect.objectContaining({ origin: '*' }), + }) + ); + expect(io).toBe(mockIo); + }); + + it('setupSocket 호출 → io.on("connection") 이벤트 등록', () => { + const httpServer = http.createServer(); + setupSocket(httpServer); + + expect(mockIo.on).toHaveBeenCalledWith('connection', expect.any(Function)); + }); + + it('connection 이벤트 → join / disconnect 소켓 이벤트 등록', () => { + const httpServer = http.createServer(); + setupSocket(httpServer); + + // connection 핸들러 직접 실행 + const connectionHandler = mockIo.on.mock.calls[0][1]; + connectionHandler(mockSocket); + + // socket.on이 'join', 'disconnect' 두 이벤트에 등록됐는지 확인 + const registeredEvents = mockSocket.on.mock.calls.map((c: any[]) => c[0]); + expect(registeredEvents).toContain('join'); + expect(registeredEvents).toContain('disconnect'); + }); + + it('join 이벤트 → socket.join(`user_${userId}`) 호출', () => { + const httpServer = http.createServer(); + setupSocket(httpServer); + + const connectionHandler = mockIo.on.mock.calls[0][1]; + connectionHandler(mockSocket); + + // join 핸들러 직접 실행 + const joinHandler = mockSocket.on.mock.calls.find((c: any[]) => c[0] === 'join')[1]; + joinHandler(42); + + expect(mockSocket.join).toHaveBeenCalledWith('user_42'); + }); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[Unit] emitNotification', () => { +// ══════════════════════════════════════════════════════════════════ + + const notificationData = { + type: 'COMMENT', + message: '새 댓글이 달렸습니다.', + productId: 1, + createdAt: new Date(), + }; + + it('io가 있을 때 → io.to(`user_${userId}`).emit 호출', () => { + emitNotification(mockIo as any, 5, notificationData); + + expect(mockTo).toHaveBeenCalledWith('user_5'); + expect(mockEmit).toHaveBeenCalledWith('NEW_NOTIFICATION', notificationData); + }); + + it('userId가 문자열이어도 → io.to(`user_string`) 호출', () => { + emitNotification(mockIo as any, 'abc', notificationData); + + expect(mockTo).toHaveBeenCalledWith('user_abc'); + expect(mockEmit).toHaveBeenCalledWith('NEW_NOTIFICATION', notificationData); + }); + + it('io가 undefined이면 → emit 호출 안 함', () => { + emitNotification(undefined, 5, notificationData); + + expect(mockTo).not.toHaveBeenCalled(); + expect(mockEmit).not.toHaveBeenCalled(); + }); + + it('알림 데이터가 올바르게 전달됨', () => { + const customData = { type: 'PRICE_CHANGE', message: '가격 변경됨', productId: 99, createdAt: new Date() }; + emitNotification(mockIo as any, 7, customData); + + expect(mockEmit).toHaveBeenCalledWith('NEW_NOTIFICATION', customData); + }); +}); \ No newline at end of file diff --git a/tests/user.test.ts b/tests/user.test.ts new file mode 100644 index 00000000..49f4f150 --- /dev/null +++ b/tests/user.test.ts @@ -0,0 +1,313 @@ +/** + * User API 통합 테스트 + 유닛 테스트 + * - GET/PATCH /users/me + * - PATCH /users/me/password + * - GET /users/me/products + * - GET /users/me/likes + * - GET/PATCH /users/me/notifications + * - GET /users/me/notifications/unread-count + */ + +import request from 'supertest'; +import { PrismaClient } from '@prisma/client'; +import bcrypt from 'bcrypt'; +import jwt from 'jsonwebtoken'; +import express from 'express'; +import userRouter from '../src/routers/userRoutes'; +import { defaultNotFoundHandler, globalErrorHandler } from '../src/controllers/errorController'; + +const prisma = new PrismaClient(); + +// userRoutes를 포함한 테스트용 앱 구성 (server.ts에 없으므로) +const app = express(); +app.use(express.json()); +app.use('/users', userRouter); +app.use(defaultNotFoundHandler); +app.use(globalErrorHandler); + +const TEST_EMAIL = `user_test_${Date.now()}@example.com`; +let testUserId: number; +let accessToken: string; +let productId: number; +let articleId: number; +let notificationId: number; + +beforeAll(async () => { + const hashed = await bcrypt.hash('password123', 10); + const user = await prisma.user.create({ + data: { email: TEST_EMAIL, nickname: 'UserTester', password: hashed }, + }); + testUserId = user.id; + + accessToken = jwt.sign( + { id: testUserId }, + process.env.JWT_SECRET || 'access_secret', + { expiresIn: '1h' } + ); + + // 테스트용 상품 생성 + const product = await prisma.product.create({ + data: { + name: '내 상품', + description: '설명', + price: 5000, + tags: [], + images: [], + userId: testUserId, + }, + }); + productId = product.id; + + // 테스트용 게시글 생성 + const article = await prisma.article.create({ + data: { title: '내 게시글', content: '내용', userId: testUserId }, + }); + articleId = article.id; + + // 테스트용 알림 생성 + const notification = await prisma.notification.create({ + data: { + type: 'COMMENT', + message: '테스트 알림', + userId: testUserId, + }, + }); + notificationId = notification.id; +}); + +afterAll(async () => { + await prisma.notification.deleteMany({ where: { userId: testUserId } }).catch(() => {}); + await prisma.articleLike.deleteMany({ where: { userId: testUserId } }).catch(() => {}); + await prisma.productLike.deleteMany({ where: { userId: testUserId } }).catch(() => {}); + await prisma.article.deleteMany({ where: { userId: testUserId } }).catch(() => {}); + await prisma.product.deleteMany({ where: { userId: testUserId } }).catch(() => {}); + await prisma.user.delete({ where: { id: testUserId } }).catch(() => {}); + await prisma.$disconnect(); +}); + +// ══════════════════════════════════════════════════════════════════ +describe('[User API] 인증 필요 테스트', () => { +// ══════════════════════════════════════════════════════════════════ + + // ── 내 정보 조회 ────────────────────────────────────────────── + describe('GET /users/me - 내 정보 조회', () => { + it('토큰 없이 요청 → 401', async () => { + const res = await request(app).get('/users/me'); + expect(res.status).toBe(401); + }); + + it('인증 후 내 정보 반환 → password 미포함', async () => { + const res = await request(app) + .get('/users/me') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body.id).toBe(testUserId); + expect(res.body.email).toBe(TEST_EMAIL); + expect(res.body).not.toHaveProperty('password'); + }); + }); + + // ── 내 정보 수정 ────────────────────────────────────────────── + describe('PATCH /users/me - 내 정보 수정', () => { + it('닉네임 수정 → 200 + 수정된 nickname 반환', async () => { + const res = await request(app) + .patch('/users/me') + .set('Authorization', `Bearer ${accessToken}`) + .send({ nickname: '수정된닉네임' }); + + expect(res.status).toBe(200); + expect(res.body.nickname).toBe('수정된닉네임'); + expect(res.body).not.toHaveProperty('password'); + }); + + it('image URL 수정 → 200', async () => { + const res = await request(app) + .patch('/users/me') + .set('Authorization', `Bearer ${accessToken}`) + .send({ image: 'https://example.com/avatar.jpg' }); + + expect(res.status).toBe(200); + expect(res.body.image).toBe('https://example.com/avatar.jpg'); + }); + }); + + // ── 비밀번호 변경 ───────────────────────────────────────────── + describe('PATCH /users/me/password - 비밀번호 변경', () => { + it('현재 비밀번호 불일치 → 401', async () => { + const res = await request(app) + .patch('/users/me/password') + .set('Authorization', `Bearer ${accessToken}`) + .send({ currentPassword: 'wrongpassword', newPassword: 'newpassword123' }); + + expect(res.status).toBe(401); + expect(res.body).toHaveProperty('message'); + }); + + it('newPassword 8자 미만 → 400', async () => { + const res = await request(app) + .patch('/users/me/password') + .set('Authorization', `Bearer ${accessToken}`) + .send({ currentPassword: 'password123', newPassword: '1234567' }); + + expect(res.status).toBe(400); + }); + + it('올바른 현재 비밀번호 + 유효한 새 비밀번호 → 200', async () => { + const res = await request(app) + .patch('/users/me/password') + .set('Authorization', `Bearer ${accessToken}`) + .send({ currentPassword: 'password123', newPassword: 'newpassword123' }); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('message'); + + // DB에서 직접 비밀번호 업데이트 (이후 테스트 영향 방지) + const hashed = await bcrypt.hash('password123', 10); + await prisma.user.update({ + where: { id: testUserId }, + data: { password: hashed }, + }); + }); + }); + + // ── 내 상품 목록 ────────────────────────────────────────────── + describe('GET /users/me/products - 내 상품 목록', () => { + it('내 상품 목록 → 200 + list, totalCount', async () => { + const res = await request(app) + .get('/users/me/products') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(res.body).toHaveProperty('totalCount'); + expect(Array.isArray(res.body.list)).toBe(true); + expect(res.body.totalCount).toBeGreaterThanOrEqual(1); + }); + + it('pageSize=1 → list 길이 1', async () => { + const res = await request(app) + .get('/users/me/products?pageSize=1') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body.list.length).toBeLessThanOrEqual(1); + }); + }); + + // ── 내 좋아요 목록 ──────────────────────────────────────────── + describe('GET /users/me/likes - 내 좋아요 목록', () => { + beforeAll(async () => { + // 좋아요 데이터 생성 + await prisma.productLike.create({ + data: { userId: testUserId, productId }, + }); + await prisma.articleLike.create({ + data: { userId: testUserId, articleId }, + }); + }); + + it('상품 좋아요 목록 → 200 + list', async () => { + const res = await request(app) + .get('/users/me/likes?type=product') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(Array.isArray(res.body.list)).toBe(true); + }); + + it('게시글 좋아요 목록 → 200 + list', async () => { + const res = await request(app) + .get('/users/me/likes?type=article') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(Array.isArray(res.body.list)).toBe(true); + }); + + it('type 없으면 기본값 product → 200', async () => { + const res = await request(app) + .get('/users/me/likes') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + }); + + it('잘못된 type → 400', async () => { + const res = await request(app) + .get('/users/me/likes?type=invalid') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(400); + }); + }); + + // ── 알림 목록 ───────────────────────────────────────────────── + describe('GET /users/me/notifications - 알림 목록', () => { + it('알림 목록 → 200 + list, totalCount', async () => { + const res = await request(app) + .get('/users/me/notifications') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('list'); + expect(res.body).toHaveProperty('totalCount'); + expect(Array.isArray(res.body.list)).toBe(true); + }); + }); + + // ── 읽지 않은 알림 개수 ─────────────────────────────────────── + describe('GET /users/me/notifications/unread-count - 미읽 알림 수', () => { + it('미읽 알림 개수 → 200 + count', async () => { + const res = await request(app) + .get('/users/me/notifications/unread-count') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('count'); + expect(typeof res.body.count).toBe('number'); + }); + }); + + // ── 모든 알림 읽음 처리 ─────────────────────────────────────── + describe('PATCH /users/me/notifications - 모든 알림 읽음', () => { + it('전체 읽음 처리 → 200', async () => { + const res = await request(app) + .patch('/users/me/notifications') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body).toHaveProperty('message'); + }); + + it('처리 후 미읽 알림 개수 0 확인', async () => { + const res = await request(app) + .get('/users/me/notifications/unread-count') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + expect(res.body.count).toBe(0); + }); + }); + + // ── 단일 알림 읽음 처리 ─────────────────────────────────────── + describe('PATCH /users/me/notifications/:id - 단일 알림 읽음', () => { + it('존재하는 알림 읽음 처리 → 200', async () => { + const res = await request(app) + .patch(`/users/me/notifications/${notificationId}`) + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(200); + }); + + it('존재하지 않는 알림 → 404', async () => { + const res = await request(app) + .patch('/users/me/notifications/999999999') + .set('Authorization', `Bearer ${accessToken}`); + + expect(res.status).toBe(404); + }); + }); +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 8343100d..42193f07 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,44 +1,41 @@ { - // Visit https://aka.ms/tsconfig to read more about this file "compilerOptions": { - // File Layout + /* 📂 File Layout */ "rootDir": "./src", "outDir": "./dist", + "baseUrl": ".", + /* 경로 인식을 위해 paths 설정 최적화 */ + "paths": { + "*": ["node_modules/*", "src/*"] + }, + + /* 🌍 Environment Settings (Node.js 실행 환경에 최적화) */ + "target": "ES6", + "module": "CommonJS", /* 👈 ESNext에서 CommonJS로 변경 (임포트 에러 해결 핵심) */ + "moduleResolution": "node", /* 👈 Bundler에서 node로 변경 (파일 찾기 해결 핵심) */ + "lib": ["ESNext"], - // Environment Settings - // See also https://aka.ms/tsconfig/module - "module": "nodenext", - "target": "esnext", - "types": [], - // For nodejs: - // "lib": ["esnext"], - // "types": ["node"], - // and npm install -D @types/node - - // Other Outputs - "sourceMap": true, - "declaration": true, - "declarationMap": true, - - // Stricter Typechecking Options - "noUncheckedIndexedAccess": true, - "exactOptionalPropertyTypes": true, - - // Style Options - // "noImplicitReturns": true, - // "noImplicitOverride": true, - // "noUnusedLocals": true, - // "noUnusedParameters": true, - // "noFallthroughCasesInSwitch": true, - // "noPropertyAccessFromIndexSignature": true, - - // Recommended Options + /* 🛡️ Strict Mode */ "strict": true, - "jsx": "react-jsx", - "verbatimModuleSyntax": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noUnusedLocals": false, /* 개발 중 편의를 위해 잠시 false (선택 사항) */ + "noUnusedParameters": false, /* 개발 중 편의를 위해 잠시 false (선택 사항) */ + "noImplicitReturns": false, + "noFallthroughCasesInSwitch": true, + + /* ⚡️ Interop & Others */ + "esModuleInterop": true, /* import React from 'react' 같은 구문 허용 */ + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, /* @types 라이브러리 내부 에러 무시 (속도 향상) */ "isolatedModules": true, - "noUncheckedSideEffectImports": true, - "moduleDetection": "force", - "skipLibCheck": true, - } -} + "resolveJsonModule": true, + + /* 🛠️ Debugging */ + "sourceMap": true, + "declaration": true + }, + "include": ["src/**/*", "tests/**/*"], + "exclude": ["node_modules", "dist"] +} \ No newline at end of file From 8a3bfcfd2d599f4d0e06ca70ed84d9c063a8d81f Mon Sep 17 00:00:00 2001 From: ssk7594-CRz Date: Mon, 16 Mar 2026 07:33:59 +0000 Subject: [PATCH 3/5] add source files --- infra/ecosystem.config.js | 0 infra/nginx.conf | 0 infra/start.sh | 35 + package-lock.json | 4620 ++++++++++++++++++++++----- package.json | 7 +- sk.pem | 27 + src/controllers/imagesController.ts | 89 +- 7 files changed, 3875 insertions(+), 903 deletions(-) create mode 100644 infra/ecosystem.config.js create mode 100644 infra/nginx.conf create mode 100644 infra/start.sh create mode 100644 sk.pem diff --git a/infra/ecosystem.config.js b/infra/ecosystem.config.js new file mode 100644 index 00000000..e69de29b diff --git a/infra/nginx.conf b/infra/nginx.conf new file mode 100644 index 00000000..e69de29b diff --git a/infra/start.sh b/infra/start.sh new file mode 100644 index 00000000..0bf2a376 --- /dev/null +++ b/infra/start.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# ───────────────────────────────────────────────────────────── +# EC2 배포 스크립트 (Ubuntu 기준) +# 실행 전: chmod +x start.sh +# ───────────────────────────────────────────────────────────── + +set -e # 에러 발생 시 즉시 중단 + +echo "🚀 판다마켓 서버 배포 시작..." + +# 1. 의존성 설치 +echo "📦 패키지 설치 중..." +npm install + +# 2. Prisma 클라이언트 생성 +echo "🔧 Prisma 클라이언트 생성 중..." +npx prisma generate + +# 3. DB 마이그레이션 +echo "🗄️ DB 마이그레이션 실행 중..." +npx prisma migrate deploy + +# 4. TypeScript 빌드 +echo "🏗️ TypeScript 빌드 중..." +npx tsc + +# 5. pm2로 서버 실행 (프로덕션 환경) +echo "⚙️ pm2 시작..." +npx pm2 start ecosystem.config.js --env production + +# pm2 프로세스 목록 저장 (재부팅 후 자동 실행 설정) +npx pm2 save + +echo "✅ 배포 완료!" +npx pm2 status \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index dbe5e14a..038d959b 100755 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,7 @@ "packages": { "": { "dependencies": { + "@aws-sdk/client-s3": "^3.1008.0", "@prisma/client": "^5.16.2", "bcrypt": "^6.0.0", "cors": "^2.8.5", @@ -34,1191 +35,2775 @@ "ts-jest": "^29.4.6" } }, - "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", - "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", - "dev": true, - "license": "MIT", - "peer": true, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/core/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { - "ms": "^2.1.3" + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/core/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=14.0.0" } }, - "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=16.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", - "dev": true, - "license": "MIT", + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { - "@babel/types": "^7.29.0" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, - "bin": { - "parser": "bin/babel-parser.js" + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.1008.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1008.0.tgz", + "integrity": "sha512-w/SIRD25v2zVMbkn8CYIxUsac8yf5Jghkhw5j7EsNWdJhl56m/nWpUX7t1etFUW1cnzpFjZV0lXt0dNFSnbXwA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-node": "^3.972.20", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.7", + "@aws-sdk/middleware-expect-continue": "^3.972.7", + "@aws-sdk/middleware-flexible-checksums": "^3.973.5", + "@aws-sdk/middleware-host-header": "^3.972.7", + "@aws-sdk/middleware-location-constraint": "^3.972.7", + "@aws-sdk/middleware-logger": "^3.972.7", + "@aws-sdk/middleware-recursion-detection": "^3.972.7", + "@aws-sdk/middleware-sdk-s3": "^3.972.19", + "@aws-sdk/middleware-ssec": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/region-config-resolver": "^3.972.7", + "@aws-sdk/signature-v4-multi-region": "^3.996.7", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@aws-sdk/util-user-agent-browser": "^3.972.7", + "@aws-sdk/util-user-agent-node": "^3.973.6", + "@smithy/config-resolver": "^4.4.10", + "@smithy/core": "^3.23.9", + "@smithy/eventstream-serde-browser": "^4.2.11", + "@smithy/eventstream-serde-config-resolver": "^4.3.11", + "@smithy/eventstream-serde-node": "^4.2.11", + "@smithy/fetch-http-handler": "^5.3.13", + "@smithy/hash-blob-browser": "^4.2.12", + "@smithy/hash-node": "^4.2.11", + "@smithy/hash-stream-node": "^4.2.11", + "@smithy/invalid-dependency": "^4.2.11", + "@smithy/md5-js": "^4.2.11", + "@smithy/middleware-content-length": "^4.2.11", + "@smithy/middleware-endpoint": "^4.4.23", + "@smithy/middleware-retry": "^4.4.40", + "@smithy/middleware-serde": "^4.2.12", + "@smithy/middleware-stack": "^4.2.11", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/node-http-handler": "^4.4.14", + "@smithy/protocol-http": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.39", + "@smithy/util-defaults-mode-node": "^4.2.42", + "@smithy/util-endpoints": "^3.3.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-retry": "^4.2.11", + "@smithy/util-stream": "^4.5.17", + "@smithy/util-utf8": "^4.2.2", + "@smithy/util-waiter": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.973.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.19.tgz", + "integrity": "sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/xml-builder": "^3.972.10", + "@smithy/core": "^3.23.9", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/property-provider": "^4.2.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/signature-v4": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=20.0.0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", + "node_modules/@aws-sdk/crc64-nvme": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.4.tgz", + "integrity": "sha512-HKZIZLbRyvzo/bXZU7Zmk6XqU+1C9DjI56xd02vwuDIxedxBEqP17t9ExhbP9QFeNq/a3l9GOcyirFXxmbDhmw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.17.tgz", + "integrity": "sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.19.tgz", + "integrity": "sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/fetch-http-handler": "^5.3.13", + "@smithy/node-http-handler": "^4.4.14", + "@smithy/property-provider": "^4.2.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/util-stream": "^4.5.17", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.19.tgz", + "integrity": "sha512-pVJVjWqVrPqjpFq7o0mCmeZu1Y0c94OCHSYgivdCD2wfmYVtBbwQErakruhgOD8pcMcx9SCqRw1pzHKR7OGBcA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-login": "^3.972.19", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.19", + "@aws-sdk/credential-provider-web-identity": "^3.972.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/credential-provider-imds": "^4.2.11", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-login": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.19.tgz", + "integrity": "sha512-jOXdZ1o+CywQKr6gyxgxuUmnGwTTnY2Kxs1PM7fI6AYtDWDnmW/yKXayNqkF8KjP1unflqMWKVbVt5VgmE3L0g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.20.tgz", + "integrity": "sha512-0xHca2BnPY0kzjDYPH7vk8YbfdBPpWVS67rtqQMalYDQUCBYS37cZ55K6TuFxCoIyNZgSCFrVKr9PXC5BVvQQw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-ini": "^3.972.19", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.19", + "@aws-sdk/credential-provider-web-identity": "^3.972.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/credential-provider-imds": "^4.2.11", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.17.tgz", + "integrity": "sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.19.tgz", + "integrity": "sha512-kVjQsEU3b///q7EZGrUzol9wzwJFKbEzqJKSq82A9ShrUTEO7FNylTtby3sPV19ndADZh1H3FB3+5ZrvKtEEeg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/token-providers": "3.1008.0", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.19.tgz", + "integrity": "sha512-BV1BlTFdG4w4tAihxN7iXDBoNcNewXD4q8uZlNQiUrnqxwGWUhKHODIQVSPlQGxXClEj+63m+cqZskw+ESmeZg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.7.tgz", + "integrity": "sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.7.tgz", + "integrity": "sha512-mvWqvm61bmZUKmmrtl2uWbokqpenY3Mc3Jf4nXB/Hse6gWxLPaCQThmhPBDzsPSV8/Odn8V6ovWt3pZ7vy4BFQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.973.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.5.tgz", + "integrity": "sha512-Dp3hqE5W6hG8HQ3Uh+AINx9wjjqYmFHbxede54sGj3akx/haIQrkp85lNdTdC+ouNUcSYNiuGkzmyDREfHX1Gg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/crc64-nvme": "^3.972.4", + "@aws-sdk/types": "^3.973.5", + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-stream": "^4.5.17", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", + "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.7.tgz", + "integrity": "sha512-vdK1LJfffBp87Lj0Bw3WdK1rJk9OLDYdQpqoKgmpIZPe+4+HawZ6THTbvjhJt4C4MNnRrHTKHQjkwBiIpDBoig==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", + "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", + "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.19.tgz", + "integrity": "sha512-/CtOHHVFg4ZuN6CnLnYkrqWgVEnbOBC4kNiKa+4fldJ9cioDt3dD/f5vpq0cWLOXwmGL2zgVrVxNhjxWpxNMkg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/core": "^3.23.9", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/signature-v4": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-stream": "^4.5.17", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.7.tgz", + "integrity": "sha512-G9clGVuAml7d8DYzY6DnRi7TIIDRvZ3YpqJPz/8wnWS5fYx/FNWNmkO6iJVlVkQg9BfeMzd+bVPtPJOvC4B+nQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz", + "integrity": "sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@smithy/core": "^3.23.9", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-retry": "^4.2.11", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.996.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.9.tgz", + "integrity": "sha512-+RpVtpmQbbtzFOKhMlsRcXM/3f1Z49qTOHaA8gEpHOYruERmog6f2AUtf/oTRLCWjR9H2b3roqryV/hI7QMW8w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/middleware-host-header": "^3.972.7", + "@aws-sdk/middleware-logger": "^3.972.7", + "@aws-sdk/middleware-recursion-detection": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/region-config-resolver": "^3.972.7", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@aws-sdk/util-user-agent-browser": "^3.972.7", + "@aws-sdk/util-user-agent-node": "^3.973.6", + "@smithy/config-resolver": "^4.4.10", + "@smithy/core": "^3.23.9", + "@smithy/fetch-http-handler": "^5.3.13", + "@smithy/hash-node": "^4.2.11", + "@smithy/invalid-dependency": "^4.2.11", + "@smithy/middleware-content-length": "^4.2.11", + "@smithy/middleware-endpoint": "^4.4.23", + "@smithy/middleware-retry": "^4.4.40", + "@smithy/middleware-serde": "^4.2.12", + "@smithy/middleware-stack": "^4.2.11", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/node-http-handler": "^4.4.14", + "@smithy/protocol-http": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.39", + "@smithy/util-defaults-mode-node": "^4.2.42", + "@smithy/util-endpoints": "^3.3.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-retry": "^4.2.11", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", + "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/config-resolver": "^4.4.10", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.996.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.7.tgz", + "integrity": "sha512-mYhh7FY+7OOqjkYkd6+6GgJOsXK1xBWmuR+c5mxJPj2kr5TBNeZq+nUvE9kANWAux5UxDVrNOSiEM/wlHzC3Lg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "^3.972.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/signature-v4": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.1008.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1008.0.tgz", + "integrity": "sha512-TulwlHQBWcJs668kNUDMZHN51DeLrDsYT59Ux4a/nbvr025gM6HjKJJ3LvnZccam7OS/ZKUVkWomCneRQKJbBg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.973.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", + "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.996.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", + "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-endpoints": "^3.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", + "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.6.tgz", + "integrity": "sha512-iF7G0prk7AvmOK64FcLvc/fW+Ty1H+vttajL7PvJFReU8urMxfYmynTTuFKDTA76Wgpq3FzTPKwabMQIXQHiXQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/types": "^3.973.5", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz", + "integrity": "sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.0", + "fast-xml-parser": "5.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", + "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@types/node": "*", + "chalk": "^4.1.2", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/core": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", + "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "30.2.0", + "@jest/pattern": "30.0.1", + "@jest/reporters": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "ci-info": "^4.2.0", + "exit-x": "^0.2.2", + "graceful-fs": "^4.2.11", + "jest-changed-files": "30.2.0", + "jest-config": "30.2.0", + "jest-haste-map": "30.2.0", + "jest-message-util": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-resolve": "30.2.0", + "jest-resolve-dependencies": "30.2.0", + "jest-runner": "30.2.0", + "jest-runtime": "30.2.0", + "jest-snapshot": "30.2.0", + "jest-util": "30.2.0", + "jest-validate": "30.2.0", + "jest-watcher": "30.2.0", + "micromatch": "^4.0.8", + "pretty-format": "30.2.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/diff-sequences": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", + "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", + "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "30.2.0", + "@jest/types": "30.2.0", + "@types/node": "*", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", + "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "30.2.0", + "jest-snapshot": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", + "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/get-type": "30.1.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", + "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "@sinonjs/fake-timers": "^13.0.0", + "@types/node": "*", + "jest-message-util": "30.2.0", + "jest-mock": "30.2.0", + "jest-util": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/get-type": { + "version": "30.1.0", + "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", + "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", + "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "30.2.0", + "@jest/expect": "30.2.0", + "@jest/types": "30.2.0", + "jest-mock": "30.2.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/pattern": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", + "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-regex-util": "30.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", + "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "30.2.0", + "@jest/test-result": "30.2.0", + "@jest/transform": "30.2.0", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "@types/node": "*", + "chalk": "^4.1.2", + "collect-v8-coverage": "^1.0.2", + "exit-x": "^0.2.2", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^5.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "30.2.0", + "jest-util": "30.2.0", + "jest-worker": "30.2.0", + "slash": "^3.0.0", + "string-length": "^4.0.2", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "30.0.5", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", + "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.34.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/snapshot-utils": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", + "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "30.2.0", + "chalk": "^4.1.2", + "graceful-fs": "^4.2.11", + "natural-compare": "^1.4.0" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", + "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "callsites": "^3.1.0", + "graceful-fs": "^4.2.11" + }, + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", + "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@jest/console": "30.2.0", + "@jest/types": "30.2.0", + "@types/istanbul-lib-coverage": "^2.0.6", + "collect-v8-coverage": "^1.0.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@jest/test-sequencer": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", + "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@jest/test-result": "30.2.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "slash": "^3.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "node_modules/@jest/transform": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", + "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/core": "^7.27.4", + "@jest/types": "30.2.0", + "@jridgewell/trace-mapping": "^0.3.25", + "babel-plugin-istanbul": "^7.0.1", + "chalk": "^4.1.2", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.11", + "jest-haste-map": "30.2.0", + "jest-regex-util": "30.0.1", + "jest-util": "30.2.0", + "micromatch": "^4.0.8", + "pirates": "^4.0.7", + "slash": "^3.0.0", + "write-file-atomic": "^5.0.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "node_modules/@jest/types": { + "version": "30.2.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", + "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@jest/pattern": "30.0.1", + "@jest/schemas": "30.0.5", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/node": "*", + "@types/yargs": "^17.0.33", + "chalk": "^4.1.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", - "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": "^14.21.3 || >=16" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@prisma/client": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", + "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", + "hasInstallScript": true, + "engines": { + "node": ">=16.13" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/debug": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", + "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", + "devOptional": true + }, + "node_modules/@prisma/engines": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", + "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", + "devOptional": true, + "hasInstallScript": true, + "dependencies": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/fetch-engine": "5.16.2", + "@prisma/get-platform": "5.16.2" + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", + "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", + "devOptional": true + }, + "node_modules/@prisma/fetch-engine": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", + "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.16.2", + "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", + "@prisma/get-platform": "5.16.2" + } + }, + "node_modules/@prisma/get-platform": { + "version": "5.16.2", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", + "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", + "devOptional": true, + "dependencies": { + "@prisma/debug": "5.16.2" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@sinclair/typebox": { + "version": "0.34.48", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", + "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } + "license": "MIT" }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "type-detect": "4.0.8" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@sinonjs/commons": "^3.0.1" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/abort-controller": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", + "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", + "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "tslib": "^2.6.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", + "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/config-resolver": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", + "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", - "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/core": { + "version": "3.23.11", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.11.tgz", + "integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18.0.0" } }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", + "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", + "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", + "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@babel/traverse/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", + "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", + "license": "Apache-2.0", "dependencies": { - "ms": "^2.1.3" + "@smithy/eventstream-serde-universal": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@babel/traverse/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", + "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", + "license": "Apache-2.0", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=18.0.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@emnapi/core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", - "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", + "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", + "license": "Apache-2.0", "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" + "@smithy/eventstream-serde-universal": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", + "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "@smithy/eventstream-codec": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", - "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.15", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", + "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.4.0" + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", + "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", + "license": "Apache-2.0", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@smithy/chunked-blob-reader": "^5.2.2", + "@smithy/chunked-blob-reader-native": "^4.2.3", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12" + "node": ">=18.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", + "node_modules/@smithy/hash-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", + "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", + "license": "Apache-2.0", "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@smithy/types": "^4.13.1", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", + "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=8" + "node": ">=18.0.0" } }, - "node_modules/@jest/console": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.2.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "slash": "^3.0.0" + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/core": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", + "license": "Apache-2.0", "dependencies": { - "@jest/console": "30.2.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", - "slash": "^3.0.0" + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/md5-js": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz", + "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/environment": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", + "license": "Apache-2.0", "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", - "@types/node": "*", - "jest-mock": "30.2.0" + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-endpoint": { + "version": "4.4.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", + "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", + "license": "Apache-2.0", "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" + "@smithy/core": "^3.23.11", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-retry": { + "version": "4.4.42", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", + "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", + "license": "Apache-2.0", "dependencies": { - "@jest/get-type": "30.1.0" + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/fake-timers": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-serde": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", + "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", + "license": "Apache-2.0", "dependencies": { - "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz", - "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/middleware-stack": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/globals": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/node-config-provider": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", + "license": "Apache-2.0", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/node-http-handler": { + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz", + "integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==", + "license": "Apache-2.0", "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" + "@smithy/abort-controller": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/reporters": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/property-provider": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", + "license": "Apache-2.0", "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/protocol-http": { + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", + "license": "Apache-2.0", "dependencies": { - "@sinclair/typebox": "^0.34.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/querystring-builder": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", + "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", + "license": "Apache-2.0", "dependencies": { - "@jest/types": "30.2.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" + "@smithy/types": "^4.13.1", + "@smithy/util-uri-escape": "^4.2.2", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/querystring-parser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/test-result": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/service-error-classification": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", + "license": "Apache-2.0", "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" + "@smithy/types": "^4.13.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/test-sequencer": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", + "license": "Apache-2.0", "dependencies": { - "@jest/test-result": "30.2.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "slash": "^3.0.0" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/transform": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/signature-v4": { + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", + "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", + "license": "Apache-2.0", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-uri-escape": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", + "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.23.11", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/types": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", + "license": "Apache-2.0", "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" + "tslib": "^2.6.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/url-parser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@smithy/querystring-parser": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-base64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=6.0.0" + "node": ">=18.0.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", + "license": "Apache-2.0", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", + "license": "Apache-2.0", "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" + "@smithy/is-array-buffer": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" + "node_modules/@smithy/util-config-provider": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", - "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", - "dev": true, - "license": "MIT", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.41", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", + "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", + "license": "Apache-2.0", "dependencies": { - "@noble/hashes": "^1.1.5" + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.44", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", + "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.11", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14" + "node": ">=18.0.0" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node_modules/@smithy/util-endpoints": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://opencollective.com/pkgr" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@prisma/client": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.16.2.tgz", - "integrity": "sha512-+1lmkhR9gHWcTC5oghm2ZKpWljyWdzfazCVlLKUWXVmwHSf52g81aZ8qb6Km5Bs025yBi7puLp3qSLEvktoUtw==", - "hasInstallScript": true, - "engines": { - "node": ">=16.13" - }, - "peerDependencies": { - "prisma": "*" + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "prisma": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@prisma/debug": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-5.16.2.tgz", - "integrity": "sha512-ItzB4nR4O8eLzuJiuP3WwUJfoIvewMHqpGCad+64gvThcKEVOtaUza9AEJo2DPqAOa/AWkFyK54oM4WwHeew+A==", - "devOptional": true - }, - "node_modules/@prisma/engines": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-5.16.2.tgz", - "integrity": "sha512-qUxwMtrwoG3byd4PbX6T7EjHJ8AUhzTuwniOGkh/hIznBfcE2QQnGakyEq4VnwNuttMqvh/GgPFapHQ3lCuRHg==", - "devOptional": true, - "hasInstallScript": true, + "node_modules/@smithy/util-middleware": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/fetch-engine": "5.16.2", - "@prisma/get-platform": "5.16.2" + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@prisma/engines-version": { - "version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303.tgz", - "integrity": "sha512-HkT2WbfmFZ9WUPyuJHhkiADxazHg8Y4gByrTSVeb3OikP6tjQ7txtSUGu9OBOBH0C13dPKN2qqH12xKtHu/Hiw==", - "devOptional": true + "node_modules/@smithy/util-retry": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@prisma/fetch-engine": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-5.16.2.tgz", - "integrity": "sha512-sq51lfHKfH2jjYSjBtMjP+AznFqOJzXpqmq6B9auWrlTJrMgZ7lPyhWUW7VU7LsQU48/TJ+DZeIz8s9bMYvcHg==", - "devOptional": true, + "node_modules/@smithy/util-stream": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", + "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.16.2", - "@prisma/engines-version": "5.16.0-24.34ace0eb2704183d2c05b60b52fba5c43c13f303", - "@prisma/get-platform": "5.16.2" + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@prisma/get-platform": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-5.16.2.tgz", - "integrity": "sha512-cXiHPgNLNyj22vLouPVNegklpRL/iX2jxTeap5GRO3DmCoVyIHmJAV1CgUMUJhHlcol9yYy7EHvsnXTDJ/PKEA==", - "devOptional": true, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "5.16.2" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.34.48", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.48.tgz", - "integrity": "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==", - "dev": true, - "license": "MIT" + "node_modules/@smithy/util-utf8": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/util-waiter": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", + "integrity": "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==", + "license": "Apache-2.0", "dependencies": { - "type-detect": "4.0.8" + "@smithy/abort-controller": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^3.0.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, "node_modules/@socket.io/component-emitter": { @@ -2080,6 +3665,12 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -2988,6 +4579,40 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-xml-builder": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz", + "integrity": "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -4829,7 +6454,22 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" } }, "node_modules/path-is-absolute": { @@ -5668,6 +7308,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/superagent": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", @@ -5964,9 +7616,7 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true + "license": "0BSD" }, "node_modules/type-detect": { "version": "4.0.8", @@ -6449,6 +8099,677 @@ } }, "dependencies": { + "@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "requires": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "requires": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "requires": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "requires": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "requires": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "requires": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + }, + "dependencies": { + "@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "requires": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "requires": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + } + } + } + }, + "@aws-sdk/client-s3": { + "version": "3.1008.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1008.0.tgz", + "integrity": "sha512-w/SIRD25v2zVMbkn8CYIxUsac8yf5Jghkhw5j7EsNWdJhl56m/nWpUX7t1etFUW1cnzpFjZV0lXt0dNFSnbXwA==", + "requires": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-node": "^3.972.20", + "@aws-sdk/middleware-bucket-endpoint": "^3.972.7", + "@aws-sdk/middleware-expect-continue": "^3.972.7", + "@aws-sdk/middleware-flexible-checksums": "^3.973.5", + "@aws-sdk/middleware-host-header": "^3.972.7", + "@aws-sdk/middleware-location-constraint": "^3.972.7", + "@aws-sdk/middleware-logger": "^3.972.7", + "@aws-sdk/middleware-recursion-detection": "^3.972.7", + "@aws-sdk/middleware-sdk-s3": "^3.972.19", + "@aws-sdk/middleware-ssec": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/region-config-resolver": "^3.972.7", + "@aws-sdk/signature-v4-multi-region": "^3.996.7", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@aws-sdk/util-user-agent-browser": "^3.972.7", + "@aws-sdk/util-user-agent-node": "^3.973.6", + "@smithy/config-resolver": "^4.4.10", + "@smithy/core": "^3.23.9", + "@smithy/eventstream-serde-browser": "^4.2.11", + "@smithy/eventstream-serde-config-resolver": "^4.3.11", + "@smithy/eventstream-serde-node": "^4.2.11", + "@smithy/fetch-http-handler": "^5.3.13", + "@smithy/hash-blob-browser": "^4.2.12", + "@smithy/hash-node": "^4.2.11", + "@smithy/hash-stream-node": "^4.2.11", + "@smithy/invalid-dependency": "^4.2.11", + "@smithy/md5-js": "^4.2.11", + "@smithy/middleware-content-length": "^4.2.11", + "@smithy/middleware-endpoint": "^4.4.23", + "@smithy/middleware-retry": "^4.4.40", + "@smithy/middleware-serde": "^4.2.12", + "@smithy/middleware-stack": "^4.2.11", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/node-http-handler": "^4.4.14", + "@smithy/protocol-http": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.39", + "@smithy/util-defaults-mode-node": "^4.2.42", + "@smithy/util-endpoints": "^3.3.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-retry": "^4.2.11", + "@smithy/util-stream": "^4.5.17", + "@smithy/util-utf8": "^4.2.2", + "@smithy/util-waiter": "^4.2.12", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/core": { + "version": "3.973.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.19.tgz", + "integrity": "sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/xml-builder": "^3.972.10", + "@smithy/core": "^3.23.9", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/property-provider": "^4.2.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/signature-v4": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/crc64-nvme": { + "version": "3.972.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.4.tgz", + "integrity": "sha512-HKZIZLbRyvzo/bXZU7Zmk6XqU+1C9DjI56xd02vwuDIxedxBEqP17t9ExhbP9QFeNq/a3l9GOcyirFXxmbDhmw==", + "requires": { + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-env": { + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.17.tgz", + "integrity": "sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-http": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.19.tgz", + "integrity": "sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/fetch-http-handler": "^5.3.13", + "@smithy/node-http-handler": "^4.4.14", + "@smithy/property-provider": "^4.2.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/util-stream": "^4.5.17", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-ini": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.19.tgz", + "integrity": "sha512-pVJVjWqVrPqjpFq7o0mCmeZu1Y0c94OCHSYgivdCD2wfmYVtBbwQErakruhgOD8pcMcx9SCqRw1pzHKR7OGBcA==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-login": "^3.972.19", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.19", + "@aws-sdk/credential-provider-web-identity": "^3.972.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/credential-provider-imds": "^4.2.11", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-login": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.19.tgz", + "integrity": "sha512-jOXdZ1o+CywQKr6gyxgxuUmnGwTTnY2Kxs1PM7fI6AYtDWDnmW/yKXayNqkF8KjP1unflqMWKVbVt5VgmE3L0g==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-node": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.20.tgz", + "integrity": "sha512-0xHca2BnPY0kzjDYPH7vk8YbfdBPpWVS67rtqQMalYDQUCBYS37cZ55K6TuFxCoIyNZgSCFrVKr9PXC5BVvQQw==", + "requires": { + "@aws-sdk/credential-provider-env": "^3.972.17", + "@aws-sdk/credential-provider-http": "^3.972.19", + "@aws-sdk/credential-provider-ini": "^3.972.19", + "@aws-sdk/credential-provider-process": "^3.972.17", + "@aws-sdk/credential-provider-sso": "^3.972.19", + "@aws-sdk/credential-provider-web-identity": "^3.972.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/credential-provider-imds": "^4.2.11", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-process": { + "version": "3.972.17", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.17.tgz", + "integrity": "sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-sso": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.19.tgz", + "integrity": "sha512-kVjQsEU3b///q7EZGrUzol9wzwJFKbEzqJKSq82A9ShrUTEO7FNylTtby3sPV19ndADZh1H3FB3+5ZrvKtEEeg==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/token-providers": "3.1008.0", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/credential-provider-web-identity": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.19.tgz", + "integrity": "sha512-BV1BlTFdG4w4tAihxN7iXDBoNcNewXD4q8uZlNQiUrnqxwGWUhKHODIQVSPlQGxXClEj+63m+cqZskw+ESmeZg==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-bucket-endpoint": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.972.7.tgz", + "integrity": "sha512-goX+axlJ6PQlRnzE2bQisZ8wVrlm6dXJfBzMJhd8LhAIBan/w1Kl73fJnalM/S+18VnpzIHumyV6DtgmvqG5IA==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-expect-continue": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.7.tgz", + "integrity": "sha512-mvWqvm61bmZUKmmrtl2uWbokqpenY3Mc3Jf4nXB/Hse6gWxLPaCQThmhPBDzsPSV8/Odn8V6ovWt3pZ7vy4BFQ==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-flexible-checksums": { + "version": "3.973.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.5.tgz", + "integrity": "sha512-Dp3hqE5W6hG8HQ3Uh+AINx9wjjqYmFHbxede54sGj3akx/haIQrkp85lNdTdC+ouNUcSYNiuGkzmyDREfHX1Gg==", + "requires": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/crc64-nvme": "^3.972.4", + "@aws-sdk/types": "^3.973.5", + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-stream": "^4.5.17", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-host-header": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.972.7.tgz", + "integrity": "sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-location-constraint": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.972.7.tgz", + "integrity": "sha512-vdK1LJfffBp87Lj0Bw3WdK1rJk9OLDYdQpqoKgmpIZPe+4+HawZ6THTbvjhJt4C4MNnRrHTKHQjkwBiIpDBoig==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-logger": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.972.7.tgz", + "integrity": "sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-recursion-detection": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.7.tgz", + "integrity": "sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-sdk-s3": { + "version": "3.972.19", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.19.tgz", + "integrity": "sha512-/CtOHHVFg4ZuN6CnLnYkrqWgVEnbOBC4kNiKa+4fldJ9cioDt3dD/f5vpq0cWLOXwmGL2zgVrVxNhjxWpxNMkg==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-arn-parser": "^3.972.3", + "@smithy/core": "^3.23.9", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/protocol-http": "^5.3.11", + "@smithy/signature-v4": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-stream": "^4.5.17", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-ssec": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.7.tgz", + "integrity": "sha512-G9clGVuAml7d8DYzY6DnRi7TIIDRvZ3YpqJPz/8wnWS5fYx/FNWNmkO6iJVlVkQg9BfeMzd+bVPtPJOvC4B+nQ==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/middleware-user-agent": { + "version": "3.972.20", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.20.tgz", + "integrity": "sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@smithy/core": "^3.23.9", + "@smithy/protocol-http": "^5.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-retry": "^4.2.11", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/nested-clients": { + "version": "3.996.9", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.9.tgz", + "integrity": "sha512-+RpVtpmQbbtzFOKhMlsRcXM/3f1Z49qTOHaA8gEpHOYruERmog6f2AUtf/oTRLCWjR9H2b3roqryV/hI7QMW8w==", + "requires": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/middleware-host-header": "^3.972.7", + "@aws-sdk/middleware-logger": "^3.972.7", + "@aws-sdk/middleware-recursion-detection": "^3.972.7", + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/region-config-resolver": "^3.972.7", + "@aws-sdk/types": "^3.973.5", + "@aws-sdk/util-endpoints": "^3.996.4", + "@aws-sdk/util-user-agent-browser": "^3.972.7", + "@aws-sdk/util-user-agent-node": "^3.973.6", + "@smithy/config-resolver": "^4.4.10", + "@smithy/core": "^3.23.9", + "@smithy/fetch-http-handler": "^5.3.13", + "@smithy/hash-node": "^4.2.11", + "@smithy/invalid-dependency": "^4.2.11", + "@smithy/middleware-content-length": "^4.2.11", + "@smithy/middleware-endpoint": "^4.4.23", + "@smithy/middleware-retry": "^4.4.40", + "@smithy/middleware-serde": "^4.2.12", + "@smithy/middleware-stack": "^4.2.11", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/node-http-handler": "^4.4.14", + "@smithy/protocol-http": "^5.3.11", + "@smithy/smithy-client": "^4.12.3", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-body-length-node": "^4.2.3", + "@smithy/util-defaults-mode-browser": "^4.3.39", + "@smithy/util-defaults-mode-node": "^4.2.42", + "@smithy/util-endpoints": "^3.3.2", + "@smithy/util-middleware": "^4.2.11", + "@smithy/util-retry": "^4.2.11", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/region-config-resolver": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.7.tgz", + "integrity": "sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/config-resolver": "^4.4.10", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/signature-v4-multi-region": { + "version": "3.996.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.7.tgz", + "integrity": "sha512-mYhh7FY+7OOqjkYkd6+6GgJOsXK1xBWmuR+c5mxJPj2kr5TBNeZq+nUvE9kANWAux5UxDVrNOSiEM/wlHzC3Lg==", + "requires": { + "@aws-sdk/middleware-sdk-s3": "^3.972.19", + "@aws-sdk/types": "^3.973.5", + "@smithy/protocol-http": "^5.3.11", + "@smithy/signature-v4": "^5.3.11", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/token-providers": { + "version": "3.1008.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1008.0.tgz", + "integrity": "sha512-TulwlHQBWcJs668kNUDMZHN51DeLrDsYT59Ux4a/nbvr025gM6HjKJJ3LvnZccam7OS/ZKUVkWomCneRQKJbBg==", + "requires": { + "@aws-sdk/core": "^3.973.19", + "@aws-sdk/nested-clients": "^3.996.9", + "@aws-sdk/types": "^3.973.5", + "@smithy/property-provider": "^4.2.11", + "@smithy/shared-ini-file-loader": "^4.4.6", + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/types": { + "version": "3.973.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.5.tgz", + "integrity": "sha512-hl7BGwDCWsjH8NkZfx+HgS7H2LyM2lTMAI7ba9c8O0KqdBLTdNJivsHpqjg9rNlAlPyREb6DeDRXUl0s8uFdmQ==", + "requires": { + "@smithy/types": "^4.13.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-arn-parser": { + "version": "3.972.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.972.3.tgz", + "integrity": "sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-endpoints": { + "version": "3.996.4", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.996.4.tgz", + "integrity": "sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "@smithy/url-parser": "^4.2.11", + "@smithy/util-endpoints": "^3.3.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-locate-window": { + "version": "3.965.5", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.965.5.tgz", + "integrity": "sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-browser": { + "version": "3.972.7", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.7.tgz", + "integrity": "sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==", + "requires": { + "@aws-sdk/types": "^3.973.5", + "@smithy/types": "^4.13.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/util-user-agent-node": { + "version": "3.973.6", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.6.tgz", + "integrity": "sha512-iF7G0prk7AvmOK64FcLvc/fW+Ty1H+vttajL7PvJFReU8urMxfYmynTTuFKDTA76Wgpq3FzTPKwabMQIXQHiXQ==", + "requires": { + "@aws-sdk/middleware-user-agent": "^3.972.20", + "@aws-sdk/types": "^3.973.5", + "@smithy/node-config-provider": "^4.3.11", + "@smithy/types": "^4.13.0", + "@smithy/util-config-provider": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@aws-sdk/xml-builder": { + "version": "3.972.10", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz", + "integrity": "sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA==", + "requires": { + "@smithy/types": "^4.13.0", + "fast-xml-parser": "5.4.1", + "tslib": "^2.6.2" + } + }, + "@aws/lambda-invoke-store": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz", + "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==" + }, "@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -7303,6 +9624,535 @@ "@sinonjs/commons": "^3.0.1" } }, + "@smithy/abort-controller": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", + "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/chunked-blob-reader": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.2.tgz", + "integrity": "sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/chunked-blob-reader-native": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.3.tgz", + "integrity": "sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==", + "requires": { + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + } + }, + "@smithy/config-resolver": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.11.tgz", + "integrity": "sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==", + "requires": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" + } + }, + "@smithy/core": { + "version": "3.23.11", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.11.tgz", + "integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==", + "requires": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.19", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + } + }, + "@smithy/credential-provider-imds": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", + "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", + "requires": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-codec": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.12.tgz", + "integrity": "sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==", + "requires": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-browser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.12.tgz", + "integrity": "sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==", + "requires": { + "@smithy/eventstream-serde-universal": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-config-resolver": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.12.tgz", + "integrity": "sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.12.tgz", + "integrity": "sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==", + "requires": { + "@smithy/eventstream-serde-universal": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/eventstream-serde-universal": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.12.tgz", + "integrity": "sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==", + "requires": { + "@smithy/eventstream-codec": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/fetch-http-handler": { + "version": "5.3.15", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", + "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", + "requires": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-blob-browser": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.13.tgz", + "integrity": "sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==", + "requires": { + "@smithy/chunked-blob-reader": "^5.2.2", + "@smithy/chunked-blob-reader-native": "^4.2.3", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", + "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", + "requires": { + "@smithy/types": "^4.13.1", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/hash-stream-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.12.tgz", + "integrity": "sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==", + "requires": { + "@smithy/types": "^4.13.1", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/invalid-dependency": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/is-array-buffer": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", + "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/md5-js": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.12.tgz", + "integrity": "sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==", + "requires": { + "@smithy/types": "^4.13.1", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-content-length": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz", + "integrity": "sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==", + "requires": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-endpoint": { + "version": "4.4.25", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz", + "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", + "requires": { + "@smithy/core": "^3.23.11", + "@smithy/middleware-serde": "^4.2.14", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-retry": { + "version": "4.4.42", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz", + "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", + "requires": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/service-error-classification": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-retry": "^4.2.12", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-serde": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz", + "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", + "requires": { + "@smithy/core": "^3.23.11", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/middleware-stack": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.12.tgz", + "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/node-config-provider": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz", + "integrity": "sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==", + "requires": { + "@smithy/property-provider": "^4.2.12", + "@smithy/shared-ini-file-loader": "^4.4.7", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/node-http-handler": { + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz", + "integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==", + "requires": { + "@smithy/abort-controller": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/property-provider": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.12.tgz", + "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/protocol-http": { + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.12.tgz", + "integrity": "sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-builder": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.12.tgz", + "integrity": "sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==", + "requires": { + "@smithy/types": "^4.13.1", + "@smithy/util-uri-escape": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/querystring-parser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.12.tgz", + "integrity": "sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/service-error-classification": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.12.tgz", + "integrity": "sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==", + "requires": { + "@smithy/types": "^4.13.1" + } + }, + "@smithy/shared-ini-file-loader": { + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.7.tgz", + "integrity": "sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/signature-v4": { + "version": "5.3.12", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.12.tgz", + "integrity": "sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==", + "requires": { + "@smithy/is-array-buffer": "^4.2.2", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-uri-escape": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/smithy-client": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz", + "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", + "requires": { + "@smithy/core": "^3.23.11", + "@smithy/middleware-endpoint": "^4.4.25", + "@smithy/middleware-stack": "^4.2.12", + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-stream": "^4.5.19", + "tslib": "^2.6.2" + } + }, + "@smithy/types": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/url-parser": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.12.tgz", + "integrity": "sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==", + "requires": { + "@smithy/querystring-parser": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-base64": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.2.tgz", + "integrity": "sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==", + "requires": { + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/util-body-length-browser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.2.tgz", + "integrity": "sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-body-length-node": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.3.tgz", + "integrity": "sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-buffer-from": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.2.tgz", + "integrity": "sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==", + "requires": { + "@smithy/is-array-buffer": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/util-config-provider": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz", + "integrity": "sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-browser": { + "version": "4.3.41", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz", + "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", + "requires": { + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-defaults-mode-node": { + "version": "4.2.44", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz", + "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", + "requires": { + "@smithy/config-resolver": "^4.4.11", + "@smithy/credential-provider-imds": "^4.2.12", + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/smithy-client": "^4.12.5", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-endpoints": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.3.3.tgz", + "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", + "requires": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-hex-encoding": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.2.tgz", + "integrity": "sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-middleware": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.12.tgz", + "integrity": "sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==", + "requires": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-retry": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.12.tgz", + "integrity": "sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==", + "requires": { + "@smithy/service-error-classification": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/util-stream": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz", + "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "requires": { + "@smithy/fetch-http-handler": "^5.3.15", + "@smithy/node-http-handler": "^4.4.16", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-hex-encoding": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/util-uri-escape": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.2.tgz", + "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", + "requires": { + "tslib": "^2.6.2" + } + }, + "@smithy/util-utf8": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.2.tgz", + "integrity": "sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==", + "requires": { + "@smithy/util-buffer-from": "^4.2.2", + "tslib": "^2.6.2" + } + }, + "@smithy/util-waiter": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.13.tgz", + "integrity": "sha512-2zdZ9DTHngRtcYxJK1GUDxruNr53kv5W2Lupe0LMU+Imr6ohQg8M2T14MNkj1Y0wS3FFwpgpGQyvuaMF7CiTmQ==", + "requires": { + "@smithy/abort-controller": "^4.2.12", + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + } + }, + "@smithy/uuid": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.2.tgz", + "integrity": "sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==", + "requires": { + "tslib": "^2.6.2" + } + }, "@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -7914,6 +10764,11 @@ "unpipe": "1.0.0" } }, + "bowser": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.14.1.tgz", + "integrity": "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==" + }, "brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -8539,6 +11394,23 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, + "fast-xml-builder": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz", + "integrity": "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==", + "requires": { + "path-expression-matcher": "^1.1.3" + } + }, + "fast-xml-parser": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "requires": { + "fast-xml-builder": "^1.0.0", + "strnum": "^2.1.2" + } + }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -9817,6 +12689,11 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, + "path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==" + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -10384,6 +13261,11 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strnum": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==" + }, "superagent": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", @@ -10569,9 +13451,7 @@ "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "optional": true + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "type-detect": { "version": "4.0.8", diff --git a/package.json b/package.json index df844668..31f03ed0 100755 --- a/package.json +++ b/package.json @@ -2,9 +2,9 @@ "type": "module", "scripts": { "start": "node ./src/main.js", - "dev": "nodemon --exec ts-node src/main.ts", - "test": "jest --config jest.config.cjs", - "test:coverage": "jest --config jest.config.cjs --coverage" + "dev": "npx nodemon --exec npx ts-node src/main.ts", + "test": "npx jest --config jest.config.cjs", + "test:coverage": "npx jest --config jest.config.cjs --coverage" }, "devDependencies": { "@types/bcrypt": "^6.0.0", @@ -23,6 +23,7 @@ "ts-jest": "^29.4.6" }, "dependencies": { + "@aws-sdk/client-s3": "^3.1008.0", "@prisma/client": "^5.16.2", "bcrypt": "^6.0.0", "cors": "^2.8.5", diff --git a/sk.pem b/sk.pem new file mode 100644 index 00000000..0a977376 --- /dev/null +++ b/sk.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAzowYMfUvnLsT0MBB+Kuh9cIFL4Zi8p5GzcZNC37QYVZ0SeRU +dcB0W/RSoUOyynA0piXZWxX5tYPAlN4zUE4FfRIk1SaI90iWRGEoNffqryXRnxvp +QAmWXtJSoSeSw8H4WRE+LP77fwUaxdmbgMvQEzrXxsNhHZ5mCqkNtUCTrdyq5YpU +RGHB7URDbuetwd40qGwo22O2H+WWG8bh7Jyyh9pQqqhgrdB4/igauPM3hyfYLP8g +9hmHuZxsKcA6Z7UsUuOh4Ngmhx9eAVKlY1j7kxEM/yRktjY54fkt6N15+cQXwN+5 +94tscSJ5kWAmEq4MEKG9YsrI4QrQSQMgpUka2wIDAQABAoIBAGIsOHvWXFEUonCA +UVsOySZ0l95k87b6ABFihdBG8GiznQZaHsLxPN1QHc5EzUBnYL7wEoW2xj++ZdTc +YGt1CirOau9dJ5DR0Yqi22f7dHLXePE1ZQJpDC35rginNJ0THyXGilT8xTE0jeso +aT8ooLfjKhhxWUGovjum6rsR/J+P/lavzlc+O7e7/4Blx2Tqs8w4bgtslgCPbRvF +oboQhaNuP1meOeVpQWe6uG0+fBzU2BIzrr5aiktEW3+XB5EyETQGF3U/Mu1s7cOX +VNMXI+5zfNG4EzXT4YSZMOv/FwqZxNG8UXf8nqiF469JhLQm/NaKph8Iz4TQd80Q +PrLpuAECgYEA8ZBGC3oW07SC2zmut1N4KG4CvzxJFegBMmsrqx6muz41HRuC7BX9 +mnFM+We/D/D46w/mC3rRPd1QcRb/rpYb5vlqRsGBfCKmb6ABIPXTOZuFiCngyReg +Ypmv3aczcUnU5n1y8CJC63ksB6Swlq5DIHgz10RubfvxUxE6IY+JygECgYEA2uQZ +fc5ZCqx4sqVgFVv0ul3IDWWeu0N33H0vwXdWgCOg30X9kVwuqTjIIM7WbAjFemCr +vWn7A8bGpAq6C1DJwW26z4xbahIouixZyA+ao+Qv/U2r11WdQlzkXSZDqITt9uau +Kc3NyGi6y36M+kQGDqRiBrcIXAg5hN1iK8hxTNsCgYA3jOT+uKnNL4K0JVSvZeuI +6JuLHLL17a9wx8J4DIltH8YZFn2KCxiRzqJT7G68nL6xV6ugUjMSFfXsu8w6etyZ +xhuRf+hmApXhr5ry2HUll0Ui5faCaAODCTKvN0cWM1NZWdn3rPlUqz3b2Byf2h0n +t1y8kUkP09NQNfL3Ssn2AQKBgQCtIjBbhuR9AdByFUZ7foGDC3yZxCAaJJJg7w/f +6cGclxG+qICZAh3SMZxx/sgxKXrxghc1OeeWpBooVGe1XZBHk8BoO69upbBbGYtm +J5l8OpgOtenO5+P8QrdKSmLHn2UNnoZxgFxdQSFGpfFiXn2gBTuX7hwJl2PPiMAG +u4OKcwKBgF5Q+ugJFqQS1WiCmlX4YIouJ1vCvpv9jZsN0IqsRoCNd+Og70UlcAfQ +oGEozvjENRmTIQ7V6iOCFbzLVjrrcJtvNufe9Ng73YMkA+1WykNarNSZ/Ti6IyAR +ViNtK362veDWFSSOchkhe/1uAZ2ZOeOlcIdGmhLw42ydkP347/rN +-----END RSA PRIVATE KEY----- \ No newline at end of file diff --git a/src/controllers/imagesController.ts b/src/controllers/imagesController.ts index 46c758dd..57912d1d 100755 --- a/src/controllers/imagesController.ts +++ b/src/controllers/imagesController.ts @@ -8,42 +8,71 @@ import type { Request, Response } from 'express'; type DestinationCallback = (error: Error | null, destination: string) => void; type FileNameCallback = (error: Error | null, filename: string) => void; +const IS_PRODUCTION = process.env.NODE_ENV === 'production'; -export const upload = multer({ - storage: multer.diskStorage({ - destination(req: Request, file: Express.Multer.File, cb: DestinationCallback) { - cb(null, PUBLIC_PATH); - }, - filename(req: Request, file: Express.Multer.File, cb: FileNameCallback) { - const ext = path.extname(file.originalname); - const filename = `${uuidv4()}${ext}`; - cb(null, filename); - }, - }), - - limits: { - fileSize: 5 * 1024 * 1024, // 5MB 제한 - }, - - fileFilter: (req: Request, file: Express.Multer.File, cb: FileFilterCallback) => { - const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; - - if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { - const err = new BadRequestError('Only png, jpeg, and jpg are allowed'); - return cb(err as any, false); - } - cb(null, true); - }, -}); +// ─── 파일 필터 (공통) ───────────────────────────────────────────── +const fileFilter = (req: Request, file: Express.Multer.File, cb: FileFilterCallback) => { + const ALLOWED_MIME_TYPES = ['image/png', 'image/jpeg', 'image/jpg']; + if (!ALLOWED_MIME_TYPES.includes(file.mimetype)) { + return cb(new BadRequestError('Only png, jpeg, and jpg are allowed') as any, false); + } + cb(null, true); +}; + +const limits = { fileSize: 5 * 1024 * 1024 }; // 5MB + +// ─── 환경에 따라 storage 분기 ───────────────────────────────────── +const storage = IS_PRODUCTION + ? multer.memoryStorage() // S3로 전송하기 위해 메모리에 저장 + : multer.diskStorage({ + destination(req: Request, file: Express.Multer.File, cb: DestinationCallback) { + cb(null, PUBLIC_PATH); + }, + filename(req: Request, file: Express.Multer.File, cb: FileNameCallback) { + const ext = path.extname(file.originalname); + cb(null, `${uuidv4()}${ext}`); + }, + }); +export const upload = multer({ storage, limits, fileFilter }); +// ─── 업로드 핸들러 ──────────────────────────────────────────────── export async function uploadImage(req: Request, res: Response) { if (!req.file) { throw new BadRequestError('파일이 업로드되지 않았습니다.'); } - const host = req.get('host'); - const url = `http://${host}/${STATIC_PATH}/${req.file.filename}`; - - return res.send({ url }); + if (IS_PRODUCTION) { + // ── S3 업로드 ────────────────────────────────────────────────── + const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3'); + + const s3 = new S3Client({ + region: process.env.AWS_REGION!, + credentials: { + accessKeyId: process.env.AWS_ACCESS_KEY_ID!, + secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!, + }, + }); + + const ext = path.extname(req.file.originalname); + const key = `uploads/${uuidv4()}${ext}`; + + await s3.send( + new PutObjectCommand({ + Bucket: process.env.AWS_S3_BUCKET_NAME!, + Key: key, + Body: req.file.buffer, + ContentType: req.file.mimetype, + }) + ); + + const url = `https://${process.env.AWS_S3_BUCKET_NAME}.s3.${process.env.AWS_REGION}.amazonaws.com/${key}`; + return res.send({ url }); + + } else { + // ── 로컬 디스크 저장 (개발 환경) ────────────────────────────── + const host = req.get('host'); + const url = `http://${host}${STATIC_PATH}/${req.file.filename}`; + return res.send({ url }); + } } \ No newline at end of file From eb5cba80f0b3ce27d1a8526ab436332c6eee278a Mon Sep 17 00:00:00 2001 From: ssk7594-CRz Date: Mon, 16 Mar 2026 07:35:53 +0000 Subject: [PATCH 4/5] remove pem file --- .gitignore | 1 + sk.pem | 27 --------------------------- 2 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 sk.pem diff --git a/.gitignore b/.gitignore index b0fc192f..9f0e1c15 100755 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node_modules/ public/* !public/.gitkeep +sk.pem diff --git a/sk.pem b/sk.pem deleted file mode 100644 index 0a977376..00000000 --- a/sk.pem +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAzowYMfUvnLsT0MBB+Kuh9cIFL4Zi8p5GzcZNC37QYVZ0SeRU -dcB0W/RSoUOyynA0piXZWxX5tYPAlN4zUE4FfRIk1SaI90iWRGEoNffqryXRnxvp -QAmWXtJSoSeSw8H4WRE+LP77fwUaxdmbgMvQEzrXxsNhHZ5mCqkNtUCTrdyq5YpU -RGHB7URDbuetwd40qGwo22O2H+WWG8bh7Jyyh9pQqqhgrdB4/igauPM3hyfYLP8g -9hmHuZxsKcA6Z7UsUuOh4Ngmhx9eAVKlY1j7kxEM/yRktjY54fkt6N15+cQXwN+5 -94tscSJ5kWAmEq4MEKG9YsrI4QrQSQMgpUka2wIDAQABAoIBAGIsOHvWXFEUonCA -UVsOySZ0l95k87b6ABFihdBG8GiznQZaHsLxPN1QHc5EzUBnYL7wEoW2xj++ZdTc -YGt1CirOau9dJ5DR0Yqi22f7dHLXePE1ZQJpDC35rginNJ0THyXGilT8xTE0jeso -aT8ooLfjKhhxWUGovjum6rsR/J+P/lavzlc+O7e7/4Blx2Tqs8w4bgtslgCPbRvF -oboQhaNuP1meOeVpQWe6uG0+fBzU2BIzrr5aiktEW3+XB5EyETQGF3U/Mu1s7cOX -VNMXI+5zfNG4EzXT4YSZMOv/FwqZxNG8UXf8nqiF469JhLQm/NaKph8Iz4TQd80Q -PrLpuAECgYEA8ZBGC3oW07SC2zmut1N4KG4CvzxJFegBMmsrqx6muz41HRuC7BX9 -mnFM+We/D/D46w/mC3rRPd1QcRb/rpYb5vlqRsGBfCKmb6ABIPXTOZuFiCngyReg -Ypmv3aczcUnU5n1y8CJC63ksB6Swlq5DIHgz10RubfvxUxE6IY+JygECgYEA2uQZ -fc5ZCqx4sqVgFVv0ul3IDWWeu0N33H0vwXdWgCOg30X9kVwuqTjIIM7WbAjFemCr -vWn7A8bGpAq6C1DJwW26z4xbahIouixZyA+ao+Qv/U2r11WdQlzkXSZDqITt9uau -Kc3NyGi6y36M+kQGDqRiBrcIXAg5hN1iK8hxTNsCgYA3jOT+uKnNL4K0JVSvZeuI -6JuLHLL17a9wx8J4DIltH8YZFn2KCxiRzqJT7G68nL6xV6ugUjMSFfXsu8w6etyZ -xhuRf+hmApXhr5ry2HUll0Ui5faCaAODCTKvN0cWM1NZWdn3rPlUqz3b2Byf2h0n -t1y8kUkP09NQNfL3Ssn2AQKBgQCtIjBbhuR9AdByFUZ7foGDC3yZxCAaJJJg7w/f -6cGclxG+qICZAh3SMZxx/sgxKXrxghc1OeeWpBooVGe1XZBHk8BoO69upbBbGYtm -J5l8OpgOtenO5+P8QrdKSmLHn2UNnoZxgFxdQSFGpfFiXn2gBTuX7hwJl2PPiMAG -u4OKcwKBgF5Q+ugJFqQS1WiCmlX4YIouJ1vCvpv9jZsN0IqsRoCNd+Og70UlcAfQ -oGEozvjENRmTIQ7V6iOCFbzLVjrrcJtvNufe9Ng73YMkA+1WykNarNSZ/Ti6IyAR -ViNtK362veDWFSSOchkhe/1uAZ2ZOeOlcIdGmhLw42ydkP347/rN ------END RSA PRIVATE KEY----- \ No newline at end of file From 634589a33ab020a0e3b27caedde80fd31d115a35 Mon Sep 17 00:00:00 2001 From: ssk7594-CRz Date: Tue, 17 Mar 2026 06:47:48 +0000 Subject: [PATCH 5/5] =?UTF-8?q?infra=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\353\260\224\354\232\264\353\223\234.png" | Bin 0 -> 165849 bytes ...3\353\260\224\354\232\264\353\223\234.png" | Bin 0 -> 138650 bytes infra/ec2/ecosystem.config.cjs | 18 ++++++++++++++++ infra/ec2/nginx.conf | 20 ++++++++++++++++++ infra/{ => ec2}/start.sh | 0 ...4\353\223\234\352\267\234\354\271\231.png" | Bin 0 -> 139164 bytes ...4\353\223\234\352\267\234\354\271\231.png" | Bin 0 -> 156237 bytes infra/ecosystem.config.js | 0 infra/nginx.conf | 0 infra/rds/db.png | Bin 0 -> 135735 bytes infra/s3/s3policy.png | Bin 0 -> 159911 bytes 11 files changed, 38 insertions(+) create mode 100644 "infra/ec2/E2C \354\235\270\353\260\224\354\232\264\353\223\234.png" create mode 100644 "infra/ec2/e2c \354\225\204\354\233\203\353\260\224\354\232\264\353\223\234.png" create mode 100644 infra/ec2/ecosystem.config.cjs create mode 100644 infra/ec2/nginx.conf rename infra/{ => ec2}/start.sh (100%) create mode 100644 "infra/ec2/\354\225\204\354\233\203\353\260\224\354\232\264\353\223\234\352\267\234\354\271\231.png" create mode 100644 "infra/ec2/\354\235\270\353\260\224\354\232\264\353\223\234\352\267\234\354\271\231.png" delete mode 100644 infra/ecosystem.config.js delete mode 100644 infra/nginx.conf create mode 100644 infra/rds/db.png create mode 100644 infra/s3/s3policy.png diff --git "a/infra/ec2/E2C \354\235\270\353\260\224\354\232\264\353\223\234.png" "b/infra/ec2/E2C \354\235\270\353\260\224\354\232\264\353\223\234.png" new file mode 100644 index 0000000000000000000000000000000000000000..06ffd3e5ad0a904ddff4232c8e6803559e84f45e GIT binary patch literal 165849 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 z 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�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 HJCFVco2}b# literal 0 HcmV?d00001 diff --git a/infra/ec2/ecosystem.config.cjs b/infra/ec2/ecosystem.config.cjs new file mode 100644 index 00000000..4dd5d5eb --- /dev/null +++ b/infra/ec2/ecosystem.config.cjs @@ -0,0 +1,18 @@ +module.exports = { + apps: [ + { + name: 'panda-market', + script: '/home/ubuntu/7-sprint-mission/dist/main.js', + instances: 1, + autorestart: true, + watch: false, + max_memory_restart: '500M', + env: { + NODE_ENV: 'development', + }, + env_production: { + NODE_ENV: 'production', + }, + }, + ], +}; \ No newline at end of file diff --git a/infra/ec2/nginx.conf b/infra/ec2/nginx.conf new file mode 100644 index 00000000..1b9a5b95 --- /dev/null +++ b/infra/ec2/nginx.conf @@ -0,0 +1,20 @@ +server { + listen 80; + server_name _; # EC2 퍼블릭 IP 또는 도메인으로 교체 가능 + + location / { + proxy_pass http://localhost:3000; + proxy_http_version 1.1; + + # WebSocket (Socket.io) 지원 + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection 'upgrade'; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_cache_bypass $http_upgrade; + } +} \ No newline at end of file diff --git a/infra/start.sh b/infra/ec2/start.sh similarity index 100% rename from infra/start.sh rename to infra/ec2/start.sh diff --git "a/infra/ec2/\354\225\204\354\233\203\353\260\224\354\232\264\353\223\234\352\267\234\354\271\231.png" "b/infra/ec2/\354\225\204\354\233\203\353\260\224\354\232\264\353\223\234\352\267\234\354\271\231.png" new file mode 100644 index 0000000000000000000000000000000000000000..736b775cf7c33d9378e80eda7acd9d65d5d86a6c GIT binary patch literal 139164 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

MpJ_ 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 Wg81EbBxMiaO>W9SJcmE5K#ww2h literal 0 HcmV?d00001

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�(Bsz!JQs`9W75U-{T1m^h$!AgR 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 literal 0 HcmV?d00001 diff --git "a/infra/ec2/\354\235\270\353\260\224\354\232\264\353\223\234\352\267\234\354\271\231.png" "b/infra/ec2/\354\235\270\353\260\224\354\232\264\353\223\234\352\267\234\354\271\231.png" new file mode 100644 index 0000000000000000000000000000000000000000..547c78e3e5ef64fe766165ea91a28c176291f21b GIT binary patch literal 156237 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%0DSLLxF|+u+kdV<6&HRh) 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 Ah5!Hn literal 0 HcmV?d00001 diff --git a/infra/ecosystem.config.js b/infra/ecosystem.config.js deleted file mode 100644 index e69de29b..00000000 diff --git a/infra/nginx.conf b/infra/nginx.conf deleted file mode 100644 index e69de29b..00000000 diff --git a/infra/rds/db.png b/infra/rds/db.png new file mode 100644 index 0000000000000000000000000000000000000000..adf91182fa4b69ba172846929aa1e765afe709c4 GIT binary patch literal 135735 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 literal 0 HcmV?d00001 diff --git a/infra/s3/s3policy.png b/infra/s3/s3policy.png new file mode 100644 index 0000000000000000000000000000000000000000..0c962e4ef0c533e26a5fbfc2f6562572c8343819 GIT binary patch literal 159911 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≷Kv-<1vM}i$ zTWdk3xZBVz$3&DbW2v~KeZ)mfdh!)>e1Xuy9ABqJ*Jn6AVB=vObsyT)BLn^Iwo0(( zs(yy!UbtjLu_$YmX_jP23y-(3Cx`KuGx_9?rVIHwO5H;yLU|0_`+2HC^rK znu4fG70!i0v>3P8k%r)q?mlwp*U9GBLomhW8nw3pxM73ynB3_y>gmy$S{C}I>&|nd zJrXy(JNnx{!P8KzqzpinG5Qfp(;fBBY$eWb869J}XI3QdsMc$)`y9mst(sUNjMvnr zWi{3&0}5tcnWNHvH1@~fLu$T5Tcs-x{9bu$&26S!Du+dRsz9HLQm97_j7>_dR$6v^ zggDh+wn%?R{W0RQre>Iua05i2fSJ2F%h0b??~i=_-~!?9j;4j37Z4Oy_zZ}xWd+9( zOR~i5)o|Hz*I~P#arXwp5)S zG9deAf3iW^Hon1qb5-@ph{-O>`J5=TTY~PXTLe9VMPr}`2LH{!CVlxrcA4}3ijJ_} z>*WbI&V37Z@M5=6A)I0eU7!*?B-S9Gg5X{=qzQhT2*NFugHFOjFDm=!hb*;eX}@fM zB+fc%8@EYGnZLxE;qnzrjN!|BYp$W}tNzyD*#^lP?|;|;jun>)I>7P4;#Sq6hPTaB zHE?>SYkYgMicK@6Q~zCaUc<@S5sAEOhRBJbsCmuqlDoB}_-FW`%pq zZOTl^%N0WW(pvQHv~Q{1>!`aC)h2Ohcb#!K6lts?2rK_ii|IvoN7;sO&rBu$$Eoun_SUtB>F$Mj zKOq<0+Nbc?t$3ms6OYa-o8jTtlTW7YA4Ue}6gRG|%d=R@Fw8UlN*sj%?T9J>D4iXQ zXG0+W`W1Lc71mQk2d@70oWQ96<-imcBn9_}9ZS+W)tUky^QU+kNID;&6N# z+5=+z)1IT}F((BAL(%WeUVf#YdPOsT?cM1FWiT3WbjcOnQ^Xcsp*Axh<@eg#o$Xvm z)Kqbs&CrPqL3uRAw5@@yL^I1@PNf_P;C0<_MGk)-b*CGsbgLO0wX`ttt89V>^f5R^ zraC5@*yEEyRcB05)*XtRP!R3Ogzeureo%~jg2A3dwJ`N$?=WmE_@mwbM&4^KGTnDF zpBxz;`piV1d=HgobmfXU`aT!8|MuX`OvFqwY?on!K7ST_=<5w=@H}9o7ZFWKx&`=$*&h~JaZ?h)oxvHfAGY#{ za!ChG^$B~3Bmf;bR7jiEy7ETtWUc21b?yN zMi#16q*HVAyU-2A=bbZoo;^nwW1cDw;v~$gA)uRTfuR=kU4M&hkmN`8A-j8j1b(-4 zXwnPPK|&0mQg5{xe5}V|X4WVN>@14dw5nJ*krgMgF=cQXxq11Bm#b(8kzfr~xJfUM;=<4|FbDo0ceg7bcyX)(w>$;RHBgl8ac;qkA8`7?q|yMN#zJ5;AjvQf|i3KwC|b(BpV?VX4`GV zWr+OTiUelMAh+={-BXhb&6+!ZydqjJVW!J?=dd-{xRXF-j)_CiK6A3F4|c*F$;$Ld zDY*#~)fEwFak@v62lbVcRm5&!)SeT)kJU*B)6n5g@EO>y2W*QcI$7-@o7lD7KJ=gljl*K;o*ltc&&`V6HGivnHCIWIWu=hy5Te9ZiGln$J#S4qGr_)1 zwC73m+5s0MA|Ho1z5C&#$k@-j*1F7^Z>E^KzP=T^6*rxFJ8d_x$SUu1YGHI*@*yjC z+XZLIMmlG~cv$!FgOJ#^Ni(np(q72cMZcUd8}PX9pqNr!CKk4EU5 z0KsImqjsGdx=%vRCm#iqQaHty{oD9MdA%$KD_9S zg3Kjt6?Wjn^bs(gi0Jr{@XZhAjNiL--7mf}ME_=CsPY*+l?-lHk5(VdM-x_HUlYbx z%kaDZJf|x|bV}dWjRHxc{xi0Z<`Nl#{wH-Vvf`M@O;)aWDcR*Z7#OH8*eA*%%_05d zUnPbh0V!2Qy>l_rp)M0tT zS^{^8Jyf1(_eBD&euOwrLo8U)yNH~wi=FhY^=5#u5>f1ow(Hn<@=U|e9Ilw5$qZ(b z;)|Bvj@ZKMa&oNsL-TxRV!$<1RkVZlclD;))Yu=>Z4t^x74`j1gNHS77%lg?U?4y? zt8!E!^-K;_xl$iD1G!9FPtMS2?F9WGG%ORLKYZrAyM-VoSV^nf_+Lq zMPW~arzwV`^qqBv!t>zCTVlZF#*jsw*}h!m;^~QnZyL}vQ%RB1tOc#A13G<=>f%ha zh5qlNJQf0n8!1jMQiSNgJ(cE*=pnH^O}_d-41Ym18x6ypVypK$`ry~E>E$8F(Zn&2 zciFRw_nXC``E%L!_Ln?McO3V2D#TEmQr&&kIZnWW&J`N1*cjg?w3B@t)QCmMC3BC* z6n43p8mJvi(~5y_&&ImfS8tE(^dxFvCDsevx~l$-ikzZ{3>xvK0cIXD0L><<)R@J9so_BI3EMDjS>L&r zl1)XkK`(<`d6UZl(G8{;2BPG#V@>weeO^NtmBYH2t1Nt=a| zLTI6US}=>Ubw|hH2EB%zyFUu)E|hnNxF=1ypDCb(FtA9desDhvD3P>S;zctOxNdZE z>|*KbA~cKa!S$ym0?9}~EcGnTiu)Sl6?^JEf7|DTc)UdHVfnfD>O0*1IzIl=+MJXk zh?7q4drB03iJ*C!AOSxt;jJO0rOIF3l0LVfw6zwkOG$E4x48H+V zC=t*nR{os?vAiEp{F;~f5ZfYLGWORdf`Y~Pb!|v_=ii0hLnLS)9-D9|#R0A(_2V_2 zk&U<#vg(#wuyb@@ zFJBPQs!hpQd6Of?_qr=?`28_f5|%b*vAY{xJnvt^360=S9k)ssRw_*$9FJXE2*($o zWOm#89X1jyqQD{?zVt9Nj5Ok7C%EW7)zHr0XHmjyI`(TlV9KYq4$-eiN#bZXUO9Gp zq0!<<>vq-0=i*)H|M;}%r^!zRB53!Hq{4P<>cEe2vG2?|xO<;zNha``4uR&%kYNH> zB|a$}x48~f*W;2n3<5)P)G6?t6TkiX&7q&I++`z0skOo|n9JladEsl!--ihswZD~^ zx#~>~+4ocS^LQy<%CxzfuCN}y%|r2Y;!*XWPXpybXK-Za8QEh;NB_t%{jcgk9$3WF zb3kw;TrA0?mo~^Lxyb?pA@?0qRQZ(z@zwjB%`J$+q3OA%=!=C1RKVMVj)(9OHMNM! zSRlP9HQm{bPkyE1s_MyC@N2pfVcA?RKr9bO5FYUQFftJRS)cv0-3H|muhMWMk8)Kp z_^VDad1sUuP7hsR;QEy)6l3(2wlw#4Y461}K`hdKcGa)R_nsH70uY#BS6;6tGtIxL z|E0+rP$gfa;({NI4}mzsTnSK(u_36(GWL12bQF$(YtZdb@Mubw)H~nh0;B&5)5-Q8 zwy80slF^32=laVz3T#(0!d9jEgHylH?WkKhJPCUrOht+KFg5*;b-_(7Ai8RRvGIJT z<@7^=XPrweVxhV}1Dg-fbK5Nw`a(BcF_}?uTEnA+{uvSjUl zg@V3y{7hxYA>6%7#{Gkw+hE0ub2cphVjkIS+rOoNH9! zGT>uvVaCPB0fr0=uCe(B&w@NDL683|?6$;Tf^^$YT@3E+Nhj@}grt3P6dUU|E?%iNJ&Dk%Sl9MHOK6IN);=z6$o1k+Oa6qo$+l>)Y==zXA_< zlIrIdAp&vTv;v7mT|y?hZv;~3or87Y%9tOy5E>d)BL+3^?!c;81@ln^rgav&>J)y( z*1n^YtZmpJL=kwI0J)ExqhnxJ+zJB-2Z;gZt@MwL z7yD3j_cRNkwK^_3_^+?@C0%0^>ERhgsNMGR=soy(xyT`HcLCjf_ zXi=y--wq)C4%_L=??Fm!K$KTx&3XmObg`-XkMZGK2~g)Yaw-SgUqZVQY0l7_ zKyoT6oFu@GW?LT|4WeK5>o2-W#CHXIyuqeFUt*oV2@N!y8=)-n=mXJ}?HE6?@)O2{ zCOt5r-)eR&&x_{-x3|B3fZ(j@%|W}Ax+9Es$uUeCpU5W@zN}VVPuXG5EzWj(RzK`~7e?iVR?Zut+ah9T$2afQ(Km zxRI|FW>=2d(|Q!4X%4o07Llkya?V?U$N8dbwxU*W(a{1fhJOc|GVD^iJ+I{fAVcu< zOq9$Naa#x-xAKd`Rwp9EP%NVTBPAf3wP4zG=-r4D=`FkGZUl+uGdMBn!ZK>61diXy zMn-u8={mrWAkwF_9E#*VqzqPz6b01O*wpo-psub1@a60s?jT+%L5W{EB{s~aZW6|k zut9CUrr3`s_*(AIg_?atf*5OQ-=9jRVKzn(!(f(E;}Z~! zl>2FFa}p1d4HOTrHwYT+?gSK7n;`V~ihfXi?PCKr+`5TLs_)`>J*;WNF)+tv3K{GD z*}9xRhd2)!{GD|(_)# z3Uw^qHuh!F;;V?XtZO8MPp97}+2mb*`wBJIoqWY7>!(*?3OZPIMy z1fvEKOkpWAg#_~VOS)!IiAX%@vvuuNaPloqD?5?#Py9+*K7j@IhJMuj)y1G#I$puw z%%vS=T+eeJUP_$#BzAoOES)K0W#Y>HHcGYcaycA~Y#DHtgM028Yza3;VV%S>+HySp z8D%SXAFv0SElyWbz`Zy?`R>%w3fF8KTbuQ?a>8Jofgrp}eNfdU9VlhG*zuAI=gQ^S zn-JA%brBbi^Ik({7cVOsKhv`lAIG#`CYF{4~TBWV$=O~XDE?OmiH1v)ay5m2$Cp2$fc+?@Q{}VQ(jR!E~ zt(+nLNii81?QK=|zy6kLD{Xr^6$vFcSjV`Vl~+O#5EtFPEeQI*9SFX)nBVO=v{}q zTO)Zl^M`ftaJEmN9amK5dV=b9Rj*aJOjxQpGQA5}9e;p<^V|&2EA@f|aVF!Mu?XA! z(^qu#t_$%6bwKc4?Z7O(fZ-de+Azgm94%8G0?bdB!F#hX*~BNAKPuz? zK#9Kyq2KtNgHXc1e;gV6TA!eBIjtO2T3#x=c=PMrIfqBQoeyGa+T|c>!VDc`D=>KJGD_adsZ4mCdLS#IcC_wsiCUqw zfuym5VZmcp%=4rZ6k=lz)1uA;+YVp%6|ijpR)%V28|dF-0fDCfu5q!@qc(^QfAUVOPzaKb-(-=NPa zOWGG=AKup{EmLvgT+&0@b1lw4uH+e&R$Vpwy;uBmm09^GN-#A#?$CwTu7(M$86&Hv zLKLDF5f9o~6SRINTvKh6;+di<`y-sC(f0;=tSu?6ZTyYt&Q$gZyVg{)Ty=!fF}6f2 zZDt|Q933$!DX3`9#D>9?dDDrqevWq?7x|nLvkm?}JqS2+>j8dw_^=Ox*r`by$m%6s z9W3927H0_|+CGY;BY1)k+SJtdfSQ9Y7$_~P7?vuu*nnoORN>x6-jW;_ani9+K&Grj!lGW2TnC7WF;OxyKKw!P27&ajh9_xIG76qw8O*xi&z#|!YS z^3C){;pdai@cUhb4Lp|O9I&lA#m(6l0yDgtheh;|gm?!d97 z0j_`67CN8*!D$&$)D)WU-_6W+(04sXPIbv6_@>2wp)EVLl0$M!npwa1&Tbfxinnsr z&dFuTIQMGBqNAYoC!W064Mp*uW7Qq;`g{Ti5R!@_>ns?u!g)gDDiP>av3l*E!Ky~I zcccoHW8Sc50+XM+4Q2wf2(BPp62dP7dxzE|k@}cKB_6S(rzE7ETcL#;x~i+Op}$XV zP^9Hhd=mo}V~Q1GAgL!^afY}o9QKv3tiHno>}um|e%witLF41sA*G~`EI2YQnP{!e zt{qq23^-?OJr3hJar0wpaaE*5TzNz2INX6c>&9_`OL{t3{{obO6Xma)Cp9gAte3afJHA>AQ=dpHtayDu%RI>^yT5)TU=upE((X?D}^ z1J(9KeetPM-!#k2Qm$ai&Tj|0lPRkhR8Qtd0sg3?MkNC+D$4AR_RbpL*K$YRj^noI zmrc=%sy}m>V<_Gh{qj;RWUD!z%uWlXBvi#~B3?Uat5ZDo?2EJ&tFWb7;DY;7w|unM z`nUk3TaDz8g95Dab>H^@a%K|7-!Gigy6aRi8CeaH8MS~@!@h|3>_Dz;%#;qaQaN7C zy}c8l-7<=7p+zB^=FKjI&S#p6O4fpsv*!@!y7_8}LU$iZ7%>5{+?c>q6j`Ouuvz;k zU|!uYlPv{!B;u2NbV!Mrol^ES_}OT zD`F=J%|`}m30OgCag>sWJ#a+FLVkgLfgEIIKXW=1Un8|J_f7_V3*m7rjIOsv*z6Um z$ZMOAn`dbei955{irae_KM$D(M8AuCF(5<49@>~}rQ~i6)PBYwQ_$K*)g)cdhyONb zy8ciioCe-uM~k9jl)DlOUuwY@R2Xo!DYj3UvcZ4;1VGF6U>nh1MYkbT4x^dR7Y4|R zuiFthbFbhyLo(8eG@*s=&*Z^nh}}!3f$x3azFqB^UHPW$;0=0B5>rbr*;$gy7t3aJfA^wkA$DrkPY!eK-Rrx)0KE-F8p>ISfFsoOY?F z-crOZ#$?JW5uWDdU9w}N?60YThba>xQK-nG@gpIZm^!};I-^sER%4p&KwP-0^$kW zCnG2RRkaemH9#uWVyt_{t-4gDW@ zN;1Pj`_G}n7)MjauG#oIzWpHz;fZ~Hemx6qwm(>J^eOg3ELJ@(F#(q9S(3*iYG#xO z!*eOrxh=#xE0JZ}R$%ePr;p=!Y86R{4{)%a8x(HZZs<$zyv6sNR{0QlJw23pZcI91 zY=O;FFkL!}Q!!D($Z@&!GEzO07RA(%PS|F}spWMQIR`+$7~6tGy7HWHJYEGMp(xjD zILev0uM@XGCF{v#%BW#JE=fz ziA6E_S%j%?*pj3>t$<^kAISkhdw_yO8=GESq6m`!DnS)uC7;a~q}6eLKa_7G=Tl$K zJuP^G17LIm3^}SZueuXSaI@#~U*AvCUPpevs)YDu1SP<`6hS(xOOdv$>H&)tgXJUZWn&0Mv^tpr&Qi)8J$;^;5nu}uO|n5|LA zTPeAI8WWvz*kreu@?{HAlcNo}_afeQ8-DOQr1mWr0(}dHR~=7=rx6J>VK{&Tg&R7S zD0Ug`&na}AouFQ*&pUhor!8ONGpF4m-YoSQ2EU!!d$C9(IY#k*|3G_? zWx}w>LoFx^fz=@(AlWAbr=gGt=PX=vobSOb}F&AO6 zae&S3Kbv52M@rHIh5eR}w!m7Rz^S{t_7-H^J2!C<#%SkSjA+ivyzYIVLBF<}QA0C* zU}1*h(7DhN=+1_5ewEnG68o0@4PNT5u*Rf7yS#*OvfTJ>@LfaQ6zQB95hekT^Az+HsAx zRb&g4A{pY0SAL-Q`1fl3c|(U0M_L%MJz}r7kIrn_is7{m-i-!*N<``!*Ov-qXMBjvdd}W2{Yunn`f)c`ZzEyo>-v)x+K6{~M+E(!pG7*nzvf*<) zoszN{kB{jXNE(-dRHYeyjEW_1h}8W9hM-*wQMw;HBDO>R`6krso3SGU4Q!}%FL5EN z&U}b#V931CJ8IW}^`fa3job61?Fu?XL7DeNHzB|ZQ)Hd#uv#JfWzt#m0hGJ~v8O$P z!C4;A$|pt*3^kBM(~Vt`L9SmRIap?S zZufX08t2wJ^V+D z!g>0O{wta27Jq%($OEFtvm5*C|z;vW5=1T!qX= zMAMmifXM;Nxf>B%yKA9Nk!(|8Bg@Ra_OqWl0yYK^ReWr)M8J#v!Ndk^My3Gis^_Yxv-E5iVS*Ig_^)0pSwuY9(&96$yS^H)U$vFF;07mOa zE4+!ReP0Z0!Sb#dv@oWxM84n+oo9rmb5r1%>f4AKUS51+`5|W4b{VC(bDUJ|bN|bj z7jwMYO@cn=oh7mrKF@qsD`;GWy&FxFS5=(N-hI@tIxArxKe2-_bwIe8!>xcX4#2lF zhu(W^AJxQ^qvgDZmU3HNGA2JrUE^~?@`mTN>E7?WqKz9vQ>EyvlM6`*N}xjktl-_3 zNCUNJAFTC}jEm?K{J&kJ$DZ#5_h+M?esKb$p9QZF>q80+73kU%7J@Ek!?%WsUOXG< zg?DbTq06+J%7(1Yol~cbvVY`5$Wo=#DqBCpI-s$ILmq_yV+vTDba$xSy$nAh} zkN>vGT!o*Xx8)9SERp_3_i@5xZVOoG=v8Te3XDXjhf~hxEZ_mCJ~WF>T}#E#LJvl< zJGo`xP<#sArIy4u{1mE}ts{Gry(_2pz78`A@2M>~uFDN{#+N2UT|@#W?Z3b-CWdb* zHJq05OoPXbY;RK41X$D#^&zv>^5-%=cBhwje;$;~nCu!HJ3oa#LwFD!DUWKO{(~;M zAAGbr^3|lWAKh0{7&X|+US<_g$z+7Jgdf>_&Vlm*K$A+ z6mIXbzeT+%W2u32{zKB>|jBERA3@(yp3Su<5tS*8o)MeVIdi7A%#1T#(3HXz5xBWq|!V$)h}sAE4O$8ARLdQ2(&I*=kCDuTu_R zcbMVRaK$E1Eb{wz(^UK~GrM47GuM8>@K(C}RL)gRf+hDW*^@-CKA~Q47-`#Js;RTh zcEQr!-$QN2VFz?BNsjknjhrbc_-?@zt)FaHn*SpU_)$*Fk!IjvTJ!< zcH;g)yOl?!Pk#K>O`Iq+qFkWMRPeZ^V;tZ~R_nNFBSO!9Qj_8k%DsuJ6OMKFe22r0 z*viSF$u=lf_d*ml_HoTOqY-W#4;~#vuejhMm6w#R!yfHZ+8iCJrt6auSUgX<1UUw_ zbuo#5)u5eb_4>1RLW4n7`OKuY1QJii`8{$JaqiYVCbp9UR=--CCPMwwTfjm&R9AWV zECP-R^R0hOjjCc+AvDw{hWqt3XLfTNOjQZi*)HwNo(?!~Cu%3ZP35saOB~8T{$NVePTJT8DeMC zqt*7t%C^j2-qZ3gYI7E*YmMMS)nq`^(Y)uj5hB4xIOj-w+#-RciVBJvPbEs?`uZ(6 za=n8YVYqujqk%z!q~pfe-2yL@8=4#4>-=*8-9ICV^@qRqjz^2r*=KUF{dQ9PMw0L~ zaq*KBPhvxIaGVMP5k_A^e7!)_ORbYT!jcw1@gv;uA26sl0w=StrDtyJ zsP}*-&k5<;MK3vV!3Fx!ZLTpPRQt)(IEPN!4C?indVk)8Y>V_tb zp>IH-w`;MlU*s7iE$arE~aY zoaU~>7_33Dc6(wDZL6`nVX|l7rA0Yai9*M{~GzrIF8>vGIWlf2nh6 zBMjy+jLn;`Ca2fHHc?s+aye~&beAbJZx@TxW@YVCQ<8c8r3C+3UqNZ^&To&{%nj$C z_QB4_D=8V84-TRm1|fEbr2Ojc-n`Bx4%9OO^LqNAV?56eOZUwbhFW6FP^YW8|Fb9c zx1W85GhNi>fB44i|Di7XMV^V{S1{h-StP%UV0%|!@Xt(c=Pgp&zoER{+=}4q>?bA` z&eeA@7^UpGj@6x($TKaX5t;FqNIqDk@zAFGJ6-VyMd|06ZHAD2o4{OaIW%DV-zbTA zCO$5AB4R75J_PKW(B{sMZ>agj^&Zm}DnA#G3W|2RlIs~!A4S=3!JM4zSsAs^cCL5S_UjM1`I4Rmn(SH-<_JF>eqWI(lg-+&o@0swY#l!!XJ$=1cF%M|Cg%$*9z8d z?(oQ0*j+1;AWe~H>UKO4FKC(d_MVuQC;XEHuOKGK&Iy^5K^iF4_V=#&Hvt3KHqZ39 zlvP?VF~~dnu=%j_)0HFOBJMNZ$aweP2HeQ4i@`w9uTU6Gj{ZvRGUFpI$km2Cf%(wN zMiDAcR75efQvdY_%XPVw7j)=wgYXg-?~b6<*6m4S7nYjw8qbndT(YsLTP9{+R8muo!^6_;O0Brm2w z8EITCO%9lH*mm1{5CwcS@ZGN0U)~BWNeYz{XWw!oWRmM(BY+A8|KY&@&%gFuUrAVE z<{eI!w^3LI8V5re3+mYuGKy?=A!w?B7`Gx+NTAI;oV1@_+noC^()=@91xCqd!QH*W zdx39BxzBF+i%7!zZ^OdIy}0@oC_RZ~grBPq+fyT6eci@A$I~l6OC`=uR8zP7X@AEf zoB!K)KpekD$JIH+{dLS4t-9x3+VEI?sl=S-epV0<>w3u8o!V>rnb)|;apDXVyL}EQ z|CKOkwQA?Dk@@d#YZoc%914d3syLVI)x>!6%~(?rTAvit`*|9_G~4OHX7w`A{MU!x zcoymVaQG%To-Q_9t0N&Z-h$1x1Fko*QJK{Rc1KZvyFAgCf$cNuacDjpV`h0kdTA!s zK9QLvPNNVmT~MP71T`HWyK&#nr#}qV&p58V1VxbrUdH_2@0mm_0^}@X_5>^VzPV$3 zU}r?UiKNg}7YRG_^%OV~cW$978ekcS#AD6`t9KDSvFkVY_w)9zzW=_vzo!RNJ%{oF zE+LSJn9w2=Wa0AUB7VhtJb<@@KyzsIY`l4|CE*0g`Uz#j3BbmL#wBDwzL zTmSuG;P(Iji~rRiSx9=J7Z`-`j$r1zW{{^RK}^G~z-gp?gY$N8nxr-djwO0=ox!%vH`O7*-L5$`?seQM|JWVT``t%nM-Qem0E4=dz`FgRG1zi;*)z9 z!x;ZHJU<#9-c1yMr6G&zT!ca{VzVNeB~J&%cvayTHN`D+qZNvq00*U;f(7`!yR^19dV`FtT753 z5M(4=Nq-Oj1p2w1>Wycm1B-0P652s?J-_&(x9%*9KGWA;9JoEF?GxPt0lYq)y~c=4 z+qiE{HN-MUvgXhyL@9*+D!#+0Jci`)zd(=W1HwQCW7uu@?vB7;B|gdWsqra`7(TV4gUL4Pt zqL)i{7kiaga2{a&$A1T)i5CnebrIF06>hKckP+>9>hj;~J>Ki7iksRn+@+$HAxt@*6xY7={kuRx5t(Z8G7M zdUU#5oz(Lwwr~=9bnAn#4AMVY6R#4l3!RRt>`17;Q(M5V%s18dlW%-t0)XeHw3Ub) zVqmxQfhZiK=O%@d2TzDhB7vlOf)U!6xNeW3d({Sr+F>9Mh@!h0TGLTt&t!pE(@&af&&W>UPtCM~y`lCvf`}xfG6$7cn zpL!isZ`Wv%*l)sWSu!z0!*2dP(6(8DZT|S!r{EtZZSpQ@ zU8-3KeJeHZO!MYcd)>|)YQsvHUv3(j1D#hudX%cR!2K^(?lkGZ0UzNUMKFG~uQWG( zw8SKkCUZM3*9;MCjd?_rAW(e;!!7u3AHe*vjP;&^QP13`s;iQ`cU<1Gz_j!v>yPVR$oe*e=?x?Is~ z#GbaSF|<{w`>VneDE7Ep_(urP2OT3Buq>j4@+@Ocpm& zb)IFz8*8v9($!(;k(VUXIt!ZCq~Wcc41E(K)e6s{Vfy#}y^Z}R6dd=P2BbGBwotAS z%$ax~E9}0o2AC<~WnW{@s!A6llu(THL=>DATx_K^vYdmH9;nkU5FPdbUfl}RQA3Qy z?oY%g1iZ>-V5J=ULje>S-25mx*h8P&G?IuaMPhg-IcacGe zD6HNA?s-rKL|!QI=k&M)Z#obtO~%%TI9v8tcu_6A*&LWg(<*{v<>BdkE_KVP1GbR^ zf5M+S$FtE>0b_#Wo{$!ET=5%<~$Y|jM$Uc`+FS+l}GWo)G6nOIVk)0+o$_%efIN(DlPnw7bF$53V^ zsCmC$4nD-6wtmPVPVOf&%E8uWz}DJ!{lV%yIe_^mPSEYR2I7Yab(YUYn3mvsUyTD2-e91WRCs*R zskC<{${L|Llb=$%Z&7LW((IZTle_5Md$Qi9;*%P;?qGISDy#n0T|zHrH3C#<@Auli z>B8}F_l#4_sB?0G)06u3u|9lGSs|PXv_Cb)NNdpF8Dr+i@+6mulT!j?g(E?H@#Rfq zm+YsOBv1+Teskti5Ib1Lp8W4eVh~cg&g^w5`;N5lDDwVWLoLfOj&*mrGje5JFT% zRt(I~RMci8drAC;W*~XAg1Ks8exFqEyMR9*bB>-ZA1>~PuNVer_TzWU&>Z1E{^P;b zffv0LphUm7nM1Ifr|tnrueT&WhULTue!dfo@70^Gi?{}Ch?!c3!=C%Y9pL7 zKwfY0M<)!7Ol0a@C(*i#_yu)=v-_hHP=1G|=SAYLc^;^iqA0j-iQ;ty^hh2lH#^U-HdC72ssUe zRao%u|^@~dI1+<;Ig0FduPTV=+=9%xE4q#O0^=GG}pL;O+swi@kBLhhF5Bu;= zuXE^^4}PNK3VgaIGnk@t<*P;AC^PZvEn}D<6-MFZj85d`pSYyQkpYpmDbfyE?|_uZGS!226*{0;)13lt&s{a!qg#3P;cnV3pEPV8?{*C-yH>dQdT~rxD@;)&&A6|fuACU?trg*OF0@cAj#R2$biGs z&HAIHX9M*vN4^kg+nau2$t`gQUPMy}S{AX;vIA*8=S+6>l^MXbbNOeiqs|K)(W9il zoG*=<6a=otzn!nT#l(jC;RdNcJwIdWUFs4)I->(%cGMGZAV!D9@|s)Y77x(hwJ(^j zUyy4r@C}AI@FP&dzBHjt7)cuLqGabSj|%tb-x!tHed%x@8bEv9^0AI->JhbwSvlqH z71sQ@28aZgpEPT+jn$F%hVKMQWrTJsuL}D~tuP@PFXm>~<0tDK^|i4RvzY#&3kVp;1w^gi&SX5KZD^dd=`~keB6nOTP3^=%DJ{CzHw1TbDR%X6B6s!kb+t%aZl8r?T)99356!Cr zqf`}wIOHt`M3jqzwlBuqUfrrnLgdi0Zskuz9+cC;c`zdg2Sx9c&EPEzA|TB*z2gDa zXJw-$>k)Tx0-FWX@78@t)d^orN>-ljZ;w~CA+$EDSRm40kF;a5rwhXI5k_c7qu@V3g5rRELped*`=c zlD=g{h+IoqcwmnqQ9LuT}M7#EO#^!X(UnsSmjWqnAA(W$?!WCL3 z7-M0toms;jg;eqK{SKM_a6Y`3(6?h()nd4Uwt)`CIlmR3%IdnM z=E!5Aq!-JJ!S?7KT_rWqU?pam6Pz94Yomiy^>7rfukl*|Hd2k(e=^{+ z#sgH&dEzH8rp6#K@YnVDc6a~|va{91%J$ON@tlUm#hoiZxv@+DzOb=Y@d`e^etP&h4DXr?!${D0^Ld#%>e$`(XT`Me#5!F z#nAB#s|BHfGcOi3&A}=>5ahBVD_$P)O|Xx@s>~)v>B;UbmD0vd~vN%J|7| z=@6|b0wAdOHd<=Bx6hOj11VxNZK7&T43D%btLPk~G0)fxSx0E@ipzZ>`23zufWL1{S*i?<9dqhG?-;m2&P*mO3r7m0b)2iLklSF_D` zX1*w#s@$iC3tF>kynv+^D4fsXY4Gf!%jJ^E@bW5hqpL`FZOb}ivZ}Ia#{xz=OGioU zpoUdWP%6)-*$|ui=8klj0}fWbT}Gsj^8PwLF90mo(RtW@B`%K(uP8;~&9b#DCo=Xa z>9Vm*U&TybqmoGRa-)EM2)4U1)G`xvj%V%jsgFr#qGuo|xm~()l3J^CP;S2Al-SEY zL$5DG*X_$GeUg4jfu0r-nwkrd016)|;US9_8^*gQPZ+?{;qrHGF0i3<@O4e3wZ$sW zfxtDZ6XQ|zBCv828`2zU4qHOsMN(XgHt9>dY3~?9a|2QO)Eh3`F`v z2Oi9)J@>=??@iEi^z#xBwOgDNW^;6uTbNGHoT_PaixJaqsS$*AkUXF!I3!0l>B^Tz zbZzvpOeGO|bJ&+X!Kas@mLl80o7KKMi-s)Mk3&LZX_z`EG^?L>R{y-UW1o3V!Jdmh zH~u0@fuPi!K-1?Cr<|9q+pHuW^NEr}{v-ucdi}PqACowq4At+e^|M5rf73OdA_pSL zf9c4-9;cu9{r^{Qg3+5)Jf6vXQm)*UP^6Sl=*&A41wMt{u;3}T|Ks}O8Q~{K*v2?@ zS3aN8pwIU#OCApouXews44Hu?v<5VZv=`A+ADS{V4K9s%xB>%mLoy@pZ#aGs3f)I% z9%U6D&J&+eVyK<6KNV2`B;)V2Y>Kw97o8*fi4y~dHfVRNu;U0WcZFVW8>Sdo;t)2^ zNw5D%y9;uIpGA7L;87tC{78|VUj5Fb?(5I$cTb`=G~QxAp=aaB0q>l9T-j zR?v@q93`uW1U;yx(Dskn(|$$<3ugaSfdMg&MA$cmR2dG?HYT+mnss>M4Wt09Idvw! z69oEdbtQb`xf+<_fpkfLjm79Nq=X}uaKOe*Hao1wI7i$C?Lh`N!z^fT-X**Ea098F zBk(@iHX<__%RYU|jdtX}a(KA)SB3T90B$aKxIy7SSVd9eix-Uz+xiQT#W6x}C?AS0 zCkhYIIS0m3Xh$>@&u^)*z@CNb)#0r|*9p>3aJ z`maShSakjG45b4#Bf&OsJ2xCa@PPvr^H#n$LqWO9)RgdGf#a1oNpi>vLLWQ;1LDaF zw5jHl{-N!yN$1eM{B3DEZ?w+zU@a2Edh8Fxbv0*CQgB?uKV|Zs$2p(m@L`8c>!QsJ zmBn^QV)(*Sgp1gW{Cli0z`HL>Y^HsS;+T3(=z>uIw^dGhY-gQX&;O~M`;Y&VK6P+c z>uTR+M*?73Kh_Ee4Ig+&Ke;Xg_!0)4-!L8O*el%Gs2=q-{ZdJzuh=kK*b+kWiMoCH z6FvII)s3bU+=AqCu!OD-^&0jB{;-<3^0^3VY2jYtm!;Nyz%jFPt7 zPgHNFc(f&Q)&E;=2_~X`AHv6=UVnv3`h>5o@+>^y;UW>>Cd?A9_Y7cXJJyLWAd3m$ zfoMM43r7TEtJ*|KXlk+X{Z6TBL*(R)XK}#~TOXrbJ06oqV8OYk8S!)Nt9f@TKm^6B zA*ND*gaK0M>^Gnp-T8qYDwj*o?^mVZt&!G3Rr^?5w;OmGvv61L#!!HaPgN6HyAdOr z+7^tFkGxK+3PH10|3C)npv4EQ!7@E|UEe0^^UO(1g8j5!C%bbvBTu3-}6`4y} zghdvY`+wKKqdU({xbvJXF=ulhZ7%NiGzi;M#gLeX(+H-ru$N^fG@6v zF~z+N=tf^{<*w{kG(sytcBJhjfZ9W3P~f){;E~p_9v{+m-K&BIQot$|-l>DQkm(Kj zni~1j;eF;g8^r49^HnM0-JK9&PqBYuQ_gCL!Ojc{;IB%q?|=r6#f7`UX5Xt>(RqoAb0RQtpsf)zVUjD9p<~xo=r4ZvP;$kg+T+E5z7h5DQ3L0{pL$HR8IJU70fPI z-nF=0=jyLSuu zy{4|ufEfv_IH{@`%i?G~mS|jc&H3rPkyE}B>Ia1#g!pof-DOV>BB+h@CCdiR_ZD}d2h|q{e4HX9I z!5?K*)MD_ab&+T%tOSq6v$yUNw5e65QyB5b5n{KRK#S1@|1f8v`B%Y(=&4oIo0RRf zI(Sie6o>OvU~!P9@!?RX#f(U~xD+$m8yHEI9z{*8;SH`@~V1;&C21BGD+Ab@ri1k?fmUOR7h`vN2D656n?!0VtYyk7JAtd>AJ`1eLvq3=;4z= zDLI9tn^(;jAq7PdBj{=F!QmmC=A`m zQ$0h23kgD6xa)IznY6`ob+33RKvH66eIyB{q)(|b+&K{{B=x!pN!38R>t@k-tVm6f zl8XNpB=rKC8kZt^Bx%2R5LJ4&L{eWU+E*JnuJ&KYAJH8^^%P%nDH+lIj~05QnNFC1F*=Q%`3)Zs$)}W9{5aHg%|VN1+c&DK5#mYp#tms38MsRUW`2}DQLI2B%#0j zNn&YQ-^ow5Tq(mj@;+bQ{S^AT$0LL$+ zex0zmU$WEO1KTUj?(o6TSAHqNkzMx}Hb_r#9HhL?Ae4{n`uYp95H;Rn-}w0Rs@O6VRA}f_z&j z%4Q#KrL$hcPIXSz%Onab-}DRmNI5-vAHG_L?m_6+_4u9YNmAR}>#7f>qrFJ1ye!gq z&*B!zP5AtOyuDsWMtqK#JND8r32Qbc*S}dR}b4JA9xt|+1*q9Gdm)Sudvn5mjfbQo~SDG zBKWsiRBXs5)Odf?@_u}Gn~cYpRn6*~m?027+!-BW*sdJGlY!%xkGCdxP8EQK?mOdD>Bhb|hO z$FL$yDL)ugm3S=C@9u>RA&CyJSMx;F3|2^5|Hxe_YeE`G{;u=I`heW}97;#La{oJy zzfF6nUJ91s&~Y81#=nHL(H++?ZH5g)kugxYr;x67$2^--WX0 zWo#BzO1fI(!3=;L})w zk%=)0VxV<*3W_#M9M&I}M+*PHR874_Z7F40uZlm&ViEho3EvRi2n>20 z{tEYeQN_uC47B~B)m%pPh*_a#$19+m(sL+OSRk9J^c_K=I}?Q>L6f^ith~;>erkST z`_h1rVG2-b300Pzot=}hU#;>L=V@&9ZQx{oOjNnXdW?CId*m=~3OuYNXN>>Waa6Kj z^0#CIK-A$mu;r)ip!1)UYi&oJuFGcKiiVJX8ic0MfM8w#!@DZVr(s`Vto|~bonBo@ z`U9C8=V^BrPX*idq|B(f{Oa9(aobVP)PeL+j(bH3huV)RZ`!;pKx-@AZt76p%ed*T z{VxaK`hBqC{a#`Jw>8zxuxQYdJAmH7{{FW)SSk}}{P/foa@OJ6>HCz?>SQ}*c_ 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