diff --git a/.npm-packages/package.json b/.npm-packages/package.json index 09884952..d12e3be4 100644 --- a/.npm-packages/package.json +++ b/.npm-packages/package.json @@ -3,8 +3,8 @@ "dependencies": { "@commitlint/cli": "19.7.1", "@commitlint/config-conventional": "19.2.2", - "@duplojs/utils": "1.9.2", "@duplojs/eslint": "0.5.0", + "@duplojs/utils": "1.9.9", "@vitest/coverage-v8": "3.1.1", "concurrently": "9.1.2", "eslint": "9.23.0", @@ -13,9 +13,9 @@ "husky": "9.1.7", "jiti": "2.4.2", "tsx": "4.19.3", - "typescript-eslint": "8.26.1", + "typescript-eslint": "^8.61.1", "vitest": "3.1.1", "vue-eslint-parser": "10.1.1", "zod": "3.24.2" } -} \ No newline at end of file +} diff --git a/.vscode/settings.json b/.vscode/settings.json index c5eb20a1..36aa077f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -58,5 +58,5 @@ "GLITCHTIP", "pubmed", "uuidv" -], + ], } diff --git a/e2e/package.json b/e2e/package.json index 27b4fe27..ce36649e 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -5,7 +5,7 @@ "test": "playwright test" }, "devDependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@duplojs/server-utils": "0.4.1", "@duplojs/playwright": "0.2.0", "playwright": "1.60.0", diff --git a/libs/async-message/package.json b/libs/async-message/package.json index 2d5a00a5..daec69b0 100644 --- a/libs/async-message/package.json +++ b/libs/async-message/package.json @@ -6,8 +6,13 @@ "zod": "3.24.2" }, "devDependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@types/node": "22.15.0", "typescript": "5.9.3" + }, + "exports": { + ".": { + "import": "./scripts/index.ts" + } } } diff --git a/libs/async-message/scripts/index.ts b/libs/async-message/scripts/index.ts index c52d3463..c891d4f1 100644 --- a/libs/async-message/scripts/index.ts +++ b/libs/async-message/scripts/index.ts @@ -1,4 +1,4 @@ -import "@vendors/backend-logger"; +import "../vendors/backend-logger"; export * from "./messageCollection"; export * from "./asyncMessage"; export * from "./extractIdFromMongoUrl"; diff --git a/libs/backend-logger/package.json b/libs/backend-logger/package.json index 7a306a78..6c8d4979 100644 --- a/libs/backend-logger/package.json +++ b/libs/backend-logger/package.json @@ -1,4 +1,9 @@ { "name": "@lib/logger", - "type": "module" + "type": "module", + "exports": { + ".": { + "import": "./scripts/index.ts" + } + } } diff --git a/libs/backend-logger/scripts/index.ts b/libs/backend-logger/scripts/index.ts index 7710f306..0f0068c2 100644 --- a/libs/backend-logger/scripts/index.ts +++ b/libs/backend-logger/scripts/index.ts @@ -1,5 +1,14 @@ -import { forwardLogger, logger } from "./logger"; -export * from "./logger"; +export function logger(...args: any[]) { + console.dir( + args[1] + ? args + : args[0], + { + depth: 10, + colors: true, + }, + ); +} process.on( "uncaughtException", @@ -8,11 +17,3 @@ process.on( process.exit(process.exitCode); }, ); - -declare global { - // eslint-disable-next-line @typescript-eslint/consistent-type-imports - const forwardLogger: typeof import("./logger").forwardLogger; -} - -// @ts-expect-error global error -global.forwardLogger = forwardLogger; diff --git a/libs/backend-logger/scripts/logger.ts b/libs/backend-logger/scripts/logger.ts deleted file mode 100644 index 92333e61..00000000 --- a/libs/backend-logger/scripts/logger.ts +++ /dev/null @@ -1,20 +0,0 @@ -export function logger(...args: any[]) { - console.dir( - args[1] - ? args - : args[0], - { - depth: 10, - colors: true, - }, - ); -} - -export function forwardLogger< - GenericValue extends unknown, ->( - value: GenericValue, -): GenericValue { - logger(value); - return value; -} diff --git a/libs/clean/package.json b/libs/clean/package.json index 99e34b71..80c48073 100644 --- a/libs/clean/package.json +++ b/libs/clean/package.json @@ -8,7 +8,7 @@ "test:types": "tsc" }, "dependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "zod": "3.24.2" } } diff --git a/libs/clients-type/package.json b/libs/clients-type/package.json index 9a1c8119..ca1b74ba 100644 --- a/libs/clients-type/package.json +++ b/libs/clients-type/package.json @@ -1,3 +1,28 @@ { - "name": "@lib/clients-type" + "name": "@lib/clients-type", + "type": "module", + "exports": { + "./abys": "./types/abys/duplojsTypesCodegen.d.ts", + "./abys/*": "./types/abys/*.d.ts", + "./beacon": "./types/beacon/duplojsTypesCodegen.d.ts", + "./beacon/*": "./types/beacon/*.d.ts", + "./bottle": "./types/bottle/duplojsTypesCodegen.d.ts", + "./bottle/*": "./types/bottle/*.d.ts", + "./bridge": "./types/bridge/duplojsTypesCodegen.d.ts", + "./bridge/*": "./types/bridge/*.d.ts", + "./coral": "./types/coral/duplojsTypesCodegen.d.ts", + "./coral/*": "./types/coral/*.d.ts", + "./harbor": "./types/harbor/duplojsTypesCodegen.d.ts", + "./harbor/*": "./types/harbor/*.d.ts", + "./horizon": "./types/horizon/duplojsTypesCodegen.d.ts", + "./horizon/*": "./types/horizon/*.d.ts", + "./marine-snow": "./types/marine-snow/duplojsTypesCodegen.d.ts", + "./marine-snow/*": "./types/marine-snow/*.d.ts", + "./rosetta": "./types/rosetta/duplojsTypesCodegen.d.ts", + "./rosetta/*": "./types/rosetta/*.d.ts", + "./school": "./types/school/duplojsTypesCodegen.d.ts", + "./school/*": "./types/school/*.d.ts", + "./sea": "./types/sea/duplojsTypesCodegen.d.ts", + "./sea/*": "./types/sea/*.d.ts" + } } diff --git a/libs/clients-type/types/bridge/duplojsTypesCodegen.d.ts b/libs/clients-type/types/bridge/duplojsTypesCodegen.d.ts index a73487a4..3ba9fc8f 100644 --- a/libs/clients-type/types/bridge/duplojsTypesCodegen.d.ts +++ b/libs/clients-type/types/bridge/duplojsTypesCodegen.d.ts @@ -5,60 +5,44 @@ /* v8 ignore start */ // noinspection JSUnusedGlobalSymbols // @ts-nocheck -type ReportingBakedDocumentTranslationListPage = { - countTotal: number; - quantityPerPage: number; -}; - -export { ReportingBakedDocumentTranslationListPage }; - -type ReportingBakedDocumentTranslationAggregateListRow = { - bakedDocumentTitle: string | null; - bakedDocumentId: string; - reportingQuantity: number; -}; - -export { ReportingBakedDocumentTranslationAggregateListRow }; - -type ReportingBakedDocumentTranslationPage = { - bakedDocument: { +type PostModerationPage = { + post: { id: string; - cookingMode: CookingMode; nodeSameRawDocumentId: string; - language: BakedDocumentLanguage; - title: string; - abstract: string | null; - abstractDetails: { - name: string; - label: string; - content: string; - }[] | null; - keywords: string[]; - }; - reporting: { - countTotal: number; - quantityPerPage: number; + topic: string; + content: string; + authorId: string; + authorName: string | null; + answerCount: number; + createdAt: string; }; + unprocessedTotalCount: number; }; -export { ReportingBakedDocumentTranslationPage }; +export { PostModerationPage }; -type CookingMode = "default" | "libretranslate" | "googleScrape"; +type AnswerModerationPage = { + answer: { + id: string; + postId: string; + content: string; + authorId: string; + authorName: string | null; + status: "compliant" | "unprocessed" | "notCompliant"; + createdAt: string; + }; + unprocessedTotalCount: number; +}; -export { CookingMode }; +export { AnswerModerationPage }; type BakedDocumentLanguage = "fr-FR" | "en-US"; export { BakedDocumentLanguage }; -type ReportingBakedDocumentTranslationListRow = { - id: string; - userId: string; - bakedDocumentId: string; - details: string; -}; +type CookingMode = "default" | "libretranslate" | "googleScrape"; -export { ReportingBakedDocumentTranslationListRow }; +export { CookingMode }; type BakedDocumentNewTranslation = { cookingMode: CookingMode; @@ -74,230 +58,230 @@ type BakedDocumentNewTranslation = { export { BakedDocumentNewTranslation }; -type PostModerationPage = { - post: { - id: string; - nodeSameRawDocumentId: string; - topic: string; - content: string; - authorId: string; - authorName: string | null; - answerCount: number; - createdAt: string; - }; - unprocessedTotalCount: number; +type ReportingBakedDocumentTranslationAggregateListRow = { + bakedDocumentTitle: string | null; + bakedDocumentId: string; + reportingQuantity: number; }; -export { PostModerationPage }; +export { ReportingBakedDocumentTranslationAggregateListRow }; -type AnswerModerationPage = { - answer: { +type ReportingBakedDocumentTranslationListPage = { + countTotal: number; + quantityPerPage: number; +}; + +export { ReportingBakedDocumentTranslationListPage }; + +type ReportingBakedDocumentTranslationListRow = { + id: string; + userId: string; + bakedDocumentId: string; + details: string; +}; + +export { ReportingBakedDocumentTranslationListRow }; + +type ReportingBakedDocumentTranslationPage = { + bakedDocument: { id: string; - postId: string; - content: string; - authorId: string; - authorName: string | null; - status: "compliant" | "unprocessed" | "notCompliant"; - createdAt: string; + cookingMode: CookingMode; + nodeSameRawDocumentId: string; + language: BakedDocumentLanguage; + title: string; + abstract: string | null; + abstractDetails: { + name: string; + label: string; + content: string; + }[] | null; + keywords: string[]; + }; + reporting: { + countTotal: number; + quantityPerPage: number; }; - unprocessedTotalCount: number; }; -export { AnswerModerationPage }; +export { ReportingBakedDocumentTranslationPage }; type CodegenRoutes = ({ method: "POST"; - path: "/reporting-baked-document-translation-aggregate-list-page"; - response: { - code: 200; - information: "reportingBakedDocumentTranslationAggregateListPage.found"; - body: ReportingBakedDocumentTranslationListPage; - }; -}) | ({ - method: "POST"; - path: "/reporting-baked-document-translation-aggregate-list"; + path: "/posts/{postId}/is-not-compliant-and-create-warning"; body: { - page: number; - }; - response: { - code: 200; - information: "reportingBakeDocumentTranslationAggregateList.found"; - body: ReportingBakedDocumentTranslationAggregateListRow[]; + makeUserBan: boolean; + reason: string; }; -}) | ({ - method: "POST"; - path: "/reporting-baked-document-translation-page"; - body: { - bakedDocumentId: string; + params: { + postId: string; }; response: { code: 404; - information: "bakedDocument.notfound"; + information: "post.notfound"; body?: undefined; } | { code: 200; - information: "reportingBakedDocumentTranslationPage.found"; - body: ReportingBakedDocumentTranslationPage; - }; -}) | ({ - method: "POST"; - path: "/reporting-baked-document-translation-list"; - body: { - bakedDocumentId: string; - page: number; - }; - response: { - code: 200; - information: "reportingDakedDocumentTranslationList.found"; - body: ReportingBakedDocumentTranslationListRow[]; + information: "post.updated"; + body?: undefined; }; }) | ({ method: "POST"; - path: "/get-new-baked-document-translation"; - body: { - nodeSameRawDocumentId: string; - bakedDocumentLanguage: BakedDocumentLanguage; - cookingMode: CookingMode; + path: "/posts/{postId}/is-compliant"; + params: { + postId: string; }; response: { code: 404; - information: "nodeSameRawDocument.notfound"; + information: "post.notfound"; body?: undefined; } | { code: 200; - information: "bakedDocument.getNewTranslation"; - body: BakedDocumentNewTranslation; + information: "post.updated"; + body?: undefined; }; }) | ({ method: "POST"; - path: "/baked-document-translation-reporting-aggregate/process/{bakedDocumentId}"; - body: { - nodeSameRawDocumentId: string; - bakedDocumentLanguage: BakedDocumentLanguage; - cookingMode: CookingMode; - }; - params: { - bakedDocumentId: string; - }; + path: "/post-moderation-page"; response: { code: 404; - information: "nodeSameRawDocument.notfound"; + information: "postModerationPage.notfound"; body?: undefined; } | { - code: 204; - information: "bakedDocumentTranslationReportingAggregate.processed"; - body?: undefined; + code: 200; + information: "postModerationPage.found"; + body: PostModerationPage; }; }) | ({ method: "POST"; - path: "/post-moderation-page"; + path: "/answer-moderation-page"; response: { code: 404; - information: "postModerationPage.notfound"; + information: "answerModerationPage.notfound"; body?: undefined; } | { code: 200; - information: "postModerationPage.found"; - body: PostModerationPage; + information: "answerModerationPage.found"; + body: AnswerModerationPage; }; }) | ({ method: "POST"; - path: "/posts/{postId}/is-compliant"; + path: "/answers/{answerId}/is-compliant"; params: { - postId: string; + answerId: string; }; response: { code: 404; - information: "post.notfound"; - body?: undefined; - } | { - code: 403; - information: "post.wrongStatus"; + information: "answer.notfound"; body?: undefined; } | { code: 200; - information: "post.updated"; + information: "answer.updated"; body?: undefined; }; }) | ({ method: "POST"; - path: "/posts/{postId}/is-not-compliant-and-create-warning"; + path: "/answers/{answerId}/is-not-compliant-and-create-warning"; body: { makeUserBan: boolean; reason: string; }; params: { - postId: string; + answerId: string; }; response: { code: 403; - information: "post.wrongStatus"; + information: "answer.wrongStatus"; body?: undefined; } | { code: 404; - information: "post.notfound"; + information: "answer.notfound"; body?: undefined; } | { code: 200; - information: "post.updated"; + information: "answer.updated"; body?: undefined; }; }) | ({ method: "POST"; - path: "/answer-moderation-page"; + path: "/get-new-baked-document-translation"; + body: { + nodeSameRawDocumentId: string; + bakedDocumentLanguage: BakedDocumentLanguage; + cookingMode: CookingMode; + }; response: { code: 404; - information: "answerModerationPage.notfound"; + information: "nodeSameRawDocument.notfound"; body?: undefined; } | { code: 200; - information: "answerModerationPage.found"; - body: AnswerModerationPage; + information: "bakedDocument.getNewTranslation"; + body: BakedDocumentNewTranslation; }; }) | ({ method: "POST"; - path: "/answers/{answerId}/is-compliant"; - params: { - answerId: string; + path: "/reporting-baked-document-translation-aggregate-list"; + body: { + page: number; + }; + response: { + code: 200; + information: "reportingBakeDocumentTranslationAggregateList.found"; + body: ReportingBakedDocumentTranslationAggregateListRow[]; + }; +}) | ({ + method: "POST"; + path: "/reporting-baked-document-translation-aggregate-list-page"; + response: { + code: 200; + information: "reportingBakedDocumentTranslationAggregateListPage.found"; + body: ReportingBakedDocumentTranslationListPage; + }; +}) | ({ + method: "POST"; + path: "/reporting-baked-document-translation-list"; + body: { + bakedDocumentId: string; + page: number; + }; + response: { + code: 200; + information: "reportingDakedDocumentTranslationList.found"; + body: ReportingBakedDocumentTranslationListRow[]; + }; +}) | ({ + method: "POST"; + path: "/reporting-baked-document-translation-page"; + body: { + bakedDocumentId: string; }; response: { code: 404; - information: "answer.notfound"; - body?: undefined; - } | { - code: 403; - information: "answer.wrongStatus"; + information: "bakedDocument.notfound"; body?: undefined; } | { code: 200; - information: "answer.updated"; - body?: undefined; + information: "reportingBakedDocumentTranslationPage.found"; + body: ReportingBakedDocumentTranslationPage; }; }) | ({ method: "POST"; - path: "/answers/{answerId}/is-not-compliant-and-create-warning"; + path: "/baked-document-translation-reporting-aggregate/process/{bakedDocumentId}"; body: { - makeUserBan: boolean; - reason: string; + nodeSameRawDocumentId: string; + bakedDocumentLanguage: BakedDocumentLanguage; + cookingMode: CookingMode; }; params: { - answerId: string; + bakedDocumentId: string; }; response: { - code: 403; - information: "answer.wrongStatus"; - body?: undefined; - } | { code: 404; - information: "answer.postMismatch"; - body?: undefined; - } | { - code: 404; - information: "answer.notfound"; + information: "nodeSameRawDocument.notfound"; body?: undefined; } | { - code: 200; - information: "answer.updated"; + code: 204; + information: "bakedDocumentTranslationReportingAggregate.processed"; body?: undefined; }; }); diff --git a/libs/clients-type/types/school/duplojsTypesCodegen.d.ts b/libs/clients-type/types/school/duplojsTypesCodegen.d.ts index cc391501..b78f0cba 100644 --- a/libs/clients-type/types/school/duplojsTypesCodegen.d.ts +++ b/libs/clients-type/types/school/duplojsTypesCodegen.d.ts @@ -1,324 +1,351 @@ -// Generated by @duplojs/types-codegen -/* eslint-disable */ -/* prettier-ignore */ -/* istanbul ignore file */ -/* v8 ignore start */ -// noinspection JSUnusedGlobalSymbols -// @ts-nocheck -type CodegenRoutes = ({ - method: "GET"; - path: "/documents/{nodeSameRawDocumentId}/posts"; - params: { - nodeSameRawDocumentId: string; - }; - query: { - page: number; - quantityPerPage: number; - }; - response: { - code: 200; - information: "posts.found"; - body: { - id: string; - nodeSameRawDocumentId: string; - status: "compliant" | "unprocessed" | "notCompliant"; - topic: string; - content: string; - authorId: string; - authorName: string | null; - answerCount: number; - createdAt: Date; - }[]; - }; -}) | ({ - method: "GET"; - path: "/documents/{nodeSameRawDocumentId}/posts-details"; - params: { - nodeSameRawDocumentId: string; - }; - response: { - code: 200; - information: "document.posts.details"; - body: { - totalCount: number; - }; - }; -}) | ({ +import { TheDate, SerializedTheDate } from "@duplojs/utils/date"; + +export type Routes = { method: "POST"; - path: "/posts"; + path: "/create-report-answer"; body: { - topic: string; - content: string; - nodeSameRawDocumentId: string; - authorId: string; - authorName: string; + answerId: string; + level: "ban" | "warning"; + reason: string; }; - response: { - code: 201; - information: "post.created"; - body: { - id: string; - }; + responses: { + code: "422"; + information: "extract-error"; + body?: undefined; + } | { + code: "404"; + information: "answer.notfound"; + body?: undefined; + } | { + code: "404"; + information: "answer.unprocessed.wrongStatus"; + body?: undefined; + } | { + code: "201"; + information: "report.created"; + body?: undefined; }; -}) | ({ - method: "GET"; - path: "/posts/{postId}"; - params: { +} | { + method: "POST"; + path: "/find-many-available-answer-by-available-post"; + body: { postId: string; + page: number; + quantityPerPage: number; }; - response: { - code: 404; + responses: { + code: "422"; + information: "extract-error"; + body?: undefined; + } | { + code: "404"; information: "post.notfound"; body?: undefined; } | { - code: 200; - information: "post.found"; + code: "404"; + information: "post.notfound"; + body?: undefined; + } | { + code: "200"; + information: "answers.found"; body: { id: string; - nodeSameRawDocumentId: string; - status: "compliant" | "unprocessed" | "notCompliant"; - topic: string; - content: string; + postId: string; authorId: string; authorName: string | null; - answerCount: number; - createdAt: Date; - }; + content: string; + status: "compliant" | "unprocessed" | "notCompliant"; + createdAt: SerializedTheDate | TheDate; + }[]; }; -}) | ({ - method: "GET"; - path: "/find-oldest-unprocessed-post"; - response: { - code: 404; - information: "oldestUnprocessedPost.notfound"; - body?: undefined; - } | { - code: 200; - information: "oldestUnprocessedPost.found"; +} | { + method: "POST"; + path: "/find-oldest-unprocessed-answer"; + responses: { + code: "200"; + information: "oldestUnprocessedAnswer.found"; body: { id: string; - nodeSameRawDocumentId: string; - status: "compliant" | "unprocessed" | "notCompliant"; - topic: string; - content: string; + postId: string; authorId: string; authorName: string | null; - answerCount: number; - createdAt: Date; + content: string; + status: "compliant" | "unprocessed" | "notCompliant"; + createdAt: SerializedTheDate | TheDate; }; + } | { + code: "404"; + information: "oldestUnprocessedAnswer.notfound"; + body?: undefined; }; -}) | ({ - method: "GET"; - path: "/unprocessed-post-details"; - response: { - code: 200; - information: "unprocessedPost.details"; +} | { + method: "POST"; + path: "/find-unprocessed-answer-details"; + responses: { + code: "200"; + information: "unprocessedAnswer.details"; body: { totalCount: number; }; }; -}) | ({ - method: "PATCH"; - path: "/posts/{postId}/is-compliant"; - params: { - postId: string; +} | { + method: "POST"; + path: "/mark-answer-as-compliant"; + body: { + answerId: string; }; - response: { - code: 404; - information: "post.notfound"; + responses: { + code: "422"; + information: "extract-error"; body?: undefined; } | { - code: 403; - information: "post.wrongStatus"; + code: "404"; + information: "answer.notfound"; body?: undefined; } | { - code: 200; - information: "post.updated"; - body: { - id: string; - nodeSameRawDocumentId: string; - status: "compliant" | "unprocessed" | "notCompliant"; - topic: string; - content: string; - authorId: string; - authorName: string | null; - answerCount: number; - createdAt: Date; - }; + code: "404"; + information: "answer.unprocessed.wrongStatus"; + body?: undefined; + } | { + code: "204"; + information: "answer.markedAsCompliant"; + body?: undefined; }; -}) | ({ - method: "PATCH"; - path: "/posts/{postId}/is-not-compliant-and-create-warning"; +} | { + method: "POST"; + path: "/reply-to-post"; body: { - makeUserBan: boolean; - reason: string; - }; - params: { postId: string; + content: string; + authorId: string; + authorName: string; }; - response: { - code: 404; + responses: { + code: "422"; + information: "extract-error"; + body?: undefined; + } | { + code: "404"; information: "post.notfound"; body?: undefined; } | { - code: 403; - information: "post.wrongStatus"; + code: "404"; + information: "post.notfound"; + body?: undefined; + } | { + code: "201"; + information: "answer.created"; + body?: undefined; + }; +} | { + method: "POST"; + path: "/create-post"; + body: { + topic: string; + content: string; + nodeSameRawDocumentId: string; + authorId: string; + authorName: string; + }; + responses: { + code: "422"; + information: "extract-error"; body?: undefined; } | { - code: 200; - information: "post.updated"; + code: "201"; + information: "post.created"; body: { id: string; - nodeSameRawDocumentId: string; - status: "compliant" | "unprocessed" | "notCompliant"; topic: string; content: string; + nodeSameRawDocumentId: string; + answerCount: number; authorId: string; authorName: string | null; - answerCount: number; - createdAt: Date; + status: "compliant" | "unprocessed" | "notCompliant"; + createdAt: SerializedTheDate | TheDate; }; }; -}) | ({ +} | { method: "POST"; - path: "/posts/{postId}/answers"; + path: "/create-report-post"; body: { - content: string; - authorId: string; - authorName: string; - }; - params: { postId: string; + level: "ban" | "warning"; + reason: string; }; - response: { - code: 404; + responses: { + code: "422"; + information: "extract-error"; + body?: undefined; + } | { + code: "404"; information: "post.notfound"; body?: undefined; } | { - code: 201; - information: "answer.created"; + code: "404"; + information: "post.unprocessed.wrongStatus"; + body?: undefined; + } | { + code: "201"; + information: "report.created"; body?: undefined; }; -}) | ({ - method: "GET"; - path: "/posts/{postId}/answers"; - params: { - postId: string; - }; - query: { +} | { + method: "POST"; + path: "/find-many-available-post-by-node-same-raw-document"; + body: { + nodeSameRawDocumentId: string; page: number; quantityPerPage: number; }; - response: { - code: 404; - information: "post.notfound"; + responses: { + code: "422"; + information: "extract-error"; body?: undefined; } | { - code: 200; - information: "answers.found"; + code: "200"; + information: "posts.found"; body: { id: string; - postId: string; + topic: string; content: string; + nodeSameRawDocumentId: string; + answerCount: number; authorId: string; authorName: string | null; status: "compliant" | "unprocessed" | "notCompliant"; - createdAt: Date; + createdAt: SerializedTheDate | TheDate; }[]; }; -}) | ({ - method: "GET"; - path: "/find-oldest-unprocessed-answer"; - response: { - code: 404; - information: "oldestUnprocessedAnswer.notfound"; +} | { + method: "POST"; + path: "/find-many-available-post-by-node-same-raw-document-details"; + body: { + nodeSameRawDocumentId: string; + }; + responses: { + code: "422"; + information: "extract-error"; body?: undefined; } | { - code: 200; - information: "oldestUnprocessedAnswer.found"; + code: "200"; + information: "posts.foundDetails"; + body: { + totalCount: number; + }; + }; +} | { + method: "POST"; + path: "/find-oldest-unprocessed-post"; + responses: { + code: "200"; + information: "oldestUnprocessedPost.found"; body: { id: string; - postId: string; + topic: string; content: string; + nodeSameRawDocumentId: string; + answerCount: number; authorId: string; authorName: string | null; status: "compliant" | "unprocessed" | "notCompliant"; - createdAt: Date; + createdAt: SerializedTheDate | TheDate; }; + } | { + code: "404"; + information: "oldestUnprocessedPost.notfound"; + body?: undefined; }; -}) | ({ - method: "GET"; - path: "/unprocessed-answer-details"; - response: { - code: 200; - information: "unprocessedAnswer.details"; +} | { + method: "POST"; + path: "/find-unprocessed-post-details"; + responses: { + code: "200"; + information: "unprocessedPost.details"; body: { totalCount: number; }; }; -}) | ({ - method: "PATCH"; - path: "/answers/{answerId}/is-compliant"; - params: { - answerId: string; +} | { + method: "POST"; + path: "/find-one-post"; + body: { + postId: string; }; - response: { - code: 404; - information: "answer.notfound"; + responses: { + code: "422"; + information: "extract-error"; body?: undefined; } | { - code: 403; - information: "answer.wrongStatus"; + code: "404"; + information: "post.notfound"; body?: undefined; } | { - code: 200; - information: "answer.updated"; + code: "200"; + information: "post.found"; body: { id: string; - postId: string; + topic: string; content: string; + nodeSameRawDocumentId: string; + answerCount: number; authorId: string; authorName: string | null; status: "compliant" | "unprocessed" | "notCompliant"; - createdAt: Date; + createdAt: SerializedTheDate | TheDate; }; }; -}) | ({ - method: "PATCH"; - path: "/answers/{answerId}/is-not-compliant-and-create-warning"; +} | { + method: "POST"; + path: "/find-one-available-post"; body: { - makeUserBan: boolean; - reason: string; - }; - params: { - answerId: string; + postId: string; }; - response: { - code: 404; - information: "answer.notfound"; - body?: undefined; - } | { - code: 403; - information: "answer.wrongStatus"; - body?: undefined; - } | { - code: 403; - information: "answer.postMismatch"; + responses: { + code: "422"; + information: "extract-error"; body?: undefined; } | { - code: 200; - information: "answer.updated"; + code: "200"; + information: "availablePost.found"; body: { id: string; - postId: string; + topic: string; content: string; + nodeSameRawDocumentId: string; + answerCount: number; authorId: string; authorName: string | null; status: "compliant" | "unprocessed" | "notCompliant"; - createdAt: Date; + createdAt: SerializedTheDate | TheDate; }; + } | { + code: "404"; + information: "availablePost.notfound"; + body?: undefined; }; -}); - -export { CodegenRoutes }; -/* v8 ignore stop */ +} | { + method: "POST"; + path: "/mark-post-as-compliant"; + body: { + postId: string; + }; + responses: { + code: "422"; + information: "extract-error"; + body?: undefined; + } | { + code: "404"; + information: "post.notfound"; + body?: undefined; + } | { + code: "404"; + information: "post.unprocessed.wrongStatus"; + body?: undefined; + } | { + code: "204"; + information: "post.markAsCompliant"; + body?: undefined; + }; +}; \ No newline at end of file diff --git a/libs/design-system/package.json b/libs/design-system/package.json index a21b809c..a2e03ab7 100644 --- a/libs/design-system/package.json +++ b/libs/design-system/package.json @@ -15,7 +15,7 @@ } }, "dependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@jamescoyle/vue-icon": "0.1.2", "@tanstack/vue-table": "8.21.2", "@vueuse/core": "^13.0.0", diff --git a/libs/duplo-plugins/plugins/debug.ts b/libs/duplo-plugins/plugins/debug.ts index f04c40f5..06992417 100644 --- a/libs/duplo-plugins/plugins/debug.ts +++ b/libs/duplo-plugins/plugins/debug.ts @@ -1,6 +1,6 @@ import { Duplo } from "@duplojs/core"; import * as Sentry from "@sentry/node"; -import { logger } from "@vendors/backend-logger/logger"; +import { logger } from "@vendors/backend-logger"; interface DebugOptions { dsn: string; diff --git a/libs/entity-rules/package.json b/libs/entity-rules/package.json index f9c7db10..664bced6 100644 --- a/libs/entity-rules/package.json +++ b/libs/entity-rules/package.json @@ -1,4 +1,9 @@ { "name": "@lib/entity-rules", - "type": "module" + "type": "module", + "exports": { + ".": { + "import": "./scripts/index.ts" + } + } } diff --git a/libs/entity-rules/scripts/answer.ts b/libs/entity-rules/scripts/answer.ts index ff38b172..533bb277 100644 --- a/libs/entity-rules/scripts/answer.ts +++ b/libs/entity-rules/scripts/answer.ts @@ -3,4 +3,4 @@ export const answerRules = { minLength: 5, maxLength: 500, }, -}; +} as const; diff --git a/libs/entity-rules/scripts/post.ts b/libs/entity-rules/scripts/post.ts index c72a7e36..7082cf50 100644 --- a/libs/entity-rules/scripts/post.ts +++ b/libs/entity-rules/scripts/post.ts @@ -7,4 +7,4 @@ export const postRules = { minLength: 30, maxLength: 5000, }, -}; +} as const; diff --git a/libs/entity-rules/scripts/warning/base.ts b/libs/entity-rules/scripts/warning/base.ts index a9c7c26b..227f0a9d 100644 --- a/libs/entity-rules/scripts/warning/base.ts +++ b/libs/entity-rules/scripts/warning/base.ts @@ -3,4 +3,4 @@ export const baseWarningRules = { min: 5, max: 250, }, -}; +} as const; diff --git a/libs/eslint/package.json b/libs/eslint/package.json index faf891ab..4ba731cc 100644 --- a/libs/eslint/package.json +++ b/libs/eslint/package.json @@ -2,12 +2,20 @@ "name": "@lib/eslint", "type": "module", "devDependencies": { - "@duplojs/eslint": "0.4.0", + "@duplojs/eslint": "0.5.0", "eslint": "9.23.0", "eslint-plugin-vue": "10.0.0", "globals": "16.0.0", "jiti": "2.4.2", - "typescript-eslint": "8.26.1", + "typescript-eslint": "^8.61.1", "vue-eslint-parser": "10.1.1" + }, + "exports": { + ".": { + "import": "./scripts/index.ts" + }, + "./vue": { + "import": "./scripts/vue.ts" + } } } diff --git a/libs/eslint/scripts/index.ts b/libs/eslint/scripts/index.ts index 85573fc3..3584d358 100644 --- a/libs/eslint/scripts/index.ts +++ b/libs/eslint/scripts/index.ts @@ -18,6 +18,7 @@ export const eslintConfig = [ "@typescript-eslint/no-empty-object-type": "off", "@typescript-eslint/no-namespace": "off", "new-cap": "off", + "@typescript-eslint/await-thenable": "off", }, }, ]; diff --git a/libs/fixture/package.json b/libs/fixture/package.json index 25c88195..11f15296 100644 --- a/libs/fixture/package.json +++ b/libs/fixture/package.json @@ -9,5 +9,10 @@ }, "devDependencies": { "@faker-js/faker": "9.7.0" + }, + "exports": { + ".": { + "import": "./scripts/index.ts" + } } } diff --git a/libs/sentry-logger/package.json b/libs/sentry-logger/package.json index a60f878d..4bd7732c 100644 --- a/libs/sentry-logger/package.json +++ b/libs/sentry-logger/package.json @@ -5,7 +5,7 @@ "@sentry/node": "9.22.0" }, "devDependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "typescript": "5.8.2" } } diff --git a/package-lock.json b/package-lock.json index f8c3e519..6117c1c7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "@commitlint/cli": "19.7.1", "@commitlint/config-conventional": "19.2.2", "@duplojs/eslint": "0.5.0", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@vitest/coverage-v8": "3.1.1", "concurrently": "9.1.2", "eslint": "9.23.0", @@ -31,22 +31,51 @@ "husky": "9.1.7", "jiti": "2.4.2", "tsx": "4.19.3", - "typescript-eslint": "8.26.1", + "typescript-eslint": "^8.61.1", "vitest": "3.1.1", "vue-eslint-parser": "10.1.1", "zod": "3.24.2" } }, + ".npm-packages/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "e2e": { "devDependencies": { "@duplojs/playwright": "0.2.0", "@duplojs/server-utils": "0.4.1", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@types/node": "22.13.10", "firebase-admin": "13.2.0", "playwright": "1.60.0" } }, + "e2e/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "libs/async-message": { "name": "@lib/async-message", "dependencies": { @@ -54,33 +83,116 @@ "zod": "3.24.2" }, "devDependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@types/node": "22.15.0", "typescript": "5.9.3" } }, - "libs/async-message/node_modules/@types/node": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.0.tgz", - "integrity": "sha512-99S8dWD2DkeE6PBaEDw+In3aar7hdoBvjyJMR6vaKBTzpvR0P00ClzJMOoVrj9D2+Sy/YCwACYHnBTpMhg1UCA==", - "dev": true, + "libs/async-message/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "undici-types": "~6.21.0" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "libs/async-message/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, + "libs/async-message/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" }, "engines": { - "node": ">=14.17" + "node": ">=12" + } + }, + "libs/async-message/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "libs/async-message/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "libs/async-message/node_modules/mongodb": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, "libs/backend-logger": { @@ -89,7 +201,7 @@ "libs/clean": { "name": "@lib/clean", "dependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "zod": "3.24.2" } }, @@ -99,7 +211,7 @@ "libs/design-system": { "name": "@lib/design-system", "dependencies": { - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@jamescoyle/vue-icon": "0.1.2", "@tanstack/vue-table": "8.21.2", "@vueuse/core": "^13.0.0", @@ -124,17 +236,27 @@ "vue-tsc": "2.2.4" } }, + "libs/design-system/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, "libs/design-system/node_modules/@vitest/coverage-v8": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.8.tgz", - "integrity": "sha512-lt3kovsyHwYe00wq4D1ti0Z974fWj4NLp6siqiyEufUpyFwK9Yhi7rBhac9JL5aA0zoMrJqc4vYPZRUnI7l7nw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.9.tgz", + "integrity": "sha512-G9/lgqibheLVBDRuya45EbsEXTYcWoSG+TLg7i2axuzx0Eq62eXn+aWXyaVdV5vKvFSWd6ywcX8hA7la9Pvu8g==", "dev": true, "license": "MIT", "optional": true, "peer": true, "dependencies": { "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.1.9", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", @@ -148,8 +270,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "4.1.8", - "vitest": "4.1.8" + "@vitest/browser": "4.1.9", + "vitest": "4.1.9" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -158,14 +280,14 @@ } }, "libs/design-system/node_modules/@vitest/ui": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.8.tgz", - "integrity": "sha512-RUS2ZU2TsduVrI+9c12uTNaKrNUTsm6yFt3fueEUB9iKvyC2UP83F+sqIz00HQIah4UOL1TMoDAki8K0NjGvsA==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.9.tgz", + "integrity": "sha512-U/cRvtqfEPj27FI1n9cyUvi4vXXdcLhjJiI+InYKdk8hP4VrS6RXOjGL7rfFaeBc37iRKANsR6eEzIoC7lmgBQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.1.9", "fflate": "^0.8.2", "flatted": "^3.4.2", "pathe": "^2.0.3", @@ -177,7 +299,7 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "4.1.8" + "vitest": "4.1.9" } }, "libs/design-system/node_modules/commander": { @@ -293,20 +415,20 @@ } }, "libs/design-system/node_modules/vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz", + "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/expect": "4.1.9", + "@vitest/mocker": "4.1.9", + "@vitest/pretty-format": "4.1.9", + "@vitest/runner": "4.1.9", + "@vitest/snapshot": "4.1.9", + "@vitest/spy": "4.1.9", + "@vitest/utils": "4.1.9", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -334,12 +456,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", + "@vitest/browser-playwright": "4.1.9", + "@vitest/browser-preview": "4.1.9", + "@vitest/browser-webdriverio": "4.1.9", + "@vitest/coverage-istanbul": "4.1.9", + "@vitest/coverage-v8": "4.1.9", + "@vitest/ui": "4.1.9", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -384,14 +506,14 @@ } }, "libs/design-system/node_modules/vitest/node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz", + "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/spy": "4.1.8", + "@vitest/spy": "4.1.9", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -435,1321 +557,1214 @@ "libs/eslint": { "name": "@lib/eslint", "devDependencies": { - "@duplojs/eslint": "0.4.0", + "@duplojs/eslint": "0.5.0", "eslint": "9.23.0", "eslint-plugin-vue": "10.0.0", "globals": "16.0.0", "jiti": "2.4.2", - "typescript-eslint": "8.26.1", + "typescript-eslint": "^8.61.1", "vue-eslint-parser": "10.1.1" } }, - "libs/eslint/node_modules/@duplojs/eslint": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@duplojs/eslint/-/eslint-0.4.0.tgz", - "integrity": "sha512-jQ48b2n+0yqOg//3SmGOTsnXNr2bdW8FoyLk1i6PvdTKY+hctSVsWf8kW3FzAFhlNmcCLIcOIXSMF/jRGIrseA==", - "dev": true, - "license": "ISC", + "libs/fixture": { + "name": "@lib/fixture", + "devDependencies": { + "@faker-js/faker": "9.7.0" + } + }, + "libs/sentry-logger": { + "name": "@lib/sentry-logger", "dependencies": { - "@stylistic/eslint-plugin-js": "3.1.0", - "@stylistic/eslint-plugin-ts": "3.1.0", - "@typescript-eslint/eslint-plugin": "8.23.0", - "@typescript-eslint/parser": "8.23.0", - "eslint": "9.20.0" + "@sentry/node": "9.22.0" + }, + "devDependencies": { + "@duplojs/utils": "1.9.9", + "typescript": "5.8.2" } }, - "libs/eslint/node_modules/@duplojs/eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", - "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", + "libs/sentry-logger/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/type-utils": "8.23.0", - "@typescript-eslint/utils": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "node": ">=14.17" } }, - "libs/eslint/node_modules/@duplojs/eslint/node_modules/@typescript-eslint/parser": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", - "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", + "libs/types-advanced-query": { + "name": "@lib/types-advanced-query", + "dependencies": { + "zod": "3.24.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", - "debug": "^4.3.4" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "libs/eslint/node_modules/@duplojs/eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", - "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", - "dev": true, - "license": "MIT", + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/utils": "8.23.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "node": ">=6.0.0" } }, - "libs/eslint/node_modules/@duplojs/eslint/node_modules/@typescript-eslint/utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", - "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0" + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/@duplojs/eslint/node_modules/eslint": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.0.tgz", - "integrity": "sha512-aL4F8167Hg4IvsW89ejnpTwx+B/UQRzJPGgbIOl+4XqffWsahVVsLEWoZvnrVuwpWmnRd7XeXmQI1zlKcFDteA==", + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", - "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", - "@eslint/plugin-kit": "^0.2.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.1", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.2.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@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": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "libs/eslint/node_modules/@duplojs/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "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", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "bin": { + "semver": "bin/semver.js" } }, - "libs/eslint/node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.15" + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", - "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0" + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/@typescript-eslint/types": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", - "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", + "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": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "libs/eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", - "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "@babel/core": "^7.0.0" } }, - "libs/eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", - "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", + "node_modules/@babel/helper-create-class-features-plugin/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.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.23.0", - "eslint-visitor-keys": "^4.2.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } }, - "libs/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "libs/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "libs/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "libs/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "libs/eslint/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, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "libs/eslint/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, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "libs/eslint/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=14.17" - } - }, - "libs/fixture": { - "name": "@lib/fixture", - "devDependencies": { - "@faker-js/faker": "9.7.0" - } - }, - "libs/sentry-logger": { - "name": "@lib/sentry-logger", - "dependencies": { - "@sentry/node": "9.22.0" - }, - "devDependencies": { - "@duplojs/utils": "1.9.2", - "typescript": "5.8.2" + "node": ">=6.9.0" } }, - "libs/sentry-logger/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { - "node": ">=14.17" - } - }, - "libs/types-advanced-query": { - "name": "@lib/types-advanced-query", - "dependencies": { - "zod": "3.24.2" + "node": ">=6.9.0" } }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, - "node_modules/@babel/code-frame": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", - "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.29.7", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/compat-data": { + "node_modules/@babel/plugin-syntax-typescript": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", - "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/core": { + "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", - "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", - "@babel/helpers": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7", - "@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" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "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" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/generator": { + "node_modules/@babel/plugin-transform-typescript": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-annotate-as-pure": { + "node_modules/@babel/preset-typescript": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", - "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", + "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-typescript": "^7.29.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/helper-compilation-targets": { + "node_modules/@babel/template": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", - "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "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-create-class-features-plugin": { + "node_modules/@babel/traverse": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", - "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/helper-replace-supers": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/traverse": "^7.29.7", - "semver": "^6.3.1" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/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": { + "node_modules/@babel/types": { "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", - "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", - "dev": true, + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", - "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", - "dev": true, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@commitlint/cli": { + "version": "19.7.1", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.7.1.tgz", + "integrity": "sha512-iObGjR1tE/PfDtDTEfd+tnRkB3/HJzpQqRTyofS2MPPkDn1mp3DBC8SoPDayokfAy+xKhF8+bwRCJO25Nea0YQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@commitlint/format": "^19.5.0", + "@commitlint/lint": "^19.7.1", + "@commitlint/load": "^19.6.1", + "@commitlint/read": "^19.5.0", + "@commitlint/types": "^19.5.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", - "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", - "dev": true, + "node_modules/@commitlint/config-conventional": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", - "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", - "dev": true, + "node_modules/@commitlint/config-validator": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", + "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@commitlint/types": "^19.8.1", + "ajv": "^8.11.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", - "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", - "dev": true, + "node_modules/@commitlint/ensure": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", + "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@commitlint/types": "^19.8.1", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", - "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", - "dev": true, + "node_modules/@commitlint/execute-rule": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", + "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", - "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", - "dev": true, + "node_modules/@commitlint/format": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", + "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.29.7", - "@babel/helper-optimise-call-expression": "^7.29.7", - "@babel/traverse": "^7.29.7" + "@commitlint/types": "^19.8.1", + "chalk": "^5.3.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", - "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", - "dev": true, + "node_modules/@commitlint/is-ignored": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", + "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.29.7", - "@babel/types": "^7.29.7" + "@commitlint/types": "^19.8.1", + "semver": "^7.6.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", - "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "node_modules/@commitlint/lint": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", + "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^19.8.1", + "@commitlint/parse": "^19.8.1", + "@commitlint/rules": "^19.8.1", + "@commitlint/types": "^19.8.1" + }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", - "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", - "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", - "dev": true, + "node_modules/@commitlint/load": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", + "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^19.8.1", + "@commitlint/execute-rule": "^19.8.1", + "@commitlint/resolve-extends": "^19.8.1", + "@commitlint/types": "^19.8.1", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^6.1.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/helpers": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", - "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", - "dev": true, + "node_modules/@commitlint/message": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", + "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", "license": "MIT", - "dependencies": { - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "node_modules/@commitlint/parse": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", + "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" + "@commitlint/types": "^19.8.1", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=v18" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", - "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", - "dev": true, + "node_modules/@commitlint/read": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", + "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" + "@commitlint/top-level": "^19.8.1", + "@commitlint/types": "^19.8.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=v18" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", - "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", - "dev": true, + "node_modules/@commitlint/read/node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", - "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", - "dev": true, + "node_modules/@commitlint/resolve-extends": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", + "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7" + "@commitlint/config-validator": "^19.8.1", + "@commitlint/types": "^19.8.1", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=v18" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", - "dev": true, + "node_modules/@commitlint/rules": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", + "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.29.7", - "@babel/helper-create-class-features-plugin": "^7.29.7", - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", - "@babel/plugin-syntax-typescript": "^7.29.7" + "@commitlint/ensure": "^19.8.1", + "@commitlint/message": "^19.8.1", + "@commitlint/to-lines": "^19.8.1", + "@commitlint/types": "^19.8.1" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=v18" } }, - "node_modules/@babel/preset-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz", - "integrity": "sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ==", - "dev": true, + "node_modules/@commitlint/to-lines": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", + "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.29.7", - "@babel/helper-validator-option": "^7.29.7", - "@babel/plugin-syntax-jsx": "^7.29.7", - "@babel/plugin-transform-modules-commonjs": "^7.29.7", - "@babel/plugin-transform-typescript": "^7.29.7" - }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=v18" } }, - "node_modules/@babel/template": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", - "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", - "dev": true, + "node_modules/@commitlint/top-level": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", + "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7" + "find-up": "^7.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", - "dev": true, + "node_modules/@commitlint/types": { + "version": "19.8.1", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", + "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", - "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", - "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", - "debug": "^4.3.1" + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=v18" } }, - "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "node_modules/@duplojs/core": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@duplojs/core/-/core-1.0.3.tgz", + "integrity": "sha512-AkXA1IZ/fEVxF4ZrTCS9c8sxAXf84WEzqslOoAtb1XZqw/aigoaG/OIcvKgMEAGf0fKfvl4cTIUNZhJj0CIJbg==", "license": "MIT", + "workspaces": [ + "test/integration" + ], "dependencies": { - "@babel/helper-string-parser": "^7.29.7", - "@babel/helper-validator-identifier": "^7.29.7" + "@duplojs/utils": "0.3.1", + "@duplojs/zod-accelerator": "2.6.2", + "mime": "4.0.4" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "zod": ">=3.23.8 <4.0.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", - "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "node_modules/@duplojs/core/node_modules/@duplojs/utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-0.3.1.tgz", + "integrity": "sha512-SNLsLrMQjWxdtjLI/nZxw6rMnS9LjI4tlV+JBfGLIW4TitXOluTZSKb0KF0v13FbC/1o0Vj68x/uZ3bh42k0cg==", "license": "MIT", - "engines": { - "node": ">=18" - } + "workspaces": [ + "test/integration" + ] }, - "node_modules/@commitlint/cli": { - "version": "19.7.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.7.1.tgz", - "integrity": "sha512-iObGjR1tE/PfDtDTEfd+tnRkB3/HJzpQqRTyofS2MPPkDn1mp3DBC8SoPDayokfAy+xKhF8+bwRCJO25Nea0YQ==", + "node_modules/@duplojs/data-parser-tools": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@duplojs/data-parser-tools/-/data-parser-tools-0.5.5.tgz", + "integrity": "sha512-2zVjLNsqvF+aMnV31Tr/xfnwWdMYkSCxxDXoxPczJQPgWACkkHeuiuyLSTgrTNVjj3lLVGve2Hm6UKA0pquFYg==", "license": "MIT", + "peer": true, + "workspaces": [ + "integration", + "docs" + ], "dependencies": { - "@commitlint/format": "^19.5.0", - "@commitlint/lint": "^19.7.1", - "@commitlint/load": "^19.6.1", - "@commitlint/read": "^19.5.0", - "@commitlint/types": "^19.5.0", - "tinyexec": "^0.3.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" + "typescript": "5.9.2" }, "engines": { - "node": ">=v18" + "node": ">=22.15.1" + }, + "peerDependencies": { + "@duplojs/server-utils": ">=0.4.0 < 1.0.0", + "@duplojs/utils": ">=1.9.1 <2.0.0" } }, - "node_modules/@commitlint/config-conventional": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", - "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", - "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.0.3", - "conventional-changelog-conventionalcommits": "^7.0.2" + "node_modules/@duplojs/data-parser-tools/node_modules/typescript": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=v18" + "node": ">=14.17" } }, - "node_modules/@commitlint/config-validator": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.8.1.tgz", - "integrity": "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==", - "license": "MIT", + "node_modules/@duplojs/eslint": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@duplojs/eslint/-/eslint-0.5.0.tgz", + "integrity": "sha512-LehZ6mQa8IYIob6rKxhFMLeNPOILlGImZGONLDXvmzqeFfSiat86GlfU1+61nMwOPYFKoWdbLop3DIbCUtmYaQ==", + "license": "ISC", "dependencies": { - "@commitlint/types": "^19.8.1", - "ajv": "^8.11.0" + "@stylistic/eslint-plugin-js": "3.1.0", + "@stylistic/eslint-plugin-ts": "3.1.0", + "@typescript-eslint/eslint-plugin": "8.23.0", + "@typescript-eslint/parser": "8.23.0", + "eslint": "9.33.0" + } + }, + "node_modules/@duplojs/eslint/node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@commitlint/ensure": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.8.1.tgz", - "integrity": "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==", - "license": "MIT", + "node_modules/@duplojs/eslint/node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", "dependencies": { - "@commitlint/types": "^19.8.1", - "lodash.camelcase": "^4.3.0", - "lodash.kebabcase": "^4.1.1", - "lodash.snakecase": "^4.1.1", - "lodash.startcase": "^4.4.0", - "lodash.upperfirst": "^4.3.1" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=v18" + "node": "*" } }, - "node_modules/@commitlint/execute-rule": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz", - "integrity": "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==", - "license": "MIT", + "node_modules/@duplojs/eslint/node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "license": "Apache-2.0", "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@commitlint/format": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.8.1.tgz", - "integrity": "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==", - "license": "MIT", + "node_modules/@duplojs/eslint/node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0" + "@types/json-schema": "^7.0.15" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@commitlint/is-ignored": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz", - "integrity": "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==", + "node_modules/@duplojs/eslint/node_modules/@eslint/js": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", "license": "MIT", - "dependencies": { - "@commitlint/types": "^19.8.1", - "semver": "^7.6.0" - }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@commitlint/lint": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.8.1.tgz", - "integrity": "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==", - "license": "MIT", + "node_modules/@duplojs/eslint/node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "license": "Apache-2.0", "dependencies": { - "@commitlint/is-ignored": "^19.8.1", - "@commitlint/parse": "^19.8.1", - "@commitlint/rules": "^19.8.1", - "@commitlint/types": "^19.8.1" + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@commitlint/load": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.8.1.tgz", - "integrity": "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", + "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/execute-rule": "^19.8.1", - "@commitlint/resolve-extends": "^19.8.1", - "@commitlint/types": "^19.8.1", - "chalk": "^5.3.0", - "cosmiconfig": "^9.0.0", - "cosmiconfig-typescript-loader": "^6.1.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "lodash.uniq": "^4.5.0" + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/type-utils": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@commitlint/message": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.8.1.tgz", - "integrity": "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/parser": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", + "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "debug": "^4.3.4" + }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@commitlint/parse": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.8.1.tgz", - "integrity": "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", + "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", "license": "MIT", "dependencies": { - "@commitlint/types": "^19.8.1", - "conventional-changelog-angular": "^7.0.0", - "conventional-commits-parser": "^5.0.0" + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@commitlint/read": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.8.1.tgz", - "integrity": "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/type-utils": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", + "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", "license": "MIT", "dependencies": { - "@commitlint/top-level": "^19.8.1", - "@commitlint/types": "^19.8.1", - "git-raw-commits": "^4.0.0", - "minimist": "^1.2.8", - "tinyexec": "^1.0.0" + "@typescript-eslint/typescript-estree": "8.23.0", + "@typescript-eslint/utils": "8.23.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@commitlint/read/node_modules/tinyexec": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", - "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/types": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", + "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", "license": "MIT", "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@commitlint/resolve-extends": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz", - "integrity": "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==", - "license": "MIT", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", + "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", + "license": "MIT", "dependencies": { - "@commitlint/config-validator": "^19.8.1", - "@commitlint/types": "^19.8.1", - "global-directory": "^4.0.1", - "import-meta-resolve": "^4.0.0", - "lodash.mergewith": "^4.6.2", - "resolve-from": "^5.0.0" + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/visitor-keys": "8.23.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.0.1" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@commitlint/rules": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.8.1.tgz", - "integrity": "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/utils": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", + "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", "license": "MIT", "dependencies": { - "@commitlint/ensure": "^19.8.1", - "@commitlint/message": "^19.8.1", - "@commitlint/to-lines": "^19.8.1", - "@commitlint/types": "^19.8.1" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.23.0", + "@typescript-eslint/types": "8.23.0", + "@typescript-eslint/typescript-estree": "8.23.0" }, "engines": { - "node": ">=v18" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.8.1.tgz", - "integrity": "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==", - "license": "MIT", - "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.8.0" } }, - "node_modules/@commitlint/top-level": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.8.1.tgz", - "integrity": "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==", + "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", + "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", "license": "MIT", "dependencies": { - "find-up": "^7.0.0" + "@typescript-eslint/types": "8.23.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { - "node": ">=v18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@commitlint/types": { - "version": "19.8.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.8.1.tgz", - "integrity": "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==", + "node_modules/@duplojs/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", "dependencies": { - "@types/conventional-commits-parser": "^5.0.0", - "chalk": "^5.3.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=v18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@duplojs/core": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@duplojs/core/-/core-1.0.3.tgz", - "integrity": "sha512-AkXA1IZ/fEVxF4ZrTCS9c8sxAXf84WEzqslOoAtb1XZqw/aigoaG/OIcvKgMEAGf0fKfvl4cTIUNZhJj0CIJbg==", + "node_modules/@duplojs/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "license": "MIT", - "workspaces": [ - "test/integration" - ], "dependencies": { - "@duplojs/utils": "0.3.1", - "@duplojs/zod-accelerator": "2.6.2", - "mime": "4.0.4" - }, - "peerDependencies": { - "zod": ">=3.23.8 <4.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@duplojs/core/node_modules/@duplojs/utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-0.3.1.tgz", - "integrity": "sha512-SNLsLrMQjWxdtjLI/nZxw6rMnS9LjI4tlV+JBfGLIW4TitXOluTZSKb0KF0v13FbC/1o0Vj68x/uZ3bh42k0cg==", - "license": "MIT", - "workspaces": [ - "test/integration" - ] - }, - "node_modules/@duplojs/data-parser-tools": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@duplojs/data-parser-tools/-/data-parser-tools-0.5.5.tgz", - "integrity": "sha512-2zVjLNsqvF+aMnV31Tr/xfnwWdMYkSCxxDXoxPczJQPgWACkkHeuiuyLSTgrTNVjj3lLVGve2Hm6UKA0pquFYg==", + "node_modules/@duplojs/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", - "peer": true, - "workspaces": [ - "integration", - "docs" - ], "dependencies": { - "typescript": "5.9.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=22.15.1" - }, - "peerDependencies": { - "@duplojs/server-utils": ">=0.4.0 < 1.0.0", - "@duplojs/utils": ">=1.9.1 <2.0.0" - } - }, - "node_modules/@duplojs/data-parser-tools/node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node": ">=10" }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@duplojs/eslint": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@duplojs/eslint/-/eslint-0.5.0.tgz", - "integrity": "sha512-LehZ6mQa8IYIob6rKxhFMLeNPOILlGImZGONLDXvmzqeFfSiat86GlfU1+61nMwOPYFKoWdbLop3DIbCUtmYaQ==", - "license": "ISC", - "dependencies": { - "@stylistic/eslint-plugin-js": "3.1.0", - "@stylistic/eslint-plugin-ts": "3.1.0", - "@typescript-eslint/eslint-plugin": "8.23.0", - "@typescript-eslint/parser": "8.23.0", - "eslint": "9.33.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@duplojs/eslint/node_modules/@eslint/config-array": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", - "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", - "license": "Apache-2.0", + "node_modules/@duplojs/eslint/node_modules/eslint": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "license": "MIT", "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.5" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/@duplojs/eslint/node_modules/@eslint/config-array/node_modules/minimatch": { + "node_modules/@duplojs/eslint/node_modules/eslint/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", @@ -1761,622 +1776,290 @@ "node": "*" } }, - "node_modules/@duplojs/eslint/node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", - "license": "Apache-2.0", + "node_modules/@duplojs/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@duplojs/eslint/node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", - "license": "Apache-2.0", - "dependencies": { - "@types/json-schema": "^7.0.15" + "node": ">=10" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@duplojs/eslint/node_modules/@eslint/js": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", - "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "node_modules/@duplojs/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "node": ">= 4" } }, - "node_modules/@duplojs/eslint/node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^0.15.2", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } + "node_modules/@duplojs/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.23.0.tgz", - "integrity": "sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==", + "node_modules/@duplojs/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/type-utils": "8.23.0", - "@typescript-eslint/utils": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "p-locate": "^5.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/parser": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.23.0.tgz", - "integrity": "sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==", + "node_modules/@duplojs/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", - "debug": "^4.3.4" + "p-limit": "^3.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.23.0.tgz", - "integrity": "sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==", + "node_modules/@duplojs/eslint/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==", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.23.0.tgz", - "integrity": "sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==", + "node_modules/@duplojs/eslint/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==", "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.23.0", - "@typescript-eslint/utils": "8.23.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" + } + }, + "node_modules/@duplojs/eslint/node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "engines": { + "node": ">=14.17" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/types": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.23.0.tgz", - "integrity": "sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==", + "node_modules/@duplojs/http": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@duplojs/http/-/http-0.13.1.tgz", + "integrity": "sha512-ew8mDpprUs1NpH5hXpRXw/ahb4THHYWFw0q0uAqIqllW84oJf3UI72NAbNijcDZSVLJ2X28k/G7dOOP9E8kR+g==", "license": "MIT", + "workspaces": [ + "integration", + "docs" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=22.15.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "@duplojs/data-parser-tools": ">=0.5.5 <1.0.0", + "@duplojs/server-utils": ">=0.4.1 <1.0.0", + "@duplojs/utils": ">=1.9.2 <2.0.0" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.23.0.tgz", - "integrity": "sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==", + "node_modules/@duplojs/http-client": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@duplojs/http-client/-/http-client-1.2.3.tgz", + "integrity": "sha512-tIDCWLHMfPv1zC3DYATa7buCRwa+2cDgBcdt2WGyArDvCGjclWmNofWF2Qry6O9ltsn3nF4H9wP47PaA9+By4g==", + "license": "MIT", + "workspaces": [ + "test/integration" + ] + }, + "node_modules/@duplojs/node": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@duplojs/node/-/node-1.0.3.tgz", + "integrity": "sha512-8+Xf5MCd8gOQM/LmDniK7xDo4ZLtpIGyvGkEneVSrUM9k0eeW892cnbw68pJxyKMAGdscuZi38gWKa8bn5/s2A==", "license": "MIT", + "workspaces": [ + "test/integration" + ], "dependencies": { - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/visitor-keys": "8.23.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@duplojs/utils": "0.2.1", + "busboy": "1.6.0", + "fast-querystring": "1.1.2" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.8.0" + "@duplojs/core": ">=1.0.0 <2.0.0" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/utils": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.23.0.tgz", - "integrity": "sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==", + "node_modules/@duplojs/node/node_modules/@duplojs/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-JqERH2vRVOj0N407g2qOPB+FhItXRg1BQKzO3+4D5Q1mJTeb/2aHadq4RKZQ9TUL1fAdoROCvYLkOQOW+yXozg==", "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.23.0", - "@typescript-eslint/types": "8.23.0", - "@typescript-eslint/typescript-estree": "8.23.0" - }, + "workspaces": [ + "test/integration" + ] + }, + "node_modules/@duplojs/playwright": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@duplojs/playwright/-/playwright-0.2.0.tgz", + "integrity": "sha512-5KTc6CmdeERXbhiYuvQq3W9vg+Kbb7qB9Li/xV8pr5pZjsfSKKTPBqNbMfLYPnHniAF+42M3rY+YAJbV/B+lSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "integration", + "docs" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=22.15.1" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.8.0" + "@duplojs/utils": ">=1.9.2 <2.0.0", + "playwright": ">=1.59.1 <2.0.0" } }, - "node_modules/@duplojs/eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.23.0.tgz", - "integrity": "sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==", + "node_modules/@duplojs/server-utils": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@duplojs/server-utils/-/server-utils-0.4.1.tgz", + "integrity": "sha512-1afpRSwr6fmImw+JhOQESQADtXf6qtQo43y3JgeARe0S2f95AoljAB+XtcIXE3SuxW8pXOnIhWVfXfeKT5qHxg==", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.23.0", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@duplojs/eslint/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@duplojs/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@duplojs/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "workspaces": [ + "integration", + "docs" + ], "engines": { - "node": ">=10" + "node": ">=22.15.1" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "peerDependencies": { + "@duplojs/utils": ">=1.9.1 <2.0.0" } }, - "node_modules/@duplojs/eslint/node_modules/eslint": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", - "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", + "node_modules/@duplojs/types-codegen": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@duplojs/types-codegen/-/types-codegen-1.1.3.tgz", + "integrity": "sha512-n22cG9nu7XNaj8deVC6VgRAy7dnkHl4snlEPC6YBlk0suGppx10Hf+adqy5SVG9GCzRfMkIL2Oc6Ba7oOlHhgQ==", + "dev": true, "license": "MIT", + "workspaces": [ + "test/integration" + ], "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.33.0", - "@eslint/plugin-kit": "^0.3.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "@duplojs/utils": "0.3.1", + "@duplojs/zod-to-typescript": "0.4.2", + "commander": "12.1.0", + "ignore": "6.0.2", + "typescript": "5.5.4", + "watcher": "2.3.1" }, "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" + "duplojs-types-codegen": "dist/bin/index.js" }, "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/@duplojs/eslint/node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" + "@duplojs/core": ">=1.0.0 <2.0.0" } }, - "node_modules/@duplojs/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@duplojs/types-codegen/node_modules/@duplojs/utils": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-0.3.1.tgz", + "integrity": "sha512-SNLsLrMQjWxdtjLI/nZxw6rMnS9LjI4tlV+JBfGLIW4TitXOluTZSKb0KF0v13FbC/1o0Vj68x/uZ3bh42k0cg==", + "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "workspaces": [ + "test/integration" + ] }, - "node_modules/@duplojs/eslint/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/@duplojs/types-codegen/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=18" } }, - "node_modules/@duplojs/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "license": "MIT" - }, - "node_modules/@duplojs/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" + "node_modules/@duplojs/types-codegen/node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.17" } }, - "node_modules/@duplojs/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@duplojs/utils": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-1.9.9.tgz", + "integrity": "sha512-U8l948ka2ObxZP2LfmVljpQlKfo/jdNBrsKqnJyGMM9wASGx6FnhrUxxA18EhK7d/N+0JbniQgNaqDWKOBhPgA==", "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, + "workspaces": [ + "integration", + "docs" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=22.15.1" } }, - "node_modules/@duplojs/eslint/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==", + "node_modules/@duplojs/zod-accelerator": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@duplojs/zod-accelerator/-/zod-accelerator-2.6.2.tgz", + "integrity": "sha512-FihQZ4FGqK5Px24ze63nxkmc07sZAt66wKh9/fwu1y0YiOIhMj298tIYFfA/Wg/tl8H4brW0W89pfZGUrCV4oQ==", "license": "MIT", - "engines": { - "node": ">=8" + "workspaces": [ + "test/integration" + ], + "peerDependencies": { + "zod": ">=3.0.0 <4.0.0" } }, - "node_modules/@duplojs/eslint/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==", + "node_modules/@duplojs/zod-to-typescript": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@duplojs/zod-to-typescript/-/zod-to-typescript-0.4.2.tgz", + "integrity": "sha512-W45xPeaGleN4LVnUcZXMoh2IulndYH0+OZDdqPs0/9FtTf/ILTmrX6GvVgauQKrdYzYv1SBmVygkReNMkJZ6ZA==", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "typescript": "5.5.4" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "zod": ">=3.23.8 <4.0.0" } }, - "node_modules/@duplojs/eslint/node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@duplojs/http": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@duplojs/http/-/http-0.13.1.tgz", - "integrity": "sha512-ew8mDpprUs1NpH5hXpRXw/ahb4THHYWFw0q0uAqIqllW84oJf3UI72NAbNijcDZSVLJ2X28k/G7dOOP9E8kR+g==", - "license": "MIT", - "workspaces": [ - "integration", - "docs" - ], - "engines": { - "node": ">=22.15.1" - }, - "peerDependencies": { - "@duplojs/data-parser-tools": ">=0.5.5 <1.0.0", - "@duplojs/server-utils": ">=0.4.1 <1.0.0", - "@duplojs/utils": ">=1.9.2 <2.0.0" - } - }, - "node_modules/@duplojs/http-client": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@duplojs/http-client/-/http-client-1.2.3.tgz", - "integrity": "sha512-tIDCWLHMfPv1zC3DYATa7buCRwa+2cDgBcdt2WGyArDvCGjclWmNofWF2Qry6O9ltsn3nF4H9wP47PaA9+By4g==", - "license": "MIT", - "workspaces": [ - "test/integration" - ] - }, - "node_modules/@duplojs/node": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@duplojs/node/-/node-1.0.3.tgz", - "integrity": "sha512-8+Xf5MCd8gOQM/LmDniK7xDo4ZLtpIGyvGkEneVSrUM9k0eeW892cnbw68pJxyKMAGdscuZi38gWKa8bn5/s2A==", - "license": "MIT", - "workspaces": [ - "test/integration" - ], - "dependencies": { - "@duplojs/utils": "0.2.1", - "busboy": "1.6.0", - "fast-querystring": "1.1.2" - }, - "peerDependencies": { - "@duplojs/core": ">=1.0.0 <2.0.0" - } - }, - "node_modules/@duplojs/node/node_modules/@duplojs/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-JqERH2vRVOj0N407g2qOPB+FhItXRg1BQKzO3+4D5Q1mJTeb/2aHadq4RKZQ9TUL1fAdoROCvYLkOQOW+yXozg==", - "license": "MIT", - "workspaces": [ - "test/integration" - ] - }, - "node_modules/@duplojs/playwright": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@duplojs/playwright/-/playwright-0.2.0.tgz", - "integrity": "sha512-5KTc6CmdeERXbhiYuvQq3W9vg+Kbb7qB9Li/xV8pr5pZjsfSKKTPBqNbMfLYPnHniAF+42M3rY+YAJbV/B+lSg==", - "dev": true, - "license": "MIT", - "workspaces": [ - "integration", - "docs" - ], - "engines": { - "node": ">=22.15.1" - }, - "peerDependencies": { - "@duplojs/utils": ">=1.9.2 <2.0.0", - "playwright": ">=1.59.1 <2.0.0" - } - }, - "node_modules/@duplojs/server-utils": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@duplojs/server-utils/-/server-utils-0.4.1.tgz", - "integrity": "sha512-1afpRSwr6fmImw+JhOQESQADtXf6qtQo43y3JgeARe0S2f95AoljAB+XtcIXE3SuxW8pXOnIhWVfXfeKT5qHxg==", - "license": "MIT", - "workspaces": [ - "integration", - "docs" - ], - "engines": { - "node": ">=22.15.1" - }, - "peerDependencies": { - "@duplojs/utils": ">=1.9.1 <2.0.0" - } - }, - "node_modules/@duplojs/types-codegen": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@duplojs/types-codegen/-/types-codegen-1.1.3.tgz", - "integrity": "sha512-n22cG9nu7XNaj8deVC6VgRAy7dnkHl4snlEPC6YBlk0suGppx10Hf+adqy5SVG9GCzRfMkIL2Oc6Ba7oOlHhgQ==", - "dev": true, - "license": "MIT", - "workspaces": [ - "test/integration" - ], - "dependencies": { - "@duplojs/utils": "0.3.1", - "@duplojs/zod-to-typescript": "0.4.2", - "commander": "12.1.0", - "ignore": "6.0.2", - "typescript": "5.5.4", - "watcher": "2.3.1" - }, - "bin": { - "duplojs-types-codegen": "dist/bin/index.js" - }, - "peerDependencies": { - "@duplojs/core": ">=1.0.0 <2.0.0" - } - }, - "node_modules/@duplojs/types-codegen/node_modules/@duplojs/utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-0.3.1.tgz", - "integrity": "sha512-SNLsLrMQjWxdtjLI/nZxw6rMnS9LjI4tlV+JBfGLIW4TitXOluTZSKb0KF0v13FbC/1o0Vj68x/uZ3bh42k0cg==", - "dev": true, - "license": "MIT", - "workspaces": [ - "test/integration" - ] - }, - "node_modules/@duplojs/types-codegen/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@duplojs/types-codegen/node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@duplojs/utils": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@duplojs/utils/-/utils-1.9.2.tgz", - "integrity": "sha512-xCLtiK7KqyiD4hWU4HFSo7XA4MZ8Z6UM86DUIuc+L7geG806t0q2iOY/A3PhdjD/XhNidToGhJ+8pt+a/TCPiQ==", - "license": "MIT", - "workspaces": [ - "integration", - "docs" - ], - "engines": { - "node": ">=22.15.1" - } - }, - "node_modules/@duplojs/zod-accelerator": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@duplojs/zod-accelerator/-/zod-accelerator-2.6.2.tgz", - "integrity": "sha512-FihQZ4FGqK5Px24ze63nxkmc07sZAt66wKh9/fwu1y0YiOIhMj298tIYFfA/Wg/tl8H4brW0W89pfZGUrCV4oQ==", - "license": "MIT", - "workspaces": [ - "test/integration" - ], - "peerDependencies": { - "zod": ">=3.0.0 <4.0.0" - } - }, - "node_modules/@duplojs/zod-to-typescript": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@duplojs/zod-to-typescript/-/zod-to-typescript-0.4.2.tgz", - "integrity": "sha512-W45xPeaGleN4LVnUcZXMoh2IulndYH0+OZDdqPs0/9FtTf/ILTmrX6GvVgauQKrdYzYv1SBmVygkReNMkJZ6ZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "typescript": "5.5.4" - }, - "peerDependencies": { - "zod": ">=3.23.8 <4.0.0" - } - }, - "node_modules/@duplojs/zod-to-typescript/node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, + "node_modules/@duplojs/zod-to-typescript/node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -2420,22 +2103,21 @@ } }, "node_modules/@elastic/transport/node_modules/undici": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.26.0.tgz", - "integrity": "sha512-4yqz8a3n5HmGTlsbADNtr/dJlhkh/55Rq798G6ibiULcXbDtaLpTl1pvdqcbFfeoj3iSi52lePFM7h9H21cw/A==", + "version": "6.27.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz", + "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==", "license": "MIT", "engines": { "node": ">=18.17" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2446,13 +2128,12 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2463,13 +2144,12 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2480,13 +2160,12 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2497,13 +2176,12 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2514,13 +2192,12 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2531,13 +2208,12 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2548,13 +2224,12 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2565,13 +2240,12 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2582,13 +2256,12 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2599,13 +2272,12 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2616,13 +2288,12 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2633,13 +2304,12 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2650,13 +2320,12 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2667,13 +2336,12 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2684,13 +2352,12 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2701,13 +2368,12 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", - "cpu": [ + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2718,13 +2384,12 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2735,13 +2400,12 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2752,13 +2416,12 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2769,13 +2432,12 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2786,13 +2448,12 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2803,13 +2464,12 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2820,13 +2480,12 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2837,13 +2496,12 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -2854,13 +2512,12 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -3868,9 +3525,9 @@ } }, "node_modules/@google-cloud/storage/node_modules/fast-xml-parser": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.8.0.tgz", - "integrity": "sha512-6bIM7fsJxeo3uXv7OncQYsBAMPJ7V16Slahl/6M98C/i2q+vB1+4a0MtrvYwDFEUrwDSbAmeLDRXsOBwrL7yAg==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.9.2.tgz", + "integrity": "sha512-DYPkXnVSJHAGAkSBeVYhEo/seIpz2SLr9OQcX7m6lXaX3gvoB+DCKzFdZIEhZGI3I1DUhObBAUOT/v2xfoXz/w==", "funding": [ { "type": "github", @@ -3880,10 +3537,11 @@ "license": "MIT", "optional": true, "dependencies": { - "@nodable/entities": "^2.1.0", + "@nodable/entities": "^2.2.0", "fast-xml-builder": "^1.2.0", + "is-unsafe": "^1.0.1", "path-expression-matcher": "^1.5.0", - "strnum": "^2.3.0", + "strnum": "^2.4.0", "xml-naming": "^0.1.0" }, "bin": { @@ -4176,6 +3834,10 @@ "resolved": "libs/clean", "link": true }, + "node_modules/@lib/client-type": { + "resolved": "services/libs/client-type", + "link": true + }, "node_modules/@lib/clients-type": { "resolved": "libs/clients-type", "link": true @@ -4228,9 +3890,9 @@ } }, "node_modules/@nodable/entities": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.1.tgz", - "integrity": "sha512-Pig3HxDIoMgjdEH8OCf/dkcTmLFjJRjWuq8jSnklu284/TKOPibSRERmOykiwmyXTtv61mP+44f3GMx0tLAyjg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==", "funding": [ { "type": "github", @@ -4374,9 +4036,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", - "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", + "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -5339,12 +5001,6 @@ "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "license": "BSD-3-Clause" }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.2.tgz", - "integrity": "sha512-pa0vFRuws4wkvaXKK1uXZMAwAX4/t8ANaJo45iw/oQHNQ9q5xUzwgFmVJGXiga2BeN+zpX7Vf9vmsiIa2J+MUw==", - "license": "BSD-3-Clause" - }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", @@ -5387,9 +5043,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", - "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.0.tgz", + "integrity": "sha512-IPIQ55ythEHkfEd9jMEi32OQ7SxURsGA43JI22lj01OLZNt2NUbJX8YUHxkVWyQ6daHPNn0truF5nSj3DQp6YQ==", "cpu": [ "arm" ], @@ -5400,9 +5056,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", - "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.0.tgz", + "integrity": "sha512-M6s9cr10MibETyo8JsOkq+Lo1+lU6hcvb1MApnUql5qte/5hMEgzlN8/ReIKNfRV8rrqX50W1BX9zoUhC192RA==", "cpu": [ "arm64" ], @@ -5413,9 +5069,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", - "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.0.tgz", + "integrity": "sha512-BqCoMoIbn0keKys+dEAdBa70EtOwV1bEsQCUgU9FdiZmmMge/Zk7LlkYGqbrdHR+Frnt0E1FOanly+rlwvvQzw==", "cpu": [ "arm64" ], @@ -5426,9 +5082,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", - "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.0.tgz", + "integrity": "sha512-SIMzST3VFNXDAbeIWDWiFCNM5qncUBDWaEV7NfE7oZbDt2mgfW4MvbKdbYiGOLoM32gbTv608UMd0XktEYSD7w==", "cpu": [ "x64" ], @@ -5439,9 +5095,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", - "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.0.tgz", + "integrity": "sha512-ezjfSQMP7ArdUsbBwbQIfwAlhE84I2iVnzQNCFSveqV42q+BmKlzVpf7mxv5EchLcoWU4y6/heFzVg1F+hodUQ==", "cpu": [ "arm64" ], @@ -5452,9 +5108,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", - "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.0.tgz", + "integrity": "sha512-9+qTWGW9AZRhnUgwtTwzNwcPlL87ngkeN0LA+q1bADvmY9aNvWaF2TFW8BZgnQPYxpDI7+rMVLivcd4V737TAQ==", "cpu": [ "x64" ], @@ -5465,9 +5121,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", - "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.0.tgz", + "integrity": "sha512-T1dMEQhXA/jkJ/jyMIw9IovK8bSUq7A8kLIlvZTb/6YIVsp2zLavr4F3oyllHWo7eIVJRyE5n3tUjQJEbE1IuQ==", "cpu": [ "arm" ], @@ -5478,9 +5134,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", - "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.0.tgz", + "integrity": "sha512-2as0LgT7qQpyceQq6VUJYnumUMUrgGQCWIiDIN9DE0/tglsk6o66uCB4f3djRawAltvfCNLyZZrsqbPA6inCsA==", "cpu": [ "arm" ], @@ -5491,9 +5147,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", - "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.0.tgz", + "integrity": "sha512-bVURMg+6eNN9C/yc0aVjooZcwTTtYF4YW3xta5pP0//r3o1V8gXEHXWCndj47w/HhwsFroZrFhR+6uQP5T0n0g==", "cpu": [ "arm64" ], @@ -5504,9 +5160,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", - "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.0.tgz", + "integrity": "sha512-Ful8pM/2yYI83PViWdFdpZhdI8HJ5qsXANe5atypbHDf+KIBBDsZsbyy8hbXnULVvW9NsTh5DHwbcBftyLTfiw==", "cpu": [ "arm64" ], @@ -5517,9 +5173,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", - "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.0.tgz", + "integrity": "sha512-9Gp/DgrkzfUBmNPVTyPTvay+4xEP7M/clXpj3efXBcm6uTIVIgDg4rqUpqKXvLEuFRVuEpSAOkhgNeecvaZ4Cg==", "cpu": [ "loong64" ], @@ -5530,9 +5186,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", - "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.0.tgz", + "integrity": "sha512-m9tsJz54LUXkSYM8+8PG81B9IKK5r+2T0clMq4QrS16xFosufU7firBDAZEsDheDs7wTlP7h3++S7lMsU955HA==", "cpu": [ "loong64" ], @@ -5543,9 +5199,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", - "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.0.tgz", + "integrity": "sha512-3UvJ5PNVU16aJf6M3tFI24pWzAl2/ynfbyRN3ICyQajK1lSkrnVYNnLz3v04J32qKa0FczJc22zeToc0lr2A3w==", "cpu": [ "ppc64" ], @@ -5556,9 +5212,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", - "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.0.tgz", + "integrity": "sha512-vRWUAbYLGHBZS6Q8Msb2sfnf1fvJf+47t8l/TwOerM2qArzy+IeNMTHrYLHXh95h8MoatPHI5hhSZNs+mGXKPg==", "cpu": [ "ppc64" ], @@ -5569,9 +5225,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", - "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.0.tgz", + "integrity": "sha512-c00T5SYENHAt86cfW47URaP3Us5vLC/4QO7GYud1G5VNRffCwwCuBspwqYrriuJB+5m0WFzClCn9wed0FBjKvg==", "cpu": [ "riscv64" ], @@ -5582,9 +5238,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", - "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.0.tgz", + "integrity": "sha512-krrCDilhXOwFkSkO3Wm9I/f9H0L92XHHwy2fwxjukxIbh0dem8gZqOW5Y8BsHrpJv5qwlRBV+Wl4ZFyRWhUpwg==", "cpu": [ "riscv64" ], @@ -5595,9 +5251,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", - "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.0.tgz", + "integrity": "sha512-7pfYFSTc4/rUC/FtAI0Qp6QthDBCIi6/AuP1xYqFk5vanI6KnL5dWKP60OM/05LOsbwTmIcvr6eXC4CJuJ75IA==", "cpu": [ "s390x" ], @@ -5608,9 +5264,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", - "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.0.tgz", + "integrity": "sha512-7SDIalKeIpG0Ifogbbdn58HmSotYMlf23K3dCJEmiVd9Fg36Vmni82iPQec27N3wY4Bvbxftkxz6vSx9OcouTg==", "cpu": [ "x64" ], @@ -5621,9 +5277,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", - "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.0.tgz", + "integrity": "sha512-eRZevouTH2i1HeAVLqJuLnt256krQkGY0TN6WsTmsIhuzbh457HuWDMakKwmi0Cjadux983CoSr8Lim2QhUIFw==", "cpu": [ "x64" ], @@ -5634,9 +5290,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", - "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.0.tgz", + "integrity": "sha512-3oVS7FLGa4U1qcvao9ylGxrjXZyUQqR8UwxEcnUEyPX53O/C/mKDZegNXTdHCP+h3e6ta/f1EN38Yif1mmZHYg==", "cpu": [ "x64" ], @@ -5647,9 +5303,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", - "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.0.tgz", + "integrity": "sha512-yTB9TgfWj5wHe5QgktAgXTLLot1gvEjl1NiPPAUiCs4oPrIWFl5V4nC3GrkNdj9LaAU4s94nVrGbGOCqUpyWsg==", "cpu": [ "arm64" ], @@ -5660,9 +5316,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", - "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.0.tgz", + "integrity": "sha512-5LOhoaesY3doG1c+ac/2JtgREpKoJr5bUHH8tKY0V8di7+uSV6BwLs2PlR0/yzefGOkR+wE7ZolZphHCsyG5Rw==", "cpu": [ "arm64" ], @@ -5673,9 +5329,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", - "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.0.tgz", + "integrity": "sha512-yYkWHhmbhRTWTnWos5HC4GcPQfjlzzCNbM9e/+GXrLuaBXYA3qSDR9f0Vgufd5S8yX81U8jPKp7ZnAjZFMtRnw==", "cpu": [ "ia32" ], @@ -5686,9 +5342,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", - "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.0.tgz", + "integrity": "sha512-SoTb6lPg25xZlA2ibwQ++ahCCnH+FP0qmEuafMJ4gznZKOlXioKEAeJLgCrqjM98ACziXM9V1amFjICVL4IFoA==", "cpu": [ "x64" ], @@ -5699,9 +5355,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", - "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.0.tgz", + "integrity": "sha512-5L+T1fMX4RIEBoZzT0+sQ0PhTS36NULFmMXtl1TZo44TMAROIMHbZufSOjVWt/Y622BtxgxtaNOokbTDvfsrZA==", "cpu": [ "x64" ], @@ -6249,9 +5905,9 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.0.tgz", - "integrity": "sha512-gOxY/hFkPh/XQYhnThBHzkbkX3Ed+z/iushyz+R+JAr213aXxUDgQoTgTdrDpBSRsjFM73P/KfUyWmaF9WHMkQ==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.17.1.tgz", + "integrity": "sha512-VZyW2Uiml5tmBZwPGrSD3Sz73OxzljQMCmzYHsUTPEuTsERf5xwa+uWb01xEzkz3ZSYTjj8NEb/mKHvgKxyZdA==", "license": "MIT", "funding": { "type": "github", @@ -6278,12 +5934,12 @@ } }, "node_modules/@tanstack/vue-virtual": { - "version": "3.13.28", - "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.28.tgz", - "integrity": "sha512-A+jWpXtMpWXKhGLKQrXeC9mk1VgYeMWSJ+o0CTCEi+HLYMSQFdVmPG9lJz7d4XJyIkc5xVwZU9QY67QpScqnxA==", + "version": "3.13.29", + "resolved": "https://registry.npmjs.org/@tanstack/vue-virtual/-/vue-virtual-3.13.29.tgz", + "integrity": "sha512-MWb9tNHjpar3sP34b8+3A4I5j9akveoPXIYqqp7/ipyWd49a/kso+1S1LqEmAVR/+g/k1WWTJC4ktvdCGWgXYQ==", "license": "MIT", "dependencies": { - "@tanstack/virtual-core": "3.17.0" + "@tanstack/virtual-core": "3.17.1" }, "funding": { "type": "github", @@ -6417,18 +6073,18 @@ } }, "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "version": "22.15.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.0.tgz", + "integrity": "sha512-99S8dWD2DkeE6PBaEDw+In3aar7hdoBvjyJMR6vaKBTzpvR0P00ClzJMOoVrj9D2+Sy/YCwACYHnBTpMhg1UCA==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/node/node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/@types/nodemailer": { @@ -6532,20 +6188,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.26.1.tgz", - "integrity": "sha512-2X3mwqsj9Bd3Ciz508ZUtoQQYpOhU/kWoUqIf49H8Z0+Vbh6UF/y0OEYp0Q0axOGzaBGs7QxRwq0knSQ8khQNA==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", + "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/type-utils": "8.26.1", - "@typescript-eslint/utils": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/type-utils": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.0.1" + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6555,55 +6210,31 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@typescript-eslint/parser": "^8.61.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">= 4" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "node_modules/@typescript-eslint/parser": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", + "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6613,19 +6244,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", + "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" + "@typescript-eslint/tsconfig-utils": "^8.61.1", + "@typescript-eslint/types": "^8.61.1", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6635,18 +6266,17 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", + "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6656,27 +6286,11 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.26.1.tgz", - "integrity": "sha512-w6HZUV4NWxqd8BdeFf81t07d7/YV9s7TCWrQQbG5uhuvGUAW+fq1usZ1Hmz9UPNLniFnD8GLSsDpjP0hm1S4lQ==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", + "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", - "debug": "^4.3.4" - }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6685,18 +6299,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", + "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6704,12 +6320,16 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "node_modules/@typescript-eslint/types": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", + "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6719,20 +6339,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", + "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" + "@typescript-eslint/project-service": "8.61.1", + "@typescript-eslint/tsconfig-utils": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6742,69 +6363,56 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "eslint-visitor-keys": "^4.2.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": "18 || 20 || >=22" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz", - "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.61.0", - "@typescript-eslint/types": "^8.61.0", - "debug": "^4.4.3" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" + "node": "18 || 20 || >=22" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz", - "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==", - "license": "MIT", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "18 || 20 || >=22" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz", - "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==", + "node_modules/@typescript-eslint/utils": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", + "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -6813,19 +6421,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.26.1.tgz", - "integrity": "sha512-Kcj/TagJLwoY/5w9JGEFV0dclQdyqw9+VMndxOJKtoFSjfZhLXhYjzsQEeyza03rwHx2vFEGvrJWJBXKleRvZg==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", + "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.26.1", - "@typescript-eslint/utils": "8.26.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.0.1" + "@typescript-eslint/types": "8.61.1", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6833,277 +6440,61 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", + "node_modules/@unovue/detypes": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@unovue/detypes/-/detypes-0.8.5.tgz", + "integrity": "sha512-Yz4JeWOHGa+w/3YudVdng8hgN/VGW9cvp8xmFkmPPFzalGblLPPSpIRiwVo853yLstMZO2LLwe0vOoLAQsUQXw==", + "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" + "@babel/core": "^7.24.5", + "@babel/preset-typescript": "^7.24.1", + "@vue/compiler-dom": "^3.4.27", + "@vue/compiler-sfc": "^3.4.27", + "@vuedx/template-ast-types": "0.7.1", + "fast-glob": "^3.3.2", + "prettier": "^3.2.5", + "typescript": "^5.4.5" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "bin": { + "detypes": "detype.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">=18" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^18.0.0 || >=20.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz", - "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz", - "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.61.0", - "@typescript-eslint/tsconfig-utils": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/visitor-keys": "8.61.0", - "debug": "^4.4.3", - "minimatch": "^10.2.2", - "semver": "^7.7.3", - "tinyglobby": "^0.2.15", - "ts-api-utils": "^2.5.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz", - "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==", - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.61.0", - "@typescript-eslint/types": "8.61.0", - "@typescript-eslint/typescript-estree": "8.61.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", - "typescript": ">=4.8.4 <6.1.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.61.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz", - "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.61.0", - "eslint-visitor-keys": "^5.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@unovue/detypes": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@unovue/detypes/-/detypes-0.8.5.tgz", - "integrity": "sha512-Yz4JeWOHGa+w/3YudVdng8hgN/VGW9cvp8xmFkmPPFzalGblLPPSpIRiwVo853yLstMZO2LLwe0vOoLAQsUQXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.24.5", - "@babel/preset-typescript": "^7.24.1", - "@vue/compiler-dom": "^3.4.27", - "@vue/compiler-sfc": "^3.4.27", - "@vuedx/template-ast-types": "0.7.1", - "fast-glob": "^3.3.2", - "prettier": "^3.2.5", - "typescript": "^5.4.5" - }, - "bin": { - "detypes": "detype.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitest/coverage-v8": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", - "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", + "node_modules/@vitest/coverage-v8": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.1.tgz", + "integrity": "sha512-MgV6D2dhpD6Hp/uroUoAIvFqA8AuvXEFBC2eepG3WFc1pxTfdk1LEqqkWoWhjz+rytoqrnUUCdf6Lzco3iHkLQ==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", @@ -7159,17 +6550,17 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz", + "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/spy": "4.1.9", + "@vitest/utils": "4.1.9", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -7225,9 +6616,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz", + "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==", "dev": true, "license": "MIT", "peer": true, @@ -7239,14 +6630,14 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz", + "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.1.9", "pathe": "^2.0.3" }, "funding": { @@ -7254,15 +6645,15 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz", + "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/pretty-format": "4.1.9", + "@vitest/utils": "4.1.9", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -7271,9 +6662,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz", + "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==", "dev": true, "license": "MIT", "peer": true, @@ -7282,14 +6673,14 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz", + "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@vitest/pretty-format": "4.1.8", + "@vitest/pretty-format": "4.1.9", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -7369,42 +6760,42 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.35.tgz", - "integrity": "sha512-BUmHaR1J+O+CKZ9uJucdVTEr1LHsdyvv7vG3eNRhK3CczEHeMd/LtsHAuD7PbrxvI2envCY2v7HI1vC1aBRzKw==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.38.tgz", + "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/shared": "3.5.35", + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.38", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.35.tgz", - "integrity": "sha512-k+bprkXxuqhVajgTx5mUHuir7TwQzUKOWR40ng1ncAqQRPnrLngGGgqVEEhOnTMlc8btHYVKmrP8s5Qyg0hvYA==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", + "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.35", - "@vue/shared": "3.5.35" + "@vue/compiler-core": "3.5.38", + "@vue/shared": "3.5.38" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.35.tgz", - "integrity": "sha512-G5VPMcXTSywXBgtFOZOnHKBxKSrwXUcvY1iaF5/hRcy7t0J6CH/d8ha9F4nzi00Fax1eLV0QHM7v4mQu68jydw==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", + "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/compiler-core": "3.5.35", - "@vue/compiler-dom": "3.5.35", - "@vue/compiler-ssr": "3.5.35", - "@vue/shared": "3.5.35", + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.38", + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.15", @@ -7412,14 +6803,14 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.35.tgz", - "integrity": "sha512-rGhAeXgdM7/ffTJGXT69rCCdTmjDewnFuUZfBQQHTdcEBeWdT5HCGY60y2ytLJr9/Dsu7IntUi5z/w0h6Rjnzw==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz", + "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.35", - "@vue/shared": "3.5.35" + "@vue/compiler-dom": "3.5.38", + "@vue/shared": "3.5.38" } }, "node_modules/@vue/compiler-vue2": { @@ -7577,9 +6968,9 @@ } }, "node_modules/@vue/shared": { - "version": "3.5.35", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.35.tgz", - "integrity": "sha512-zSbjL7gRXwks2ZQLRGCajBtBXEOXW9Ddhn/HvSdrGkE2dqGnumzW8XtusRrxrE9LvqtiqDXQ+A60Hp6mvdYxfA==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.38.tgz", + "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==", "dev": true, "license": "MIT" }, @@ -7668,9 +7059,9 @@ } }, "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -7789,9 +7180,9 @@ } }, "node_modules/anynum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.0.tgz", - "integrity": "sha512-xjR9/zBVnUOP6ztMIIgShjsxui80nQUQH+5xJnvrYLs+90bF25/KJqaAi8mk+B4RDtX1Nspi6fmp4YTEts8SfA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", "funding": [ { "type": "github", @@ -7821,14 +7212,20 @@ } }, "node_modules/apache-arrow/node_modules/@types/node": { - "version": "20.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.42.tgz", - "integrity": "sha512-5L7SUaFC1RyDraj2yRhyBzHTobyXHmohD100CChNtyPyleoq37Mqab5Gn8XEKI04dfN/oqPdpHk38MgcQWHbZg==", + "version": "20.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } }, + "node_modules/apache-arrow/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -7902,9 +7299,9 @@ } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.3.tgz", - "integrity": "sha512-jCMQ6ZylLPudp0CDfBmQBZUsrh1/8psbmu9ibeVWKuHWD0YrH9YABwlKu5kVEFoT0GCQQW9Z/SxfuEbbkGQCRg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.4.tgz", + "integrity": "sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==", "dev": true, "license": "MIT", "optional": true, @@ -8003,9 +7400,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.35", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.35.tgz", - "integrity": "sha512-honAfLBde0HAFLdNyBEfuuENkF6zR+ozxqxa/2zJKHBe1qzLqyTSeRKpdPEHAP03rlDGyQOPnCSxnVpVqQo9Mg==", + "version": "2.10.38", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8260,9 +7657,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001797", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz", - "integrity": "sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==", + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", "dev": true, "funding": [ { @@ -9251,9 +8648,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.370", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.370.tgz", - "integrity": "sha512-D5tSHJReAb/Kf3Hu9F/GO4lJuSWzEWHwvQ/kKSUP7pimNgvxkSKj+gUQhHpKKACwrin7rS3byU7IxreF56rl5g==", + "version": "1.5.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.375.tgz", + "integrity": "sha512-ZWP5eB4BVPW/ZYo9252hQZHZ5XavtsTgpbhcmMmRwymavC5AsLWQWBPaKMeNd2LW0KGby5HPXvj7+sr4ta5j/Q==", "dev": true, "license": "ISC" }, @@ -9275,9 +8672,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz", - "integrity": "sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.0.tgz", + "integrity": "sha512-SkE2t82KlkkxQRVMVLAGKxLfORGQfrkx5dkj+vlgXRVNEdPc4eZcR+J/Fvj8C+yKSFH5L0q3NFlyufOVQnCcYQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -9382,10 +8779,9 @@ } }, "node_modules/esbuild": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", - "dev": true, + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -9395,32 +8791,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.0", - "@esbuild/android-arm": "0.28.0", - "@esbuild/android-arm64": "0.28.0", - "@esbuild/android-x64": "0.28.0", - "@esbuild/darwin-arm64": "0.28.0", - "@esbuild/darwin-x64": "0.28.0", - "@esbuild/freebsd-arm64": "0.28.0", - "@esbuild/freebsd-x64": "0.28.0", - "@esbuild/linux-arm": "0.28.0", - "@esbuild/linux-arm64": "0.28.0", - "@esbuild/linux-ia32": "0.28.0", - "@esbuild/linux-loong64": "0.28.0", - "@esbuild/linux-mips64el": "0.28.0", - "@esbuild/linux-ppc64": "0.28.0", - "@esbuild/linux-riscv64": "0.28.0", - "@esbuild/linux-s390x": "0.28.0", - "@esbuild/linux-x64": "0.28.0", - "@esbuild/netbsd-arm64": "0.28.0", - "@esbuild/netbsd-x64": "0.28.0", - "@esbuild/openbsd-arm64": "0.28.0", - "@esbuild/openbsd-x64": "0.28.0", - "@esbuild/openharmony-arm64": "0.28.0", - "@esbuild/sunos-x64": "0.28.0", - "@esbuild/win32-arm64": "0.28.0", - "@esbuild/win32-ia32": "0.28.0", - "@esbuild/win32-x64": "0.28.0" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/esbuild-register": { @@ -10172,16 +9568,16 @@ } }, "node_modules/form-data": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", - "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.6.tgz", + "integrity": "sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA==", "license": "MIT", "optional": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", + "hasown": "^2.0.4", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" }, @@ -10292,64 +9688,55 @@ } }, "node_modules/gcp-metadata": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", - "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", "license": "Apache-2.0", "optional": true, "peer": true, "dependencies": { - "gaxios": "^5.0.0", + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", "json-bigint": "^1.0.0" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/gcp-metadata/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/gcp-metadata/node_modules/gaxios": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", - "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", - "license": "Apache-2.0", + "node_modules/gcp-metadata/node_modules/gaxios": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.5.tgz", + "integrity": "sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg==", + "license": "Apache-2.0", "optional": true, "peer": true, "dependencies": { "extend": "^3.0.2", - "https-proxy-agent": "^5.0.0", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9" + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/gcp-metadata/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/gcp-metadata/node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", "license": "MIT", "optional": true, "peer": true, "dependencies": { - "agent-base": "6", - "debug": "4" + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" }, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" } }, "node_modules/gensync": { @@ -10449,9 +9836,9 @@ } }, "node_modules/giget": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-3.2.0.tgz", - "integrity": "sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/giget/-/giget-3.3.0.tgz", + "integrity": "sha512-gzi2D96p+AMfDcmJHGDj3KJ9NRiwvlFAU5yfa3ROwWZmFUjX4P43x3BcyRaOMMLto1vUo7C+86+MFhYTl6Ryiw==", "devOptional": true, "license": "MIT", "bin": { @@ -11117,6 +10504,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-unsafe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-1.0.1.tgz", + "integrity": "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -12191,26 +11591,26 @@ "license": "MIT" }, "node_modules/mongodb": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", - "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.3.0.tgz", + "integrity": "sha512-WpCqSx7JAU9vcyjm/SU7ydnHls2YrfU3Y3sx4Ml9D7sPe4mXPlaapndiurDXrQ7/VvJkB4/i7b7WovHb8bd8sg==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", - "mongodb-connection-string-url": "^3.0.0" + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^7.2.0", + "mongodb-connection-string-url": "^7.0.0" }, "engines": { - "node": ">=16.20.1" + "node": ">=20.19.0" }, "peerDependencies": { - "@aws-sdk/credential-providers": "^3.188.0", - "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", - "gcp-metadata": "^5.2.0", - "kerberos": "^2.0.1", - "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", - "socks": "^2.7.1" + "@aws-sdk/credential-providers": "^3.806.0", + "@mongodb-js/zstd": "^7.0.0", + "gcp-metadata": "^7.0.1", + "kerberos": "^7.0.0", + "mongodb-client-encryption": ">=7.0.0 <7.1.0", + "snappy": "^7.3.2", + "socks": "^2.8.6" }, "peerDependenciesMeta": { "@aws-sdk/credential-providers": { @@ -12246,6 +11646,37 @@ "whatwg-url": "^14.1.0 || ^13.0.0" } }, + "node_modules/mongodb/node_modules/@types/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", + "license": "MIT", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/mongodb/node_modules/bson": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-7.3.0.tgz", + "integrity": "sha512-WmjjMEwFwZHmGnAb7wn90MhkiT+mTm4x/rLj7dvAPWfwnVWDXhLun2e+UM88MJoDGW624yzZglVX/zTBy9ZZMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/mongodb/node_modules/mongodb-connection-string-url": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz", + "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==", + "license": "Apache-2.0", + "dependencies": { + "@types/whatwg-url": "^13.0.0", + "whatwg-url": "^14.1.0" + }, + "engines": { + "node": ">=20.19.0" + } + }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -12398,9 +11829,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.47", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", - "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "version": "2.0.48", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", + "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", "dev": true, "license": "MIT", "engines": { @@ -12483,9 +11914,9 @@ } }, "node_modules/obug": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.2.tgz", - "integrity": "sha512-AWGB9WFcRXOQs48Z/udjI5ZcZMHXwX8XPByNpOydgcGsDLIzjGizhoMWJyKAWze7AVW/2W1i+/gPX4YtKe5cyg==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.3.tgz", + "integrity": "sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", @@ -13111,9 +12542,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -13312,9 +12743,9 @@ } }, "node_modules/protobufjs": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.2.tgz", - "integrity": "sha512-N9EiLovGEQOJSPF26Ij7qUGvahfEnq0eeYZ02aigIedkmz1qZSwjnP9SBITHJuF/6MYbIW4HDN8zdYjsjqJKXQ==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.4.tgz", + "integrity": "sha512-RJJPTTpvFfHcWLkIa2JFWK4XvtSzS0yEWDmunqHXli1h3JlkbcQZXDZdcWxv+JK3Xsl5/UFDPZ0iGm7DAengYw==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -13324,7 +12755,6 @@ "@protobufjs/eventemitter": "^1.1.1", "@protobufjs/fetch": "^1.1.1", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.2", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", @@ -13480,9 +12910,9 @@ } }, "node_modules/reka-ui": { - "version": "2.9.9", - "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.9.tgz", - "integrity": "sha512-/e+hdF9vP8E2kPrKR4RdgMQQsfpCr8l436Zn8GRWM3jKT9EG1lOO/UFMGBVEnrMLOVoJSjjmIFrej4tMOb+6qQ==", + "version": "2.9.10", + "resolved": "https://registry.npmjs.org/reka-ui/-/reka-ui-2.9.10.tgz", + "integrity": "sha512-yuvZVTp4fWH2G3qk+ze/x6YYlyc2Xl1d+eMUlIYrKqzTowBKteoDoN17fitURmqSUck3mc7JbcYgp49DnGu2EQ==", "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.6.13", @@ -13666,9 +13096,9 @@ } }, "node_modules/rollup": { - "version": "4.61.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", - "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "version": "4.62.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.0.tgz", + "integrity": "sha512-nc72Wgq62I7rtDV4izT5/aaS0zxy3kttkinf9586ApknY3jZO9NYsmtc24fUckA0X7Q2v+ML4a15pdUlV5V/jA==", "license": "MIT", "dependencies": { "@types/estree": "1.0.9" @@ -13681,31 +13111,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.61.1", - "@rollup/rollup-android-arm64": "4.61.1", - "@rollup/rollup-darwin-arm64": "4.61.1", - "@rollup/rollup-darwin-x64": "4.61.1", - "@rollup/rollup-freebsd-arm64": "4.61.1", - "@rollup/rollup-freebsd-x64": "4.61.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", - "@rollup/rollup-linux-arm-musleabihf": "4.61.1", - "@rollup/rollup-linux-arm64-gnu": "4.61.1", - "@rollup/rollup-linux-arm64-musl": "4.61.1", - "@rollup/rollup-linux-loong64-gnu": "4.61.1", - "@rollup/rollup-linux-loong64-musl": "4.61.1", - "@rollup/rollup-linux-ppc64-gnu": "4.61.1", - "@rollup/rollup-linux-ppc64-musl": "4.61.1", - "@rollup/rollup-linux-riscv64-gnu": "4.61.1", - "@rollup/rollup-linux-riscv64-musl": "4.61.1", - "@rollup/rollup-linux-s390x-gnu": "4.61.1", - "@rollup/rollup-linux-x64-gnu": "4.61.1", - "@rollup/rollup-linux-x64-musl": "4.61.1", - "@rollup/rollup-openbsd-x64": "4.61.1", - "@rollup/rollup-openharmony-arm64": "4.61.1", - "@rollup/rollup-win32-arm64-msvc": "4.61.1", - "@rollup/rollup-win32-ia32-msvc": "4.61.1", - "@rollup/rollup-win32-x64-gnu": "4.61.1", - "@rollup/rollup-win32-x64-msvc": "4.61.1", + "@rollup/rollup-android-arm-eabi": "4.62.0", + "@rollup/rollup-android-arm64": "4.62.0", + "@rollup/rollup-darwin-arm64": "4.62.0", + "@rollup/rollup-darwin-x64": "4.62.0", + "@rollup/rollup-freebsd-arm64": "4.62.0", + "@rollup/rollup-freebsd-x64": "4.62.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.0", + "@rollup/rollup-linux-arm-musleabihf": "4.62.0", + "@rollup/rollup-linux-arm64-gnu": "4.62.0", + "@rollup/rollup-linux-arm64-musl": "4.62.0", + "@rollup/rollup-linux-loong64-gnu": "4.62.0", + "@rollup/rollup-linux-loong64-musl": "4.62.0", + "@rollup/rollup-linux-ppc64-gnu": "4.62.0", + "@rollup/rollup-linux-ppc64-musl": "4.62.0", + "@rollup/rollup-linux-riscv64-gnu": "4.62.0", + "@rollup/rollup-linux-riscv64-musl": "4.62.0", + "@rollup/rollup-linux-s390x-gnu": "4.62.0", + "@rollup/rollup-linux-x64-gnu": "4.62.0", + "@rollup/rollup-linux-x64-musl": "4.62.0", + "@rollup/rollup-openbsd-x64": "4.62.0", + "@rollup/rollup-openharmony-arm64": "4.62.0", + "@rollup/rollup-win32-arm64-msvc": "4.62.0", + "@rollup/rollup-win32-ia32-msvc": "4.62.0", + "@rollup/rollup-win32-x64-gnu": "4.62.0", + "@rollup/rollup-win32-x64-msvc": "4.62.0", "fsevents": "~2.3.2" } }, @@ -13799,9 +13229,9 @@ "license": "BSD-3-Clause" }, "node_modules/semver": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", - "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -14180,9 +13610,9 @@ "license": "MIT" }, "node_modules/strnum": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.0.tgz", - "integrity": "sha512-sHrVyWWdq28RbhjuJdZsA1SnGRJV6NiXbk6AXBxDOsgAcA+lmpUZCYjOdLBxkXMwis6RRe7dlZt4VlIWFVzkmg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz", + "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==", "funding": [ { "type": "github", @@ -14191,7 +13621,7 @@ ], "license": "MIT", "dependencies": { - "anynum": "^1.0.0" + "anynum": "^1.0.1" } }, "node_modules/stubborn-fs": { @@ -14430,9 +13860,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.0.tgz", - "integrity": "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", + "integrity": "sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==", "license": "MIT", "peer": true }, @@ -14766,6 +14196,7 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "deprecated": "unmaintained", "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" @@ -14789,12 +14220,13 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", - "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "devOptional": true, "license": "MIT", "dependencies": { - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -14808,9 +14240,9 @@ } }, "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "cpu": [ "ppc64" ], @@ -14819,14 +14251,15 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "cpu": [ "arm" ], @@ -14835,14 +14268,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "cpu": [ "arm64" ], @@ -14851,14 +14285,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" ], @@ -14867,14 +14302,15 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "cpu": [ "arm64" ], @@ -14883,14 +14319,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "cpu": [ "x64" ], @@ -14899,14 +14336,15 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "cpu": [ "arm64" ], @@ -14915,14 +14353,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "cpu": [ "x64" ], @@ -14931,14 +14370,15 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "cpu": [ "arm" ], @@ -14947,14 +14387,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "cpu": [ "arm64" ], @@ -14963,14 +14404,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "cpu": [ "ia32" ], @@ -14979,14 +14421,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "cpu": [ "loong64" ], @@ -14995,14 +14438,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "cpu": [ "mips64el" ], @@ -15011,14 +14455,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "cpu": [ "ppc64" ], @@ -15027,14 +14472,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "cpu": [ "riscv64" ], @@ -15043,14 +14489,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "cpu": [ "s390x" ], @@ -15059,14 +14506,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "cpu": [ "x64" ], @@ -15075,14 +14523,15 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "cpu": [ "arm64" ], @@ -15091,14 +14540,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "cpu": [ "x64" ], @@ -15107,14 +14557,15 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "cpu": [ "arm64" ], @@ -15123,14 +14574,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "cpu": [ "x64" ], @@ -15139,14 +14591,15 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "cpu": [ "arm64" ], @@ -15155,14 +14608,15 @@ "os": [ "openharmony" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ "x64" ], @@ -15171,14 +14625,15 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ "arm64" ], @@ -15187,14 +14642,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ "ia32" ], @@ -15203,14 +14659,15 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], @@ -15219,14 +14676,16 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=18" } }, "node_modules/tsx/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "devOptional": true, "hasInstallScript": true, "license": "MIT", "bin": { @@ -15236,32 +14695,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/tw-animate-css": { @@ -15286,9 +14745,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -15299,93 +14758,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.26.1.tgz", - "integrity": "sha512-t/oIs9mYyrwZGRpDv3g+3K6nZ5uhKEMt2oNmAPwaY4/ye0+EH4nXIPYNtkYFS6QHm+1DFg34DbglYBz5P9Xysg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "8.26.1", - "@typescript-eslint/parser": "8.26.1", - "@typescript-eslint/utils": "8.26.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.26.1.tgz", - "integrity": "sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.26.1.tgz", - "integrity": "sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==", - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.26.1.tgz", - "integrity": "sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/visitor-keys": "8.26.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.26.1.tgz", - "integrity": "sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", + "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.26.1", - "@typescript-eslint/types": "8.26.1", - "@typescript-eslint/typescript-estree": "8.26.1" + "@typescript-eslint/eslint-plugin": "8.61.1", + "@typescript-eslint/parser": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/utils": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -15395,25 +14776,8 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.26.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.26.1.tgz", - "integrity": "sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==", - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.26.1", - "eslint-visitor-keys": "^4.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/typical": { @@ -15471,9 +14835,9 @@ } }, "node_modules/undici": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.27.2.tgz", - "integrity": "sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", "dev": true, "license": "MIT", "engines": { @@ -15481,9 +14845,10 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "dev": true, "license": "MIT" }, "node_modules/unicorn-magic": { @@ -15791,9 +15156,9 @@ } }, "node_modules/uuidv7": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", - "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.2.1.tgz", + "integrity": "sha512-4kPkK3/XTQW9Hbm4CaqfICn+kY9LJtDVEOfgsRRra/+n2Ofg4NqzRFceAkxvQ/Ud/6BpHOPzj8cirqM7TzTN5Q==", "license": "Apache-2.0", "bin": { "uuidv7": "cli.js" @@ -15920,493 +15285,36 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], + "node_modules/vitest": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", + "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/vitest": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.1.tgz", - "integrity": "sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==", - "license": "MIT", - "dependencies": { - "@vitest/expect": "3.1.1", - "@vitest/mocker": "3.1.1", - "@vitest/pretty-format": "^3.1.1", - "@vitest/runner": "3.1.1", - "@vitest/snapshot": "3.1.1", - "@vitest/spy": "3.1.1", - "@vitest/utils": "3.1.1", - "chai": "^5.2.0", - "debug": "^4.4.0", - "expect-type": "^1.2.0", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "std-env": "^3.8.1", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinypool": "^1.0.2", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.1.1", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, + "dependencies": { + "@vitest/expect": "3.1.1", + "@vitest/mocker": "3.1.1", + "@vitest/pretty-format": "^3.1.1", + "@vitest/runner": "3.1.1", + "@vitest/snapshot": "3.1.1", + "@vitest/spy": "3.1.1", + "@vitest/utils": "3.1.1", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.2.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.1", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.1.1", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, "engines": { "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, @@ -17186,214 +16094,54 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrapjs": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", - "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", - "license": "MIT", - "engines": { - "node": ">=12.17" - } - }, - "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==", - "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==", - "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==", - "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==", - "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==", - "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==", - "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==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "license": "MIT" - }, - "node_modules/wrap-ansi/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==", - "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/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xml-naming": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", - "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "optional": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "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==", - "license": "ISC", - "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "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/wordwrapjs": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.1.tgz", + "integrity": "sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==", + "license": "MIT", + "engines": { + "node": ">=12.17" + } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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==", "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" + "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/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==", - "license": "ISC", + "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==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/yargs/node_modules/ansi-regex": { + "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==", @@ -17402,13 +16150,13 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/emoji-regex": { + "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==", "license": "MIT" }, - "node_modules/yargs/node_modules/string-width": { + "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==", @@ -17422,7 +16170,7 @@ "node": ">=8" } }, - "node_modules/yargs/node_modules/strip-ansi": { + "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==", @@ -17434,815 +16182,665 @@ "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==", + "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==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.24.2", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", - "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "services/abys": { - "name": "@service/abys", - "hasInstallScript": true, - "dependencies": { - "@duplojs/core": "1.0.3", - "@duplojs/http-client": "1.2.3", - "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", - "commander": "13.1.0", - "dotenv": "16.4.5", - "dotenv-expand": "12.0.1", - "mongodb": "6.15.0", - "ts-pattern": "5.7.0", - "uuidv7": "1.0.2" - }, - "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@types/node": "22.13.10", - "tsx": "4.19.3", - "typescript": "5.8.2" - } - }, - "services/abys/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "services/beacon": { - "name": "@service/beacon", - "hasInstallScript": true, - "dependencies": { - "@duplojs/core": "1.0.3", - "@duplojs/node": "1.0.3", - "dotenv": "16.4.5", - "dotenv-expand": "12.0.1", - "mongodb": "6.15.0", - "ts-pattern": "^5.7.1", - "uuidv7": "1.0.2" - }, - "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@types/node": "22.13.10", - "tsx": "4.19.3", - "typescript": "5.8.2" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "services/beacon/node_modules/ts-pattern": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", - "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", + "node_modules/wrap-ansi/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==", "license": "MIT" }, - "services/beacon/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "services/bottle": { - "name": "@service/bottle", - "hasInstallScript": true, - "dependencies": { - "@duplojs/core": "1.0.3", - "@duplojs/node": "1.0.3", - "dotenv": "16.4.5", - "dotenv-expand": "12.0.1", - "nodemailer": "7.0.3", - "ts-pattern": "5.7.0", - "uuidv7": "1.0.2" - }, - "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@types/node": "22.13.10", - "@types/nodemailer": "6.4.17", - "tsx": "4.19.3", - "typescript": "5.8.2" - } - }, - "services/bottle/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "services/bridge": { - "name": "@service/bridge", - "hasInstallScript": true, - "dependencies": { - "@duplojs/core": "1.0.3", - "@duplojs/http-client": "1.2.3", - "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", - "dotenv": "16.4.5", - "dotenv-expand": "12.0.1", - "ts-pattern": "5.7.0" - }, - "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@types/node": "22.13.10", - "tsx": "4.19.3", - "typescript": "5.8.2" - } - }, - "services/bridge/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "services/coral": { - "name": "@service/coral", - "dependencies": { - "@duplojs/http": "0.13.1", - "@duplojs/server-utils": "0.4.1", - "@duplojs/utils": "1.9.2", - "mongodb": "7.0.0", - "uuidv7": "1.1.0" - }, - "devDependencies": { - "@types/node": "22.15.0", - "tsx": "4.21.0", - "typescript": "5.9.3" - } - }, - "services/coral/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "node_modules/wrap-ansi/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==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=18" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "services/coral/node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "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==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } ], - "dev": true, "license": "MIT", "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=16.0.0" } }, - "services/coral/node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "dev": 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==", "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": ">=0.4" } }, - "services/coral/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=10" } }, - "services/coral/node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], + "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==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "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": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "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==", + "license": "ISC", "engines": { - "node": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "dev": true, + "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==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": ">=8" } }, - "services/coral/node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "dev": true, + "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==", + "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==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "services/coral/node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "dev": true, + "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==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=18" + "node": ">=8" } }, - "services/coral/node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "dev": true, + "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==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "services/coral/node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/zod": { + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "services/abys": { + "name": "@service/abys", + "hasInstallScript": true, + "dependencies": { + "@duplojs/core": "1.0.3", + "@duplojs/http-client": "1.2.3", + "@duplojs/node": "1.0.3", + "@duplojs/utils": "1.9.9", + "commander": "13.1.0", + "dotenv": "16.4.5", + "dotenv-expand": "12.0.1", + "mongodb": "6.15.0", + "ts-pattern": "5.7.0", + "uuidv7": "1.0.2" + }, + "devDependencies": { + "@duplojs/types-codegen": "1.1.3", + "@types/node": "22.13.10", + "tsx": "4.19.3", + "typescript": "5.8.2" } }, - "services/coral/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], + "services/abys/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "undici-types": "~6.20.0" } }, - "services/coral/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "dev": true, + "services/abys/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6.0.0" } }, - "services/coral/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", + "services/abys/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", + "services/abys/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "dev": true, + "services/abys/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "optional": true, - "os": [ - "linux" - ], + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6" } }, - "services/coral/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "services/abys/node_modules/mongodb": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, "engines": { - "node": ">=18" + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, - "services/coral/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], + "services/abys/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "services/coral/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], + "services/abys/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=18" + "node": ">=14.17" } }, - "services/coral/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "services/abys/node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "license": "Apache-2.0", + "bin": { + "uuidv7": "cli.js" } }, - "services/coral/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], + "services/beacon": { + "name": "@service/beacon", + "hasInstallScript": true, + "dependencies": { + "@duplojs/core": "1.0.3", + "@duplojs/node": "1.0.3", + "dotenv": "16.4.5", + "dotenv-expand": "12.0.1", + "mongodb": "6.15.0", + "ts-pattern": "^5.7.1", + "uuidv7": "1.0.2" + }, + "devDependencies": { + "@duplojs/types-codegen": "1.1.3", + "@types/node": "22.13.10", + "tsx": "4.19.3", + "typescript": "5.8.2" + } + }, + "services/beacon/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "dependencies": { + "undici-types": "~6.20.0" } }, - "services/coral/node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "dev": true, + "services/beacon/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "optional": true, - "os": [ - "sunos" - ], + "peer": true, + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6.0.0" } }, - "services/coral/node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", + "services/beacon/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", "optional": true, - "os": [ - "win32" - ], + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", + "services/beacon/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", "optional": true, - "os": [ - "win32" - ], + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "services/coral/node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "dev": true, + "services/beacon/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "license": "MIT", "optional": true, - "os": [ - "win32" - ], + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6" } }, - "services/coral/node_modules/@types/node": { - "version": "22.15.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.0.tgz", - "integrity": "sha512-99S8dWD2DkeE6PBaEDw+In3aar7hdoBvjyJMR6vaKBTzpvR0P00ClzJMOoVrj9D2+Sy/YCwACYHnBTpMhg1UCA==", - "dev": true, - "license": "MIT", + "services/beacon/node_modules/mongodb": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "license": "Apache-2.0", "dependencies": { - "undici-types": "~6.21.0" + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, - "services/coral/node_modules/@types/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", + "services/beacon/node_modules/ts-pattern": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz", + "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==", + "license": "MIT" + }, + "services/beacon/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, "license": "MIT", "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "services/coral/node_modules/bson": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-7.2.0.tgz", - "integrity": "sha512-YCEo7KjMlbNlyHhz7zAZNDpIpQbd+wOEHJYezv0nMYTn4x31eIUM2yomNNubclAt63dObUzKHWsBLJ9QcZNSnQ==", - "license": "Apache-2.0", + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, "engines": { - "node": ">=20.19.0" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "services/coral/node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", + "services/beacon/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, - "hasInstallScript": true, - "license": "MIT", + "license": "Apache-2.0", "bin": { - "esbuild": "bin/esbuild" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=18" + "node": ">=14.17" + } + }, + "services/beacon/node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "license": "Apache-2.0", + "bin": { + "uuidv7": "cli.js" + } + }, + "services/bottle": { + "name": "@service/bottle", + "hasInstallScript": true, + "dependencies": { + "@duplojs/core": "1.0.3", + "@duplojs/node": "1.0.3", + "dotenv": "16.4.5", + "dotenv-expand": "12.0.1", + "nodemailer": "7.0.3", + "ts-pattern": "5.7.0", + "uuidv7": "1.0.2" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" + "devDependencies": { + "@duplojs/types-codegen": "1.1.3", + "@types/node": "22.13.10", + "@types/nodemailer": "6.4.17", + "tsx": "4.19.3", + "typescript": "5.8.2" + } + }, + "services/bottle/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" } }, - "services/coral/node_modules/gaxios": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.5.tgz", - "integrity": "sha512-5FZy72Rh8LhtjmvDrKkI+lVhrsQrVKVsItxMoDm5mNQE+xR0WVIIs+jzPSJgBvKVsLi24fZhXJIsNI0bihDzFg==", - "license": "Apache-2.0", - "optional": true, - "peer": true, + "services/bottle/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "license": "MIT", "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2" + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">=18" + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "services/coral/node_modules/gcp-metadata": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", - "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", + "services/bottle/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=18" + "node": ">=14.17" } }, - "services/coral/node_modules/mongodb": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.0.0.tgz", - "integrity": "sha512-vG/A5cQrvGGvZm2mTnCSz1LUcbOPl83hfB6bxULKQ8oFZauyox/2xbZOoGNl+64m8VBrETkdGCDBdOsCr3F3jg==", + "services/bottle/node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.3.0", - "bson": "^7.0.0", - "mongodb-connection-string-url": "^7.0.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.806.0", - "@mongodb-js/zstd": "^7.0.0", - "gcp-metadata": "^7.0.1", - "kerberos": "^7.0.0", - "mongodb-client-encryption": ">=7.0.0 <7.1.0", - "snappy": "^7.3.2", - "socks": "^2.8.6" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } + "bin": { + "uuidv7": "cli.js" } }, - "services/coral/node_modules/mongodb-connection-string-url": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.1.tgz", - "integrity": "sha512-h0AZ9A7IDVwwHyMxmdMXKy+9oNlF0zFoahHiX3vQ8e3KFcSP3VmsmfvtRSuLPxmyv2vjIDxqty8smTgie/SNRQ==", - "license": "Apache-2.0", + "services/bridge": { + "name": "@service/bridge", + "hasInstallScript": true, "dependencies": { - "@types/whatwg-url": "^13.0.0", - "whatwg-url": "^14.1.0" + "@duplojs/core": "1.0.3", + "@duplojs/http": "0.13.1", + "@duplojs/http-client": "1.2.3", + "@duplojs/node": "1.0.3", + "@duplojs/utils": "1.9.9", + "dotenv": "16.4.5", + "dotenv-expand": "12.0.1", + "ts-pattern": "5.7.0" }, - "engines": { - "node": ">=20.19.0" + "devDependencies": { + "@duplojs/types-codegen": "1.1.3", + "@types/node": "22.13.10", + "tsx": "4.19.3", + "typescript": "5.8.2" } }, - "services/coral/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "services/bridge/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" + "undici-types": "~6.20.0" } }, - "services/coral/node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "services/bridge/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", + "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -18255,10 +16853,10 @@ "fsevents": "~2.3.3" } }, - "services/coral/node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "services/bridge/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -18269,15 +16867,41 @@ "node": ">=14.17" } }, - "services/coral/node_modules/uuidv7": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.1.0.tgz", - "integrity": "sha512-2VNnOC0+XQlwogChUDzy6pe8GQEys9QFZBGOh54l6qVfwoCUwwRvk7rDTgaIsRgsF5GFa5oiNg8LqXE3jofBBg==", - "license": "Apache-2.0", - "bin": { - "uuidv7": "cli.js" + "services/coral": { + "name": "@service/coral", + "dependencies": { + "@duplojs/http": "0.13.1", + "@duplojs/server-utils": "0.4.1", + "@duplojs/utils": "1.9.9", + "@lib/async-message": "file:../libs/async-message", + "@lib/entity-rules": "file:../libs/entity-rules", + "@lib/eslint": "file:../libs/eslint", + "@lib/logger": "file:../libs/backend-logger", + "mongodb": "7.3.0", + "uuidv7": "1.2.1" + }, + "devDependencies": { + "@types/node": "22.15.0", + "tsx": "4.21.0", + "typescript": "5.9.3" } }, + "services/coral/node_modules/@lib/async-message": { + "resolved": "services/libs/async-message", + "link": true + }, + "services/coral/node_modules/@lib/entity-rules": { + "resolved": "services/libs/entity-rules", + "link": true + }, + "services/coral/node_modules/@lib/eslint": { + "resolved": "services/libs/eslint", + "link": true + }, + "services/coral/node_modules/@lib/logger": { + "resolved": "services/libs/backend-logger", + "link": true + }, "services/harbor": { "name": "@service/harbor", "hasInstallScript": true, @@ -18302,6 +16926,36 @@ "typescript": "5.8.2" } }, + "services/harbor/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "services/harbor/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "services/harbor/node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", @@ -18316,6 +16970,15 @@ "node": ">=14.17" } }, + "services/harbor/node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "license": "Apache-2.0", + "bin": { + "uuidv7": "cli.js" + } + }, "services/horizon": { "name": "@service/horizon", "hasInstallScript": true, @@ -18325,6 +16988,7 @@ "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", "@duplojs/server-utils": "0.4.1", + "@duplojs/utils": "1.9.9", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", "ts-pattern": "5.7.0" @@ -18336,6 +17000,36 @@ "typescript": "5.8.2" } }, + "services/horizon/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "services/horizon/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "services/horizon/node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", @@ -18350,11 +17044,17 @@ "node": ">=14.17" } }, + "services/libs/async-message": {}, + "services/libs/backend-logger": {}, + "services/libs/client-type": {}, + "services/libs/entity-rules": {}, + "services/libs/eslint": {}, + "services/libs/fixture": {}, "services/lighthouse": { "name": "@service/lighthouse", "dependencies": { "@duplojs/http-client": "1.2.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@mdi/js": "7.4.47", "@sentry/vue": "9.22.0", "@tailwindcss/vite": "4.0.14", @@ -18469,7 +17169,7 @@ "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@vue/reactivity": "3.5.13", "commander": "13.1.0", "dotenv": "16.4.5", @@ -18479,13 +17179,42 @@ "tsx": "4.19.3", "uuidv7": "1.0.2" }, - "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@prisma/client": "6.7.0", - "@types/node": "22.13.10", - "prisma": "6.7.0", - "prisma-json-types-generator": "3.4.2", - "typescript": "5.8.2" + "devDependencies": { + "@duplojs/types-codegen": "1.1.3", + "@prisma/client": "6.7.0", + "@types/node": "22.13.10", + "prisma": "6.7.0", + "prisma-json-types-generator": "3.4.2", + "typescript": "5.8.2" + } + }, + "services/marine-snow/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "services/marine-snow/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, "services/marine-snow/node_modules/typescript": { @@ -18502,6 +17231,15 @@ "node": ">=14.17" } }, + "services/marine-snow/node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "license": "Apache-2.0", + "bin": { + "uuidv7": "cli.js" + } + }, "services/rosetta": { "name": "@service/rosetta", "hasInstallScript": true, @@ -18509,7 +17247,7 @@ "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "commander": "13.1.0", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", @@ -18526,18 +17264,121 @@ "typescript": "5.8.2" } }, - "services/rosetta/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, + "services/rosetta/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "services/rosetta/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "optional": true, - "os": [ - "darwin" - ], + "peer": true, + "dependencies": { + "debug": "4" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 6.0.0" + } + }, + "services/rosetta/node_modules/gaxios": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-5.1.3.tgz", + "integrity": "sha512-95hVgBRgEIRQQQHIbnxBXeHbW4TqFk4ZDJW7wmVtvYar72FdhRIo1UGOLS2eRAKCPEdPBWu+M7+A33D9CdX9rA==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "engines": { + "node": ">=12" + } + }, + "services/rosetta/node_modules/gcp-metadata": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-5.3.0.tgz", + "integrity": "sha512-FNTkdNEnBdlqF2oatizolQqNANMrcqJt6AAYt99B3y1aLLC8Hc5IOBb+ZnnzllodEEf6xMBp6wRcBbc16fa65w==", + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "gaxios": "^5.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "services/rosetta/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "services/rosetta/node_modules/mongodb": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.15.0.tgz", + "integrity": "sha512-ifBhQ0rRzHDzqp9jAQP6OwHSH7dbYIQjD3SbJs9YYk9AikKEettW/9s/tbSFDTpXcRbF+u1aLrhHxDFaYtZpFQ==", + "license": "Apache-2.0", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.9", + "bson": "^6.10.3", + "mongodb-connection-string-url": "^3.0.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0 || ^2.0.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } } }, "services/rosetta/node_modules/playwright": { @@ -18570,6 +17411,39 @@ "node": ">=18" } }, + "services/rosetta/node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "services/rosetta/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "services/rosetta/node_modules/typescript": { "version": "5.8.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", @@ -18584,38 +17458,55 @@ "node": ">=14.17" } }, + "services/rosetta/node_modules/uuidv7": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uuidv7/-/uuidv7-1.0.2.tgz", + "integrity": "sha512-8JQkH4ooXnm1JCIhqTMbtmdnYEn6oKukBxHn1Ic9878jMkL7daTI7anTExfY18VRCX7tcdn5quzvCb6EWrR8PA==", + "license": "Apache-2.0", + "bin": { + "uuidv7": "cli.js" + } + }, "services/school": { "name": "@service/school", - "hasInstallScript": true, "dependencies": { - "@duplojs/core": "1.0.3", - "@duplojs/node": "1.0.3", - "dotenv": "16.4.5", - "dotenv-expand": "12.0.1", - "mongodb": "6.15.0", - "ts-pattern": "5.7.0", - "uuidv7": "1.0.2" + "@duplojs/http": "0.13.1", + "@duplojs/server-utils": "0.4.1", + "@duplojs/utils": "1.9.9", + "@lib/async-message": "file:../libs/async-message", + "@lib/client-type": "file:../libs/client-type", + "@lib/entity-rules": "file:../libs/entity-rules", + "@lib/eslint": "file:../libs/eslint", + "@lib/fixture": "file:../libs/fixture", + "@lib/logger": "file:../libs/backend-logger", + "mongodb": "7.3.0", + "uuidv7": "1.2.1" }, "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@types/node": "22.13.10", - "tsx": "4.19.3", - "typescript": "5.8.2" + "@types/node": "22.15.0", + "tsx": "4.21.0", + "typescript": "5.9.3" } }, - "services/school/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } + "services/school/node_modules/@lib/async-message": { + "resolved": "services/libs/async-message", + "link": true + }, + "services/school/node_modules/@lib/entity-rules": { + "resolved": "services/libs/entity-rules", + "link": true + }, + "services/school/node_modules/@lib/eslint": { + "resolved": "services/libs/eslint", + "link": true + }, + "services/school/node_modules/@lib/fixture": { + "resolved": "services/libs/fixture", + "link": true + }, + "services/school/node_modules/@lib/logger": { + "resolved": "services/libs/backend-logger", + "link": true }, "services/sea": { "name": "@service/sea", @@ -18623,7 +17514,7 @@ "dependencies": { "@duplojs/core": "1.0.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@elastic/elasticsearch": "8.18.2", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", @@ -18636,11 +17527,55 @@ "typescript": "5.8.3" } }, + "services/sea/node_modules/@types/node": { + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.20.0" + } + }, + "services/sea/node_modules/tsx": { + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.25.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "services/sea/node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, "services/spotter": { "name": "@service/spotter", "dependencies": { "@duplojs/http-client": "1.2.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@mdi/js": "7.4.47", "@sentry/vue": "9.22.0", "@tailwindcss/vite": "4.0.14", diff --git a/package.json b/package.json index a97c170f..328c90d5 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,9 @@ "docker:coral": "docker compose up coral", - "docker:beacon": "docker compose up beacon" + "docker:beacon": "docker compose up beacon", + + "docker:install:dependencies": "docker compose up node-installer" }, "workspaces": [ ".npm-packages", diff --git a/services/abys/package.json b/services/abys/package.json index a34357a2..08321684 100644 --- a/services/abys/package.json +++ b/services/abys/package.json @@ -20,7 +20,7 @@ "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "commander": "13.1.0", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", diff --git a/services/bridge/interfaces/http/checkers/post.ts b/services/bridge/interfaces/http/checkers/post.ts index e225b712..b1013b40 100644 --- a/services/bridge/interfaces/http/checkers/post.ts +++ b/services/bridge/interfaces/http/checkers/post.ts @@ -1,12 +1,12 @@ -import { SchoolAPI } from "@interfaces/providers/school"; -import { match } from "ts-pattern"; +import { P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; export const postExistCheck = createChecker("postExist") .handler( - async(input: string, output) => { - const schoolResponse = await SchoolAPI.findPostById(input); + async(postId: string, output) => { + const schoolResponse = await SchoolProvider.findOnePost({ postId }); - return match(schoolResponse) + return P.match(schoolResponse) .with( { information: "post.found" }, ({ body }) => output("post.exist", body), diff --git a/services/bridge/interfaces/http/routes/answer/answerModerationPage.ts b/services/bridge/interfaces/http/routes/answer/answerModerationPage.ts index 34011646..89ac039c 100644 --- a/services/bridge/interfaces/http/routes/answer/answerModerationPage.ts +++ b/services/bridge/interfaces/http/routes/answer/answerModerationPage.ts @@ -1,14 +1,14 @@ import { Page } from "@business/entities/page"; -import { SchoolAPI } from "@interfaces/providers/school"; -import { match } from "ts-pattern"; +import { D, O, P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; useBuilder() .createRoute("POST", "/answer-moderation-page") .cut( async({ dropper }) => { - const schoolResponse = await SchoolAPI.findOldestUnprocessedAnswer(); + const schoolResponse = await SchoolProvider.findOldestUnprocessedAnswer(); - return match(schoolResponse) + return P.match(schoolResponse) .with( { information: "oldestUnprocessedAnswer.notfound" }, () => new NotFoundHttpResponse("answerModerationPage.notfound"), @@ -24,9 +24,9 @@ useBuilder() ) .cut( async({ dropper }) => { - const schoolResponse = await SchoolAPI.getUnprocessedAnswerDetails(); + const schoolResponse = await SchoolProvider.getUnprocessedAnswerDetails(); - return match(schoolResponse) + return P.match(schoolResponse) .with( { information: "unprocessedAnswer.details" }, ({ body }) => dropper({ @@ -41,13 +41,20 @@ useBuilder() ) .handler( (pickup) => { - const { details, answer } = pickup(["details", "answer"]); + const floorFragment = pickup(["details", "answer"]); + + // theDate translation + const answer = O.transformProperty( + floorFragment.answer, + "createdAt", + D.toISOString, + ); return new OkHttpResponse( "answerModerationPage.found", { answer, - unprocessedTotalCount: details.totalCount, + unprocessedTotalCount: floorFragment.details.totalCount, }, ); }, diff --git a/services/bridge/interfaces/http/routes/answer/indicateAnswerIsNotCompliantAndCreateWarning.ts b/services/bridge/interfaces/http/routes/answer/createReportAnswer.ts similarity index 59% rename from services/bridge/interfaces/http/routes/answer/indicateAnswerIsNotCompliantAndCreateWarning.ts rename to services/bridge/interfaces/http/routes/answer/createReportAnswer.ts index 7c25d3e5..ba44d99d 100644 --- a/services/bridge/interfaces/http/routes/answer/indicateAnswerIsNotCompliantAndCreateWarning.ts +++ b/services/bridge/interfaces/http/routes/answer/createReportAnswer.ts @@ -1,6 +1,6 @@ -import { SchoolAPI } from "@interfaces/providers/school"; +import { O, P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; import { baseWarningRules } from "@vendors/entity-rules"; -import { match } from "ts-pattern"; useBuilder() .createRoute("POST", "/answers/{answerId}/is-not-compliant-and-create-warning") @@ -25,27 +25,22 @@ useBuilder() answerId, } = pickup(["body", "answerId"]); - const schoolResponse = await SchoolAPI.indicateAnswerIsNotCompliantAndCreateWarning({ + const schoolResponse = await SchoolProvider.createReportAnswer({ answerId, - makeUserBan, + level: makeUserBan ? "ban" : "warning", reason, }); - return match(schoolResponse) - .with( - { information: "answer.wrongStatus" }, - () => new ForbiddenHttpResponse("answer.wrongStatus"), - ) - .with( - { information: "answer.notfound" }, + return P.match(schoolResponse) + .when( + O.discriminate( + "information", + ["answer.notfound", "answer.unprocessed.wrongStatus"], + ), () => new NotFoundHttpResponse("answer.notfound"), ) - .with( - { information: "answer.postMismatch" }, - () => new NotFoundHttpResponse("answer.postMismatch"), - ) - .with( - { information: "answer.updated" }, + .when( + O.discriminate("information", "report.created"), () => dropper(null), ) .exhaustive(); @@ -53,7 +48,6 @@ useBuilder() undefined, [ ...makeResponseContract(ForbiddenHttpResponse, "answer.wrongStatus"), - ...makeResponseContract(NotFoundHttpResponse, "answer.postMismatch"), ...makeResponseContract(NotFoundHttpResponse, "answer.notfound"), ], ) diff --git a/services/bridge/interfaces/http/routes/answer/index.ts b/services/bridge/interfaces/http/routes/answer/index.ts new file mode 100644 index 00000000..c3b5ae63 --- /dev/null +++ b/services/bridge/interfaces/http/routes/answer/index.ts @@ -0,0 +1,3 @@ +import "./answerModerationPage"; +import "./markAnswerAsCompliant"; +import "./createReportAnswer"; diff --git a/services/bridge/interfaces/http/routes/answer/indicateAnswerIsCompliant.ts b/services/bridge/interfaces/http/routes/answer/indicateAnswerIsCompliant.ts deleted file mode 100644 index d4a6a86b..00000000 --- a/services/bridge/interfaces/http/routes/answer/indicateAnswerIsCompliant.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { SchoolAPI } from "@interfaces/providers/school"; -import { match } from "ts-pattern"; - -useBuilder() - .createRoute("POST", "/answers/{answerId}/is-compliant") - .extract({ - params: { - answerId: zod.string(), - }, - }) - .cut( - async({ pickup, dropper }) => { - const answerId = pickup("answerId"); - - const schoolResponse = await SchoolAPI.indicateAnswerIsCompliant(answerId); - - return match(schoolResponse) - .with( - { information: "answer.notfound" }, - () => new NotFoundHttpResponse("answer.notfound"), - ) - .with( - { information: "answer.wrongStatus" }, - () => new ForbiddenHttpResponse("answer.wrongStatus"), - ) - .with( - { information: "answer.updated" }, - () => dropper(null), - ) - .exhaustive(); - }, - undefined, - [ - ...makeResponseContract(NotFoundHttpResponse, "answer.notfound"), - ...makeResponseContract(ForbiddenHttpResponse, "answer.wrongStatus"), - ], - ) - .handler( - () => new OkHttpResponse( - "answer.updated", - ), - makeResponseContract(OkHttpResponse, "answer.updated"), - ); diff --git a/services/bridge/interfaces/http/routes/answer/markAnswerAsCompliant.ts b/services/bridge/interfaces/http/routes/answer/markAnswerAsCompliant.ts new file mode 100644 index 00000000..eb8ff8c3 --- /dev/null +++ b/services/bridge/interfaces/http/routes/answer/markAnswerAsCompliant.ts @@ -0,0 +1,39 @@ +import { O, P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; + +useBuilder() + .createRoute("POST", "/answers/{answerId}/is-compliant") + .extract({ + params: { + answerId: zod.string(), + }, + }) + .cut( + async({ pickup, dropper }) => { + const answerId = pickup("answerId"); + + const schoolResponse = await SchoolProvider.markAnswerAsCompliant({ answerId }); + + return P.match(schoolResponse) + .when( + O.discriminate( + "information", + ["answer.notfound", "answer.unprocessed.wrongStatus"], + ), + () => new NotFoundHttpResponse("answer.notfound"), + ) + .when( + O.discriminate("information", "answer.markedAsCompliant"), + () => dropper(null), + ) + .exhaustive(); + }, + undefined, + makeResponseContract(NotFoundHttpResponse, "answer.notfound"), + ) + .handler( + () => new OkHttpResponse( + "answer.updated", + ), + makeResponseContract(OkHttpResponse, "answer.updated"), + ); diff --git a/services/bridge/interfaces/http/routes/bakedDocument/index.ts b/services/bridge/interfaces/http/routes/bakedDocument/index.ts new file mode 100644 index 00000000..faf78971 --- /dev/null +++ b/services/bridge/interfaces/http/routes/bakedDocument/index.ts @@ -0,0 +1 @@ +import "./getNewTranslation"; diff --git a/services/bridge/interfaces/http/routes/index.ts b/services/bridge/interfaces/http/routes/index.ts index 0ff602da..43cd08c0 100644 --- a/services/bridge/interfaces/http/routes/index.ts +++ b/services/bridge/interfaces/http/routes/index.ts @@ -1,15 +1,4 @@ -import "./reporting/bakedDocumentTranslationAggregateListPage"; -import "./reporting/bakedDocumentTranslationAggregateList"; -import "./reporting/bakedDocumentTranslationPage"; -import "./reporting/bakedDocumentTranslationList"; - -import "./bakedDocument/getNewTranslation"; -import "./reporting/processBakedDocumentTranslationReportingAggregate"; - -import "./post/postModerationPage"; -import "./post/indicatePostIsCompliant"; -import "./post/indicatePostIsNotCompliantAndCreateWarning"; - -import "./answer/answerModerationPage"; -import "./answer/indicateAnswerIsCompliant"; -import "./answer/indicateAnswerIsNotCompliantAndCreateWarning"; +import "./post"; +import "./answer"; +import "./bakedDocument"; +import "./reporting"; diff --git a/services/bridge/interfaces/http/routes/post/indicatePostIsNotCompliantAndCreateWarning.ts b/services/bridge/interfaces/http/routes/post/createReportPost.ts similarity index 57% rename from services/bridge/interfaces/http/routes/post/indicatePostIsNotCompliantAndCreateWarning.ts rename to services/bridge/interfaces/http/routes/post/createReportPost.ts index 8ad71363..3593dc11 100644 --- a/services/bridge/interfaces/http/routes/post/indicatePostIsNotCompliantAndCreateWarning.ts +++ b/services/bridge/interfaces/http/routes/post/createReportPost.ts @@ -1,6 +1,6 @@ -import { SchoolAPI } from "@interfaces/providers/school"; +import { O, P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; import { baseWarningRules } from "@vendors/entity-rules"; -import { match } from "ts-pattern"; useBuilder() .createRoute("POST", "/posts/{postId}/is-not-compliant-and-create-warning") @@ -25,32 +25,28 @@ useBuilder() postId, } = pickup(["body", "postId"]); - const schoolResponse = await SchoolAPI.indicatePostIsNotCompliantAndCreateWarning({ + const schoolResponse = await SchoolProvider.createReportPost({ postId, - makeUserBan, + level: makeUserBan ? "ban" : "warning", reason, }); - return match(schoolResponse) - .with( - { information: "post.wrongStatus" }, - () => new ForbiddenHttpResponse("post.wrongStatus"), - ) - .with( - { information: "post.notfound" }, + return P.match(schoolResponse) + .when( + O.discriminate( + "information", + ["post.notfound", "post.unprocessed.wrongStatus"], + ), () => new NotFoundHttpResponse("post.notfound"), ) - .with( - { information: "post.updated" }, + .when( + O.discriminate("information", "report.created"), () => dropper(null), ) .exhaustive(); }, undefined, - [ - ...makeResponseContract(ForbiddenHttpResponse, "post.wrongStatus"), - ...makeResponseContract(NotFoundHttpResponse, "post.notfound"), - ], + makeResponseContract(NotFoundHttpResponse, "post.notfound"), ) .handler( () => new OkHttpResponse("post.updated"), diff --git a/services/bridge/interfaces/http/routes/post/index.ts b/services/bridge/interfaces/http/routes/post/index.ts new file mode 100644 index 00000000..a0504d49 --- /dev/null +++ b/services/bridge/interfaces/http/routes/post/index.ts @@ -0,0 +1,3 @@ +import "./createReportPost"; +import "./markPostAsCompliant"; +import "./postModerationPage"; diff --git a/services/bridge/interfaces/http/routes/post/indicatePostIsCompliant.ts b/services/bridge/interfaces/http/routes/post/indicatePostIsCompliant.ts deleted file mode 100644 index f42c2713..00000000 --- a/services/bridge/interfaces/http/routes/post/indicatePostIsCompliant.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { SchoolAPI } from "@interfaces/providers/school"; -import { match } from "ts-pattern"; - -useBuilder() - .createRoute("POST", "/posts/{postId}/is-compliant") - .extract({ - params: { - postId: zod.string(), - }, - }) - .cut( - async({ pickup, dropper }) => { - const postId = pickup("postId"); - - const schoolResponse = await SchoolAPI.indicatePostIsCompliant(postId); - - return match(schoolResponse) - .with( - { information: "post.notfound" }, - () => new NotFoundHttpResponse("post.notfound"), - ) - .with( - { information: "post.wrongStatus" }, - () => new ForbiddenHttpResponse("post.wrongStatus"), - ) - .with( - { information: "post.updated" }, - () => dropper(null), - ) - .exhaustive(); - }, - undefined, - [ - ...makeResponseContract(NotFoundHttpResponse, "post.notfound"), - ...makeResponseContract(ForbiddenHttpResponse, "post.wrongStatus"), - ], - ) - .handler( - () => new OkHttpResponse( - "post.updated", - ), - makeResponseContract(OkHttpResponse, "post.updated"), - ); diff --git a/services/bridge/interfaces/http/routes/post/markPostAsCompliant.ts b/services/bridge/interfaces/http/routes/post/markPostAsCompliant.ts new file mode 100644 index 00000000..a86c6012 --- /dev/null +++ b/services/bridge/interfaces/http/routes/post/markPostAsCompliant.ts @@ -0,0 +1,37 @@ +import { O, P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; + +useBuilder() + .createRoute("POST", "/posts/{postId}/is-compliant") + .extract({ + params: { + postId: zod.string(), + }, + }) + .cut( + async({ pickup, dropper }) => { + const postId = pickup("postId"); + + const result = await SchoolProvider.markPostAsCompliant({ postId }); + + return P.match(result) + .when( + O.discriminate( + "information", + ["post.notfound", "post.unprocessed.wrongStatus"], + ), + () => new NotFoundHttpResponse("post.notfound"), + ) + .when( + O.discriminate("information", "post.markAsCompliant"), + () => dropper(null), + ) + .exhaustive(); + }, + undefined, + makeResponseContract(NotFoundHttpResponse, "post.notfound"), + ) + .handler( + () => new OkHttpResponse("post.updated"), + makeResponseContract(OkHttpResponse, "post.updated"), + ); diff --git a/services/bridge/interfaces/http/routes/post/postModerationPage.ts b/services/bridge/interfaces/http/routes/post/postModerationPage.ts index 43cee0de..df33ee28 100644 --- a/services/bridge/interfaces/http/routes/post/postModerationPage.ts +++ b/services/bridge/interfaces/http/routes/post/postModerationPage.ts @@ -1,14 +1,14 @@ import { Page } from "@business/entities/page"; -import { SchoolAPI } from "@interfaces/providers/school"; -import { match } from "ts-pattern"; +import { D, O, P } from "@duplojs/utils"; +import { SchoolProvider } from "@interfaces/providers/school"; useBuilder() .createRoute("POST", "/post-moderation-page") .cut( async({ dropper }) => { - const schoolResponse = await SchoolAPI.findOldestUnprocessedPost(); + const schoolResponse = await SchoolProvider.findOldestUnprocessedPost(); - return match(schoolResponse) + return P.match(schoolResponse) .with( { information: "oldestUnprocessedPost.notfound" }, () => new NotFoundHttpResponse("postModerationPage.notfound"), @@ -24,9 +24,9 @@ useBuilder() ) .cut( async({ dropper }) => { - const schoolResponse = await SchoolAPI.getUnprocessedPostDetails(); + const schoolResponse = await SchoolProvider.getUnprocessedPostDetails(); - return match(schoolResponse) + return P.match(schoolResponse) .with( { information: "unprocessedPost.details" }, ({ body }) => dropper({ @@ -41,13 +41,20 @@ useBuilder() ) .handler( (pickup) => { - const { details, post } = pickup(["details", "post"]); + const floorFragment = pickup(["details", "post"]); + + // theDate translation + const post = O.transformProperty( + floorFragment.post, + "createdAt", + D.toISOString, + ); return new OkHttpResponse( "postModerationPage.found", { post, - unprocessedTotalCount: details.totalCount, + unprocessedTotalCount: floorFragment.details.totalCount, }, ); }, diff --git a/services/bridge/interfaces/http/routes/reporting/index.ts b/services/bridge/interfaces/http/routes/reporting/index.ts new file mode 100644 index 00000000..e8415992 --- /dev/null +++ b/services/bridge/interfaces/http/routes/reporting/index.ts @@ -0,0 +1,5 @@ +import "./bakedDocumentTranslationAggregateList"; +import "./bakedDocumentTranslationAggregateListPage"; +import "./bakedDocumentTranslationList"; +import "./bakedDocumentTranslationPage"; +import "./processBakedDocumentTranslationReportingAggregate"; diff --git a/services/bridge/interfaces/providers/abys/index.ts b/services/bridge/interfaces/providers/abys/index.ts index 483e7f72..93f9401b 100644 --- a/services/bridge/interfaces/providers/abys/index.ts +++ b/services/bridge/interfaces/providers/abys/index.ts @@ -1,7 +1,7 @@ import { HttpClient, type TransformCodegenRouteToHttpClientRoute } from "@duplojs/http-client"; import { envs } from "@interfaces/envs"; import { type CodegenRoutes } from "@vendors/clients-type/abys/duplojsTypesCodegen"; -import { type InputTransformeNodeSameRawDocumentToBakedDocument, type InputCookNodeSameRawDocument } from "./types"; +import { type InputCookNodeSameRawDocument } from "./types"; export type AbysClientRoute = TransformCodegenRouteToHttpClientRoute< CodegenRoutes diff --git a/services/bridge/interfaces/providers/school/index.ts b/services/bridge/interfaces/providers/school/index.ts index aeb9fdb1..f7d44e43 100644 --- a/services/bridge/interfaces/providers/school/index.ts +++ b/services/bridge/interfaces/providers/school/index.ts @@ -1,132 +1,136 @@ -import { HttpClient, type TransformCodegenRouteToHttpClientRoute } from "@duplojs/http-client"; +import { createHttpClient } from "@duplojs/http/client"; +import type { Routes } from "@vendors/clients-type/school/duplojsTypesCodegen"; import { envs } from "@interfaces/envs"; -import { type CodegenRoutes } from "@vendors/clients-type/school/duplojsTypesCodegen"; -export type SchoolClientRoute = TransformCodegenRouteToHttpClientRoute< - CodegenRoutes ->; +export namespace SchoolProvider { + const client = createHttpClient({ + baseUrl: envs.SCHOOL_BASE_URL, + }); -interface InputIndicateIsNotCompliantAndCreateWarning { - makeUserBan: boolean; - reason: string; -} - -interface InputIndicatePostIsNotCompliantAndCreateWarning extends InputIndicateIsNotCompliantAndCreateWarning { - postId: string; -} - -interface InputIndicateAnswerIsNotCompliantAndCreateWarning extends InputIndicateIsNotCompliantAndCreateWarning { - answerId: string; -} -export class SchoolAPI { - private static httpClient: HttpClient; - - public static findOldestUnprocessedPost() { - return this.httpClient - .get( - "/find-oldest-unprocessed-post", - ) - .iWantExpectedResponse(); + export function findOldestUnprocessedPost() { + return client.post( + "/find-oldest-unprocessed-post", + ).iSelectExpectedResponseByInformationOrThrow({ + "oldestUnprocessedPost.found": true, + "oldestUnprocessedPost.notfound": true, + }); } - public static getUnprocessedPostDetails() { - return this.httpClient - .get( - "/unprocessed-post-details", - ) - .iWantExpectedResponse(); + export function getUnprocessedPostDetails() { + return client.post( + "/find-unprocessed-post-details", + ).iSelectExpectedResponseByInformationOrThrow({ + "unprocessedPost.details": true, + }); } - public static indicatePostIsCompliant(postId: string) { - return this.httpClient.patch( - "/posts/{postId}/is-compliant", + export function markPostAsCompliant( + params: { + postId: string; + }, + ) { + return client.post( + "/mark-post-as-compliant", { - params: { - postId, - }, + body: params, }, - ).iWantExpectedResponse(); + ).iSelectExpectedResponseByInformationOrThrow({ + "extract-error": false, + "post.markAsCompliant": true, + "post.notfound": true, + "post.unprocessed.wrongStatus": true, + }); } - public static indicatePostIsNotCompliantAndCreateWarning(params: InputIndicatePostIsNotCompliantAndCreateWarning) { - return this.httpClient - .patch( - "/posts/{postId}/is-not-compliant-and-create-warning", - { - params: { - postId: params.postId, - }, - body: { - makeUserBan: params.makeUserBan, - reason: params.reason, - }, - }, - ) - .iWantExpectedResponse(); + export function createReportPost( + params: { + postId: string; + level: "ban" | "warning"; + reason: string; + }, + ) { + return client.post( + "/create-report-post", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "extract-error": false, + "post.notfound": true, + "post.unprocessed.wrongStatus": true, + "report.created": true, + }); } - public static findPostById(postId: string) { - return this.httpClient - .get( - "/posts/{postId}", - { - params: { - postId, - }, - }, - ) - .iWantExpectedResponse(); + export function findOnePost( + params: { + postId: string; + }, + ) { + return client.post( + "/find-one-post", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "extract-error": false, + "post.found": true, + "post.notfound": true, + }); } - public static findOldestUnprocessedAnswer() { - return this.httpClient - .get( - "/find-oldest-unprocessed-answer", - ) - .iWantExpectedResponse(); + export function findOldestUnprocessedAnswer() { + return client.post( + "/find-oldest-unprocessed-answer", + ).iSelectExpectedResponseByInformationOrThrow({ + "oldestUnprocessedAnswer.found": true, + "oldestUnprocessedAnswer.notfound": true, + }); } - public static getUnprocessedAnswerDetails() { - return this.httpClient - .get( - "/unprocessed-answer-details", - ) - .iWantExpectedResponse(); + export function getUnprocessedAnswerDetails() { + return client.post( + "/find-unprocessed-answer-details", + ).iSelectExpectedResponseByInformationOrThrow({ + "unprocessedAnswer.details": true, + }); } - public static indicateAnswerIsCompliant(answerId: string) { - return this.httpClient.patch( - "/answers/{answerId}/is-compliant", + export function markAnswerAsCompliant( + params: { + answerId: string; + }, + ) { + return client.post( + "/mark-answer-as-compliant", { - params: { - answerId, - }, + body: params, }, - ).iWantExpectedResponse(); + ).iSelectExpectedResponseByInformationOrThrow({ + "answer.markedAsCompliant": true, + "answer.notfound": true, + "answer.unprocessed.wrongStatus": true, + "extract-error": false, + }); } - public static indicateAnswerIsNotCompliantAndCreateWarning( - params: InputIndicateAnswerIsNotCompliantAndCreateWarning, + export function createReportAnswer( + params: { + answerId: string; + level: "ban" | "warning"; + reason: string; + }, ) { - return this.httpClient - .patch( - "/answers/{answerId}/is-not-compliant-and-create-warning", - { - params: { - answerId: params.answerId, - }, - body: { - makeUserBan: params.makeUserBan, - reason: params.reason, - }, - }, - ) - .iWantExpectedResponse(); - } - - static { - this.httpClient = new HttpClient({ - baseUrl: envs.SCHOOL_BASE_URL, + return client.post( + "/create-report-answer", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "answer.notfound": true, + "answer.unprocessed.wrongStatus": true, + "extract-error": false, + "report.created": true, }); } } diff --git a/services/bridge/package.json b/services/bridge/package.json index f86c06ee..ddb8633e 100644 --- a/services/bridge/package.json +++ b/services/bridge/package.json @@ -9,14 +9,17 @@ "test:lint": "eslint", "test:types": "tsc", + "test:lint:fix": "eslint --fix", "postinstall": "npm run duplo:generate" }, "dependencies": { + "@duplojs/http": "0.13.1", + "@duplojs/utils": "1.9.9", + "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", "ts-pattern": "5.7.0" diff --git a/services/coral/business/applications/useCases/documentFolder/checkDocumentFolderCapacity.ts b/services/coral/business/applications/useCases/documentFolder/checkDocumentFolderCapacity.ts index 868140d1..c45a0b19 100644 --- a/services/coral/business/applications/useCases/documentFolder/checkDocumentFolderCapacity.ts +++ b/services/coral/business/applications/useCases/documentFolder/checkDocumentFolderCapacity.ts @@ -1,6 +1,6 @@ import { C, E } from "@duplojs/utils"; import { DocumentFolder } from "@business/domains/entities/documentFolder"; -import { documentFolderRules } from "@vendors/entity-rules"; +import { documentFolderRules } from "@lib/entity-rules"; interface Input< GenericDocumentFolder extends DocumentFolder.Entity, diff --git a/services/coral/business/domains/entities/documentFolder.ts b/services/coral/business/domains/entities/documentFolder.ts index 02e6ec21..60b9985d 100644 --- a/services/coral/business/domains/entities/documentFolder.ts +++ b/services/coral/business/domains/entities/documentFolder.ts @@ -1,5 +1,5 @@ import { C, D, DPE } from "@duplojs/utils"; -import { documentFolderRules } from "@vendors/entity-rules"; +import { documentFolderRules } from "@lib/entity-rules"; import { UserId } from "../common/user"; export namespace DocumentFolder { diff --git a/services/coral/business/domains/entities/documentInFolder.ts b/services/coral/business/domains/entities/documentInFolder.ts index 7990a898..e5968ae8 100644 --- a/services/coral/business/domains/entities/documentInFolder.ts +++ b/services/coral/business/domains/entities/documentInFolder.ts @@ -1,5 +1,5 @@ import { C, D, DPE } from "@duplojs/utils"; -import { documentInFolderRules } from "@vendors/entity-rules"; +import { documentInFolderRules } from "@lib/entity-rules"; import { DocumentFolder } from "./documentFolder"; import { UserId } from "../common/user"; import { NodeSameRawDocumentId } from "../common/nodeSameRawDocument"; diff --git a/services/coral/business/domains/entities/favoriteEquation.ts b/services/coral/business/domains/entities/favoriteEquation.ts index 1098f26a..49bd4c23 100644 --- a/services/coral/business/domains/entities/favoriteEquation.ts +++ b/services/coral/business/domains/entities/favoriteEquation.ts @@ -1,5 +1,5 @@ import { C, D, DPE } from "@duplojs/utils"; -import { favoriteEquationRules } from "@vendors/entity-rules"; +import { favoriteEquationRules } from "@lib/entity-rules"; import { UserId } from "../common/user"; import { operatorContentSchema } from "../common/typesAdvancedQuery/operator"; diff --git a/services/coral/eslint.config.ts b/services/coral/eslint.config.ts index 9f88242b..7eb99584 100644 --- a/services/coral/eslint.config.ts +++ b/services/coral/eslint.config.ts @@ -1,3 +1,3 @@ -import { eslintConfig } from "./vendors/eslint"; +import { eslintConfig } from "@lib/eslint"; export default eslintConfig; diff --git a/services/coral/interfaces/asyncMessage/main.ts b/services/coral/interfaces/asyncMessage/main.ts index 0a0f2dec..a29d6781 100644 --- a/services/coral/interfaces/asyncMessage/main.ts +++ b/services/coral/interfaces/asyncMessage/main.ts @@ -1,2 +1,3 @@ -import "@vendors/backend-logger"; +import "@lib/logger"; + import "./deleteUser"; diff --git a/services/coral/interfaces/http/main.ts b/services/coral/interfaces/http/main.ts index 15e5ae4d..bcc37e27 100644 --- a/services/coral/interfaces/http/main.ts +++ b/services/coral/interfaces/http/main.ts @@ -18,5 +18,5 @@ await createHttpServer( }, ) .then( - () => void console.log("Coral service is running !"), + () => void console.log(`${envs.SERVICE_NAME} service is running !`), ); diff --git a/services/coral/interfaces/providers/asyncMessage/index.ts b/services/coral/interfaces/providers/asyncMessage/index.ts index 089602b1..f22dde5c 100644 --- a/services/coral/interfaces/providers/asyncMessage/index.ts +++ b/services/coral/interfaces/providers/asyncMessage/index.ts @@ -1,5 +1,5 @@ import { envs } from "@interfaces/envs"; -import { AsyncMessage } from "@vendors/async-message"; +import { AsyncMessage } from "@lib/async-message"; export const asyncMessage = new AsyncMessage({ currentServiceName: envs.SERVICE_NAME, diff --git a/services/coral/package.json b/services/coral/package.json index 3b00b3a6..c51773ce 100644 --- a/services/coral/package.json +++ b/services/coral/package.json @@ -14,10 +14,14 @@ }, "dependencies": { "@duplojs/http": "0.13.1", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@duplojs/server-utils": "0.4.1", - "mongodb": "7.0.0", - "uuidv7": "1.1.0" + "mongodb": "7.3.0", + "uuidv7": "1.2.1", + "@lib/entity-rules": "file:../libs/entity-rules", + "@lib/async-message": "file:../libs/async-message", + "@lib/eslint": "file:../libs/eslint", + "@lib/logger": "file:../libs/backend-logger" }, "devDependencies": { "@types/node": "22.15.0", diff --git a/services/coral/vendors/async-message b/services/coral/vendors/async-message deleted file mode 120000 index 2f9150aa..00000000 --- a/services/coral/vendors/async-message +++ /dev/null @@ -1 +0,0 @@ -../../../libs/async-message/scripts/ \ No newline at end of file diff --git a/services/coral/vendors/backend-logger b/services/coral/vendors/backend-logger deleted file mode 120000 index d1aa3c8a..00000000 --- a/services/coral/vendors/backend-logger +++ /dev/null @@ -1 +0,0 @@ -../../../libs/backend-logger/scripts/ \ No newline at end of file diff --git a/services/coral/vendors/entity-rules b/services/coral/vendors/entity-rules deleted file mode 120000 index 6f0c7637..00000000 --- a/services/coral/vendors/entity-rules +++ /dev/null @@ -1 +0,0 @@ -../../../libs/entity-rules/scripts/ \ No newline at end of file diff --git a/services/coral/vendors/eslint b/services/coral/vendors/eslint deleted file mode 120000 index 1e2ce6cc..00000000 --- a/services/coral/vendors/eslint +++ /dev/null @@ -1 +0,0 @@ -../../../libs/eslint/scripts/ \ No newline at end of file diff --git a/services/horizon/interfaces/http/checkers/post.ts b/services/horizon/interfaces/http/checkers/post.ts index 7b8cc42a..a6c63323 100644 --- a/services/horizon/interfaces/http/checkers/post.ts +++ b/services/horizon/interfaces/http/checkers/post.ts @@ -1,11 +1,11 @@ -import { SchoolAPI } from "@interfaces/providers/school"; +import { SchoolProvider } from "@interfaces/providers/school"; export const postExistCheck = createChecker("postExist") .handler( - async(input: string, output) => { - const schoolResponse = await SchoolAPI.findPost(input); + async(postId: string, output) => { + const schoolResponse = await SchoolProvider.findOneAvailablePost({ postId }); - if (schoolResponse.information === "post.found") { + if (schoolResponse.information === "availablePost.found") { return output("post.exist", schoolResponse.body); } else { return output("post.notfound", null); diff --git a/services/horizon/interfaces/http/routes/answer.ts b/services/horizon/interfaces/http/routes/answer/answerList.ts similarity index 50% rename from services/horizon/interfaces/http/routes/answer.ts rename to services/horizon/interfaces/http/routes/answer/answerList.ts index 28c1235a..4288d64b 100644 --- a/services/horizon/interfaces/http/routes/answer.ts +++ b/services/horizon/interfaces/http/routes/answer/answerList.ts @@ -1,51 +1,8 @@ -import { SchoolAPI } from "@interfaces/providers/school"; -import { useMustBeConnectedBuilder } from "../security/authentication"; -import { match } from "ts-pattern"; +import { A, D, O, P } from "@duplojs/utils"; import { answerConfig } from "@interfaces/configs/answer"; import { Answer } from "@business/entities/forum/answer"; import { Post } from "@business/entities/forum/post"; - -useMustBeConnectedBuilder({ unauthorizedBannedUser: true }) - .createRoute("POST", "/create-answer") - .extract({ - body: { - postId: Post.id, - content: Answer.content, - }, - }) - .cut( - async({ pickup, dropper }) => { - const { postId, content, user } = pickup(["postId", "content", "user"]); - - const schoolResponse = await SchoolAPI.replyToPost( - postId, - { - content, - authorId: user.id, - authorName: user.username, - }, - ); - - return match(schoolResponse) - .with( - { information: "post.notfound" }, - () => new NotFoundHttpResponse("post.notfound"), - ) - .with( - { information: "answer.created" }, - (_response) => dropper(null), - ) - .exhaustive(); - }, - [], - makeResponseContract(NotFoundHttpResponse, "post.notfound"), - ) - .handler( - () => new CreatedHttpResponse( - "answer.created", - ), - makeResponseContract(CreatedHttpResponse, "answer.created"), - ); +import { SchoolProvider } from "@interfaces/providers/school"; useBuilder() .createRoute("POST", "/answer-list") @@ -59,13 +16,13 @@ useBuilder() async({ pickup, dropper }) => { const { postId, page } = pickup(["postId", "page"]); - const schoolResponse = await SchoolAPI.findAnswers( + const result = await SchoolProvider.findManyAvailableAnswer({ postId, - answerConfig.findAnswers.quantityPerPage, + quantityPerPage: answerConfig.findAnswers.quantityPerPage, page, - ); + }); - return match(schoolResponse) + return P.match(result) .with( { information: "post.notfound" }, () => new NotFoundHttpResponse("post.notfound"), @@ -98,7 +55,14 @@ useBuilder() ) .handler( (pickup) => { - const processedAnswers = pickup("processedAnswers"); + // theDate translation + const processedAnswers = A.map( + pickup("processedAnswers"), + O.transformProperty( + "createdAt", + D.toISOString, + ), + ); return new OkHttpResponse( "answerList.found", diff --git a/services/horizon/interfaces/http/routes/answer/createAnswer.ts b/services/horizon/interfaces/http/routes/answer/createAnswer.ts new file mode 100644 index 00000000..a1b9b984 --- /dev/null +++ b/services/horizon/interfaces/http/routes/answer/createAnswer.ts @@ -0,0 +1,48 @@ + +import { P } from "@duplojs/utils"; +import { Answer } from "@business/entities/forum/answer"; +import { Post } from "@business/entities/forum/post"; +import { useMustBeConnectedBuilder } from "@interfaces/http/security/authentication"; +import { SchoolProvider } from "@interfaces/providers/school"; + +useMustBeConnectedBuilder({ unauthorizedBannedUser: true }) + .createRoute("POST", "/create-answer") + .extract({ + body: { + postId: Post.id, + content: Answer.content, + }, + }) + .cut( + async({ pickup, dropper }) => { + const { postId, content, user } = pickup(["postId", "content", "user"]); + + const result = await SchoolProvider.replyToPost( + { + postId, + content, + authorId: user.id, + authorName: user.username, + }, + ); + + return P.match(result) + .with( + { information: "post.notfound" }, + () => new NotFoundHttpResponse("post.notfound"), + ) + .with( + { information: "answer.created" }, + () => dropper(null), + ) + .exhaustive(); + }, + [], + makeResponseContract(NotFoundHttpResponse, "post.notfound"), + ) + .handler( + () => new CreatedHttpResponse( + "answer.created", + ), + makeResponseContract(CreatedHttpResponse, "answer.created"), + ); diff --git a/services/horizon/interfaces/http/routes/answer/index.ts b/services/horizon/interfaces/http/routes/answer/index.ts new file mode 100644 index 00000000..c5566df1 --- /dev/null +++ b/services/horizon/interfaces/http/routes/answer/index.ts @@ -0,0 +1,2 @@ +import "./createAnswer"; +import "./answerList"; diff --git a/services/horizon/interfaces/http/routes/document.ts b/services/horizon/interfaces/http/routes/document.ts index 6a556e02..5ad9fd00 100644 --- a/services/horizon/interfaces/http/routes/document.ts +++ b/services/horizon/interfaces/http/routes/document.ts @@ -1,8 +1,9 @@ import { documentConfig } from "@interfaces/configs/document"; import { iWantDocumentExistById } from "../checkers/document"; -import { SchoolAPI } from "@interfaces/providers/school"; import { BackedDocument } from "@business/entities/bakedDocument"; import { Page } from "@business/entities/page"; +import { SchoolProvider } from "@interfaces/providers/school"; +import { A, D, O } from "@duplojs/utils"; useBuilder() .createRoute("POST", "/document-page") @@ -17,12 +18,21 @@ useBuilder() ) .handler( async(pickup) => { - const { document } = pickup(["document"]); + const document = pickup("document"); - const { body: posts } = await SchoolAPI.findPosts( - document.nodeSameRawDocumentId, - documentConfig.findPosts.quantityPerPage, - documentConfig.findPosts.defaultPage, + const result = await SchoolProvider.findManyAvailablePost({ + nodeSameRawDocumentId: document.nodeSameRawDocumentId, + quantityPerPage: documentConfig.findPosts.quantityPerPage, + page: documentConfig.findPosts.defaultPage, + }); + + // theDate translation + const posts = A.map( + result.body, + O.transformProperty( + "createdAt", + D.toISOString, + ), ); return new OkHttpResponse("documentPage.found", { diff --git a/services/horizon/interfaces/http/routes/documentFolder/findMany.ts b/services/horizon/interfaces/http/routes/documentFolder/findMany.ts index ef5a9f7b..a78c393a 100644 --- a/services/horizon/interfaces/http/routes/documentFolder/findMany.ts +++ b/services/horizon/interfaces/http/routes/documentFolder/findMany.ts @@ -33,6 +33,7 @@ useMustBeConnectedBuilder() return new OkHttpResponse( "documentFolders.found", + // theDate translation A.map( result.body, O.transformProperty( @@ -107,6 +108,7 @@ useMustBeConnectedBuilder() return new OkHttpResponse( "documentFolders.found", + // theDate translation A.map( result.body, O.transformProperty( diff --git a/services/horizon/interfaces/http/routes/documentFolder/findOne.ts b/services/horizon/interfaces/http/routes/documentFolder/findOne.ts index 6af1ee81..37321fa0 100644 --- a/services/horizon/interfaces/http/routes/documentFolder/findOne.ts +++ b/services/horizon/interfaces/http/routes/documentFolder/findOne.ts @@ -20,6 +20,7 @@ useMustBeConnectedBuilder() .handler( (pickup) => new OkHttpResponse( "documentFolder.found", + // theDate translation O.transformProperty( pickup("documentFolder"), "createdAt", diff --git a/services/horizon/interfaces/http/routes/favoriteEquation/findOne.ts b/services/horizon/interfaces/http/routes/favoriteEquation/findOne.ts index ca0ff731..b6c3d8ef 100644 --- a/services/horizon/interfaces/http/routes/favoriteEquation/findOne.ts +++ b/services/horizon/interfaces/http/routes/favoriteEquation/findOne.ts @@ -47,6 +47,7 @@ useMustBeConnectedBuilder() return new OkHttpResponse( "favoriteEquation.found", + // theDate translation O.transformProperty( favoriteEquation, "addedAt", diff --git a/services/horizon/interfaces/http/routes/post/createPost.ts b/services/horizon/interfaces/http/routes/post/createPost.ts index 89292bac..63f0992f 100644 --- a/services/horizon/interfaces/http/routes/post/createPost.ts +++ b/services/horizon/interfaces/http/routes/post/createPost.ts @@ -2,7 +2,7 @@ import { BackedDocument } from "@business/entities/bakedDocument"; import { Post } from "@business/entities/forum/post"; import { iWantDocumentExistById } from "@interfaces/http/checkers/document"; import { useMustBeConnectedBuilder } from "@interfaces/http/security/authentication"; -import { SchoolAPI } from "@interfaces/providers/school"; +import { SchoolProvider } from "@interfaces/providers/school"; useMustBeConnectedBuilder({ unauthorizedBannedUser: true }) .createRoute("POST", "/create-post") @@ -20,20 +20,16 @@ useMustBeConnectedBuilder({ unauthorizedBannedUser: true }) .handler( async(pickup) => { const { user, body, document } = pickup(["user", "body", "document"]); - const { topic, content } = body; - const createdPost = await SchoolAPI.createPost({ - topic, - content, + const result = await SchoolProvider.createPost({ + topic: body.topic, + content: body.content, nodeSameRawDocumentId: document.nodeSameRawDocumentId, authorId: user.id, authorName: user.username, }); - return new CreatedHttpResponse( - "post.created", - createdPost.body, - ); + return new CreatedHttpResponse("post.created", { id: result.body.id }); }, makeResponseContract(CreatedHttpResponse, "post.created", Post.createdPost), ); diff --git a/services/horizon/interfaces/http/routes/post/postList.ts b/services/horizon/interfaces/http/routes/post/postList.ts index 14a1b674..c59b6d4f 100644 --- a/services/horizon/interfaces/http/routes/post/postList.ts +++ b/services/horizon/interfaces/http/routes/post/postList.ts @@ -1,15 +1,17 @@ +import { A, D, O } from "@duplojs/utils"; import { BackedDocument } from "@business/entities/bakedDocument"; import { Post } from "@business/entities/forum/post"; import { postConfig } from "@interfaces/configs/post"; import { iWantDocumentExistById } from "@interfaces/http/checkers/document"; -import { SchoolAPI } from "@interfaces/providers/school"; +import { SchoolProvider } from "@interfaces/providers/school"; useBuilder() .createRoute("POST", "/post-list") .extract({ body: { documentId: BackedDocument.id, - page: zod.number() + page: zod + .number() .min(postConfig.findPosts.pageOffset), }, }) @@ -21,10 +23,19 @@ useBuilder() async(pickup) => { const { page, document } = pickup(["page", "document"]); - const { body: posts } = await SchoolAPI.findPosts( - document.nodeSameRawDocumentId, - postConfig.findPosts.quantityPerPage, - page - postConfig.findPosts.pageOffset, + const result = await SchoolProvider.findManyAvailablePost({ + nodeSameRawDocumentId: document.nodeSameRawDocumentId, + quantityPerPage: postConfig.findPosts.quantityPerPage, + page: page - postConfig.findPosts.pageOffset, + }); + + const posts = A.map( + result.body, + // theDate translation + O.transformProperty( + "createdAt", + D.toISOString, + ), ); return new OkHttpResponse( diff --git a/services/horizon/interfaces/http/routes/post/postListPage.ts b/services/horizon/interfaces/http/routes/post/postListPage.ts index 165cb04a..8d2d2cb5 100644 --- a/services/horizon/interfaces/http/routes/post/postListPage.ts +++ b/services/horizon/interfaces/http/routes/post/postListPage.ts @@ -1,9 +1,9 @@ +import { P } from "@duplojs/utils"; import { BackedDocument } from "@business/entities/bakedDocument"; import { Page } from "@business/entities/page"; import { postConfig } from "@interfaces/configs/post"; import { iWantDocumentExistById } from "@interfaces/http/checkers/document"; -import { SchoolAPI } from "@interfaces/providers/school"; -import { match } from "ts-pattern"; +import { SchoolProvider } from "@interfaces/providers/school"; useBuilder() .createRoute("POST", "/post-list-page") @@ -18,12 +18,12 @@ useBuilder() ) .cut( async({ pickup, dropper }) => { - const { document } = pickup(["document"]); - const details = await SchoolAPI.findDocumentPostsDetails(document.nodeSameRawDocumentId); + const { nodeSameRawDocumentId } = pickup("document"); + const details = await SchoolProvider.findManyAvailablePostDetails({ nodeSameRawDocumentId }); - return match(details) + return P.match(details) .with( - { information: "document.posts.details" }, + { information: "posts.foundDetails" }, ({ body }) => dropper({ documentPostsDetails: body }), ) .exhaustive(); diff --git a/services/horizon/interfaces/http/routes/post/postPage.ts b/services/horizon/interfaces/http/routes/post/postPage.ts index 8e2dd091..67153a44 100644 --- a/services/horizon/interfaces/http/routes/post/postPage.ts +++ b/services/horizon/interfaces/http/routes/post/postPage.ts @@ -7,7 +7,7 @@ import { iWantPostExistById } from "@interfaces/http/checkers/post"; import { tryAuthenticationProcess } from "@interfaces/http/security/authentication"; import { BottleAPI } from "@interfaces/providers/bottle"; import { createBakedDocumentId } from "@interfaces/utils/createBakedDocumentId"; -import { match } from "ts-pattern"; +import { P, O, D } from "@duplojs/utils"; useBuilder() .createRoute("POST", "/post-page") @@ -68,7 +68,7 @@ useBuilder() postId: post.id, }) .then( - ({ information }) => match(information) + ({ information }) => P.match(information) .with( "replyPostNotificationSetting.found", () => true, @@ -88,10 +88,17 @@ useBuilder() (pickup) => { const { post, document, notificationOfPostIsActivate } = pickup(["post", "document", "notificationOfPostIsActivate"]); + // theDate translation + const ntm = O.transformProperty( + post, + "createdAt", + D.toISOString, + ); + return new OkHttpResponse( "postPage.found", { - post, + post: ntm, document: { id: document.id, title: document.title, diff --git a/services/horizon/interfaces/providers/school/index.ts b/services/horizon/interfaces/providers/school/index.ts index 75cc8524..7505232f 100644 --- a/services/horizon/interfaces/providers/school/index.ts +++ b/services/horizon/interfaces/providers/school/index.ts @@ -1,111 +1,123 @@ -import { HttpClient, type TransformCodegenRouteToHttpClientRoute } from "@duplojs/http-client"; +import { createHttpClient } from "@duplojs/http/client"; +import type { Routes } from "@vendors/clients-type/school/duplojsTypesCodegen"; import { envs } from "@interfaces/envs"; -import { type CodegenRoutes } from "@vendors/clients-type/school/duplojsTypesCodegen"; -import { type InputCreateAnswer, type InputCreatePost } from "./types"; -export type SchoolClientRoute = TransformCodegenRouteToHttpClientRoute< - CodegenRoutes ->; +export namespace SchoolProvider { + const client = createHttpClient({ + baseUrl: envs.SCHOOL_BASE_URL, + }); -export class SchoolAPI { - private static httpClient: HttpClient; - - public static findPosts( - nodeSameRawDocumentId: string, - quantityPerPage: number, - page: number, + export function findManyAvailablePost( + params: { + nodeSameRawDocumentId: string; + page: number; + quantityPerPage: number; + }, ) { - return this.httpClient - .get( - "/documents/{nodeSameRawDocumentId}/posts", - { - params: { - nodeSameRawDocumentId, - }, - query: { - page: page.toString(), - quantityPerPage: quantityPerPage.toString(), - }, - }, - ) - .iWantInformation("posts.found"); - } - - public static createPost(body: InputCreatePost) { - return this.httpClient - .post( - "/posts", - { - body, - }, - ) - .iWantInformation("post.created"); + return client.post( + "/find-many-available-post-by-node-same-raw-document", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "posts.found": true, + "extract-error": false, + }); } - public static findAnswers( - postId: string, - quantityPerPage: number, - page: number, + export function findManyAvailablePostDetails( + params: { + nodeSameRawDocumentId: string; + }, ) { - return this.httpClient - .get( - "/posts/{postId}/answers", - { - params: { - postId, - }, - query: { - page: page.toString(), - quantityPerPage: quantityPerPage.toString(), - }, - }, - ) - .iWantInformation(["answers.found", "post.notfound"]); + return client.post( + "/find-many-available-post-by-node-same-raw-document-details", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "posts.foundDetails": true, + "extract-error": false, + }); } - public static replyToPost(postId: string, body: InputCreateAnswer) { - return this.httpClient - .post( - "/posts/{postId}/answers", - { - params: { - postId, - }, - body, - }, - ) - .iWantExpectedResponse(); + export function createPost( + params: { + topic: string; + content: string; + nodeSameRawDocumentId: string; + authorId: string; + authorName: string; + }, + ) { + return client.post( + "/create-post", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "post.created": true, + "extract-error": false, + }); } - public static findPost(postId: string) { - return this.httpClient - .get( - "/posts/{postId}", - { - params: { - postId, - }, - }, - ) - .iWantExpectedResponse(); + export function findManyAvailableAnswer( + params: { + postId: string; + page: number; + quantityPerPage: number; + }, + ) { + return client.post( + "/find-many-available-answer-by-available-post", + { + body: params, + }, + ).iSelectExpectedResponseByInformationOrThrow({ + "post.notfound": true, + "answers.found": true, + "extract-error": false, + }); } - public static findDocumentPostsDetails(nodeSameRawDocumentId: string) { - return this.httpClient - .get( - "/documents/{nodeSameRawDocumentId}/posts-details", - { - params: { - nodeSameRawDocumentId, - }, - }, - ) - .iWantExpectedResponse(); + export function replyToPost( + params: { + postId: string; + content: string; + authorId: string; + authorName: string; + }, + ) { + return client.post( + "/reply-to-post", + { + body: params, + }, + // big difference + ).iSelectExpectedResponseByInformationOrThrow({ + "answer.created": true, + "post.notfound": true, + "post.wrongStatus": false, + "extract-error": false, + "replyToPost.failed": false, + }); } - static { - this.httpClient = new HttpClient({ - baseUrl: envs.SCHOOL_BASE_URL, - }); + export function findOneAvailablePost( + params: { + postId: string; + }, + ) { + return client.post( + "/find-one-available-post", + { + body: params, + }, + ) + .iSelectExpectedResponseByInformationOrThrow({ + "availablePost.found": true, + "availablePost.notfound": true, + "extract-error": false, + }); } } diff --git a/services/horizon/interfaces/providers/school/types.ts b/services/horizon/interfaces/providers/school/types.ts deleted file mode 100644 index e5463b7e..00000000 --- a/services/horizon/interfaces/providers/school/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { type FindHttpClientRoute } from "@duplojs/http-client"; -import { type SchoolClientRoute } from "."; - -export type InputCreatePost = FindHttpClientRoute< - SchoolClientRoute, - "POST", - "/posts" ->["body"]; - -export type InputCreateAnswer = FindHttpClientRoute< - SchoolClientRoute, - "POST", - "/posts/{postId}/answers" ->["body"]; diff --git a/services/horizon/package.json b/services/horizon/package.json index 9ab8d37e..c82b882b 100644 --- a/services/horizon/package.json +++ b/services/horizon/package.json @@ -7,12 +7,15 @@ "duplo:dev": "tsx --watch interfaces/http/main.ts", "duplo:generate": "duplojs-types-codegen --import @duplojs/node/globals --require interfaces/http/plugins/generate.ts --include interfaces/http/routes/index.ts --output ../../libs/clients-type/types/horizon/duplojsTypesCodegen.d.ts", "test:lint": "eslint", + "test:lint:fix": "eslint --fix", "test:types": "tsc", "postinstall": "npm run duplo:generate" }, "dependencies": { "@duplojs/http": "0.13.1", + "@duplojs/utils": "1.9.9", "@duplojs/server-utils": "0.4.1", + "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", diff --git a/services/lighthouse/package.json b/services/lighthouse/package.json index 751e9ea1..08ad953d 100644 --- a/services/lighthouse/package.json +++ b/services/lighthouse/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@duplojs/http-client": "1.2.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@mdi/js": "7.4.47", "@sentry/vue": "9.22.0", "@tailwindcss/vite": "4.0.14", diff --git a/services/marine-snow/package.json b/services/marine-snow/package.json index 6ac4c963..5ba3154d 100644 --- a/services/marine-snow/package.json +++ b/services/marine-snow/package.json @@ -28,7 +28,7 @@ "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@vue/reactivity": "3.5.13", "commander": "13.1.0", "dotenv": "16.4.5", diff --git a/services/rosetta/package.json b/services/rosetta/package.json index 8d00b22b..07c9075d 100644 --- a/services/rosetta/package.json +++ b/services/rosetta/package.json @@ -14,7 +14,7 @@ "@duplojs/core": "1.0.3", "@duplojs/http-client": "1.2.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "commander": "13.1.0", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", diff --git a/services/school/.commands/test-lint.sh b/services/school/.commands/test-lint.sh new file mode 100755 index 00000000..4a9f7dc6 --- /dev/null +++ b/services/school/.commands/test-lint.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +ARGUMENTS="$@" + +eslint --quiet $ARGUMENTS business/ + +eslint --quiet $ARGUMENTS interfaces/ \ No newline at end of file diff --git a/services/school/.commands/test-types.sh b/services/school/.commands/test-types.sh new file mode 100755 index 00000000..e338d0a0 --- /dev/null +++ b/services/school/.commands/test-types.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +set -e + +tsc -p ./business/domains/tsconfig.json +tsc -p ./business/applications/tsconfig.json + +tsc -p ./interfaces/adapters/tsconfig.json +tsc -p ./interfaces/http/tsconfig.json +tsc -p ./interfaces/asyncMessage/tsconfig.json +tsc -p ./interfaces/providers/tsconfig.json +tsc -p ./interfaces/tsconfig.json \ No newline at end of file diff --git a/services/school/.env b/services/school/.env index dd6668e9..289e1b91 100644 --- a/services/school/.env +++ b/services/school/.env @@ -17,3 +17,6 @@ GLITCHTIP_DSN="" BOTTLE_BASE_URL="http://bottle:1506" HARBOR_BASE_URL="http://harbor:1506" + +CODEGEN_PATH="../../libs/clients-type/types/school/duplojsTypesCodegen.d.ts" +SERVICE_NAME="school" \ No newline at end of file diff --git a/services/school/business/applications/ports/answer.ts b/services/school/business/applications/ports/answer.ts new file mode 100644 index 00000000..4e9aef0d --- /dev/null +++ b/services/school/business/applications/ports/answer.ts @@ -0,0 +1,11 @@ +import { C } from "@duplojs/utils"; +import type { AnswerRepository } from "@domains/repositories/answer"; +import type { BaseRepositoryPort } from "./types"; +import type { Answer } from "@domains/entities/answer"; + +export interface AnswerPort extends AnswerRepository, BaseRepositoryPort { + findOneById(id: Answer.Id): Promise>; + getTotalCountOfUnprocessed(): Promise; +} + +export const AnswerPort = C.createPort(); diff --git a/services/school/business/applications/ports/author.ts b/services/school/business/applications/ports/author.ts new file mode 100644 index 00000000..606ac999 --- /dev/null +++ b/services/school/business/applications/ports/author.ts @@ -0,0 +1,8 @@ +import { C } from "@duplojs/utils"; +import type { AuthorRepository } from "@domains/repositories/author"; + +export interface AuthorPort extends AuthorRepository { + +} + +export const AuthorPort = C.createPort(); diff --git a/services/school/business/applications/ports/notificationSetting.ts b/services/school/business/applications/ports/notificationSetting.ts new file mode 100644 index 00000000..4ff108f5 --- /dev/null +++ b/services/school/business/applications/ports/notificationSetting.ts @@ -0,0 +1,8 @@ +import { C } from "@duplojs/utils"; +import type { BaseRepositoryPort } from "./types"; +import type { NotificationSetting } from "@domains/entities/notificationSetting"; + +export interface NotificationSettingPort extends BaseRepositoryPort { +} + +export const NotificationSettingPort = C.createPort(); diff --git a/services/school/business/applications/ports/post.ts b/services/school/business/applications/ports/post.ts new file mode 100644 index 00000000..cef88f67 --- /dev/null +++ b/services/school/business/applications/ports/post.ts @@ -0,0 +1,14 @@ +import { C } from "@duplojs/utils"; +import type { PostRepository } from "@domains/repositories/post"; +import type { BaseRepositoryPort } from "@applications/ports/types"; +import type { Post } from "@domains/entities/post"; + +export interface PostPort extends PostRepository, BaseRepositoryPort { + findOneById(id: Post.Id): Promise>; + getTotalCountAvailableByNodeSameRawDocument( + nodeSameRawDocumentId: Post.NodeSameRawDocumentId + ): Promise; + getTotalCountOfUnprocessed(): Promise; +} + +export const PostPort = C.createPort(); diff --git a/services/school/business/applications/ports/report.ts b/services/school/business/applications/ports/report.ts new file mode 100644 index 00000000..6fbbaa00 --- /dev/null +++ b/services/school/business/applications/ports/report.ts @@ -0,0 +1,8 @@ +import { C } from "@duplojs/utils"; +import type { BaseRepositoryPort } from "./types"; +import type { Report } from "@domains/entities/report"; + +export interface ReportPort extends BaseRepositoryPort { +} + +export const ReportPort = C.createPort(); diff --git a/services/school/business/applications/ports/types/baseRepository.ts b/services/school/business/applications/ports/types/baseRepository.ts new file mode 100644 index 00000000..6c79cfb9 --- /dev/null +++ b/services/school/business/applications/ports/types/baseRepository.ts @@ -0,0 +1,9 @@ +import type { C } from "@duplojs/utils"; + +export interface BaseRepositoryPort< + GenericEntity extends C.Entity, +> { + save< + GenericSavedEntity extends GenericEntity, + >(entity: GenericSavedEntity): Promise; +} diff --git a/services/school/business/applications/ports/types/index.ts b/services/school/business/applications/ports/types/index.ts new file mode 100644 index 00000000..a6a60274 --- /dev/null +++ b/services/school/business/applications/ports/types/index.ts @@ -0,0 +1 @@ +export * from "./baseRepository"; diff --git a/services/school/business/applications/repositories/answer.ts b/services/school/business/applications/repositories/answer.ts deleted file mode 100644 index 6105f508..00000000 --- a/services/school/business/applications/repositories/answer.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { type Username, type UserId } from "@business/domains/common/user"; -import { type AnswerId, type AnswerEntity } from "@business/domains/entities/answer"; -import { type PostAnswerCount, type PostId } from "@business/domains/entities/post"; -import { createRepositoryHandler, type Int, type RepositoryBase } from "@vendors/clean"; - -interface FindByPostIdParams { - page: Int; - quantityPerPage: Int; -} - -export interface AnswerRepository extends RepositoryBase { - generateAnswerId(): AnswerId; - findByPostId(postId: PostId, params: FindByPostIdParams): Promise; - getCountByPostId(postId: PostId): Promise; - renameAuthor(userId: UserId, newName: Username | null): Promise; - findOneById(id: AnswerId): Promise; - findOldestUnprocessedAnswer(): Promise; - getTotalCountOfUnprocessedAnswers(): Promise; -} - -export const answerRepository = createRepositoryHandler(); diff --git a/services/school/business/applications/repositories/notification.ts b/services/school/business/applications/repositories/notification.ts deleted file mode 100644 index 66ac99a6..00000000 --- a/services/school/business/applications/repositories/notification.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { type PostEntity } from "@business/domains/entities/post"; -import { createRepositoryHandler, type RepositoryBase } from "@vendors/clean"; - -export interface notificationRepository extends RepositoryBase { - enableReplyPostNotificationToAuthor(post: PostEntity): Promise; -} - -export const notificationRepository = createRepositoryHandler< - notificationRepository ->(); diff --git a/services/school/business/applications/repositories/post.ts b/services/school/business/applications/repositories/post.ts deleted file mode 100644 index b1b71951..00000000 --- a/services/school/business/applications/repositories/post.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { type Username, type UserId } from "@business/domains/common/user"; -import { type PostId, type PostEntity, type NodeSameRawDocumentId } from "@business/domains/entities/post"; -import { createRepositoryHandler, type Int, type RepositoryBase } from "@vendors/clean"; - -interface FindByDocumentIdParams { - page: Int; - quantityPerPage: Int; -} -export interface PostRepository extends RepositoryBase { - generatePostId(): PostId; - findByNodeSameRawDocumentId( - documentId: NodeSameRawDocumentId, - params: FindByDocumentIdParams - ): Promise; - findOneById(postId: PostId): Promise; - findOldestUnprocessedPost(): Promise; - getTotalCountByNodeSameRawDocumentId(documentId: NodeSameRawDocumentId): Promise; - getTotalCountOfUnprocessedPosts(): Promise; - renameAuthor(userId: UserId, newName: Username | null): Promise; -} - -export const postRepository = createRepositoryHandler(); diff --git a/services/school/business/applications/repositories/warning.ts b/services/school/business/applications/repositories/warning.ts deleted file mode 100644 index a8c5e9c5..00000000 --- a/services/school/business/applications/repositories/warning.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { type PostEntity } from "@business/domains/entities/post"; -import { type WarningMakeUserBan, type WarningReason } from "@business/domains/common/warning"; -import { createRepositoryHandler, type RepositoryBase } from "@vendors/clean"; -import { type AnswerEntity } from "@business/domains/entities/answer"; - -interface InputWarning { - makeUserBan: WarningMakeUserBan; - reason: WarningReason; -} - -interface InputPostWarning extends InputWarning { - post: PostEntity; -} - -interface InputAnswerWarning extends InputWarning { - answer: AnswerEntity; - post: PostEntity; -} - -export interface WarningRepository extends RepositoryBase { - createPostWarning(warning: InputPostWarning): Promise; - createAnswerWarning(warning: InputAnswerWarning): Promise; -} - -export const warningRepository = createRepositoryHandler< - WarningRepository ->(); diff --git a/services/school/business/applications/tsconfig.json b/services/school/business/applications/tsconfig.json new file mode 100644 index 00000000..0972102a --- /dev/null +++ b/services/school/business/applications/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@applications/*": ["./*"], + "@domains/*": ["../domains/*"], + }, + }, + "include": ["**/*.ts", "../domains/**/*.ts"], +} \ No newline at end of file diff --git a/services/school/business/applications/useCases/answer/createReportAnswer.ts b/services/school/business/applications/useCases/answer/createReportAnswer.ts new file mode 100644 index 00000000..7bb5da8b --- /dev/null +++ b/services/school/business/applications/useCases/answer/createReportAnswer.ts @@ -0,0 +1,27 @@ +import { C, E, promiseObject } from "@duplojs/utils"; +import { createReportAnswer } from "@domains/aggregates/answer/createReportAnswer"; +import { AnswerPort } from "@applications/ports/answer"; +import { ReportPort } from "@applications/ports/report"; +import type { Answer } from "@domains/entities/answer"; +import type { Report } from "@domains/entities/report"; + +interface Input { + answer: Answer.Entity & Answer.Unprocessed; + level: Report.Level; + reason: Report.Reason; +} + +export const CreateReportAnswerUseCase = C.createUseCase( + { + AnswerPort, + ReportPort, + }, + ({ answerPort, reportPort }) => (input: Input) => E.rightAsyncPipe( + createReportAnswer(input), + ({ answer, report }) => promiseObject({ + report: reportPort.save(report), + answer: answerPort.save(answer), + }), + (result) => E.right("post.report", result), + ), +); diff --git a/services/school/business/applications/useCases/answer/findManyAvailableAnswerByAvailablePost.ts b/services/school/business/applications/useCases/answer/findManyAvailableAnswerByAvailablePost.ts new file mode 100644 index 00000000..6b1226cf --- /dev/null +++ b/services/school/business/applications/useCases/answer/findManyAvailableAnswerByAvailablePost.ts @@ -0,0 +1,17 @@ +import { C } from "@duplojs/utils"; +import { findManyAvailableAnswerByAvailablePost } from "@domains/aggregates/answer/findManyAvailableAnswerByAvailablePost"; +import { AnswerPort } from "@applications/ports/answer"; +import type { Post } from "@domains/entities/post"; + +interface Input { + post: Post.AvailableEntity; + page: C.PositiveInt; + quantityPerPage: C.StrictPositiveInt; +} + +export const FindManyAvailableAnswerByAvailablePost = C.createUseCase( + { AnswerPort }, + ({ answerPort }) => async(input: Input) => findManyAvailableAnswerByAvailablePost( + await answerPort.findManyAvailableByAvailablePost(input), + ), +); diff --git a/services/school/business/applications/useCases/answer/findOldestUnprocessedAnswer.ts b/services/school/business/applications/useCases/answer/findOldestUnprocessedAnswer.ts new file mode 100644 index 00000000..c91d3e2e --- /dev/null +++ b/services/school/business/applications/useCases/answer/findOldestUnprocessedAnswer.ts @@ -0,0 +1,10 @@ +import { C } from "@duplojs/utils"; +import { AnswerPort } from "@applications/ports/answer"; +import { findOldestUnprocessedAnswer } from "@domains/aggregates/answer/findOldestUnprocessedAnswer"; + +export const FindOldestUnprocessedAnswer = C.createUseCase( + { AnswerPort }, + ({ answerPort }) => async() => findOldestUnprocessedAnswer( + await answerPort.findOldestUnprocessed(), + ), +); diff --git a/services/school/business/applications/useCases/answer/index.ts b/services/school/business/applications/useCases/answer/index.ts new file mode 100644 index 00000000..96d8fad8 --- /dev/null +++ b/services/school/business/applications/useCases/answer/index.ts @@ -0,0 +1,5 @@ +export * from "./createReportAnswer"; +export * from "./markAnswerAsCompliant"; +export * from "./replyToPost"; +export * from "./findManyAvailableAnswerByAvailablePost"; +export * from "./findOldestUnprocessedAnswer"; diff --git a/services/school/business/applications/useCases/answer/markAnswerAsCompliant.ts b/services/school/business/applications/useCases/answer/markAnswerAsCompliant.ts new file mode 100644 index 00000000..49f548f3 --- /dev/null +++ b/services/school/business/applications/useCases/answer/markAnswerAsCompliant.ts @@ -0,0 +1,16 @@ +import { C, E } from "@duplojs/utils"; +import { markAnswerAsCompliant } from "@domains/aggregates/answer/markAnswerAsCompliant"; +import { AnswerPort } from "@applications/ports/answer"; +import type { Answer } from "@domains/entities/answer"; + +interface Input { + answer: Answer.Entity & Answer.Unprocessed; +} + +export const MarkAnswerAsCompliantUseCase = C.createUseCase( + { AnswerPort }, + ({ answerPort }) => (input: Input) => E.rightPipe( + markAnswerAsCompliant(input.answer), + answerPort.save, + ), +); diff --git a/services/school/business/applications/useCases/answer/replyToPost.ts b/services/school/business/applications/useCases/answer/replyToPost.ts new file mode 100644 index 00000000..9377ed67 --- /dev/null +++ b/services/school/business/applications/useCases/answer/replyToPost.ts @@ -0,0 +1,33 @@ +import { C, E, promiseObject } from "@duplojs/utils"; +import { replyToPost } from "@domains/aggregates/answer/replyToPost"; +import { AnswerPort } from "@applications/ports/answer"; +import { PostPort } from "@applications/ports/post"; +import type { Answer } from "@domains/entities/answer"; +import type { UserId, UserName } from "@domains/common/user"; +import type { Post } from "@domains/entities/post"; + +interface Input { + post: Post.AvailableEntity; + content: Answer.Content; + authorId: UserId; + authorName: UserName; +} + +export const ReplyToPostUseCase = C.createUseCase( + { + AnswerPort, + PostPort, + }, + ({ answerPort, postPort }) => async(input: Input) => E.rightAsyncPipe( + replyToPost({ + ...input, + id: answerPort.generateId(), + postAnswerCount: await postPort.getAnswerCount(input.post), + }), + ({ answer, post }) => promiseObject({ + post: postPort.save(post), + answer: answerPort.save(answer), + }), + (result) => E.right("replyPost", result), + ), +); diff --git a/services/school/business/applications/useCases/author/anonymiseAuthor.ts b/services/school/business/applications/useCases/author/anonymiseAuthor.ts new file mode 100644 index 00000000..cf9ab567 --- /dev/null +++ b/services/school/business/applications/useCases/author/anonymiseAuthor.ts @@ -0,0 +1,15 @@ +import { C } from "@duplojs/utils"; +import { anonymiseAuthor } from "@domains/aggregates/author/anonymiseAuthor"; +import { AuthorPort } from "@applications/ports/author"; +import type { UserId } from "@domains/common/user"; + +interface Input { + userId: UserId; +} + +export const AnonymiseAuthorUseCase = C.createUseCase( + { AuthorPort }, + ({ authorPort }) => async(input: Input) => anonymiseAuthor( + await authorPort.anonymise(input.userId), + ), +); diff --git a/services/school/business/applications/useCases/author/index.ts b/services/school/business/applications/useCases/author/index.ts new file mode 100644 index 00000000..34ad2bdb --- /dev/null +++ b/services/school/business/applications/useCases/author/index.ts @@ -0,0 +1,3 @@ +export * from "./anonymiseAuthor"; +export * from "./renameAuthor"; +export * from "./restoreAuthor"; diff --git a/services/school/business/applications/useCases/author/renameAuthor.ts b/services/school/business/applications/useCases/author/renameAuthor.ts new file mode 100644 index 00000000..ba396934 --- /dev/null +++ b/services/school/business/applications/useCases/author/renameAuthor.ts @@ -0,0 +1,16 @@ +import { C } from "@duplojs/utils"; +import { renameAuthor } from "@domains/aggregates/author/renameAuthor"; +import { AuthorPort } from "@applications/ports/author"; +import type { UserId, UserName } from "@domains/common/user"; + +interface Input { + userId: UserId; + username: UserName; +} + +export const RenameAuthorUseCase = C.createUseCase( + { AuthorPort }, + ({ authorPort }) => async(input: Input) => renameAuthor( + await authorPort.rename(input.userId, input.username), + ), +); diff --git a/services/school/business/applications/useCases/author/restoreAuthor.ts b/services/school/business/applications/useCases/author/restoreAuthor.ts new file mode 100644 index 00000000..a2ad3958 --- /dev/null +++ b/services/school/business/applications/useCases/author/restoreAuthor.ts @@ -0,0 +1,16 @@ +import { C } from "@duplojs/utils"; +import { restoreAuthor } from "@domains/aggregates/author/restoreAuthor"; +import { AuthorPort } from "@applications/ports/author"; +import type { UserId, UserName } from "@domains/common/user"; + +interface Input { + userId: UserId; + username: UserName; +} + +export const RestoreAuthorUseCase = C.createUseCase( + { AuthorPort }, + ({ authorPort }) => async(input: Input) => restoreAuthor( + await authorPort.restore(input.userId, input.username), + ), +); diff --git a/services/school/business/applications/useCases/post/createPost.ts b/services/school/business/applications/useCases/post/createPost.ts new file mode 100644 index 00000000..b772a3d0 --- /dev/null +++ b/services/school/business/applications/useCases/post/createPost.ts @@ -0,0 +1,32 @@ +import { C, E, promiseObject } from "@duplojs/utils"; +import { createPost } from "@domains/aggregates/post/createPost"; +import { PostPort } from "@applications/ports/post"; +import { NotificationSettingPort } from "@applications/ports/notificationSetting"; +import type { UserId, UserName } from "@domains/common/user"; +import type { Post } from "@domains/entities/post"; + +interface Input { + nodeSameRawDocumentId: Post.NodeSameRawDocumentId; + authorId: UserId; + authorName: UserName; + topic: Post.Topic; + content: Post.Content; +} + +export const CreatePostUseCase = C.createUseCase( + { + PostPort, + NotificationSettingPort, + }, + ({ postPort, notificationSettingPort }) => (input: Input) => E.rightAsyncPipe( + createPost({ + ...input, + id: postPort.generateId(), + }), + ({ post, notificationSetting }) => promiseObject({ + post: postPort.save(post), + notificationSetting: notificationSettingPort.save(notificationSetting), + }), + (result) => E.right("post.created", result), + ), +); diff --git a/services/school/business/applications/useCases/post/createReportPost.ts b/services/school/business/applications/useCases/post/createReportPost.ts new file mode 100644 index 00000000..37176965 --- /dev/null +++ b/services/school/business/applications/useCases/post/createReportPost.ts @@ -0,0 +1,27 @@ +import { C, E, promiseObject } from "@duplojs/utils"; +import { createReportPost } from "@domains/aggregates/post/createReportPost"; +import { PostPort } from "@applications/ports/post"; +import { ReportPort } from "@applications/ports/report"; +import type { Post } from "@domains/entities/post"; +import type { Report } from "@domains/entities/report"; + +interface Input { + post: Post.Entity & Post.Unprocessed; + level: Report.Level; + reason: Report.Reason; +} + +export const CreateReportPostUseCase = C.createUseCase( + { + PostPort, + ReportPort, + }, + ({ postPort, reportPort }) => (input: Input) => E.rightAsyncPipe( + createReportPost(input), + ({ post, report }) => promiseObject({ + report: reportPort.save(report), + post: postPort.save(post), + }), + (result) => E.right("post.report", result), + ), +); diff --git a/services/school/business/applications/useCases/post/findManyAvailablePostByNodeSameRawDocument.ts b/services/school/business/applications/useCases/post/findManyAvailablePostByNodeSameRawDocument.ts new file mode 100644 index 00000000..c433e9a4 --- /dev/null +++ b/services/school/business/applications/useCases/post/findManyAvailablePostByNodeSameRawDocument.ts @@ -0,0 +1,17 @@ +import { C } from "@duplojs/utils"; +import { findManyAvailablePostByNodeSameRawDocument } from "@domains/aggregates/post/findManyAvailablePostByNodeSameRawDocument"; +import { PostPort } from "@applications/ports/post"; +import type { Post } from "@domains/entities/post"; + +interface Input { + nodeSameRawDocumentId: Post.NodeSameRawDocumentId; + page: C.PositiveInt; + quantityPerPage: C.StrictPositiveInt; +} + +export const FindManyAvailablePostByNodeSameRawDocumentUseCase = C.createUseCase( + { PostPort }, + ({ postPort }) => async(input: Input) => findManyAvailablePostByNodeSameRawDocument( + await postPort.findManyAvailableByNodeSameRawDocument(input), + ), +); diff --git a/services/school/business/applications/useCases/post/findOldestUnprocessedPost.ts b/services/school/business/applications/useCases/post/findOldestUnprocessedPost.ts new file mode 100644 index 00000000..52f893ca --- /dev/null +++ b/services/school/business/applications/useCases/post/findOldestUnprocessedPost.ts @@ -0,0 +1,10 @@ +import { C } from "@duplojs/utils"; +import { findOldestUnprocessedPost } from "@domains/aggregates/post/findOldestUnprocessedPost"; +import { PostPort } from "@applications/ports/post"; + +export const FindOldestUnprocessedPost = C.createUseCase( + { PostPort }, + ({ postPort }) => async() => findOldestUnprocessedPost( + await postPort.findOldestUnprocessed(), + ), +); diff --git a/services/school/business/applications/useCases/post/findOneAvailablePostById.ts b/services/school/business/applications/useCases/post/findOneAvailablePostById.ts new file mode 100644 index 00000000..19a484a7 --- /dev/null +++ b/services/school/business/applications/useCases/post/findOneAvailablePostById.ts @@ -0,0 +1,15 @@ +import { C } from "@duplojs/utils"; +import { findOneAvailablePostById } from "@domains/aggregates/post/findOneAvailablePostById"; +import { PostPort } from "@applications/ports/post"; +import type { Post } from "@domains/entities/post"; + +interface Input { + postId: Post.Id; +} + +export const FindOneAvailablePostById = C.createUseCase( + { PostPort }, + ({ postPort }) => async(input: Input) => findOneAvailablePostById( + await postPort.findOneAvailableById(input.postId), + ), +); diff --git a/services/school/business/applications/useCases/post/index.ts b/services/school/business/applications/useCases/post/index.ts new file mode 100644 index 00000000..8dfcac41 --- /dev/null +++ b/services/school/business/applications/useCases/post/index.ts @@ -0,0 +1,6 @@ +export * from "./createPost"; +export * from "./createReportPost"; +export * from "./findManyAvailablePostByNodeSameRawDocument"; +export * from "./findOldestUnprocessedPost"; +export * from "./findOneAvailablePostById"; +export * from "./markPostAsCompliant"; diff --git a/services/school/business/applications/useCases/post/markPostAsCompliant.ts b/services/school/business/applications/useCases/post/markPostAsCompliant.ts new file mode 100644 index 00000000..fe915dc5 --- /dev/null +++ b/services/school/business/applications/useCases/post/markPostAsCompliant.ts @@ -0,0 +1,16 @@ +import { C, E } from "@duplojs/utils"; +import { markPostAsCompliant } from "@domains/aggregates/post/markPostAsCompliant"; +import { PostPort } from "@applications/ports/post"; +import type { Post } from "@domains/entities/post"; + +interface Input { + post: Post.Entity & Post.Unprocessed; +} + +export const MarkPostAsCompliantUseCase = C.createUseCase( + { PostPort }, + ({ postPort }) => (input: Input) => E.rightPipe( + markPostAsCompliant(input.post), + postPort.save, + ), +); diff --git a/services/school/business/applications/usecases/anonymizeAuthor.ts b/services/school/business/applications/usecases/anonymizeAuthor.ts deleted file mode 100644 index 77c1fcc6..00000000 --- a/services/school/business/applications/usecases/anonymizeAuthor.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { type UserId } from "@business/domains/common/user"; -import { UsecaseHandler } from "@vendors/clean"; -import { RenameAuthorUsecase } from "./renameAuthor"; - -interface Input { - authorId: UserId; -} - -export class AnonymizeAuthorUsecase extends UsecaseHandler.create({ - renameAuthor: RenameAuthorUsecase, -}) { - public execute({ authorId }: Input) { - return this.renameAuthor({ - authorId, - newAuthorName: null, - }); - } -} diff --git a/services/school/business/applications/usecases/computePostAnswer.ts b/services/school/business/applications/usecases/computePostAnswer.ts deleted file mode 100644 index 1cc3b698..00000000 --- a/services/school/business/applications/usecases/computePostAnswer.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; -import { type PostEntity } from "@business/domains/entities/post"; -import { postRepository } from "../repositories/post"; - -interface Input { - post: PostEntity; -} - -export class ComputePostAnswerUsecase extends UsecaseHandler.create({ - answerRepository, - postRepository, -}) { - public async execute({ post }: Input) { - const count = await this.answerRepository.getCountByPostId(post.id); - - const updatedPost = post.updateAnswerCount(count); - - return this.postRepository.save(updatedPost); - } -} - diff --git a/services/school/business/applications/usecases/createPost.ts b/services/school/business/applications/usecases/createPost.ts deleted file mode 100644 index d1d5693f..00000000 --- a/services/school/business/applications/usecases/createPost.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; -import { type NodeSameRawDocumentId, PostEntity, type PostContent, type PostTopic } from "@business/domains/entities/post"; -import { notificationRepository } from "../repositories/notification"; -import { type UserId, type Username } from "@business/domains/common/user"; - -interface Input { - topic: PostTopic; - content: PostContent; - nodeSameRawDocumentId: NodeSameRawDocumentId; - authorId: UserId; - authorName: Username; -} - -export class CreatePostUsecase extends UsecaseHandler.create({ - postRepository, - notificationRepository, -}) { - public async execute( - { - topic, - content, - nodeSameRawDocumentId, - authorId, - authorName, - }: Input, - ) { - const post = PostEntity.create({ - id: this.postRepository.generatePostId(), - topic, - content, - nodeSameRawDocumentId, - authorId, - authorName, - }); - - await this.postRepository.save(post); - - await this.notificationRepository.enableReplyPostNotificationToAuthor(post); - - return post; - } -} diff --git a/services/school/business/applications/usecases/findAnswerById.ts b/services/school/business/applications/usecases/findAnswerById.ts deleted file mode 100644 index 83d7ddd9..00000000 --- a/services/school/business/applications/usecases/findAnswerById.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type AnswerId } from "@business/domains/entities/answer"; -import { UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; - -interface Input { - id: AnswerId; -} - -export class FindAnswerByIdUsecase extends UsecaseHandler.create({ - answerRepository, -}) { - public execute({ id }: Input) { - return this.answerRepository.findOneById(id); - } -} diff --git a/services/school/business/applications/usecases/findAnswersFromPost.ts b/services/school/business/applications/usecases/findAnswersFromPost.ts deleted file mode 100644 index 96c90c62..00000000 --- a/services/school/business/applications/usecases/findAnswersFromPost.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { type PostEntity } from "@business/domains/entities/post"; -import { type Int, UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; - -interface Input { - post: PostEntity; - page: Int; - quantityPerPage: Int; -} - -export class FindAnswersFromPostUsecase extends UsecaseHandler.create({ - answerRepository, -}) { - public execute({ post, page, quantityPerPage }: Input) { - return this.answerRepository.findByPostId( - post.id, - { - quantityPerPage, - page, - }, - ); - } -} diff --git a/services/school/business/applications/usecases/findOldestUnprocessedAnswer.ts b/services/school/business/applications/usecases/findOldestUnprocessedAnswer.ts deleted file mode 100644 index 23c80a29..00000000 --- a/services/school/business/applications/usecases/findOldestUnprocessedAnswer.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; - -export class FindOldestUnprocessedAnswerUsecase extends UsecaseHandler.create({ - answerRepository, -}) { - public execute() { - return this.answerRepository.findOldestUnprocessedAnswer(); - } -} diff --git a/services/school/business/applications/usecases/findOldestUnprocessedPost.ts b/services/school/business/applications/usecases/findOldestUnprocessedPost.ts deleted file mode 100644 index 98aa1627..00000000 --- a/services/school/business/applications/usecases/findOldestUnprocessedPost.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; - -export class FindOldestUnprocessedPostUsecase extends UsecaseHandler.create({ - postRepository, -}) { - public execute() { - return this.postRepository.findOldestUnprocessedPost(); - } -} diff --git a/services/school/business/applications/usecases/findPostById.ts b/services/school/business/applications/usecases/findPostById.ts deleted file mode 100644 index 7b205488..00000000 --- a/services/school/business/applications/usecases/findPostById.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { type PostId } from "@business/domains/entities/post"; -import { UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; - -interface Input { - id: PostId; -} - -export class FindPostByIdUsecase extends UsecaseHandler.create({ - postRepository, -}) { - public execute({ id }: Input) { - return this.postRepository.findOneById(id); - } -} diff --git a/services/school/business/applications/usecases/findPostsFromNodeSameRawDocumentId.ts b/services/school/business/applications/usecases/findPostsFromNodeSameRawDocumentId.ts deleted file mode 100644 index c8137c38..00000000 --- a/services/school/business/applications/usecases/findPostsFromNodeSameRawDocumentId.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { type Int, UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; -import { type NodeSameRawDocumentId } from "@business/domains/entities/post"; - -interface Input { - nodeSameRawDocumentId: NodeSameRawDocumentId; - page: Int; - quantityPerPage: Int; -} - -export class FindPostsFromNodeSameRawDocumentIdUsecase extends UsecaseHandler.create({ - postRepository, -}) { - public execute({ nodeSameRawDocumentId, page, quantityPerPage }: Input) { - return this.postRepository.findByNodeSameRawDocumentId( - nodeSameRawDocumentId, - { - quantityPerPage, - page, - }, - ); - } -} diff --git a/services/school/business/applications/usecases/getPostTotalCountFromNodeSameRawDocumentId.ts b/services/school/business/applications/usecases/getPostTotalCountFromNodeSameRawDocumentId.ts deleted file mode 100644 index 262a3e45..00000000 --- a/services/school/business/applications/usecases/getPostTotalCountFromNodeSameRawDocumentId.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; -import { type NodeSameRawDocumentId } from "@business/domains/entities/post"; - -interface Input { - nodeSameRawDocumentId: NodeSameRawDocumentId; -} - -export class GetPostTotalCountFromNodeSameRawDocumentIdUsecase extends UsecaseHandler.create({ - postRepository, -}) { - public execute({ nodeSameRawDocumentId }: Input) { - return this.postRepository.getTotalCountByNodeSameRawDocumentId( - nodeSameRawDocumentId, - ); - } -} diff --git a/services/school/business/applications/usecases/getTotalCountOfUnprocessedAnswers.ts b/services/school/business/applications/usecases/getTotalCountOfUnprocessedAnswers.ts deleted file mode 100644 index 2e2be369..00000000 --- a/services/school/business/applications/usecases/getTotalCountOfUnprocessedAnswers.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; - -export class GetTotalCountOfUnprocessedAnswersUsecase extends UsecaseHandler.create({ - answerRepository, -}) { - public execute() { - return this.answerRepository.getTotalCountOfUnprocessedAnswers(); - } -} diff --git a/services/school/business/applications/usecases/getTotalCountOfUnprocessedPosts.ts b/services/school/business/applications/usecases/getTotalCountOfUnprocessedPosts.ts deleted file mode 100644 index 76a25f63..00000000 --- a/services/school/business/applications/usecases/getTotalCountOfUnprocessedPosts.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; - -export class GetTotalCountOfUnprocessedPostsUsecase extends UsecaseHandler.create({ - postRepository, -}) { - public execute() { - return this.postRepository.getTotalCountOfUnprocessedPosts(); - } -} diff --git a/services/school/business/applications/usecases/indicateAnswerIsCompliant.ts b/services/school/business/applications/usecases/indicateAnswerIsCompliant.ts deleted file mode 100644 index f5032c0b..00000000 --- a/services/school/business/applications/usecases/indicateAnswerIsCompliant.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { type AnswerEntity } from "@business/domains/entities/answer"; -import { UsecaseError, UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; - -interface Input { - answer: AnswerEntity; -} - -export class IndicateAnswerIsCompliantUsecase extends UsecaseHandler.create({ - answerRepository, -}) { - public execute({ answer }: Input) { - if (!answer.isUnprocessed()) { - return new UsecaseError("wrong-status", { answer }); - } - - const updatedAnswer = answer.updateStatus("compliant"); - - return this.answerRepository.save(updatedAnswer); - } -} diff --git a/services/school/business/applications/usecases/indicateAnswerIsNotCompliantAndCreateWarning.ts b/services/school/business/applications/usecases/indicateAnswerIsNotCompliantAndCreateWarning.ts deleted file mode 100644 index 66c1ba70..00000000 --- a/services/school/business/applications/usecases/indicateAnswerIsNotCompliantAndCreateWarning.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { type WarningMakeUserBan, type WarningReason } from "@business/domains/common/warning"; -import { type AnswerEntity } from "@business/domains/entities/answer"; -import { UsecaseError, UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; -import { warningRepository } from "../repositories/warning"; -import { postRepository } from "../repositories/post"; - -interface Input { - answer: AnswerEntity; - makeUserBan: WarningMakeUserBan; - reason: WarningReason; -} - -export class IndicateAnswerIsNotCompliantAndCreateWarningUsecase extends UsecaseHandler.create({ - answerRepository, - postRepository, - warningRepository, -}) { - public async execute({ answer, makeUserBan, reason }: Input) { - if (!answer.isUnprocessed()) { - return new UsecaseError("wrong-status", { answer }); - } - - const postAnswer = await this.postRepository.findOneById(answer.postId); - - if (!postAnswer) { - return new UsecaseError("answer-post-mismatch", { postId: answer.postId }); - } - - const updatedAnswer = answer.updateStatus("notCompliant"); - - await this.answerRepository.save(updatedAnswer); - - await this.warningRepository.createAnswerWarning({ - makeUserBan, - reason, - answer, - post: postAnswer, - }); - - return updatedAnswer; - } -} diff --git a/services/school/business/applications/usecases/indicatePostIsCompliant.ts b/services/school/business/applications/usecases/indicatePostIsCompliant.ts deleted file mode 100644 index 40cbda1e..00000000 --- a/services/school/business/applications/usecases/indicatePostIsCompliant.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { type PostEntity } from "@business/domains/entities/post"; -import { UsecaseError, UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; - -interface Input { - post: PostEntity; -} - -export class IndicatePostIsCompliantUsecase extends UsecaseHandler.create({ - postRepository, -}) { - public execute({ post }: Input) { - if (!post.isUnprocessed()) { - return new UsecaseError("wrong-status", { post }); - } - - const updatedPost = post.updateStatus("compliant"); - - return this.postRepository.save(updatedPost); - } -} diff --git a/services/school/business/applications/usecases/indicatePostIsNotCompliantAndCreateWarning.ts b/services/school/business/applications/usecases/indicatePostIsNotCompliantAndCreateWarning.ts deleted file mode 100644 index edc2d984..00000000 --- a/services/school/business/applications/usecases/indicatePostIsNotCompliantAndCreateWarning.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { type PostEntity } from "@business/domains/entities/post"; -import { UsecaseError, UsecaseHandler } from "@vendors/clean"; -import { postRepository } from "../repositories/post"; -import { warningRepository } from "../repositories/warning"; -import { type WarningMakeUserBan, type WarningReason } from "@business/domains/common/warning"; - -interface Input { - post: PostEntity; - makeUserBan: WarningMakeUserBan; - reason: WarningReason; -} - -export class IndicatePostIsNotCompliantAndCreateWarningUsecase extends UsecaseHandler.create({ - postRepository, - warningRepository, -}) { - public async execute({ post, makeUserBan, reason }: Input) { - if (!post.isUnprocessed()) { - return new UsecaseError("wrong-status", { post }); - } - - const updatedPost = post.updateStatus("notCompliant"); - - await this.postRepository.save(updatedPost); - - await this.warningRepository.createPostWarning({ - makeUserBan, - reason, - post, - }); - - return updatedPost; - } -} diff --git a/services/school/business/applications/usecases/renameAuthor.ts b/services/school/business/applications/usecases/renameAuthor.ts deleted file mode 100644 index 075eae06..00000000 --- a/services/school/business/applications/usecases/renameAuthor.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; -import { postRepository } from "../repositories/post"; -import { type Username, type UserId } from "@business/domains/common/user"; - -interface Input { - authorId: UserId; - newAuthorName: Username | null; -} - -export class RenameAuthorUsecase extends UsecaseHandler.create({ - answerRepository, - postRepository, -}) { - public execute({ authorId, newAuthorName }: Input) { - return Promise.all([ - this.answerRepository.renameAuthor(authorId, newAuthorName), - this.postRepository.renameAuthor(authorId, newAuthorName), - ]); - } -} diff --git a/services/school/business/applications/usecases/replyToPost.ts b/services/school/business/applications/usecases/replyToPost.ts deleted file mode 100644 index ec6cba99..00000000 --- a/services/school/business/applications/usecases/replyToPost.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { UsecaseHandler } from "@vendors/clean"; -import { answerRepository } from "../repositories/answer"; -import { AnswerEntity, type AnswerContent } from "@business/domains/entities/answer"; -import { type PostEntity } from "@business/domains/entities/post"; -import { type UserId, type Username } from "@business/domains/common/user"; -import { postRepository } from "../repositories/post"; -import { ComputePostAnswerUsecase } from "./computePostAnswer"; - -interface Input { - post: PostEntity; - content: AnswerContent; - authorId: UserId; - authorName: Username; -} - -export class ReplyToPostUsecase extends UsecaseHandler.create({ - answerRepository, - postRepository, - computePostAnswer: ComputePostAnswerUsecase, -}) { - public async execute( - { - post, - content, - authorId, - authorName, - }: Input, - ) { - const answer = AnswerEntity.create({ - id: this.answerRepository.generateAnswerId(), - postId: post.id, - content, - authorId, - authorName, - }); - - await this.answerRepository.save(answer); - await this.computePostAnswer({ post }); - - return answer; - } -} diff --git a/services/school/business/applications/usecases/restoreAuthor.ts b/services/school/business/applications/usecases/restoreAuthor.ts deleted file mode 100644 index d09585a2..00000000 --- a/services/school/business/applications/usecases/restoreAuthor.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { type Username, type UserId } from "@business/domains/common/user"; -import { UsecaseHandler } from "@vendors/clean"; -import { RenameAuthorUsecase } from "./renameAuthor"; - -interface Input { - authorId: UserId; - newAuthorName: Username; -} - -export class RestoreAuthorUsecase extends UsecaseHandler.create({ - renameAuthor: RenameAuthorUsecase, -}) { - public execute({ authorId, newAuthorName }: Input) { - return this.renameAuthor({ - authorId, - newAuthorName, - }); - } -} diff --git a/services/school/business/domains/aggregates/answer/createReportAnswer.ts b/services/school/business/domains/aggregates/answer/createReportAnswer.ts new file mode 100644 index 00000000..c133a37c --- /dev/null +++ b/services/school/business/domains/aggregates/answer/createReportAnswer.ts @@ -0,0 +1,27 @@ +import { Answer } from "@domains/entities/answer"; +import { Report } from "@domains/entities/report"; + +interface CreateReportAnswerParams { + answer: Answer.Entity & Answer.Unprocessed; + level: Report.Level; + reason: Report.Reason; +} + +const notCompliantAnswerStatus = Answer.Status.createOrThrow("notCompliant"); + +export function createReportAnswer(params: CreateReportAnswerParams) { + return { + report: Report.Entity.new({ + answerId: params.answer.id, + postId: params.answer.postId, + userId: params.answer.authorId, + level: params.level, + reason: params.reason, + }), + answer: Answer.Entity.update( + params.answer, + { status: notCompliantAnswerStatus }, + ), + }; +} + diff --git a/services/school/business/domains/aggregates/answer/findManyAvailableAnswerByAvailablePost.ts b/services/school/business/domains/aggregates/answer/findManyAvailableAnswerByAvailablePost.ts new file mode 100644 index 00000000..227be0e1 --- /dev/null +++ b/services/school/business/domains/aggregates/answer/findManyAvailableAnswerByAvailablePost.ts @@ -0,0 +1,11 @@ +import { E, type C } from "@duplojs/utils"; +import type { AnswerRepository } from "@domains/repositories/answer"; + +export function findManyAvailableAnswerByAvailablePost( + input: C.GetEvidenceResult< + AnswerRepository["findManyAvailableByAvailablePost"], + "many-available" + >, +) { + return E.right("find-many-available-answer-by-available-post-success", input); +} diff --git a/services/school/business/domains/aggregates/answer/findOldestUnprocessedAnswer.ts b/services/school/business/domains/aggregates/answer/findOldestUnprocessedAnswer.ts new file mode 100644 index 00000000..b633d399 --- /dev/null +++ b/services/school/business/domains/aggregates/answer/findOldestUnprocessedAnswer.ts @@ -0,0 +1,11 @@ +import { E, type C } from "@duplojs/utils"; +import type { AnswerRepository } from "@domains/repositories/answer"; + +export function findOldestUnprocessedAnswer( + input: C.GetEvidenceResult< + AnswerRepository["findOldestUnprocessed"], + "oldest-unprocessed" + >, +) { + return E.right("find-oldest-unprocessed-answer-success", input); +} diff --git a/services/school/business/domains/aggregates/answer/markAnswerAsCompliant.ts b/services/school/business/domains/aggregates/answer/markAnswerAsCompliant.ts new file mode 100644 index 00000000..94fdad5c --- /dev/null +++ b/services/school/business/domains/aggregates/answer/markAnswerAsCompliant.ts @@ -0,0 +1,17 @@ +import { E, pipe } from "@duplojs/utils"; +import { Answer } from "../../entities/answer"; + +const compliantStatus = Answer.Status.createOrThrow("compliant"); + +export function markAnswerAsCompliant(answer: Answer.Entity & Answer.Unprocessed) { + return pipe( + answer, + Answer.Entity.update({ status: compliantStatus }), + Answer.computeStatus, + E.whenHasInformationOtherwise( + "answer.compliant", + (answer) => E.right("answer.compliant", answer), + (result) => E.left("answer.compliant.wrongStatus", result), + ), + ); +} diff --git a/services/school/business/domains/aggregates/answer/replyToPost.ts b/services/school/business/domains/aggregates/answer/replyToPost.ts new file mode 100644 index 00000000..18c38b34 --- /dev/null +++ b/services/school/business/domains/aggregates/answer/replyToPost.ts @@ -0,0 +1,50 @@ +/* eslint-disable @typescript-eslint/no-magic-numbers */ +import { C, D, E, pipe } from "@duplojs/utils"; +import { Answer } from "@domains/entities/answer"; +import { Post } from "@domains/entities/post"; +import type { AnswerRepository } from "@domains/repositories/answer"; +import type { PostRepository } from "@domains/repositories/post"; +import type { UserId, UserName } from "@domains/common/user"; + +interface ReplyToPostParams { + id: C.GetEvidenceResult; + post: Post.AvailableEntity; + postAnswerCount: C.GetEvidenceResult; + content: Answer.Content; + authorId: UserId; + authorName: UserName; +} + +const defaultAnswerStatus = Answer.Status.createOrThrow("unprocessed"); + +export function replyToPost(params: ReplyToPostParams) { + return E.rightPipe( + E.group({ + answerCreatedAt: Answer.CreatedAt.create(D.now()), + postAnswerCount: pipe( + params.postAnswerCount, + C.add(1), + Post.AnswerCount.create, + ), + }), + ({ answerCreatedAt, postAnswerCount }) => { + const post = Post.Entity.update( + params.post, + { answerCount: postAnswerCount }, + ); + + return { + post, + answer: Answer.Entity.new({ + id: params.id, + postId: params.post.id, + authorId: params.authorId, + authorName: params.authorName, + content: params.content, + status: defaultAnswerStatus, + createdAt: answerCreatedAt, + }), + }; + }, + ); +} diff --git a/services/school/business/domains/aggregates/author/anonymiseAuthor.ts b/services/school/business/domains/aggregates/author/anonymiseAuthor.ts new file mode 100644 index 00000000..434c1560 --- /dev/null +++ b/services/school/business/domains/aggregates/author/anonymiseAuthor.ts @@ -0,0 +1,11 @@ +import type { AuthorRepository } from "@domains/repositories/author"; +import { E, type C } from "@duplojs/utils"; + +export function anonymiseAuthor( + _input: C.GetEvidenceResult< + AuthorRepository["anonymise"], + "anonymise" + >, +) { + return E.right("anonymise-author-success"); +} diff --git a/services/school/business/domains/aggregates/author/renameAuthor.ts b/services/school/business/domains/aggregates/author/renameAuthor.ts new file mode 100644 index 00000000..6ffd3789 --- /dev/null +++ b/services/school/business/domains/aggregates/author/renameAuthor.ts @@ -0,0 +1,11 @@ +import type { AuthorRepository } from "@domains/repositories/author"; +import { E, type C } from "@duplojs/utils"; + +export function renameAuthor( + _input: C.GetEvidenceResult< + AuthorRepository["rename"], + "rename" + >, +) { + return E.right("rename-author-success"); +} diff --git a/services/school/business/domains/aggregates/author/restoreAuthor.ts b/services/school/business/domains/aggregates/author/restoreAuthor.ts new file mode 100644 index 00000000..7b535824 --- /dev/null +++ b/services/school/business/domains/aggregates/author/restoreAuthor.ts @@ -0,0 +1,11 @@ +import type { AuthorRepository } from "@domains/repositories/author"; +import { E, type C } from "@duplojs/utils"; + +export function restoreAuthor( + _input: C.GetEvidenceResult< + AuthorRepository["restore"], + "restore" + >, +) { + return E.right("restore-author-success"); +} diff --git a/services/school/business/domains/aggregates/post/createPost.ts b/services/school/business/domains/aggregates/post/createPost.ts new file mode 100644 index 00000000..4a150fa0 --- /dev/null +++ b/services/school/business/domains/aggregates/post/createPost.ts @@ -0,0 +1,35 @@ +/* eslint-disable @typescript-eslint/no-magic-numbers */ +import { type C, D } from "@duplojs/utils"; +import type { UserName, UserId } from "../../common/user"; +import { Post } from "../../entities/post"; +import { NotificationSetting } from "../../entities/notificationSetting"; +import type { PostRepository } from "../../repositories/post"; + +interface CreatePostParams { + id: C.GetEvidenceResult; + nodeSameRawDocumentId: Post.NodeSameRawDocumentId; + authorId: UserId; + authorName: UserName; + topic: Post.Topic; + content: Post.Content; +} + +const defaultPostAnswerCount = Post.AnswerCount.createOrThrow(0); +const defaultPostStatus = Post.Status.createOrThrow("unprocessed"); + +export function createPost(params: CreatePostParams) { + const post = Post.Entity.new({ + ...params, + answerCount: defaultPostAnswerCount, + status: defaultPostStatus, + createdAt: Post.CreatedAt.createOrThrow(D.now()), + }); + + return { + post, + notificationSetting: NotificationSetting.Entity.new({ + postId: post.id, + userId: post.authorId, + }), + }; +} diff --git a/services/school/business/domains/aggregates/post/createReportPost.ts b/services/school/business/domains/aggregates/post/createReportPost.ts new file mode 100644 index 00000000..4483a5d0 --- /dev/null +++ b/services/school/business/domains/aggregates/post/createReportPost.ts @@ -0,0 +1,27 @@ +import { Post } from "@domains/entities/post"; +import { Report } from "@domains/entities/report"; + +interface CreateReportPostParams { + post: Post.Entity & Post.Unprocessed; + level: Report.Level; + reason: Report.Reason; +} + +const notCompliantPostStatus = Post.Status.createOrThrow("notCompliant"); + +export function createReportPost(params: CreateReportPostParams) { + return { + report: Report.Entity.new({ + postId: params.post.id, + answerId: null, + userId: params.post.authorId, + level: params.level, + reason: params.reason, + }), + post: Post.Entity.update( + params.post, + { status: notCompliantPostStatus }, + ), + }; +} + diff --git a/services/school/business/domains/aggregates/post/findManyAvailablePostByNodeSameRawDocument.ts b/services/school/business/domains/aggregates/post/findManyAvailablePostByNodeSameRawDocument.ts new file mode 100644 index 00000000..1c0f7074 --- /dev/null +++ b/services/school/business/domains/aggregates/post/findManyAvailablePostByNodeSameRawDocument.ts @@ -0,0 +1,11 @@ +import { E, type C } from "@duplojs/utils"; +import type { PostRepository } from "@domains/repositories/post"; + +export function findManyAvailablePostByNodeSameRawDocument( + input: C.GetEvidenceResult< + PostRepository["findManyAvailableByNodeSameRawDocument"], + "many-available" + >, +) { + return E.right("find-many-available-post-by-node-same-raw-document-success", input); +} diff --git a/services/school/business/domains/aggregates/post/findOldestUnprocessedPost.ts b/services/school/business/domains/aggregates/post/findOldestUnprocessedPost.ts new file mode 100644 index 00000000..12439e20 --- /dev/null +++ b/services/school/business/domains/aggregates/post/findOldestUnprocessedPost.ts @@ -0,0 +1,11 @@ +import { E, type C } from "@duplojs/utils"; +import type { PostRepository } from "@domains/repositories/post"; + +export function findOldestUnprocessedPost( + input: C.GetEvidenceResult< + PostRepository["findOldestUnprocessed"], + "oldest-unprocessed" + >, +) { + return E.right("find-oldest-unprocessed-post-success", input); +} diff --git a/services/school/business/domains/aggregates/post/findOneAvailablePostById.ts b/services/school/business/domains/aggregates/post/findOneAvailablePostById.ts new file mode 100644 index 00000000..0e8e3f5b --- /dev/null +++ b/services/school/business/domains/aggregates/post/findOneAvailablePostById.ts @@ -0,0 +1,11 @@ +import { E, type C } from "@duplojs/utils"; +import type { PostRepository } from "@domains/repositories/post"; + +export function findOneAvailablePostById( + input: C.GetEvidenceResult< + PostRepository["findOneAvailableById"], + "one-available" + >, +) { + return E.right("find-one-available-post-by-id-success", input); +} diff --git a/services/school/business/domains/aggregates/post/markPostAsCompliant.ts b/services/school/business/domains/aggregates/post/markPostAsCompliant.ts new file mode 100644 index 00000000..347d272e --- /dev/null +++ b/services/school/business/domains/aggregates/post/markPostAsCompliant.ts @@ -0,0 +1,17 @@ +import { E, pipe } from "@duplojs/utils"; +import { Post } from "@domains/entities/post"; + +const compliantStatus = Post.Status.createOrThrow("compliant"); + +export function markPostAsCompliant(post: Post.Entity & Post.Unprocessed) { + return pipe( + post, + Post.Entity.update({ status: compliantStatus }), + Post.computeStatus, + E.whenHasInformationOtherwise( + "post.compliant", + (answer) => E.right("post.compliant", answer), + (result) => E.left("post.compliant.wrongStatus", result), + ), + ); +} diff --git a/services/school/business/domains/common/user.ts b/services/school/business/domains/common/user.ts index 1e1e786d..8b566cca 100644 --- a/services/school/business/domains/common/user.ts +++ b/services/school/business/domains/common/user.ts @@ -1,7 +1,7 @@ -import { zod, type GetValueObject } from "@vendors/clean"; +import { C } from "@duplojs/utils"; -export const userIdObjecter = zod.string().createValueObjecter("userId"); -export const usernameObjecter = zod.string().createValueObjecter("username"); +export const UserId = C.createNewType("UserId", C.String); +export type UserId = C.GetNewType; -export type UserId = GetValueObject; -export type Username = GetValueObject; +export const UserName = C.createNewType("UserName", C.String); +export type UserName = C.GetNewType; diff --git a/services/school/business/domains/common/warning.ts b/services/school/business/domains/common/warning.ts index f9b02494..b51e3a9d 100644 --- a/services/school/business/domains/common/warning.ts +++ b/services/school/business/domains/common/warning.ts @@ -1,14 +1,15 @@ -import { type GetValueObject, zod } from "@vendors/clean"; -import { baseWarningRules } from "@vendors/entity-rules"; +import { C } from "@duplojs/utils"; +import { baseWarningRules } from "@lib/entity-rules"; -export const warningReasonObjecter = zod - .string() - .min(baseWarningRules.reason.min) - .max(baseWarningRules.reason.max) - .createValueObjecter("warningReason"); -export type WarningReason = GetValueObject; +export const WarningReason = C.createNewType( + "WarningReason", + C.String, + [ + C.StringMin(baseWarningRules.reason.min), + C.StringMax(baseWarningRules.reason.max), + ], +); +export type WarningReason = C.GetNewType; -export const warningMakeUserBanObjecter = zod - .boolean() - .createValueObjecter("warningMakeUserBan"); -export type WarningMakeUserBan = GetValueObject; +export const WarningMakeUserBan = C.createNewType("WarningMakeUserBan", C.Boolean); +export type WarningMakeUserBan = C.GetNewType; diff --git a/services/school/business/domains/entities/answer.ts b/services/school/business/domains/entities/answer.ts index 309d5bcd..e10753aa 100644 --- a/services/school/business/domains/entities/answer.ts +++ b/services/school/business/domains/entities/answer.ts @@ -1,66 +1,70 @@ -import { commonDateObjecter, createEnum, EntityHandler, type GetEntityProperties, type GetEnumValue, type GetValueObject, zod } from "@vendors/clean"; -import { postIdObjecter } from "./post"; -import { answerRules } from "@vendors/entity-rules"; -import { userIdObjecter, type Username, usernameObjecter } from "../common/user"; +import { C, createEnum, DPE, E, P } from "@duplojs/utils"; +import { answerRules } from "@lib/entity-rules"; +import { Post } from "./post"; +import { UserId, UserName } from "../common/user"; -export const answerContentObjecter = zod.string() - .min(answerRules.content.minLength) - .max(answerRules.content.maxLength) - .createValueObjecter("answerContent"); -export const answerIdObjecter = zod.string().createValueObjecter("answerId"); +export namespace Answer { + export const Id = C.createNewType("AnswerId", C.String); + export type Id = C.GetNewType; -export const answerStatusEnum = createEnum([ - "compliant", - "unprocessed", - "notCompliant", -]); + export const Content = C.createNewType( + "AnswerContent", + C.String, + [ + C.StringMin(answerRules.content.minLength), + C.StringMax(answerRules.content.maxLength), + ], + ); + export type Content = C.GetNewType; -export type AnswerStatusEnum = GetEnumValue; + export const statusEnum = createEnum([ + "compliant", + "unprocessed", + "notCompliant", + ]); -export const answerStatusObjecter = zod.enum(answerStatusEnum.toTuple()).createValueObjecter("answerStatus"); + export const Status = C.createNewType("AnswerStatus", DPE.literal(statusEnum.toTuple())); + export type Status = C.GetNewType; -export type AnswerStatus = GetValueObject; -export type AnswerContent = GetValueObject; -export type AnswerId = GetValueObject; + export const CreatedAt = C.createNewType("AnswerCreatedAt", C.Date); + export type CreatedAt = C.GetNewType; -type InputCreateAnswerEntity = Omit, "createdAt" | "status">; + export const Entity = C.createEntity( + "Answer", + ({ nullable }) => ({ + id: Id, + postId: Post.Id, + authorId: UserId, + authorName: nullable(UserName), + content: Content, + status: Status, + createdAt: CreatedAt, + }), + ); + export type Entity = C.GetEntity; -export class AnswerEntity extends EntityHandler.create({ - id: answerIdObjecter, - postId: postIdObjecter, - content: answerContentObjecter, - authorId: userIdObjecter, - authorName: usernameObjecter.nullable(), - status: answerStatusObjecter, - createdAt: commonDateObjecter, -}) { - public static create(params: InputCreateAnswerEntity) { - return new AnswerEntity({ - ...params, - status: answerStatusObjecter.unsafeCreate("unprocessed"), - createdAt: commonDateObjecter.unsafeCreate(new Date()), - }); - } + const Unprocessed = C.createFlag("Unprocessed"); + export type Unprocessed = C.GetFlag; - public updateAuthorName(authorName: Username) { - return this.update({ - authorName, - }); - } + const Compliant = C.createFlag("Compliant"); + export type Compliant = C.GetFlag; - public updateStatus(status: AnswerStatus["value"]) { - return this.update({ - status: answerStatusObjecter.unsafeCreate(status), - }); - } + const NotCompliant = C.createFlag("NotCompliant"); + export type NotCompliant = C.GetFlag; - public isUnprocessed() { - return this.status.value === "unprocessed"; + export function computeStatus(entity: Entity) { + return C.matchWithString( + entity.status, + { + compliant: () => E.result("answer.compliant", Compliant.append(entity)), + notCompliant: () => E.result("answer.notCompliant", NotCompliant.append(entity)), + unprocessed: () => E.result("answer.unprocessed", Unprocessed.append(entity)), + }, + ); } - public anonymize() { - return this.update({ - authorName: null, - }); - } + export type AvailableEntity = ( + | Entity & Unprocessed + | Entity & Compliant + ); } diff --git a/services/school/business/domains/entities/notificationSetting.ts b/services/school/business/domains/entities/notificationSetting.ts new file mode 100644 index 00000000..3b95cc11 --- /dev/null +++ b/services/school/business/domains/entities/notificationSetting.ts @@ -0,0 +1,14 @@ +import { C } from "@duplojs/utils"; +import { Post } from "./post"; +import { UserId } from "../common/user"; + +export namespace NotificationSetting { + export const Entity = C.createEntity( + "NotificationSetting", + () => ({ + postId: Post.Id, + userId: UserId, + }), + ); + export type Entity = C.GetEntity; +} diff --git a/services/school/business/domains/entities/post.ts b/services/school/business/domains/entities/post.ts index 5cd3558e..48dd9338 100644 --- a/services/school/business/domains/entities/post.ts +++ b/services/school/business/domains/entities/post.ts @@ -1,86 +1,88 @@ -import { commonDateObjecter, createEnum, EntityHandler, type GetEntityProperties, type GetValueObject, zod } from "@vendors/clean"; -import { postRules } from "@vendors/entity-rules"; -import { userIdObjecter, type Username, usernameObjecter } from "../common/user"; +import { C, createEnum, DPE, E, P } from "@duplojs/utils"; +import { postRules } from "@lib/entity-rules"; +import { UserId, UserName } from "../common/user"; -export const postTopicObjecter = zod.string() - .min(postRules.topic.minLength) - .max(postRules.topic.maxLength) - .createValueObjecter("postTopic"); -export type PostTopic = GetValueObject; +export namespace Post { -export const postContentObjecter = zod.string() - .min(postRules.content.minLength) - .max(postRules.content.maxLength) - .createValueObjecter("postContent"); -export type PostContent = GetValueObject; + export const Id = C.createNewType("PostId", C.String); + export type Id = C.GetNewType; -export const postIdObjecter = zod.string().createValueObjecter("postId"); -export type PostId = GetValueObject; + export const Topic = C.createNewType( + "PostTopic", + C.String, + [ + C.StringMin(postRules.topic.minLength), + C.StringMax(postRules.topic.maxLength), + ], + ); + export type Topic = C.GetNewType; -export const postAnswerCountObjecter = zod.number().createValueObjecter("postAnswerCount"); -export type PostAnswerCount = GetValueObject; + export const Content = C.createNewType( + "PostContent", + C.String, + [ + C.StringMin(postRules.content.minLength), + C.StringMax(postRules.content.maxLength), + ], + ); + export type Content = C.GetNewType; -export const nodeSameRawDocumentIdObjecter = zod.string().createValueObjecter("nodeSameRawDocumentId"); -export type NodeSameRawDocumentId = GetValueObject; + export const NodeSameRawDocumentId = C.createNewType("NodeSameRawDocumentId", C.String); + export type NodeSameRawDocumentId = C.GetNewType; -export const postStatusEnum = createEnum([ - "compliant", - "unprocessed", - "notCompliant", -]); + export const AnswerCount = C.createNewType("PostAnswerCount", C.Number, C.PositiveInt); + export type AnswerCount = C.GetNewType; -export const postStatusObjecter = zod.enum(postStatusEnum.toTuple()).createValueObjecter("postStatus"); -export type PostStatus = GetValueObject; + const statusEnum = createEnum([ + "compliant", + "unprocessed", + "notCompliant", + ]); -const defaultAnswerCount = 0; + export const Status = C.createNewType("PostStatus", DPE.literal(statusEnum.toTuple())); + export type Status = C.GetNewType; -type InputCreatePostEntity = Omit, "answerCount" | "createdAt" | "status">; + export const CreatedAt = C.createNewType("PostCreatedAt", C.Date); + export type CreatedAt = C.GetNewType; -export class PostEntity extends EntityHandler.create({ - id: postIdObjecter, - topic: postTopicObjecter, - content: postContentObjecter, - nodeSameRawDocumentId: nodeSameRawDocumentIdObjecter, - answerCount: postAnswerCountObjecter, - authorId: userIdObjecter, - authorName: usernameObjecter.nullable(), - status: postStatusObjecter, - createdAt: commonDateObjecter, -}) { - public static create(params: InputCreatePostEntity) { - return new PostEntity({ - ...params, - status: postStatusObjecter.unsafeCreate("unprocessed"), - answerCount: postAnswerCountObjecter.unsafeCreate(defaultAnswerCount), - createdAt: commonDateObjecter.unsafeCreate(new Date()), - }); - } + export const Entity = C.createEntity( + "Post", + ({ nullable }) => ({ + id: Id, + topic: Topic, + content: Content, + nodeSameRawDocumentId: NodeSameRawDocumentId, + answerCount: AnswerCount, + authorId: UserId, + authorName: nullable(UserName), + status: Status, + createdAt: CreatedAt, + }), + ); + export type Entity = C.GetEntity; - public updateAnswerCount(answerCount: PostAnswerCount) { - return this.update({ - answerCount, - }); - } + const Unprocessed = C.createFlag("Unprocessed"); + export type Unprocessed = C.GetFlag; - public updateAuthorName(authorName: Username) { - return this.update({ - authorName, - }); - } + const Compliant = C.createFlag("Compliant"); + export type Compliant = C.GetFlag; - public updateStatus(status: PostStatus["value"]) { - return this.update({ - status: postStatusObjecter.unsafeCreate(status), - }); - } + const NotCompliant = C.createFlag("NotCompliant"); + export type NotCompliant = C.GetFlag; - public isUnprocessed() { - return this.status.value === "unprocessed"; + export function computeStatus(entity: Entity) { + return C.matchWithString( + entity.status, + { + compliant: () => E.result("post.compliant", Compliant.append(entity)), + notCompliant: () => E.result("post.notCompliant", NotCompliant.append(entity)), + unprocessed: () => E.result("post.unprocessed", Unprocessed.append(entity)), + }, + ); } - public anonymize() { - return this.update({ - authorName: null, - }); - } + export type AvailableEntity = ( + | Entity & Unprocessed + | Entity & Compliant + ); } diff --git a/services/school/business/domains/entities/report.ts b/services/school/business/domains/entities/report.ts new file mode 100644 index 00000000..51fe4473 --- /dev/null +++ b/services/school/business/domains/entities/report.ts @@ -0,0 +1,37 @@ +import { C, createEnum, DPE } from "@duplojs/utils"; +import { baseWarningRules } from "@lib/entity-rules"; +import { UserId } from "../common/user"; +import { Post } from "./post"; +import { Answer } from "./answer"; + +export namespace Report { + + export const Reason = C.createNewType( + "ReportReason", + C.String, + [ + C.StringMin(baseWarningRules.reason.min), + C.StringMax(baseWarningRules.reason.max), + ], + ); + export type Reason = C.GetNewType; + + const levelEnum = createEnum([ + "ban", + "warning", + ]); + export const Level = C.createNewType("ReportLevel", DPE.literal(levelEnum.toTuple())); + export type Level = C.GetNewType; + + export const Entity = C.createEntity( + "Report", + ({ nullable }) => ({ + userId: UserId, + postId: Post.Id, + answerId: nullable(Answer.Id), + reason: Reason, + level: Level, + }), + ); + export type Entity = C.GetEntity; +} diff --git a/services/school/business/domains/repositories/answer.ts b/services/school/business/domains/repositories/answer.ts new file mode 100644 index 00000000..ab6bf8a2 --- /dev/null +++ b/services/school/business/domains/repositories/answer.ts @@ -0,0 +1,19 @@ +import type { C } from "@duplojs/utils"; +import type { Answer } from "../entities/answer"; +import type { Post } from "@domains/entities/post"; + +interface FindManyAvailableByAvailablePostParams { + post: Post.AvailableEntity; + page: C.PositiveInt; + quantityPerPage: C.StrictPositiveInt; +} + +export interface AnswerRepository { + generateId(): Answer.Id & C.Evidence<"generated">; + findOldestUnprocessed(): Promise< + C.Maybe & C.Evidence<"oldest-unprocessed"> + >; + findManyAvailableByAvailablePost(params: FindManyAvailableByAvailablePostParams): Promise< + Answer.AvailableEntity[] & C.Evidence<"many-available"> + >; +} diff --git a/services/school/business/domains/repositories/author.ts b/services/school/business/domains/repositories/author.ts new file mode 100644 index 00000000..80eb9892 --- /dev/null +++ b/services/school/business/domains/repositories/author.ts @@ -0,0 +1,9 @@ +import { type C } from "@duplojs/utils"; +import type { UserId, UserName } from "../common/user"; + +// We go through this for performance +export interface AuthorRepository { + rename(id: UserId, name: UserName): Promise>; + anonymise(id: UserId): Promise>; + restore(id: UserId, name: UserName): Promise>; +} diff --git a/services/school/business/domains/repositories/post.ts b/services/school/business/domains/repositories/post.ts new file mode 100644 index 00000000..dbc9efc4 --- /dev/null +++ b/services/school/business/domains/repositories/post.ts @@ -0,0 +1,18 @@ +import type { C } from "@duplojs/utils"; +import type { Post } from "../entities/post"; + +interface FindManyAvailablePostByNodeSameRawDocumentParams { + nodeSameRawDocumentId: Post.NodeSameRawDocumentId; + page: C.PositiveInt; + quantityPerPage: C.StrictPositiveInt; +} + +export interface PostRepository { + generateId(): Post.Id & C.Evidence<"generated">; + getAnswerCount(entity: Post.Entity): Promise>; + findOneAvailableById(id: Post.Id): Promise & C.Evidence<"one-available">>; + findOldestUnprocessed(): Promise & C.Evidence<"oldest-unprocessed">>; + findManyAvailableByNodeSameRawDocument( + params: FindManyAvailablePostByNodeSameRawDocumentParams + ): Promise>; +} diff --git a/services/school/business/domains/tsconfig.json b/services/school/business/domains/tsconfig.json new file mode 100644 index 00000000..951a2558 --- /dev/null +++ b/services/school/business/domains/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@domains/*": ["./*"], + }, + }, + "include": ["**/*.ts"], +} \ No newline at end of file diff --git a/services/school/business/tsconfig.json b/services/school/business/tsconfig.json deleted file mode 100644 index 92e768a3..00000000 --- a/services/school/business/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": ["**/*.ts"] -} \ No newline at end of file diff --git a/services/school/eslint.config.ts b/services/school/eslint.config.ts index 9f88242b..7eb99584 100644 --- a/services/school/eslint.config.ts +++ b/services/school/eslint.config.ts @@ -1,3 +1,3 @@ -import { eslintConfig } from "./vendors/eslint"; +import { eslintConfig } from "@lib/eslint"; export default eslintConfig; diff --git a/services/school/interfaces/adapters/ports/answer.ts b/services/school/interfaces/adapters/ports/answer.ts new file mode 100644 index 00000000..ca9c920e --- /dev/null +++ b/services/school/interfaces/adapters/ports/answer.ts @@ -0,0 +1,130 @@ +import { AnswerPort } from "@applications/ports/answer"; +import { C, E, forward, forwardAsserts, innerPipe, pipe, toNative, unwrap } from "@duplojs/utils"; +import { Answer } from "@domains/entities/answer"; +import { asyncMessage } from "../../providers/asyncMessage"; +import { mongo } from "../../providers/mongo"; +import { uuidv7 } from "uuidv7"; + +export const answerPort = AnswerPort.createImplementation({ + generateId() { + return C.appendEvidence( + Answer.Id.createOrThrow(uuidv7()), + "generated", + ); + }, + async save(entity) { + const answer = C.unwrapEntity(entity, { transformer: toNative }); + + if (answer.authorName !== null) { + const existingAnswer = await mongo.answerCollection.findOne({ + id: answer.id, + }); + + if (!existingAnswer) { + await asyncMessage.collections.createAnswer.emit({ + id: answer.id, + postId: answer.postId, + content: answer.content, + authorId: answer.authorId, + authorName: answer.authorName, + createdAt: answer.createdAt, + }); + } + } + + await mongo.answerCollection.updateOne( + { + id: answer.id, + }, + { + $set: { + id: answer.id, + postId: answer.postId, + content: answer.content, + authorId: answer.authorId, + authorName: answer.authorName, + createdAt: answer.createdAt, + status: answer.status, + }, + }, + { upsert: true }, + ); + + return entity; + }, + async findOneById(id) { + const answer = await mongo.answerCollection.findOne({ + id: unwrap(id), + }); + + if (!answer) { + return C.none("Answer"); + } + + return C.some(Answer.Entity.mapOrThrow(answer)); + }, + async findOldestUnprocessed() { + const answer = await mongo.answerCollection.findOne( + { + status: "unprocessed", + }, + { + sort: { + createdAt: 1, + }, + }, + ); + + if (!answer) { + return C.appendEvidence(C.none("Answer"), "oldest-unprocessed"); + } + + return pipe( + answer, + Answer.Entity.mapOrThrow( + innerPipe( + Answer.computeStatus, + E.whenHasInformationOtherwise( + "answer.unprocessed", + E.success, + (result) => E.left("answer.wrongStatus", result), + ), + ), + ), + C.some, + C.appendEvidence("oldest-unprocessed"), + ); + }, + async findManyAvailableByAvailablePost(params) { + const postId = unwrap(params.post.id); + const page = unwrap(params.page); + const quantityPerPage = unwrap(params.quantityPerPage); + + return mongo.answerCollection + .find({ postId }) + .sort({ createdAt: -1 }) + .skip(page * quantityPerPage) + .limit(quantityPerPage) + .map( + Answer.Entity.mapOrThrow( + innerPipe( + Answer.computeStatus, + E.whenHasInformationOtherwise( + ["answer.unprocessed", "answer.compliant"], + E.success, + (result) => E.left("answer.wrongStatus", result), + ), + ), + ), + ) + .toArray() + .then(C.appendEvidence("many-available")); + }, + async getTotalCountOfUnprocessed() { + const count = await mongo.answerCollection.countDocuments({ + status: "unprocessed", + }); + + return C.PositiveInt.createOrThrow(count); + }, +}); diff --git a/services/school/interfaces/adapters/ports/author.ts b/services/school/interfaces/adapters/ports/author.ts new file mode 100644 index 00000000..c3d4d7f3 --- /dev/null +++ b/services/school/interfaces/adapters/ports/author.ts @@ -0,0 +1,48 @@ +import { AuthorPort } from "@applications/ports/author"; +import { C, unwrap } from "@duplojs/utils"; +import { mongo } from "../../providers/mongo"; + +export const authorPort = AuthorPort.createImplementation({ + async rename(id, name) { + await Promise.all([ + mongo.postCollection.updateMany( + { authorId: unwrap(id) }, + { $set: { authorName: unwrap(name) } }, + ), + mongo.answerCollection.updateMany( + { authorId: unwrap(id) }, + { $set: { authorName: unwrap(name) } }, + ), + ]); + + return C.appendEvidence(id, "rename"); + }, + async anonymise(id) { + await Promise.all([ + mongo.postCollection.updateMany( + { authorId: unwrap(id) }, + { $set: { authorName: null } }, + ), + mongo.answerCollection.updateMany( + { authorId: unwrap(id) }, + { $set: { authorName: null } }, + ), + ]); + + return C.appendEvidence(id, "anonymise"); + }, + async restore(id, name) { + await Promise.all([ + mongo.postCollection.updateMany( + { authorId: unwrap(id) }, + { $set: { authorName: unwrap(name) } }, + ), + mongo.answerCollection.updateMany( + { authorId: unwrap(id) }, + { $set: { authorName: unwrap(name) } }, + ), + ]); + + return C.appendEvidence(id, "restore"); + }, +}); diff --git a/services/school/interfaces/adapters/ports/index.ts b/services/school/interfaces/adapters/ports/index.ts new file mode 100644 index 00000000..32852470 --- /dev/null +++ b/services/school/interfaces/adapters/ports/index.ts @@ -0,0 +1,5 @@ +export * from "./answer"; +export * from "./author"; +export * from "./notificationSettings"; +export * from "./post"; +export * from "./report"; diff --git a/services/school/interfaces/adapters/ports/notificationSettings.ts b/services/school/interfaces/adapters/ports/notificationSettings.ts new file mode 100644 index 00000000..8b171de0 --- /dev/null +++ b/services/school/interfaces/adapters/ports/notificationSettings.ts @@ -0,0 +1,14 @@ +import { NotificationSettingPort } from "@applications/ports/notificationSetting"; +import { unwrap } from "@duplojs/utils"; +import { BottleAPI } from "../../providers/bottle"; + +export const notificationSettingPort = NotificationSettingPort.createImplementation({ + async save(entity) { + await BottleAPI.enableReplyPostNotification({ + postId: unwrap(entity.postId), + userId: unwrap(entity.userId), + }); + + return entity; + }, +}); diff --git a/services/school/interfaces/adapters/ports/post.ts b/services/school/interfaces/adapters/ports/post.ts new file mode 100644 index 00000000..12b2999c --- /dev/null +++ b/services/school/interfaces/adapters/ports/post.ts @@ -0,0 +1,161 @@ +import { PostPort } from "@applications/ports/post"; +import { C, E, forwardAsserts, innerPipe, pipe, toNative, unwrap } from "@duplojs/utils"; +import { Post } from "@domains/entities/post"; +import { mongo } from "../../providers/mongo"; +import { uuidv7 } from "uuidv7"; + +export const postPort = PostPort.createImplementation({ + generateId() { + return C.appendEvidence( + Post.Id.createOrThrow(uuidv7()), + "generated", + ); + }, + async getAnswerCount(entity) { + const count = await mongo.answerCollection.countDocuments({ + postId: unwrap(entity.id), + }); + + return C.appendEvidence( + C.PositiveInt.createOrThrow(count), + "count", + ); + }, + async save(entity) { + const post = C.unwrapEntity(entity, { transformer: toNative }); + + await mongo.postCollection.updateOne( + { + id: post.id, + }, + { + $set: { + id: post.id, + topic: post.topic, + content: post.content, + nodeSameRawDocumentId: post.nodeSameRawDocumentId, + authorId: post.authorId, + authorName: post.authorName, + answerCount: post.answerCount, + status: post.status, + createdAt: post.createdAt, + }, + }, + { upsert: true }, + ); + + return entity; + }, + async findOneById(id) { + const post = await mongo.postCollection.findOne({ + id: unwrap(id), + }); + + if (!post) { + return C.none("Post"); + } + + return C.some(Post.Entity.mapOrThrow(post)); + }, + async findOneAvailableById(id) { + const post = await mongo.postCollection.findOne({ + id: unwrap(id), + status: { $in: ["compliant", "unprocessed"] }, + }); + + if (!post) { + return C.appendEvidence(C.none("Post"), "one-available"); + } + + return pipe( + post, + Post.Entity.mapOrThrow( + innerPipe( + Post.computeStatus, + E.whenHasInformationOtherwise( + ["post.unprocessed", "post.compliant"], + E.success, + (result) => E.left("post.wrongStatus", result), + ), + ), + ), + C.some, + C.appendEvidence("one-available"), + ); + }, + async findOldestUnprocessed() { + const post = await mongo.postCollection.findOne( + { + status: "unprocessed", + }, + { + sort: { + createdAt: 1, + }, + }, + ); + + if (!post) { + return C.appendEvidence(C.none("Post"), "oldest-unprocessed"); + } + + return pipe( + post, + Post.Entity.mapOrThrow( + innerPipe( + Post.computeStatus, + E.whenHasInformationOtherwise( + "post.unprocessed", + E.success, + (result) => E.left("post.wrongStatus", result), + ), + ), + ), + C.some, + C.appendEvidence("oldest-unprocessed"), + ); + }, + async findManyAvailableByNodeSameRawDocument(params) { + const nodeSameRawDocumentId = unwrap(params.nodeSameRawDocumentId); + const page = unwrap(params.page); + const quantityPerPage = unwrap(params.quantityPerPage); + + return mongo.postCollection + .find({ + nodeSameRawDocumentId, + status: { $in: ["compliant", "unprocessed"] }, + }) + .sort({ answerCount: -1 }) + .skip(page * quantityPerPage) + .limit(quantityPerPage) + .map( + Post.Entity.mapOrThrow( + innerPipe( + Post.computeStatus, + E.whenHasInformationOtherwise( + ["post.unprocessed", "post.compliant"], + E.success, + (result) => E.left("post.wrongStatus", result), + ), + ), + ), + ) + .toArray() + .then(C.appendEvidence("many-available")); + }, + async getTotalCountAvailableByNodeSameRawDocument(nodeSameRawDocumentId) { + const count = await mongo.postCollection.countDocuments({ + nodeSameRawDocumentId: unwrap(nodeSameRawDocumentId), + status: { $in: ["compliant", "unprocessed"] }, + }); + + return C.PositiveInt.createOrThrow(count); + }, + async getTotalCountOfUnprocessed() { + const count = await mongo.postCollection.countDocuments({ + status: "unprocessed", + }); + + return C.PositiveInt.createOrThrow(count); + }, +}); diff --git a/services/school/interfaces/adapters/ports/report.ts b/services/school/interfaces/adapters/ports/report.ts new file mode 100644 index 00000000..eaa17115 --- /dev/null +++ b/services/school/interfaces/adapters/ports/report.ts @@ -0,0 +1,29 @@ +import { ReportPort } from "@applications/ports/report"; +import { C, P, unwrap } from "@duplojs/utils"; +import { HarborAPI } from "../../providers/harbor"; + +export const reportPort = ReportPort.createImplementation({ + async save(entity) { + await P.match(entity.answerId) + .with( + null, + () => HarborAPI.createPostUserWarning({ + makeUserBan: C.equal(entity.level, "ban"), + reason: unwrap(entity.reason), + userId: unwrap(entity.userId), + postId: unwrap(entity.postId), + }), + ) + .otherwise( + (answerId) => HarborAPI.createAnswerUserWarning({ + makeUserBan: C.equal(entity.level, "ban"), + reason: unwrap(entity.reason), + userId: unwrap(entity.userId), + postId: unwrap(entity.postId), + answerId: unwrap(answerId), + }), + ); + + return entity; + }, +}); diff --git a/services/school/interfaces/adapters/tsconfig.json b/services/school/interfaces/adapters/tsconfig.json new file mode 100644 index 00000000..ee3f861e --- /dev/null +++ b/services/school/interfaces/adapters/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@adapters/*": ["./*"], + "@applications/*": ["../../business/applications/*"], + "@domains/*": ["../../business/domains/*"], + "@envs": ["../envs.ts"], + }, + }, + "include": [ + "**/*.ts", + "../../business/domains/**/*.ts", + "../../business/applications/**/*.ts", + "../envs.ts", + ], +} \ No newline at end of file diff --git a/services/school/interfaces/adapters/useCases/index.ts b/services/school/interfaces/adapters/useCases/index.ts new file mode 100644 index 00000000..4fdede65 --- /dev/null +++ b/services/school/interfaces/adapters/useCases/index.ts @@ -0,0 +1,16 @@ +import { C } from "@duplojs/utils"; + +import * as Ports from "../ports"; + +import * as PostUseCases from "@applications/useCases/post"; +import * as AnswerUseCases from "@applications/useCases/answer"; +import * as AuthorUseCases from "@applications/useCases/author"; + +export const useCases = C.useCaseInstances( + { + ...PostUseCases, + ...AnswerUseCases, + ...AuthorUseCases, + }, + Ports, +); diff --git a/services/school/interfaces/asyncMessage/deleteUser/index.ts b/services/school/interfaces/asyncMessage/deleteUser/index.ts deleted file mode 100644 index d248d2e7..00000000 --- a/services/school/interfaces/asyncMessage/deleteUser/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { userIdObjecter } from "@business/domains/common/user"; -import { asyncMessage } from "@interfaces/providers/asyncMessage"; -import { anonymizeAuthorUsecase } from "@interfaces/usecase"; - -asyncMessage.collections.deleteUser.on( - async({ value }) => { - const authorId = userIdObjecter.unsafeCreate(value.userId); - - await anonymizeAuthorUsecase.execute({ - authorId, - }); - }, -); - -await asyncMessage - .collections - .deleteUser - .start(true); diff --git a/services/school/interfaces/asyncMessage/main.js b/services/school/interfaces/asyncMessage/main.js index b7ab42f1..1d5f7dd1 100644 --- a/services/school/interfaces/asyncMessage/main.js +++ b/services/school/interfaces/asyncMessage/main.js @@ -1,6 +1,8 @@ //@ts-check import { register } from "tsx/esm/api"; -register(); +register({ + tsconfig: new URL("./tsconfig.json", import.meta.url).pathname, +}); -await import("./main"); \ No newline at end of file +await import("./main"); diff --git a/services/school/interfaces/asyncMessage/main.ts b/services/school/interfaces/asyncMessage/main.ts index 480d309a..689dd761 100644 --- a/services/school/interfaces/asyncMessage/main.ts +++ b/services/school/interfaces/asyncMessage/main.ts @@ -1,4 +1,3 @@ -import "@vendors/backend-logger"; -import "./updateUser"; -import "./deleteUser"; -import "./restoreUser"; +import "@lib/logger"; + +import "./messages"; diff --git a/services/school/interfaces/asyncMessage/messages/anonymiseAuthor.ts b/services/school/interfaces/asyncMessage/messages/anonymiseAuthor.ts new file mode 100644 index 00000000..9345c7e4 --- /dev/null +++ b/services/school/interfaces/asyncMessage/messages/anonymiseAuthor.ts @@ -0,0 +1,16 @@ +import { UserId } from "@domains/common/user"; +import { asyncMessage } from "@providers/asyncMessage"; +import { useCases } from "@adapters/useCases"; + +asyncMessage.collections.deleteUser.on( + async({ value }) => { + const userId = UserId.createOrThrow(value.userId); + + await useCases.anonymiseAuthorUseCase({ userId }); + }, +); + +await asyncMessage + .collections + .deleteUser + .start(true); diff --git a/services/school/interfaces/asyncMessage/messages/index.ts b/services/school/interfaces/asyncMessage/messages/index.ts new file mode 100644 index 00000000..e65ee120 --- /dev/null +++ b/services/school/interfaces/asyncMessage/messages/index.ts @@ -0,0 +1,3 @@ +export * from "./renameAuthor"; +export * from "./anonymiseAuthor"; +export * from "./restoreAuthor"; diff --git a/services/school/interfaces/asyncMessage/messages/renameAuthor.ts b/services/school/interfaces/asyncMessage/messages/renameAuthor.ts new file mode 100644 index 00000000..a0996a90 --- /dev/null +++ b/services/school/interfaces/asyncMessage/messages/renameAuthor.ts @@ -0,0 +1,23 @@ +import { asyncMessage } from "@providers/asyncMessage"; +import { useCases } from "@adapters/useCases"; +import { UserId, UserName } from "@domains/common/user"; + +asyncMessage.collections.updateUser.on( + async({ value }) => { + if (!value.username) { + return; + } + const userId = UserId.createOrThrow(value.userId); + const username = UserName.createOrThrow(value.username); + + await useCases.renameAuthorUseCase({ + userId, + username, + }); + }, +); + +await asyncMessage + .collections + .updateUser + .start(true); diff --git a/services/school/interfaces/asyncMessage/messages/restoreAuthor.ts b/services/school/interfaces/asyncMessage/messages/restoreAuthor.ts new file mode 100644 index 00000000..d432af2b --- /dev/null +++ b/services/school/interfaces/asyncMessage/messages/restoreAuthor.ts @@ -0,0 +1,20 @@ +import { UserId, UserName } from "@domains/common/user"; +import { asyncMessage } from "@providers/asyncMessage"; +import { useCases } from "@adapters/useCases"; + +asyncMessage.collections.restoreUser.on( + async({ value }) => { + const userId = UserId.createOrThrow(value.userId); + const username = UserName.createOrThrow(value.username); + + await useCases.restoreAuthorUseCase({ + userId, + username, + }); + }, +); + +await asyncMessage + .collections + .restoreUser + .start(true); diff --git a/services/school/interfaces/asyncMessage/restoreUser/index.ts b/services/school/interfaces/asyncMessage/restoreUser/index.ts deleted file mode 100644 index 5f336743..00000000 --- a/services/school/interfaces/asyncMessage/restoreUser/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { userIdObjecter, usernameObjecter } from "@business/domains/common/user"; -import { asyncMessage } from "@interfaces/providers/asyncMessage"; -import { restoreAuthorUsecase } from "@interfaces/usecase"; - -asyncMessage.collections.restoreUser.on( - async({ value }) => { - const authorId = userIdObjecter.unsafeCreate(value.userId); - const newAuthorName = usernameObjecter.unsafeCreate(value.username); - - await restoreAuthorUsecase.execute({ - authorId, - newAuthorName, - }); - }, -); - -await asyncMessage - .collections - .restoreUser - .start(true); diff --git a/services/school/interfaces/asyncMessage/tsconfig.json b/services/school/interfaces/asyncMessage/tsconfig.json new file mode 100644 index 00000000..f5a4a286 --- /dev/null +++ b/services/school/interfaces/asyncMessage/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@http/*": ["./*"], + "@applications/*": ["../../business/applications/*"], + "@domains/*": ["../../business/domains/*"], + "@adapters/*": ["../adapters/*"], + "@providers/asyncMessage": ["../providers/asyncMessage/index.ts"], + "@envs": ["../envs.ts"], + }, + }, + "include": [ + "**/*.ts", + "../../business/domains/**/*.ts", + "../../business/applications/**/*.ts", + "../adapters/**/*.ts", + "../envs.ts", + ], +} \ No newline at end of file diff --git a/services/school/interfaces/asyncMessage/updateUser/index.ts b/services/school/interfaces/asyncMessage/updateUser/index.ts deleted file mode 100644 index e5c2e66e..00000000 --- a/services/school/interfaces/asyncMessage/updateUser/index.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { userIdObjecter, usernameObjecter } from "@business/domains/common/user"; -import { asyncMessage } from "@interfaces/providers/asyncMessage"; -import { renameAuthor } from "@interfaces/usecase"; - -asyncMessage.collections.updateUser.on( - async({ value }) => { - const username = value.username; - if (!username) { - return; - } - const authorId = userIdObjecter.unsafeCreate(value.userId); - const newAuthorName = usernameObjecter.unsafeCreate(username); - - await renameAuthor.execute({ - authorId, - newAuthorName, - }); - }, -); - -await asyncMessage - .collections - .updateUser - .start(true); diff --git a/services/school/interfaces/envs.ts b/services/school/interfaces/envs.ts index 655f981b..3d06c465 100644 --- a/services/school/interfaces/envs.ts +++ b/services/school/interfaces/envs.ts @@ -1,25 +1,23 @@ -import { zod } from "@duplojs/core"; -import { config as importEnvFile } from "dotenv"; -import { expand as expandEnv } from "dotenv-expand"; +import { DPE } from "@duplojs/utils"; +import { environmentVariableOrThrow } from "@duplojs/server-utils"; -for (const pathEnv of [".env.local", ".env"]) { - expandEnv( - importEnvFile({ path: pathEnv }), - ); -} - -export const envs = zod - .object({ - PORT: zod.coerce.number(), - HOST: zod.enum(["0.0.0.0"]), - ENVIRONMENT: zod.enum(["DEV", "PROD"]), - MONGO_DATABASE_URL: zod.string(), - MONGO_DB: zod.string(), - DB_CONNECTION: zod.booleanInString(), - ASYNC_MESSAGE_MONGO_URL: zod.string(), - SERVICE_NAME: zod.literal("school").default("school"), - GLITCHTIP_DSN: zod.string(), - BOTTLE_BASE_URL: zod.string().url(), - HARBOR_BASE_URL: zod.string().url(), - }) - .parse(process.env); +export const envs = await environmentVariableOrThrow( + { + PORT: DPE.coerce.number(), + HOST: DPE.literal(["0.0.0.0", "localhost", "127.0.0.1"]), + ENVIRONMENT: DPE.literal(["DEV", "PROD"]), + MONGO_DATABASE_URL: DPE.string(), + MONGO_DB: DPE.string(), + DB_CONNECTION: DPE.coerce.boolean(), + ASYNC_MESSAGE_MONGO_URL: DPE.string(), + SERVICE_NAME: DPE.literal("school"), + GLITCHTIP_DSN: DPE.string(), + BOTTLE_BASE_URL: DPE.url(), + HARBOR_BASE_URL: DPE.url(), + CODEGEN_PATH: DPE.string(), + }, + { + paths: [".env"], + justRead: true, + }, +); diff --git a/services/school/interfaces/fixtures/entities/answer.ts b/services/school/interfaces/fixtures/entities/answer.ts deleted file mode 100644 index 25da0240..00000000 --- a/services/school/interfaces/fixtures/entities/answer.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { uuidv7 } from "uuidv7"; -import { faker } from "@vendors/fixture"; -import { EntityHandler, type ToSimpleObject } from "@vendors/clean"; -import { AnswerEntity } from "@business/domains/entities/answer"; -import { answerRepository } from "@business/applications/repositories/answer"; -import { answerRules } from "@vendors/entity-rules"; - -const start = 0; - -export async function makeAnswer( - answer?: Partial, "id">>, -) { - return answerRepository.use.save( - EntityHandler.unsafeMapper( - AnswerEntity, - { - id: uuidv7(), - postId: answer?.postId || uuidv7(), - content: answer?.content || faker.lorem.paragraphs({ - min: 2, - max: 4, - }).slice(start, answerRules.content.maxLength), - authorId: answer?.authorId || uuidv7(), - authorName: answer?.authorName || faker.internet.displayName(), - status: answer?.status || "unprocessed", - createdAt: answer?.createdAt || faker.date.past({ - years: 1, - refDate: new Date(), - }), - }, - ), - ); -} diff --git a/services/school/interfaces/fixtures/entities/post.ts b/services/school/interfaces/fixtures/entities/post.ts deleted file mode 100644 index 9e9ea14d..00000000 --- a/services/school/interfaces/fixtures/entities/post.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { uuidv7 } from "uuidv7"; -import { faker } from "@vendors/fixture"; -import { EntityHandler, type ToSimpleObject } from "@vendors/clean"; -import { PostEntity } from "@business/domains/entities/post"; -import { postRepository } from "@business/applications/repositories/post"; - -const answerDefaultCount = 0; - -export async function makePost( - post?: Partial, "id">>, -) { - return postRepository.use.save( - EntityHandler.unsafeMapper( - PostEntity, - { - id: uuidv7(), - nodeSameRawDocumentId: post?.nodeSameRawDocumentId || uuidv7(), - topic: post?.topic || faker.lorem.sentence({ - min: 3, - max: 6, - }), - content: post?.content || faker.lorem.paragraphs({ - min: 2, - max: 4, - }), - answerCount: post?.answerCount || answerDefaultCount, - authorId: post?.authorId || uuidv7(), - authorName: post?.authorName || faker.internet.displayName(), - status: post?.status || "unprocessed", - createdAt: post?.createdAt || faker.date.past({ - years: 1, - refDate: new Date(), - }), - }, - ), - ); -} diff --git a/services/school/interfaces/fixtures/index.ts b/services/school/interfaces/fixtures/index.ts index c4ae6de9..e49b12e2 100644 --- a/services/school/interfaces/fixtures/index.ts +++ b/services/school/interfaces/fixtures/index.ts @@ -1,66 +1,97 @@ -import { program } from "commander"; -import { zod } from "@duplojs/core"; -import { mongo } from "@interfaces/providers/mongo"; -import { mapAsync, repeater } from "@vendors/fixture"; -import "../repositories"; -import { makeAnswer } from "./entities/answer"; -import { makePost } from "./entities/post"; +/* eslint-disable @typescript-eslint/no-magic-numbers */ +import "@providers/mongo"; +import { SC } from "@duplojs/server-utils"; +import { A, asyncPipe, DPE, E, O, promiseAll } from "@duplojs/utils"; +import { uuidv7 } from "uuidv7"; +import { faker, repeater } from "@lib/fixture"; +import { Post } from "@domains/entities/post"; +import { Answer } from "@domains/entities/answer"; +import { UserId, UserName } from "@domains/common/user"; +import { useCases } from "@adapters/useCases"; -const numberOf = Object.freeze({ - posts: 10, - answers: 100, -}); - -const optionsSchema = zod.object({ - nodeSameRawDocumentId: zod.string(), - numberOfPost: zod.coerce - .number() - .int() - .positive() - .default(numberOf.posts), - numberOfAnswersPerPost: zod.coerce - .number() - .int() - .positive() - .default(numberOf.answers), -}); - -program - .requiredOption( - "-d , --nodeSameRawDocumentId ", - ) - .option( - "-p, --numberOfPost ", - "Nombre de posts à générer", - "10", - ) - .option( - "-a, --numberOfAnswersPerPost ", - "Nombre de réponses par post", - "100", - ); - -program.parse(); - -const rawOptions = program.opts(); -const { nodeSameRawDocumentId, numberOfPost, numberOfAnswersPerPost } = optionsSchema.parse(rawOptions); - -const posts = await repeater( - numberOfPost, - () => makePost({ - answerCount: numberOfAnswersPerPost, - nodeSameRawDocumentId, - }), -); - -await mapAsync( - posts, - (post) => repeater( - numberOfAnswersPerPost, - () => makeAnswer({ - postId: post.id.toSimpleObject(), - }), - ), +await SC.exec( + { + displayName: "School Fixtures", + options: [ + SC.createOption( + "nodeSameRawDocumentId", + Post.NodeSameRawDocumentId, + { + aliases: ["-d"], + description: "document ID", + required: true, + }, + ), + SC.createOption( + "numberOfPost", + DPE.int().min(0), + { + aliases: ["-np"], + description: "number of posts", + required: true, + }, + ), + SC.createOption( + "numberOfAnswerPerPost", + DPE.int().min(0), + { + aliases: ["-na"], + description: "number of answers per post", + required: true, + }, + ), + ], + }, + async({ options }) => { + await asyncPipe( + repeater( + options.numberOfPost, + async() => useCases.createPostUseCase( + { + nodeSameRawDocumentId: Post.NodeSameRawDocumentId + .createOrThrow(options.nodeSameRawDocumentId), + authorId: UserId.createOrThrow(uuidv7()), + authorName: UserName.createOrThrow( + faker.internet.displayName(), + ), + content: Post.Content.createOrThrow( + faker.lorem.paragraphs({ + min: 1, + max: 2, + }), + ), + topic: Post.Topic.createOrThrow( + faker.lorem.sentence({ + min: 1, + max: 2, + }), + ), + }, + ).then(O.getProperty("post")), + ), + A.map( + (post) => repeater( + options.numberOfAnswerPerPost, + () => asyncPipe( + { + post, + authorId: UserId.createOrThrow(uuidv7()), + authorName: UserName.createOrThrow( + faker.internet.displayName(), + ), + content: Answer.Content.createOrThrow( + faker.lorem.paragraphs({ + min: 1, + max: 2, + }), + ), + }, + useCases.replyToPostUseCase, + E.unwrapByInformationOrThrow("reply-post"), + ), + ), + ), + promiseAll, + ); + }, ); - -await mongo.client.close(); diff --git a/services/school/interfaces/fixtures/tsconfig.json b/services/school/interfaces/fixtures/tsconfig.json new file mode 100644 index 00000000..641e4c11 --- /dev/null +++ b/services/school/interfaces/fixtures/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "types": ["node"], + "baseUrl": "./", + "paths": { + "@fixtures/*": ["./*"], + "@domains/*": ["../../business/domains/*"], + "@applications/*": ["../../business/applications/*"], + "@adapters/*": ["../adapters/*"], + "@providers/*": ["../providers/*"], + "@envs": ["../envs.ts"], + }, + }, + "include": [ + "**/*.ts", + "../../business/domains/**/*.ts", + "../../business/applications/**/*.ts", + "../adapters/**/*.ts", + "../providers/**/*.ts", + "../envs.ts", + ], +} \ No newline at end of file diff --git a/services/school/interfaces/http/checkers/answer.ts b/services/school/interfaces/http/checkers/answer.ts index bba52f4f..aaebb13f 100644 --- a/services/school/interfaces/http/checkers/answer.ts +++ b/services/school/interfaces/http/checkers/answer.ts @@ -1,25 +1,47 @@ -import { type AnswerId } from "@business/domains/entities/answer"; -import { findAnswerByIdUsecase } from "@interfaces/usecase"; +import { ResponseContract, createPresetChecker, useCheckerBuilder } from "@duplojs/http"; +import { E } from "@duplojs/utils"; +import { answerPort } from "@adapters/ports"; +import { Answer } from "@domains/entities/answer"; -export const answerExistCheck = createChecker("answerExist") +export const answerExistChecker = useCheckerBuilder() .handler( - async(input: AnswerId, output) => { - const answer = await findAnswerByIdUsecase.execute({ id: input }); + async(id: Answer.Id, { output }) => { + const result = await answerPort.findOneById(id); - if (answer) { - return output("answer.exist", answer); - } else { + if (E.isLeft(result)) { return output("answer.notfound", null); } + + return output("answer.found", E.unwrapRight(result)); }, ); -export const iWantAnswerExistById = createPresetChecker( - answerExistCheck, +export const iWantAnswerExistsById = createPresetChecker( + answerExistChecker, + { + result: "answer.found", + indexing: "answer", + otherwise: ResponseContract.notFound("answer.notfound"), + }, +); + +export const computeStatusAnswerChecker = useCheckerBuilder() + .handler( + (answer: Answer.Entity, { output }) => E.matchInformation( + Answer.computeStatus(answer), + { + "answer.compliant": (answer) => output("answer.compliant", answer), + "answer.notCompliant": (answer) => output("answer.notCompliant", answer), + "answer.unprocessed": (answer) => output("answer.unprocessed", answer), + }, + ), + ); + +export const iWantAnswerWithUnprocessedStatus = createPresetChecker( + computeStatusAnswerChecker, { - result: "answer.exist", - catch: () => new NotFoundHttpResponse("answer.notfound"), + result: "answer.unprocessed", + otherwise: ResponseContract.notFound("answer.unprocessed.wrongStatus"), indexing: "answer", }, - makeResponseContract(NotFoundHttpResponse, "answer.notfound"), ); diff --git a/services/school/interfaces/http/checkers/index.ts b/services/school/interfaces/http/checkers/index.ts new file mode 100644 index 00000000..1d1874ff --- /dev/null +++ b/services/school/interfaces/http/checkers/index.ts @@ -0,0 +1,2 @@ +export * from "./answer"; +export * from "./post"; diff --git a/services/school/interfaces/http/checkers/post.ts b/services/school/interfaces/http/checkers/post.ts index ae4a1a24..34893f25 100644 --- a/services/school/interfaces/http/checkers/post.ts +++ b/services/school/interfaces/http/checkers/post.ts @@ -1,25 +1,57 @@ -import { type PostId } from "@business/domains/entities/post"; -import { findPostByIdUsecase } from "@interfaces/usecase"; +import { ResponseContract, createPresetChecker, useCheckerBuilder } from "@duplojs/http"; +import { E } from "@duplojs/utils"; +import { postPort } from "@adapters/ports"; +import { Post } from "@domains/entities/post"; -export const postExistCheck = createChecker("postExist") +export const postExistChecker = useCheckerBuilder() .handler( - async(input: PostId, output) => { - const post = await findPostByIdUsecase.execute({ id: input }); + async(id: Post.Id, { output }) => { + const result = await postPort.findOneById(id); - if (post) { - return output("post.exist", post); - } else { + if (E.isLeft(result)) { return output("post.notfound", null); } + + return output("post.found", E.unwrapRight(result)); }, ); -export const iWantPostExistById = createPresetChecker( - postExistCheck, +export const iWantPostExistsById = createPresetChecker( + postExistChecker, { - result: "post.exist", - catch: () => new NotFoundHttpResponse("post.notfound"), + result: "post.found", indexing: "post", + otherwise: ResponseContract.notFound("post.notfound"), }, - makeResponseContract(NotFoundHttpResponse, "post.notfound"), ); + +export const computePostStatusChecker = useCheckerBuilder() + .handler( + (post: Post.Entity, { output }) => E.matchInformation( + Post.computeStatus(post), + { + "post.compliant": (answer) => output("post.compliant", answer), + "post.notCompliant": (answer) => output("post.notCompliant", answer), + "post.unprocessed": (answer) => output("post.unprocessed", answer), + }, + ), + ); + +export const iWantPostWithAvailableStatus = createPresetChecker( + computePostStatusChecker, + { + result: ["post.unprocessed", "post.compliant"], + otherwise: ResponseContract.notFound("post.notfound"), + indexing: "post", + }, +); + +export const iWantPostWithUnprocessedStatus = createPresetChecker( + computePostStatusChecker, + { + result: "post.unprocessed", + otherwise: ResponseContract.notFound("post.unprocessed.wrongStatus"), + indexing: "post", + }, +); + diff --git a/services/school/interfaces/http/main.js b/services/school/interfaces/http/main.js index b7ab42f1..1d5f7dd1 100644 --- a/services/school/interfaces/http/main.js +++ b/services/school/interfaces/http/main.js @@ -1,6 +1,8 @@ //@ts-check import { register } from "tsx/esm/api"; -register(); +register({ + tsconfig: new URL("./tsconfig.json", import.meta.url).pathname, +}); -await import("./main"); \ No newline at end of file +await import("./main"); diff --git a/services/school/interfaces/http/main.ts b/services/school/interfaces/http/main.ts index fdda016a..bcc37e27 100644 --- a/services/school/interfaces/http/main.ts +++ b/services/school/interfaces/http/main.ts @@ -1,26 +1,22 @@ -import "@duplojs/node"; -import "@duplojs/node/globals"; -import { Duplo, useProcessBuilder, useRouteBuilder } from "@duplojs/core"; +import { createHub, routeStore } from "@duplojs/http"; +import { codeGeneratorPlugin } from "@duplojs/http/codeGenerator"; +import { createHttpServer } from "@duplojs/http/node"; import { envs } from "../envs"; -import "./routes"; -import { debug } from "@vendors/duplo-plugins/debug"; -const duplo = new Duplo({ - environment: envs.ENVIRONMENT, - host: envs.HOST, - port: envs.PORT, - plugins: [ - debug({ - dsn: envs.GLITCHTIP_DSN, - }), - ], -}); +import "./routes"; +import "./plugins/generate"; -duplo.register( - ...useProcessBuilder.getAllCreatedProcess(), - ...useRouteBuilder.getAllCreatedRoute(), -); +const hub = createHub({ environment: "DEV" }) + .plug(codeGeneratorPlugin({ outputFile: envs.CODEGEN_PATH })) + .register(routeStore.getAll()); -await duplo.launch( - () => void console.log("School service is running !"), -); +await createHttpServer( + hub, + { + host: envs.HOST, + port: envs.PORT, + }, +) + .then( + () => void console.log(`${envs.SERVICE_NAME} service is running !`), + ); diff --git a/services/bridge/interfaces/providers/.gitkeep b/services/school/interfaces/http/plugins/generate.ts similarity index 100% rename from services/bridge/interfaces/providers/.gitkeep rename to services/school/interfaces/http/plugins/generate.ts diff --git a/services/school/interfaces/http/routes/answer.ts b/services/school/interfaces/http/routes/answer.ts deleted file mode 100644 index 94519765..00000000 --- a/services/school/interfaces/http/routes/answer.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { answerContentObjecter, AnswerEntity, answerIdObjecter } from "@business/domains/entities/answer"; -import { postIdObjecter } from "@business/domains/entities/post"; -import { findAnswersFromPostUsecase, findOldestUnprocessedAnswerUsecase, getTotalCountOfUnprocessedAnswersUsecase, indicateAnswerIsCompliantUsecase, indicateAnswerIsNotCompliantAndCreateWarningUsecase, replyToPostUsecase } from "@interfaces/usecase"; -import { iWantPostExistById } from "../checkers/post"; -import { endpointAnswerSchema, endpointUnprocessedAnswerDetails } from "../schemas/answer"; -import { intObjecter, toSimpleObject, UsecaseError } from "@vendors/clean"; -import { userIdObjecter, usernameObjecter } from "@business/domains/common/user"; -import { iWantAnswerExistById } from "../checkers/answer"; -import { warningMakeUserBanObjecter, warningReasonObjecter } from "@business/domains/common/warning"; -import { match, P } from "ts-pattern"; - -useBuilder() - .createRoute("POST", "/posts/{postId}/answers") - .extract({ - params: { - postId: postIdObjecter.toZodSchema(), - }, - body: zod.object({ - content: answerContentObjecter.toZodSchema(), - authorId: userIdObjecter.toZodSchema(), - authorName: usernameObjecter.toZodSchema(), - }), - }) - .presetCheck( - iWantPostExistById, - (pickup) => pickup("postId"), - ) - .handler( - async(pickup) => { - const { post } = pickup(["post"]); - const { content, authorId, authorName } = pickup("body"); - - await replyToPostUsecase - .execute({ - post, - content, - authorId, - authorName, - }); - - return new CreatedHttpResponse( - "answer.created", - ); - }, - makeResponseContract(CreatedHttpResponse, "answer.created"), - ); - -useBuilder() - .createRoute("GET", "/posts/{postId}/answers") - .extract({ - params: { - postId: postIdObjecter.toZodSchema(), - }, - query: { - page: zoderce.number().pipe(intObjecter.toZodSchema()), - quantityPerPage: zoderce.number().pipe(intObjecter.toZodSchema()), - }, - }) - .presetCheck( - iWantPostExistById, - (pickup) => pickup("postId"), - ) - .handler( - async(pickup) => { - const { post, page, quantityPerPage } = pickup(["post", "page", "quantityPerPage"]); - - const answers = await findAnswersFromPostUsecase - .execute({ - post, - page, - quantityPerPage, - }) - .then((answer) => answer.map(toSimpleObject)); - - return new OkHttpResponse( - "answers.found", - answers, - ); - }, - makeResponseContract(OkHttpResponse, "answers.found", endpointAnswerSchema.array()), - ); - -useBuilder() - .createRoute("GET", "/find-oldest-unprocessed-answer") - .cut( - async({ dropper }) => { - const result = await findOldestUnprocessedAnswerUsecase.execute(); - - return match({ result }) - .with( - { result: null }, - () => new NotFoundHttpResponse("oldestUnprocessedAnswer.notfound"), - ) - .with( - { result: P.instanceOf(AnswerEntity) }, - ({ result: answer }) => dropper({ answer }), - ) - .exhaustive(); - }, - ["answer"], - makeResponseContract(NotFoundHttpResponse, "oldestUnprocessedAnswer.notfound"), - ) - .handler( - (pickup) => { - const answer = pickup("answer"); - - return new OkHttpResponse( - "oldestUnprocessedAnswer.found", - answer.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "oldestUnprocessedAnswer.found", endpointAnswerSchema), - ); - -useBuilder() - .createRoute("GET", "/unprocessed-answer-details") - .handler( - async() => { - const totalCount = await getTotalCountOfUnprocessedAnswersUsecase.execute(); - - return new OkHttpResponse( - "unprocessedAnswer.details", - { totalCount: totalCount.value }, - ); - }, - makeResponseContract(OkHttpResponse, "unprocessedAnswer.details", endpointUnprocessedAnswerDetails), - ); - -useBuilder() - .createRoute("PATCH", "/answers/{answerId}/is-compliant") - .extract({ - params: { - answerId: answerIdObjecter.toZodSchema(), - }, - }) - .presetCheck( - iWantAnswerExistById, - (pickup) => pickup("answerId"), - ) - .cut( - async({ pickup, dropper }) => { - const answer = pickup("answer"); - - const updatedAnswer = await indicateAnswerIsCompliantUsecase.execute({ - answer, - }); - - if (updatedAnswer instanceof UsecaseError) { - return new ForbiddenHttpResponse("answer.wrongStatus"); - } - - return dropper({ updatedAnswer }); - }, - ["updatedAnswer"], - makeResponseContract(ForbiddenHttpResponse, "answer.wrongStatus"), - ) - .handler( - (pickup) => { - const answer = pickup("updatedAnswer"); - - return new OkHttpResponse( - "answer.updated", - answer.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "answer.updated", endpointAnswerSchema), - ); - -useBuilder() - .createRoute("PATCH", "/answers/{answerId}/is-not-compliant-and-create-warning") - .extract({ - params: { - answerId: answerIdObjecter.toZodSchema(), - }, - body: { - makeUserBan: warningMakeUserBanObjecter.toZodSchema(), - reason: warningReasonObjecter.toZodSchema(), - }, - }) - .presetCheck( - iWantAnswerExistById, - (pickup) => pickup("answerId"), - ) - .cut( - async({ pickup, dropper }) => { - const { - answer, - makeUserBan, - reason, - } = pickup(["answer", "makeUserBan", "reason"]); - - const result = await indicateAnswerIsNotCompliantAndCreateWarningUsecase.execute({ - answer, - reason, - makeUserBan, - }); - - return match(result) - .with( - P.instanceOf(UsecaseError), - ({ information }) => match(information) - .with( - "wrong-status", - () => new ForbiddenHttpResponse("answer.wrongStatus"), - ) - .with( - "answer-post-mismatch", - () => new ForbiddenHttpResponse("answer.postMismatch"), - ) - .exhaustive(), - ) - .with( - P.instanceOf(AnswerEntity), - (updatedAnswer) => dropper({ updatedAnswer }), - ) - .exhaustive(); - }, - ["updatedAnswer"], - [ - ...makeResponseContract(ForbiddenHttpResponse, "answer.wrongStatus"), - ...makeResponseContract(ForbiddenHttpResponse, "answer.postMismatch"), - ], - ) - .handler( - (pickup) => { - const answer = pickup("updatedAnswer"); - - return new OkHttpResponse( - "answer.updated", - answer.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "answer.updated", endpointAnswerSchema), - ); diff --git a/services/school/interfaces/http/routes/answer/createReport.ts b/services/school/interfaces/http/routes/answer/createReport.ts new file mode 100644 index 00000000..87de7283 --- /dev/null +++ b/services/school/interfaces/http/routes/answer/createReport.ts @@ -0,0 +1,37 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, DPE, E } from "@duplojs/utils"; +import { useCases } from "@adapters/useCases"; +import { Answer } from "@domains/entities/answer"; +import { Report } from "@domains/entities/report"; +import { iWantAnswerExistsById, iWantAnswerWithUnprocessedStatus } from "@http/checkers"; + +useRouteBuilder("POST", "/create-report-answer") + .extract({ + body: DPE.object({ + answerId: Answer.Id.toExtractParser(), + level: Report.Level.toExtractParser(), + reason: Report.Reason.toExtractParser(), + }), + }) + .presetCheck( + iWantAnswerExistsById, + ({ body }) => body.answerId, + ) + .presetCheck( + iWantAnswerWithUnprocessedStatus, + (floor) => floor.answer, + ) + .handler( + ResponseContract.created("report.created"), + ({ body, answer }, { response }) => asyncPipe( + useCases.createReportAnswerUseCase({ + answer, + level: body.level, + reason: body.reason, + }), + E.unwrapSelectionOrThrow({ + "post.report": true, + }), + () => response("report.created"), + ), + ); diff --git a/services/school/interfaces/http/routes/answer/findMany.ts b/services/school/interfaces/http/routes/answer/findMany.ts new file mode 100644 index 00000000..41ed5827 --- /dev/null +++ b/services/school/interfaces/http/routes/answer/findMany.ts @@ -0,0 +1,38 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { A, asyncPipe, C, DPE, E } from "@duplojs/utils"; +import { Answer } from "@domains/entities/answer"; +import { Post } from "@domains/entities/post"; +import { iWantPostExistsById, iWantPostWithAvailableStatus } from "@http/checkers"; +import { useCases } from "@adapters/useCases"; + +useRouteBuilder("POST", "/find-many-available-answer-by-available-post") + .extract({ + body: DPE.object({ + postId: Post.Id.toExtractParser(), + page: C.PositiveInt.toExtractParser(), + quantityPerPage: C.StrictPositiveInt.toExtractParser(), + }), + }) + .presetCheck( + iWantPostExistsById, + ({ body }) => body.postId, + ) + .presetCheck( + iWantPostWithAvailableStatus, + (floor) => floor.post, + ) + .handler( + ResponseContract.ok("answers.found", Answer.Entity.toEndpointSchema().array()), + ({ body, post }, { response }) => asyncPipe( + useCases.findManyAvailableAnswerByAvailablePost({ + post, + page: body.page, + quantityPerPage: body.quantityPerPage, + }), + E.unwrapSelectionOrThrow({ + "find-many-available-answer-by-available-post-success": true, + }), + A.map((answer) => C.unwrapEntity(answer)), + (answers) => response("answers.found", answers), + ), + ); diff --git a/services/school/interfaces/http/routes/answer/findOldest.ts b/services/school/interfaces/http/routes/answer/findOldest.ts new file mode 100644 index 00000000..0e9fec44 --- /dev/null +++ b/services/school/interfaces/http/routes/answer/findOldest.ts @@ -0,0 +1,38 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, C, DPE, E, unwrap } from "@duplojs/utils"; +import { Answer } from "@domains/entities/answer"; +import { useCases } from "@adapters/useCases"; +import { answerPort } from "@adapters/ports"; + +useRouteBuilder("POST", "/find-oldest-unprocessed-answer") + .handler( + [ + ResponseContract.ok("oldestUnprocessedAnswer.found", Answer.Entity.toEndpointSchema()), + ResponseContract.notFound("oldestUnprocessedAnswer.notfound"), + ], + (_floor, { response }) => asyncPipe( + useCases.findOldestUnprocessedAnswer(), + E.unwrapSelectionOrThrow({ + "find-oldest-unprocessed-answer-success": true, + }), + E.matchInformation({ + "none-Answer": () => response("oldestUnprocessedAnswer.notfound"), + "some-Answer": (answer) => response( + "oldestUnprocessedAnswer.found", + C.unwrapEntity(answer), + ), + }), + ), + ); + +useRouteBuilder("POST", "/find-unprocessed-answer-details") + .handler( + ResponseContract.ok("unprocessedAnswer.details", DPE.object({ totalCount: DPE.number() })), + (_floor, { response }) => answerPort + .getTotalCountOfUnprocessed() + .then( + (totalCount) => response("unprocessedAnswer.details", { + totalCount: unwrap(totalCount), + }), + ), + ); diff --git a/services/school/interfaces/http/routes/answer/index.ts b/services/school/interfaces/http/routes/answer/index.ts new file mode 100644 index 00000000..9e1ea82e --- /dev/null +++ b/services/school/interfaces/http/routes/answer/index.ts @@ -0,0 +1,5 @@ +export * from "./createReport"; +export * from "./findMany"; +export * from "./findOldest"; +export * from "./markAsCompliant"; +export * from "./reply"; diff --git a/services/school/interfaces/http/routes/answer/markAsCompliant.ts b/services/school/interfaces/http/routes/answer/markAsCompliant.ts new file mode 100644 index 00000000..4ea96e73 --- /dev/null +++ b/services/school/interfaces/http/routes/answer/markAsCompliant.ts @@ -0,0 +1,31 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, DPE, E } from "@duplojs/utils"; +import { useCases } from "@adapters/useCases"; +import { Answer } from "@domains/entities/answer"; +import { iWantAnswerExistsById, iWantAnswerWithUnprocessedStatus } from "@http/checkers"; + +useRouteBuilder("POST", "/mark-answer-as-compliant") + .extract({ + body: DPE.object({ + answerId: Answer.Id.toExtractParser(), + }), + }) + .presetCheck( + iWantAnswerExistsById, + ({ body }) => body.answerId, + ) + .presetCheck( + iWantAnswerWithUnprocessedStatus, + (floor) => floor.answer, + ) + .handler( + ResponseContract.noContent("answer.markedAsCompliant"), + ({ answer }, { response }) => asyncPipe( + useCases.markAnswerAsCompliantUseCase({ answer }), + E.unwrapSelectionOrThrow({ + success: true, + "answer.compliant.wrongStatus": false, + }), + () => response("answer.markedAsCompliant"), + ), + ); diff --git a/services/school/interfaces/http/routes/answer/reply.ts b/services/school/interfaces/http/routes/answer/reply.ts new file mode 100644 index 00000000..0da595e5 --- /dev/null +++ b/services/school/interfaces/http/routes/answer/reply.ts @@ -0,0 +1,41 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, DPE, E } from "@duplojs/utils"; +import { useCases } from "@adapters/useCases"; +import { Answer } from "@domains/entities/answer"; +import { Post } from "@domains/entities/post"; +import { UserId, UserName } from "@domains/common/user"; +import { iWantPostExistsById, iWantPostWithAvailableStatus } from "@http/checkers"; + +useRouteBuilder("POST", "/reply-to-post") + .extract({ + body: DPE.object({ + postId: Post.Id.toExtractParser(), + content: Answer.Content.toExtractParser(), + authorId: UserId.toExtractParser(), + authorName: UserName.toExtractParser(), + }), + }) + .presetCheck( + iWantPostExistsById, + ({ body }) => body.postId, + ) + .presetCheck( + iWantPostWithAvailableStatus, + (floor) => floor.post, + ) + .handler( + ResponseContract.created("answer.created"), + ({ body, post }, { response }) => asyncPipe( + useCases.replyToPostUseCase({ + post, + content: body.content, + authorId: body.authorId, + authorName: body.authorName, + }), + E.unwrapSelectionOrThrow({ + createNewTypeError: false, + replyPost: true, + }), + () => response("answer.created"), + ), + ); diff --git a/services/school/interfaces/http/routes/index.ts b/services/school/interfaces/http/routes/index.ts index f7df7045..1d1874ff 100644 --- a/services/school/interfaces/http/routes/index.ts +++ b/services/school/interfaces/http/routes/index.ts @@ -1,2 +1,2 @@ -import "@interfaces/http/routes/post"; -import "@interfaces/http/routes/answer"; +export * from "./answer"; +export * from "./post"; diff --git a/services/school/interfaces/http/routes/post.ts b/services/school/interfaces/http/routes/post.ts deleted file mode 100644 index 3d2a6d21..00000000 --- a/services/school/interfaces/http/routes/post.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { - nodeSameRawDocumentIdObjecter, - postContentObjecter, - PostEntity, - postIdObjecter, - postTopicObjecter, -} from "@business/domains/entities/post"; -import { - createPostUsecase, - findPostsFromNodeSameRawDocumentIdUsecase, - findOldestUnprocessedPostUsecase, - getPostTotalCountFromNodeSameRawDocumentIdUsecase, - indicatePostIsNotCompliantAndCreateWarningUsecase, - indicatePostIsCompliantUsecase, - getTotalCountOfUnprocessedPostsUsecase, -} from "@interfaces/usecase"; -import { intObjecter, UsecaseError } from "@vendors/clean"; -import { endpointCreatePost, endpointPostSchema, endpointPostsDetails, endpointUnprocessedPostDetails } from "../schemas/post"; -import { iWantPostExistById } from "../checkers/post"; -import { warningMakeUserBanObjecter, warningReasonObjecter } from "@business/domains/common/warning"; -import { match, P } from "ts-pattern"; -import { userIdObjecter, usernameObjecter } from "@business/domains/common/user"; - -useBuilder() - .createRoute("GET", "/documents/{nodeSameRawDocumentId}/posts") - .extract({ - params: { - nodeSameRawDocumentId: nodeSameRawDocumentIdObjecter.toZodSchema(), - }, - query: { - page: zoderce.number().pipe(intObjecter.toZodSchema()), - quantityPerPage: zoderce.number().pipe(intObjecter.toZodSchema()), - }, - }) - .handler( - async(pickup) => { - const { nodeSameRawDocumentId, page, quantityPerPage } = pickup(["nodeSameRawDocumentId", "page", "quantityPerPage"]); - - const posts = await findPostsFromNodeSameRawDocumentIdUsecase - .execute({ - quantityPerPage, - nodeSameRawDocumentId, - page, - }) - .then((posts) => posts.map( - (post) => post.toSimpleObject(), - )); - - return new OkHttpResponse( - "posts.found", - posts, - ); - }, - makeResponseContract(OkHttpResponse, "posts.found", endpointPostSchema.array()), - ); - -useBuilder() - .createRoute("GET", "/documents/{nodeSameRawDocumentId}/posts-details") - .extract({ - params: { - nodeSameRawDocumentId: nodeSameRawDocumentIdObjecter.toZodSchema(), - }, - }) - .handler( - async(pickup) => { - const { nodeSameRawDocumentId } = pickup(["nodeSameRawDocumentId"]); - - const totalCount = await getPostTotalCountFromNodeSameRawDocumentIdUsecase.execute({ - nodeSameRawDocumentId, - }); - - return new OkHttpResponse( - "document.posts.details", - { totalCount: totalCount.value }, - ); - }, - makeResponseContract(OkHttpResponse, "document.posts.details", endpointPostsDetails), - ); - -useBuilder() - .createRoute("POST", "/posts") - .extract({ - body: zod.object({ - topic: postTopicObjecter.toZodSchema(), - content: postContentObjecter.toZodSchema(), - nodeSameRawDocumentId: nodeSameRawDocumentIdObjecter.toZodSchema(), - authorId: userIdObjecter.toZodSchema(), - authorName: usernameObjecter.toZodSchema(), - }), - }) - .handler( - async(pickup) => { - const { topic, content, nodeSameRawDocumentId, authorName, authorId } = pickup("body"); - - const createdPost = await createPostUsecase.execute({ - topic, - content, - nodeSameRawDocumentId, - authorName, - authorId, - }); - - return new CreatedHttpResponse( - "post.created", - { - id: createdPost.id.value, - }, - ); - }, - makeResponseContract(CreatedHttpResponse, "post.created", endpointCreatePost), - ); - -useBuilder() - .createRoute("GET", "/posts/{postId}") - .extract({ - params: { - postId: postIdObjecter.toZodSchema(), - }, - }) - .presetCheck( - iWantPostExistById, - (pickup) => pickup("postId"), - ) - .handler( - (pickup) => { - const post = pickup("post"); - - return new OkHttpResponse( - "post.found", - post.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "post.found", endpointPostSchema), - ); - -useBuilder() - .createRoute("GET", "/find-oldest-unprocessed-post") - .cut( - async({ dropper }) => { - const result = await findOldestUnprocessedPostUsecase.execute(); - - return match({ result }) - .with( - { result: null }, - () => new NotFoundHttpResponse("oldestUnprocessedPost.notfound"), - ) - .with( - { result: P.instanceOf(PostEntity) }, - ({ result: post }) => dropper({ post }), - ) - .exhaustive(); - }, - ["post"], - makeResponseContract(NotFoundHttpResponse, "oldestUnprocessedPost.notfound"), - ) - .handler( - (pickup) => { - const post = pickup("post"); - - return new OkHttpResponse( - "oldestUnprocessedPost.found", - post.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "oldestUnprocessedPost.found", endpointPostSchema), - ); - -useBuilder() - .createRoute("GET", "/unprocessed-post-details") - .handler( - async() => { - const totalCount = await getTotalCountOfUnprocessedPostsUsecase.execute(); - - return new OkHttpResponse( - "unprocessedPost.details", - { totalCount: totalCount.value }, - ); - }, - makeResponseContract(OkHttpResponse, "unprocessedPost.details", endpointUnprocessedPostDetails), - ); - -useBuilder() - .createRoute("PATCH", "/posts/{postId}/is-compliant") - .extract({ - params: { - postId: postIdObjecter.toZodSchema(), - }, - }) - .presetCheck( - iWantPostExistById, - (pickup) => pickup("postId"), - ) - .cut( - async({ pickup, dropper }) => { - const post = pickup("post"); - - const updatedPost = await indicatePostIsCompliantUsecase.execute({ - post, - }); - - if (updatedPost instanceof UsecaseError) { - return new ForbiddenHttpResponse("post.wrongStatus"); - } - - return dropper({ updatedPost }); - }, - ["updatedPost"], - makeResponseContract(ForbiddenHttpResponse, "post.wrongStatus"), - ) - .handler( - (pickup) => { - const post = pickup("updatedPost"); - - return new OkHttpResponse( - "post.updated", - post.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "post.updated", endpointPostSchema), - ); - -useBuilder() - .createRoute("PATCH", "/posts/{postId}/is-not-compliant-and-create-warning") - .extract({ - params: { - postId: postIdObjecter.toZodSchema(), - }, - body: { - makeUserBan: warningMakeUserBanObjecter.toZodSchema(), - reason: warningReasonObjecter.toZodSchema(), - }, - }) - .presetCheck( - iWantPostExistById, - (pickup) => pickup("postId"), - ) - .cut( - async({ pickup, dropper }) => { - const { - post, - makeUserBan, - reason, - } = pickup(["post", "makeUserBan", "reason"]); - - const updatedPost = await indicatePostIsNotCompliantAndCreateWarningUsecase.execute({ - post, - reason, - makeUserBan, - }); - - if (updatedPost instanceof UsecaseError) { - return new ForbiddenHttpResponse("post.wrongStatus"); - } - - return dropper({ updatedPost }); - }, - ["updatedPost"], - makeResponseContract(ForbiddenHttpResponse, "post.wrongStatus"), - ) - .handler( - (pickup) => { - const post = pickup("updatedPost"); - - return new OkHttpResponse( - "post.updated", - post.toSimpleObject(), - ); - }, - makeResponseContract(OkHttpResponse, "post.updated", endpointPostSchema), - ); diff --git a/services/school/interfaces/http/routes/post/create.ts b/services/school/interfaces/http/routes/post/create.ts new file mode 100644 index 00000000..54a4c6fb --- /dev/null +++ b/services/school/interfaces/http/routes/post/create.ts @@ -0,0 +1,26 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, C, DPE, E } from "@duplojs/utils"; +import { useCases } from "@adapters/useCases"; +import { Post } from "@domains/entities/post"; +import { UserId, UserName } from "@domains/common/user"; + +useRouteBuilder("POST", "/create-post") + .extract({ + body: DPE.object({ + topic: Post.Topic.toExtractParser(), + content: Post.Content.toExtractParser(), + nodeSameRawDocumentId: Post.NodeSameRawDocumentId.toExtractParser(), + authorId: UserId.toExtractParser(), + authorName: UserName.toExtractParser(), + }), + }) + .handler( + ResponseContract.created("post.created", Post.Entity.toEndpointSchema()), + ({ body }, { response }) => asyncPipe( + useCases.createPostUseCase(body), + E.unwrapSelectionOrThrow({ + "post.created": true, + }), + ({ post }) => response("post.created", C.unwrapEntity(post)), + ), + ); diff --git a/services/school/interfaces/http/routes/post/createReport.ts b/services/school/interfaces/http/routes/post/createReport.ts new file mode 100644 index 00000000..7116ef7b --- /dev/null +++ b/services/school/interfaces/http/routes/post/createReport.ts @@ -0,0 +1,37 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, DPE, E } from "@duplojs/utils"; +import { useCases } from "@adapters/useCases"; +import { Post } from "@domains/entities/post"; +import { Report } from "@domains/entities/report"; +import { iWantPostExistsById, iWantPostWithUnprocessedStatus } from "@http/checkers"; + +useRouteBuilder("POST", "/create-report-post") + .extract({ + body: DPE.object({ + postId: Post.Id.toExtractParser(), + level: Report.Level.toExtractParser(), + reason: Report.Reason.toExtractParser(), + }), + }) + .presetCheck( + iWantPostExistsById, + (floor) => floor.body.postId, + ) + .presetCheck( + iWantPostWithUnprocessedStatus, + (floor) => floor.post, + ) + .handler( + ResponseContract.created("report.created"), + ({ body, post }, { response }) => asyncPipe( + useCases.createReportPostUseCase({ + post, + level: body.level, + reason: body.reason, + }), + E.unwrapSelectionOrThrow({ + "post.report": true, + }), + () => response("report.created"), + ), + ); diff --git a/services/school/interfaces/http/routes/post/findMany.ts b/services/school/interfaces/http/routes/post/findMany.ts new file mode 100644 index 00000000..f74d9db8 --- /dev/null +++ b/services/school/interfaces/http/routes/post/findMany.ts @@ -0,0 +1,42 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { A, asyncPipe, C, DPE, E, unwrap } from "@duplojs/utils"; +import { postPort } from "@adapters/ports"; +import { Post } from "@domains/entities/post"; +import { useCases } from "@adapters/useCases"; + +useRouteBuilder("POST", "/find-many-available-post-by-node-same-raw-document") + .extract({ + body: DPE.object({ + nodeSameRawDocumentId: Post.NodeSameRawDocumentId.toExtractParser(), + page: C.PositiveInt.toExtractParser(), + quantityPerPage: C.StrictPositiveInt.toExtractParser(), + }), + }) + .handler( + ResponseContract.ok("posts.found", Post.Entity.toEndpointSchema().array()), + ({ body }, { response }) => asyncPipe( + useCases.findManyAvailablePostByNodeSameRawDocumentUseCase(body), + E.unwrapSelectionOrThrow({ + "find-many-available-post-by-node-same-raw-document-success": true, + }), + A.map((post) => C.unwrapEntity(post)), + (posts) => response("posts.found", posts), + ), + ); + +useRouteBuilder("POST", "/find-many-available-post-by-node-same-raw-document-details") + .extract({ + body: DPE.object({ + nodeSameRawDocumentId: Post.NodeSameRawDocumentId.toExtractParser(), + }), + }) + .handler( + ResponseContract.ok("posts.foundDetails", DPE.object({ totalCount: DPE.number() })), + ({ body }, { response }) => postPort + .getTotalCountAvailableByNodeSameRawDocument(body.nodeSameRawDocumentId) + .then( + (totalCount) => response("posts.foundDetails", { + totalCount: unwrap(totalCount), + }), + ), + ); diff --git a/services/school/interfaces/http/routes/post/findOldest.ts b/services/school/interfaces/http/routes/post/findOldest.ts new file mode 100644 index 00000000..bae3f98e --- /dev/null +++ b/services/school/interfaces/http/routes/post/findOldest.ts @@ -0,0 +1,38 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, C, DPE, E, unwrap } from "@duplojs/utils"; +import { postPort } from "@adapters/ports"; +import { Post } from "@domains/entities/post"; +import { useCases } from "@adapters/useCases"; + +useRouteBuilder("POST", "/find-oldest-unprocessed-post") + .handler( + [ + ResponseContract.ok("oldestUnprocessedPost.found", Post.Entity.toEndpointSchema()), + ResponseContract.notFound("oldestUnprocessedPost.notfound"), + ], + (_floor, { response }) => asyncPipe( + useCases.findOldestUnprocessedPost(), + E.unwrapSelectionOrThrow({ + "find-oldest-unprocessed-post-success": true, + }), + E.matchInformation({ + "none-Post": () => response("oldestUnprocessedPost.notfound"), + "some-Post": (post) => response( + "oldestUnprocessedPost.found", + C.unwrapEntity(post), + ), + }), + ), + ); + +useRouteBuilder("POST", "/find-unprocessed-post-details") + .handler( + ResponseContract.ok("unprocessedPost.details", DPE.object({ totalCount: DPE.number() })), + (_floor, { response }) => postPort + .getTotalCountOfUnprocessed() + .then( + (totalCount) => response("unprocessedPost.details", { + totalCount: unwrap(totalCount), + }), + ), + ); diff --git a/services/school/interfaces/http/routes/post/findOne.ts b/services/school/interfaces/http/routes/post/findOne.ts new file mode 100644 index 00000000..c30b069e --- /dev/null +++ b/services/school/interfaces/http/routes/post/findOne.ts @@ -0,0 +1,49 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, C, DPE, E } from "@duplojs/utils"; +import { Post } from "@domains/entities/post"; +import { iWantPostExistsById } from "@http/checkers"; +import { useCases } from "@adapters/useCases"; + +useRouteBuilder("POST", "/find-one-post") + .extract({ + body: DPE.object({ + postId: Post.Id.toExtractParser(), + }), + }) + .presetCheck( + iWantPostExistsById, + (floor) => floor.body.postId, + ) + .handler( + ResponseContract.ok("post.found", Post.Entity.toEndpointSchema()), + ({ post }, { response }) => response( + "post.found", + C.unwrapEntity(post), + ), + ); + +useRouteBuilder("POST", "/find-one-available-post") + .extract({ + body: DPE.object({ + postId: Post.Id.toExtractParser(), + }), + }) + .handler( + [ + ResponseContract.ok("availablePost.found", Post.Entity.toEndpointSchema()), + ResponseContract.notFound("availablePost.notfound"), + ], + (floor, { response }) => asyncPipe( + useCases.findOneAvailablePostById({ postId: floor.body.postId }), + E.unwrapSelectionOrThrow({ + "find-one-available-post-by-id-success": true, + }), + E.matchInformation({ + "none-Post": () => response("availablePost.notfound"), + "some-Post": (post) => response( + "availablePost.found", + C.unwrapEntity(post), + ), + }), + ), + ); diff --git a/services/school/interfaces/http/routes/post/index.ts b/services/school/interfaces/http/routes/post/index.ts new file mode 100644 index 00000000..e02857a8 --- /dev/null +++ b/services/school/interfaces/http/routes/post/index.ts @@ -0,0 +1,6 @@ +export * from "./create"; +export * from "./createReport"; +export * from "./findMany"; +export * from "./findOldest"; +export * from "./findOne"; +export * from "./markAsCompliant"; diff --git a/services/school/interfaces/http/routes/post/markAsCompliant.ts b/services/school/interfaces/http/routes/post/markAsCompliant.ts new file mode 100644 index 00000000..61c03e64 --- /dev/null +++ b/services/school/interfaces/http/routes/post/markAsCompliant.ts @@ -0,0 +1,31 @@ +import { ResponseContract, useRouteBuilder } from "@duplojs/http"; +import { asyncPipe, DPE, E } from "@duplojs/utils"; +import { useCases } from "@adapters/useCases"; +import { Post } from "@domains/entities/post"; +import { iWantPostExistsById, iWantPostWithUnprocessedStatus } from "@http/checkers"; + +useRouteBuilder("POST", "/mark-post-as-compliant") + .extract({ + body: DPE.object({ + postId: Post.Id.toExtractParser(), + }), + }) + .presetCheck( + iWantPostExistsById, + (floor) => floor.body.postId, + ) + .presetCheck( + iWantPostWithUnprocessedStatus, + (floor) => floor.post, + ) + .handler( + ResponseContract.noContent("post.markAsCompliant"), + ({ post }, { response }) => asyncPipe( + useCases.markPostAsCompliantUseCase({ post }), + E.unwrapSelectionOrThrow({ + success: true, + "post.compliant.wrongStatus": false, + }), + () => response("post.markAsCompliant"), + ), + ); diff --git a/services/school/interfaces/http/schemas/answer.ts b/services/school/interfaces/http/schemas/answer.ts deleted file mode 100644 index ad07599e..00000000 --- a/services/school/interfaces/http/schemas/answer.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { answerStatusEnum } from "@business/domains/entities/answer"; - -export const endpointAnswerSchema = zod.object({ - id: zod.string(), - postId: zod.string(), - content: zod.string(), - authorId: zod.string(), - authorName: zod.string().nullable(), - status: zod.enum(answerStatusEnum.toTuple()), - createdAt: zod.date(), -}); - -export const endpointUnprocessedAnswerDetails = zod.object({ - totalCount: zod.number(), -}); diff --git a/services/school/interfaces/http/schemas/post.ts b/services/school/interfaces/http/schemas/post.ts deleted file mode 100644 index 695dc702..00000000 --- a/services/school/interfaces/http/schemas/post.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { zod } from "@vendors/clean"; -import { nodeSameRawDocumentIdObjecter, postStatusEnum } from "@business/domains/entities/post"; - -export const endpointPostSchema = zod.object({ - id: zod.string(), - nodeSameRawDocumentId: nodeSameRawDocumentIdObjecter.zodSchema, - status: zod.enum(postStatusEnum.toTuple()), - topic: zod.string(), - content: zod.string(), - authorId: zod.string(), - authorName: zod.string().nullable(), - answerCount: zod.number(), - createdAt: zod.date(), -}); - -export const endpointPostsDetails = zod.object({ - totalCount: zod.number(), -}); - -export const endpointUnprocessedPostDetails = zod.object({ - totalCount: zod.number(), -}); - -export const endpointCreatePost = zod.object({ - id: zod.string(), -}); diff --git a/services/school/interfaces/http/tsconfig.json b/services/school/interfaces/http/tsconfig.json new file mode 100644 index 00000000..398005f8 --- /dev/null +++ b/services/school/interfaces/http/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@http/*": ["./*"], + "@applications/*": ["../../business/applications/*"], + "@domains/*": ["../../business/domains/*"], + "@adapters/*": ["../adapters/*"], + "@envs": ["../envs.ts"], + }, + }, + "include": [ + "**/*.ts", + "../../business/domains/**/*.ts", + "../../business/applications/**/*.ts", + "../adapters/**/*.ts", + "../envs.ts", + ], +} \ No newline at end of file diff --git a/services/school/interfaces/main.ts b/services/school/interfaces/main.js similarity index 100% rename from services/school/interfaces/main.ts rename to services/school/interfaces/main.js diff --git a/services/school/interfaces/providers/asyncMessage/index.ts b/services/school/interfaces/providers/asyncMessage/index.ts index 089602b1..de235422 100644 --- a/services/school/interfaces/providers/asyncMessage/index.ts +++ b/services/school/interfaces/providers/asyncMessage/index.ts @@ -1,5 +1,5 @@ -import { envs } from "@interfaces/envs"; -import { AsyncMessage } from "@vendors/async-message"; +import { envs } from "@envs"; +import { AsyncMessage } from "@lib/async-message"; export const asyncMessage = new AsyncMessage({ currentServiceName: envs.SERVICE_NAME, diff --git a/services/school/interfaces/providers/bottle/index.ts b/services/school/interfaces/providers/bottle/index.ts index f2a0697b..fc698ef3 100644 --- a/services/school/interfaces/providers/bottle/index.ts +++ b/services/school/interfaces/providers/bottle/index.ts @@ -1,6 +1,6 @@ import { HttpClient, type TransformCodegenRouteToHttpClientRoute } from "@duplojs/http-client"; -import { envs } from "@interfaces/envs"; -import { type CodegenRoutes } from "@vendors/clients-type/bottle/duplojsTypesCodegen"; +import { envs } from "@envs"; +import { type CodegenRoutes } from "@lib/clients-type/bottle/duplojsTypesCodegen"; import type { InputEnableNotification } from "./types"; export type BottleClientRoute = TransformCodegenRouteToHttpClientRoute< diff --git a/services/school/interfaces/providers/harbor/index.ts b/services/school/interfaces/providers/harbor/index.ts index aea95eab..0ee85152 100644 --- a/services/school/interfaces/providers/harbor/index.ts +++ b/services/school/interfaces/providers/harbor/index.ts @@ -1,6 +1,6 @@ import { HttpClient, type TransformCodegenRouteToHttpClientRoute } from "@duplojs/http-client"; -import { envs } from "@interfaces/envs"; -import { type CodegenRoutes } from "@vendors/clients-type/harbor/duplojsTypesCodegen"; +import { envs } from "@envs"; +import { type CodegenRoutes } from "@lib/clients-type/harbor/duplojsTypesCodegen"; export type HarborClientRoute = TransformCodegenRouteToHttpClientRoute< CodegenRoutes diff --git a/services/school/interfaces/providers/mongo/entities/answer.ts b/services/school/interfaces/providers/mongo/entities/answer.ts index 84914ea9..15fc0421 100644 --- a/services/school/interfaces/providers/mongo/entities/answer.ts +++ b/services/school/interfaces/providers/mongo/entities/answer.ts @@ -1,12 +1,10 @@ -import { type AnswerStatusEnum } from "@business/domains/entities/answer"; - export interface MongoAnswer { id: string; postId: string; content: string; authorId: string; authorName: string | null; - status: AnswerStatusEnum; + status: "compliant" | "unprocessed" | "notCompliant"; createdAt: Date; } diff --git a/services/school/interfaces/providers/mongo/entities/post.ts b/services/school/interfaces/providers/mongo/entities/post.ts index aef5ae13..64237ba6 100644 --- a/services/school/interfaces/providers/mongo/entities/post.ts +++ b/services/school/interfaces/providers/mongo/entities/post.ts @@ -1,5 +1,3 @@ -import { type PostStatus } from "@business/domains/entities/post"; - export interface MongoPost { id: string; topic: string; @@ -8,6 +6,6 @@ export interface MongoPost { authorId: string; authorName: string | null; answerCount: number; - status: PostStatus["value"]; + status: "compliant" | "unprocessed" | "notCompliant"; createdAt: Date; } diff --git a/services/school/interfaces/providers/mongo/index.ts b/services/school/interfaces/providers/mongo/index.ts index be565d06..1b6497c1 100644 --- a/services/school/interfaces/providers/mongo/index.ts +++ b/services/school/interfaces/providers/mongo/index.ts @@ -1,4 +1,4 @@ -import { envs } from "@interfaces/envs"; +import { envs } from "@envs"; import { MongoClient } from "mongodb"; import { type MongoPost } from "./entities/post"; import { type MongoAnswer } from "./entities/answer"; diff --git a/services/school/interfaces/providers/tsconfig.json b/services/school/interfaces/providers/tsconfig.json new file mode 100644 index 00000000..47bab7a4 --- /dev/null +++ b/services/school/interfaces/providers/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@providers/*": ["./*"], + "@envs": ["../envs.ts"], + }, + }, + "include": [ + "**/*.ts", + "../envs.ts", + ], +} \ No newline at end of file diff --git a/services/school/interfaces/repositories/answer.ts b/services/school/interfaces/repositories/answer.ts deleted file mode 100644 index 634db509..00000000 --- a/services/school/interfaces/repositories/answer.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { answerRepository } from "@business/applications/repositories/answer"; -import { AnswerEntity, answerIdObjecter } from "@business/domains/entities/answer"; -import { postAnswerCountObjecter } from "@business/domains/entities/post"; -import { asyncMessage } from "@interfaces/providers/asyncMessage"; -import { mongo } from "@interfaces/providers/mongo"; -import { EntityHandler, intObjecter, toSimpleObject } from "@vendors/clean"; -import { uuidv7 } from "uuidv7"; - -answerRepository.default = { - generateAnswerId() { - return answerIdObjecter.unsafeCreate(uuidv7()); - }, - async findByPostId(postId, { quantityPerPage, page }) { - return mongo.answerCollection.find( - { postId: postId.value }, - ) - .sort( - { - createdAt: -1, - }, - ) - .skip(page.value * quantityPerPage.value) - .limit(quantityPerPage.value) - .map( - (mongoAnswer) => EntityHandler.unsafeMapper( - AnswerEntity, - { - ...mongoAnswer, - }, - ), - ) - .toArray(); - }, - async getCountByPostId(postId) { - const mongoAnswerCount = await mongo.answerCollection.countDocuments({ - postId: postId.value, - }); - return postAnswerCountObjecter.unsafeCreate(mongoAnswerCount); - }, - async save(entity) { - const simpleEntity = entity.toSimpleObject(); - - if (simpleEntity.authorName !== null) { - const mongoAnswer = await mongo.answerCollection.findOne({ - id: simpleEntity.id, - }); - - if (!mongoAnswer) { - await asyncMessage.collections.createAnswer.emit({ - ...simpleEntity, - authorName: simpleEntity.authorName, - }); - } - } - - await mongo.answerCollection.updateOne( - { - id: simpleEntity.id, - }, - { - $set: simpleEntity, - }, - { upsert: true }, - ); - - return entity; - }, - async renameAuthor(userId, newName) { - await mongo.answerCollection.updateMany( - { - authorId: userId.value, - }, - { - $set: { - authorName: toSimpleObject(newName), - }, - }, - ); - }, - async getTotalCountOfUnprocessedAnswers() { - const mongoResult = await mongo.answerCollection.countDocuments({ - status: "unprocessed", - }); - - return intObjecter.unsafeCreate(mongoResult); - }, - async findOldestUnprocessedAnswer() { - const unprocessedOldestMongoAnswer = await mongo.answerCollection.findOne( - { - status: "unprocessed", - }, - { - sort: { - createdAt: 1, - }, - }, - ); - - if (!unprocessedOldestMongoAnswer) { - return null; - } - - return EntityHandler.unsafeMapper( - AnswerEntity, - { - ...unprocessedOldestMongoAnswer, - }, - ); - }, - async findOneById(id) { - const mongoAnswer = await mongo.answerCollection.findOne({ - id: id.value, - }); - - if (!mongoAnswer) { - return null; - } - - return EntityHandler.unsafeMapper( - AnswerEntity, - { - ...mongoAnswer, - }, - ); - }, -}; diff --git a/services/school/interfaces/repositories/index.ts b/services/school/interfaces/repositories/index.ts deleted file mode 100644 index 1d7ff034..00000000 --- a/services/school/interfaces/repositories/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import "./answer"; -import "./post"; -import "./notification"; -import "./warning"; diff --git a/services/school/interfaces/repositories/notification.ts b/services/school/interfaces/repositories/notification.ts deleted file mode 100644 index 0355f634..00000000 --- a/services/school/interfaces/repositories/notification.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { notificationRepository } from "@business/applications/repositories/notification"; -import { BottleAPI } from "@interfaces/providers/bottle"; -import { RepositoryError } from "@vendors/clean"; - -notificationRepository.default = { - save() { - throw new RepositoryError("unsupported-method"); - }, - async enableReplyPostNotificationToAuthor(post) { - await BottleAPI.enableReplyPostNotification({ - postId: post.id.value, - userId: post.authorId.value, - }); - }, -}; diff --git a/services/school/interfaces/repositories/post.ts b/services/school/interfaces/repositories/post.ts deleted file mode 100644 index 5bd74bf3..00000000 --- a/services/school/interfaces/repositories/post.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { postRepository } from "@business/applications/repositories/post"; -import { PostEntity, postIdObjecter } from "@business/domains/entities/post"; -import { mongo } from "@interfaces/providers/mongo"; -import { EntityHandler, intObjecter, toSimpleObject } from "@vendors/clean"; -import { uuidv7 } from "uuidv7"; - -postRepository.default = { - generatePostId() { - return postIdObjecter.unsafeCreate(uuidv7()); - }, - async findOldestUnprocessedPost() { - const unprocessedOldestMongoPost = await mongo.postCollection.findOne( - { - status: "unprocessed", - }, - { - sort: { - createdAt: 1, - }, - }, - ); - - if (!unprocessedOldestMongoPost) { - return null; - } - - return EntityHandler.unsafeMapper( - PostEntity, - { - ...unprocessedOldestMongoPost, - }, - ); - }, - async findByNodeSameRawDocumentId(nodeSameRawDocumentId, { quantityPerPage, page }) { - return mongo - .postCollection - .find({ - nodeSameRawDocumentId: nodeSameRawDocumentId.value, - status: { $ne: "notCompliant" }, - }) - .sort( - { - answerCount: -1, - }, - ) - .skip(page.value * quantityPerPage.value) - .limit(quantityPerPage.value) - .map( - (mongoPost) => EntityHandler.unsafeMapper( - PostEntity, - { - ...mongoPost, - }, - ), - ) - .toArray(); - }, - async getTotalCountOfUnprocessedPosts() { - const mongoPostCount = await mongo.postCollection.countDocuments({ - status: "unprocessed", - }); - - return intObjecter.unsafeCreate(mongoPostCount); - }, - async getTotalCountByNodeSameRawDocumentId(nodeSameRawDocumentId) { - const mongoPostCount = await mongo.postCollection.countDocuments({ - nodeSameRawDocumentId: nodeSameRawDocumentId.value, - }); - - return intObjecter.unsafeCreate(mongoPostCount); - }, - async findOneById(postId) { - const mongoPost = await mongo.postCollection.findOne({ - id: postId.value, - }); - - if (!mongoPost) { - return null; - } - - return EntityHandler.unsafeMapper( - PostEntity, - { - ...mongoPost, - }, - ); - }, - async save(entity) { - const simplePost = entity.toSimpleObject(); - - await mongo.postCollection.updateOne( - { - id: simplePost.id, - }, - { $set: simplePost }, - { upsert: true }, - ); - - return entity; - }, - async renameAuthor(userId, newName) { - await mongo.postCollection.updateMany( - { - authorId: userId.value, - }, - { - $set: { - authorName: toSimpleObject(newName), - }, - }, - ); - }, -}; diff --git a/services/school/interfaces/repositories/warning.ts b/services/school/interfaces/repositories/warning.ts deleted file mode 100644 index 14287d10..00000000 --- a/services/school/interfaces/repositories/warning.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { warningRepository } from "@business/applications/repositories/warning"; -import { HarborAPI } from "@interfaces/providers/harbor"; -import { RepositoryError } from "@vendors/clean"; - -warningRepository.default = { - save() { - throw new RepositoryError("unsupported-method"); - }, - async createPostWarning(warning) { - const { makeUserBan, reason, post } = warning; - - await HarborAPI.createPostUserWarning({ - makeUserBan: makeUserBan.value, - reason: reason.value, - userId: post.authorId.value, - postId: post.id.value, - }); - }, - async createAnswerWarning(warning) { - const { makeUserBan, reason, answer } = warning; - - await HarborAPI.createAnswerUserWarning({ - makeUserBan: makeUserBan.value, - reason: reason.value, - userId: answer.authorId.value, - answerId: answer.id.value, - postId: answer.postId.value, - }); - }, -}; diff --git a/services/school/interfaces/tsconfig.json b/services/school/interfaces/tsconfig.json new file mode 100644 index 00000000..314874b1 --- /dev/null +++ b/services/school/interfaces/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.base.json", + "compilerOptions": { + + }, + "include": ["envs.ts"], +} \ No newline at end of file diff --git a/services/school/interfaces/usecase/index.ts b/services/school/interfaces/usecase/index.ts deleted file mode 100644 index d3d80c78..00000000 --- a/services/school/interfaces/usecase/index.ts +++ /dev/null @@ -1,41 +0,0 @@ -import "../repositories"; -import { CreatePostUsecase } from "@business/applications/usecases/createPost"; -import { FindPostsFromNodeSameRawDocumentIdUsecase } from "@business/applications/usecases/findPostsFromNodeSameRawDocumentId"; -import { FindAnswersFromPostUsecase } from "@business/applications/usecases/findAnswersFromPost"; -import { ReplyToPostUsecase } from "@business/applications/usecases/replyToPost"; -import { GetPostTotalCountFromNodeSameRawDocumentIdUsecase } from "@business/applications/usecases/getPostTotalCountFromNodeSameRawDocumentId"; -import { FindPostByIdUsecase } from "@business/applications/usecases/findPostById"; -import { RenameAuthorUsecase } from "@business/applications/usecases/renameAuthor"; -import { FindOldestUnprocessedPostUsecase } from "@business/applications/usecases/findOldestUnprocessedPost"; -import { IndicatePostIsCompliantUsecase } from "@business/applications/usecases/indicatePostIsCompliant"; -import { IndicatePostIsNotCompliantAndCreateWarningUsecase } from "@business/applications/usecases/indicatePostIsNotCompliantAndCreateWarning"; -import { GetTotalCountOfUnprocessedPostsUsecase } from "@business/applications/usecases/getTotalCountOfUnprocessedPosts"; -import { FindAnswerByIdUsecase } from "@business/applications/usecases/findAnswerById"; -import { IndicateAnswerIsCompliantUsecase } from "@business/applications/usecases/indicateAnswerIsCompliant"; -import { IndicateAnswerIsNotCompliantAndCreateWarningUsecase } from "@business/applications/usecases/indicateAnswerIsNotCompliantAndCreateWarning"; -import { FindOldestUnprocessedAnswerUsecase } from "@business/applications/usecases/findOldestUnprocessedAnswer"; -import { GetTotalCountOfUnprocessedAnswersUsecase } from "@business/applications/usecases/getTotalCountOfUnprocessedAnswers"; -import { AnonymizeAuthorUsecase } from "@business/applications/usecases/anonymizeAuthor"; -import { RestoreAuthorUsecase } from "@business/applications/usecases/restoreAuthor"; - -export const createPostUsecase = new CreatePostUsecase(); -export const findPostsFromNodeSameRawDocumentIdUsecase = new FindPostsFromNodeSameRawDocumentIdUsecase(); -export const findPostByIdUsecase = new FindPostByIdUsecase(); -export const findAnswersFromPostUsecase = new FindAnswersFromPostUsecase(); -export const getPostTotalCountFromNodeSameRawDocumentIdUsecase - = new GetPostTotalCountFromNodeSameRawDocumentIdUsecase(); -export const replyToPostUsecase = new ReplyToPostUsecase(); -export const renameAuthor = new RenameAuthorUsecase(); -export const findOldestUnprocessedPostUsecase = new FindOldestUnprocessedPostUsecase(); -export const indicatePostIsCompliantUsecase = new IndicatePostIsCompliantUsecase(); -export const indicatePostIsNotCompliantAndCreateWarningUsecase - = new IndicatePostIsNotCompliantAndCreateWarningUsecase(); -export const getTotalCountOfUnprocessedPostsUsecase = new GetTotalCountOfUnprocessedPostsUsecase(); -export const findAnswerByIdUsecase = new FindAnswerByIdUsecase(); -export const indicateAnswerIsCompliantUsecase = new IndicateAnswerIsCompliantUsecase(); -export const indicateAnswerIsNotCompliantAndCreateWarningUsecase - = new IndicateAnswerIsNotCompliantAndCreateWarningUsecase(); -export const findOldestUnprocessedAnswerUsecase = new FindOldestUnprocessedAnswerUsecase(); -export const getTotalCountOfUnprocessedAnswersUsecase = new GetTotalCountOfUnprocessedAnswersUsecase(); -export const anonymizeAuthorUsecase = new AnonymizeAuthorUsecase(); -export const restoreAuthorUsecase = new RestoreAuthorUsecase(); diff --git a/services/school/package.json b/services/school/package.json index 541f98b3..d2b2346c 100644 --- a/services/school/package.json +++ b/services/school/package.json @@ -3,32 +3,34 @@ "description": "Microservice de gestion du contenu éditorial. Nommé d'après les bancs de poissons ('school' en anglais), il orchestre les articles et leurs sujets, reflétant ainsi leur organisation collective et structurée.", "type": "module", "scripts": { - "dev": "tsx watch --clear-screen=false --include interfaces/http/main.ts,interfaces/asyncMessage/main.ts interfaces/main.ts", - "start": "tsx interfaces/main.ts", - "duplo:dev": "tsx --watch interfaces/http/main.ts", - "duplo:start": "tsx interfaces/http/main.ts", - "duplo:generate": "DB_CONNECTION=false duplojs-types-codegen --import @duplojs/node/globals --include interfaces/http/routes/index.ts --output ../../libs/clients-type/types/school/duplojsTypesCodegen.d.ts", + "dev": "tsx --watch interfaces/main.js", + "start": "tsx interfaces/main.js", - "test:lint": "eslint", - "test:types": "tsc", + "http:dev": "tsx watch --tsconfig interfaces/http/tsconfig.json interfaces/http/main.ts", + "http:start": "tsx --tsconfig interfaces/http/tsconfig.json interfaces/http/main.ts", - "fixtures": "tsx interfaces/fixtures/index.ts", + "test:types": "./.commands/test-types.sh", + "test:lint": "./.commands/test-lint.sh", + "test:lint:fix": "./.commands/test-lint.sh --fix", - "postinstall": "npm run duplo:generate" + "fixtures": "tsx interfaces/fixtures/index.ts" }, "dependencies": { - "@duplojs/core": "1.0.3", - "@duplojs/node": "1.0.3", - "dotenv": "16.4.5", - "dotenv-expand": "12.0.1", - "mongodb": "6.15.0", - "uuidv7": "1.0.2", - "ts-pattern": "5.7.0" + "@duplojs/http": "0.13.1", + "@duplojs/utils": "1.9.9", + "@duplojs/server-utils": "0.4.1", + "mongodb": "7.3.0", + "uuidv7": "1.2.1", + "@lib/entity-rules": "file:../libs/entity-rules", + "@lib/client-type": "file:../libs/client-type", + "@lib/async-message": "file:../libs/async-message", + "@lib/eslint": "file:../libs/eslint", + "@lib/logger": "file:../libs/backend-logger", + "@lib/fixture": "file:../libs/fixture" }, "devDependencies": { - "@duplojs/types-codegen": "1.1.3", - "@types/node": "22.13.10", - "tsx": "4.19.3", - "typescript": "5.8.2" + "@types/node": "22.15.0", + "tsx": "4.21.0", + "typescript": "5.9.3" } } diff --git a/services/school/tsconfig.base.json b/services/school/tsconfig.base.json new file mode 100644 index 00000000..937785fb --- /dev/null +++ b/services/school/tsconfig.base.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext"], + "moduleDetection": "force", + "module": "ESNext", + "moduleResolution": "Bundler", + "noEmit": true, + "isolatedModules": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "useUnknownInCatchVariables": true, + "alwaysStrict": true, + "noImplicitReturns": true, + "noUncheckedIndexedAccess": true, + "noImplicitOverride": true, + "skipLibCheck": true, + }, +} \ No newline at end of file diff --git a/services/school/tsconfig.json b/services/school/tsconfig.json index 4e2752bf..9958c4bb 100644 --- a/services/school/tsconfig.json +++ b/services/school/tsconfig.json @@ -1,39 +1,15 @@ { - "compilerOptions": { - "target": "ESNext", - "lib": [ - "ESNext" - ], - "moduleDetection": "force", - "module": "ESNext", - "moduleResolution": "Bundler", - "types": [ - "node" - ], - "noEmit": true, - "esModuleInterop": true, - "strict": true, - "skipLibCheck": true, - "paths": { - "@vendors/*": [ - "./vendors/*" - ], - "@business/*": [ - "./business/*" - ], - "@interfaces/*": [ - "./interfaces/*" - ], - "@providers/*": [ - "./interfaces/providers/*" - ], - } - }, - "include": [ - "**/*.ts", - "eslint.config.ts" - ], - "exclude": [ - "vendors/**/*.test.ts", - ] + "files": [], + "references": [ + { "path": "./business/domains/tsconfig.json" }, + { "path": "./business/applications/tsconfig.json" }, + + { "path": "./interfaces/adapters/tsconfig.json" }, + { "path": "./interfaces/providers/tsconfig.json" }, + { "path": "./interfaces/http/tsconfig.json" }, + { "path": "./interfaces/asyncMessage/tsconfig.json" }, + { "path": "./interfaces/fixtures/tsconfig.json" }, + + { "path": "./interfaces/tsconfig.json" } + ], } \ No newline at end of file diff --git a/services/school/vendors/async-message b/services/school/vendors/async-message deleted file mode 120000 index 2f9150aa..00000000 --- a/services/school/vendors/async-message +++ /dev/null @@ -1 +0,0 @@ -../../../libs/async-message/scripts/ \ No newline at end of file diff --git a/services/school/vendors/backend-logger b/services/school/vendors/backend-logger deleted file mode 120000 index d1aa3c8a..00000000 --- a/services/school/vendors/backend-logger +++ /dev/null @@ -1 +0,0 @@ -../../../libs/backend-logger/scripts/ \ No newline at end of file diff --git a/services/school/vendors/clean b/services/school/vendors/clean deleted file mode 120000 index fddae790..00000000 --- a/services/school/vendors/clean +++ /dev/null @@ -1 +0,0 @@ -../../../libs/clean/scripts/ \ No newline at end of file diff --git a/services/school/vendors/clients-type b/services/school/vendors/clients-type deleted file mode 120000 index fb227216..00000000 --- a/services/school/vendors/clients-type +++ /dev/null @@ -1 +0,0 @@ -../../../libs/clients-type/types/ \ No newline at end of file diff --git a/services/school/vendors/duplo-plugins b/services/school/vendors/duplo-plugins deleted file mode 120000 index 0ed46024..00000000 --- a/services/school/vendors/duplo-plugins +++ /dev/null @@ -1 +0,0 @@ -../../../libs/duplo-plugins/plugins/ \ No newline at end of file diff --git a/services/school/vendors/entity-rules b/services/school/vendors/entity-rules deleted file mode 120000 index 6f0c7637..00000000 --- a/services/school/vendors/entity-rules +++ /dev/null @@ -1 +0,0 @@ -../../../libs/entity-rules/scripts/ \ No newline at end of file diff --git a/services/school/vendors/eslint b/services/school/vendors/eslint deleted file mode 120000 index 1e2ce6cc..00000000 --- a/services/school/vendors/eslint +++ /dev/null @@ -1 +0,0 @@ -../../../libs/eslint/scripts/ \ No newline at end of file diff --git a/services/school/vendors/fixture b/services/school/vendors/fixture deleted file mode 120000 index 85232d62..00000000 --- a/services/school/vendors/fixture +++ /dev/null @@ -1 +0,0 @@ -../../../libs/fixture/scripts \ No newline at end of file diff --git a/services/school/vitest.config.ts b/services/school/vitest.config.ts deleted file mode 100644 index 97fb5240..00000000 --- a/services/school/vitest.config.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { defineConfig } from "vitest/config"; - -export default defineConfig({ - test: { - watch: false, - globals: true, - include: [ - "business/**/*.test.ts", - "interfaces/**/*.test.ts", - ], - coverage: { - provider: "v8", - reporter: ["text", "json", "html", "json-summary"], - reportsDirectory: "coverage", - }, - }, -}); diff --git a/services/sea/package.json b/services/sea/package.json index 42cd6cc2..62851d3f 100644 --- a/services/sea/package.json +++ b/services/sea/package.json @@ -14,7 +14,7 @@ "dependencies": { "@duplojs/core": "1.0.3", "@duplojs/node": "1.0.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@elastic/elasticsearch": "8.18.2", "dotenv": "16.4.5", "dotenv-expand": "12.0.1", diff --git a/services/spotter/package.json b/services/spotter/package.json index a14e3534..6251da59 100644 --- a/services/spotter/package.json +++ b/services/spotter/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@duplojs/http-client": "1.2.3", - "@duplojs/utils": "1.9.2", + "@duplojs/utils": "1.9.9", "@mdi/js": "7.4.47", "@sentry/vue": "9.22.0", "@tailwindcss/vite": "4.0.14",