From 11ab6a6a212c0a37102a289263a90fe590a9d78c Mon Sep 17 00:00:00 2001 From: grimhilt Date: Sat, 1 Apr 2023 22:36:51 +0200 Subject: [PATCH] tests in typescript --- .gitignore | 7 +- back/controllers/rooms.ts | 2 +- back/db/db.ts | 22 +- back/db/mail.ts | 9 +- back/db/saveMessageApp.ts | 39 +- .../{addressQueries.js => addressQueries.ts} | 14 +- back/interfaces/mail/attrs.interface.ts | 49 +- back/mails/imap/Box.ts | 5 +- back/mails/saveMessage.ts | 83 +- back/mails/storeMessage.ts | 6 +- back/mails/utils/envelopeUtils.ts | 13 +- back/package-lock.json | 1009 ++++++++++++++--- back/package.json | 9 +- back/test/mail/saveMessage-test.js | 90 -- back/test/mail/saveMessage-test.ts | 112 ++ ...opeUtils-test.js => envelopeUtils-test.ts} | 28 +- back/test/test-utils/{names.js => names.ts} | 4 +- back/test/test-utils/test-attrsUtils.js | 61 - back/test/test-utils/test-attrsUtils.ts | 73 ++ back/tsconfig.json | 17 + back/utils/{string.js => string.ts} | 12 +- front/babel.config.js | 6 + 22 files changed, 1258 insertions(+), 412 deletions(-) rename back/db/utils/{addressQueries.js => addressQueries.ts} (55%) delete mode 100644 back/test/mail/saveMessage-test.js create mode 100644 back/test/mail/saveMessage-test.ts rename back/test/mail/utils/{envelopeUtils-test.js => envelopeUtils-test.ts} (63%) rename back/test/test-utils/{names.js => names.ts} (98%) delete mode 100644 back/test/test-utils/test-attrsUtils.js create mode 100644 back/test/test-utils/test-attrsUtils.ts create mode 100644 back/tsconfig.json rename back/utils/{string.js => string.ts} (73%) diff --git a/.gitignore b/.gitignore index bfd38a6..adfbcae 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,10 @@ -.DS_Store node_modules /dist - # local env files .env.local .env.*.local +.env # Log files npm-debug.log* @@ -22,15 +21,13 @@ pnpm-debug.log* *.sln *.sw? +build .tmp - .s.* log* -config.json .direnv .envrc *.txt -*.json tmp test.* *.png diff --git a/back/controllers/rooms.ts b/back/controllers/rooms.ts index 3138dd5..7a299c5 100644 --- a/back/controllers/rooms.ts +++ b/back/controllers/rooms.ts @@ -1,6 +1,6 @@ import statusCode from "../utils/statusCodes"; import { getRooms } from "../db/api"; -import { logger } from "../system/Logger"; +import logger from "../system/Logger"; export async function rooms(body, res) { const { mailboxId, offset, limit } = body; diff --git a/back/db/db.ts b/back/db/db.ts index d5a2f2c..82f6786 100644 --- a/back/db/db.ts +++ b/back/db/db.ts @@ -1,13 +1,13 @@ import mysql from "mysql"; -import { logger } from "../system/Logger"; -import MYSQL from "./config.json"; +import logger from "../system/Logger"; +require("dotenv").config(); // todo remove export export const db = mysql.createConnection({ - host: MYSQL.host, - user: MYSQL.user, - password: MYSQL.pwd, - database: MYSQL.database, + host: process.env.HOST_DB, + user: process.env.USER_DB, + password: process.env.PASSWORD_DB, + database: process.env.NAME_DB, }); db.connect(function (err) { @@ -18,7 +18,7 @@ db.connect(function (err) { } }); -export function execQueryAsync(query, values) { +export function execQueryAsync(query: string, values: any[]): Promise { return new Promise((resolve, reject) => { db.query(query, values, (err, results, fields) => { if (err) { @@ -30,7 +30,7 @@ export function execQueryAsync(query, values) { }); } -export function execQueryAsyncWithId(query, values) { +export function execQueryAsyncWithId(query: string, values: any[]): Promise { return new Promise((resolve, reject) => { db.query(query, values, (err, results, fields) => { if (err) { @@ -42,12 +42,12 @@ export function execQueryAsyncWithId(query, values) { }); } -export function execQuery(query, values) { +export function execQuery(query: string, values: any[]) { db.query(query, values, (err, results, fields) => { if (err) { logger.error(err); - throw (err); + throw err; } return results; }); -} \ No newline at end of file +} diff --git a/back/db/mail.ts b/back/db/mail.ts index 4965590..7fb0d4c 100644 --- a/back/db/mail.ts +++ b/back/db/mail.ts @@ -1,6 +1,7 @@ import { execQueryAsync, execQueryAsyncWithId } from "./db"; -export async function getAddresseId(email, name) { +export async function getAddresseId(email: string, name?: string): Promise { + console.log("get address id") const localpart = email.split("@")[0]; const domain = email.split("@")[1]; const query = `INSERT INTO address @@ -10,19 +11,19 @@ export async function getAddresseId(email, name) { return await execQueryAsyncWithId(query, values); } -export async function getFieldId(field) { +export async function getFieldId(field: string): Promise { const query = `INSERT INTO field_name (field_name) VALUES (?) ON DUPLICATE KEY UPDATE field_id=LAST_INSERT_ID(field_id)`; const values = [field]; return await execQueryAsyncWithId(query, values); } -export async function findRoomByOwner(ownerId) { +export async function findRoomByOwner(ownerId: number): Promise<{ room_id: number }[]> { const query = `SELECT room_id FROM app_room WHERE owner_id = ?`; const values = [ownerId]; return await execQueryAsync(query, values); } -export async function getUserIdOfMailbox(boxId) { +export async function getUserIdOfMailbox(boxId: number): Promise<{ user_id: number }[]> { const query = ` SELECT app_account.user_id FROM mailbox diff --git a/back/db/saveMessageApp.ts b/back/db/saveMessageApp.ts index 341adc3..3bd4fd1 100644 --- a/back/db/saveMessageApp.ts +++ b/back/db/saveMessageApp.ts @@ -2,7 +2,7 @@ import { transformEmojis } from "../utils/string"; import { db, execQueryAsync, execQueryAsyncWithId, execQuery } from "./db"; import { queryFromId, queryToId, queryCcId } from "./utils/addressQueries"; -export async function getAllMembers(messageId) { +export async function getAllMembers(messageId: number) { const query = ` SELECT GROUP_CONCAT(address.address_id) AS is FROM address @@ -15,13 +15,18 @@ export async function getAllMembers(messageId) { return await execQueryAsync(query, values); } -export async function registerMember(roomId, memberId) { +export async function registerMember(roomId: number, memberId: number) { const query = `INSERT IGNORE INTO app_room_member (room_id, member_id) VALUES (?, ?)`; const values = [roomId, memberId]; return await execQueryAsync(query, values); } -export async function createRoom(roomName, ownerId, messageId, roomType) { +export async function createRoom( + roomName: string | null | undefined, + ownerId: number, + messageId: number, + roomType: number, +) { if (!roomName) roomName = "No room name"; roomName = transformEmojis(roomName); const query = `INSERT IGNORE INTO app_room (room_name, owner_id, message_id, room_type) VALUES (?, ?, ?, ?)`; @@ -29,7 +34,14 @@ export async function createRoom(roomName, ownerId, messageId, roomType) { return await execQueryAsyncWithId(query, values); } -export async function registerMessageInRoom(messageId, roomId, isSeen, idate) { +// todo date not good +export async function registerMessageInRoom( + messageId: number, + roomId: number, + isSeen: boolean, + idate: string | undefined | null, +) { + if (!idate) idate = new Date().toString(); const query = `INSERT IGNORE INTO app_room_message (message_id, room_id) VALUES (?, ?)`; const values = [messageId, roomId]; await execQueryAsync(query, values); @@ -40,17 +52,17 @@ export async function registerMessageInRoom(messageId, roomId, isSeen, idate) { // } } -export function updateLastUpdateRoom(roomId, idate) { +export function updateLastUpdateRoom(roomId: number, idate: string) { const query = `UPDATE app_room SET lastUpdate = ? WHERE room_id = ?`; const values = [idate, roomId]; execQuery(query, values); } -export function incrementNotSeenRoom(roomId) { +export function incrementNotSeenRoom(roomId: number) { // todo } -export async function getRoomInfo(messageID) { +export async function getRoomInfo(messageID: string): Promise<{ room_id: number; root_id: number }[]> { const query = ` SELECT app_room.room_id @@ -65,13 +77,13 @@ export async function getRoomInfo(messageID) { return await execQueryAsync(query, values); } -export async function registerThread(roomId, parentId, rootId) { +export async function registerThread(roomId: number, parentId: number, rootId: number) { const query = `INSERT IGNORE INTO app_thread (room_id, parent_id, root_id) VALUES (?, ?, ?)`; const values = [roomId, parentId, rootId]; return await execQueryAsync(query, values); } -export async function isRoomGroup(roomId) { +export async function isRoomGroup(roomId: number): Promise { return new Promise((resolve, reject) => { const query = `SELECT isGroup FROM app_room WHERE room_id = '${roomId}'`; db.query(query, (err, results, fields) => { @@ -81,13 +93,14 @@ export async function isRoomGroup(roomId) { }); } -export async function findRoomsFromMessage(messageId) { +export async function findRoomsFromMessage(messageID: string) { + // todo find message in room not started const query = `SELECT room_id FROM app_room_message WHERE message_id = ? ORDER BY room_id`; - const values = [messageId]; + const values = [messageID]; return await execQueryAsync(query, values); } -export async function hasSameMembersAsParent(messageId, messageID) { +export async function hasSameMembersAsParent(messageId: number, messageID: string) { const query1 = ` SELECT GROUP_CONCAT(fromT.address_id) AS fromA, @@ -129,4 +142,4 @@ export async function hasSameMembersAsParent(messageId, messageID) { addressesMsg1.length == addressesMsg2.length && addressesMsg1.reduce((a, b) => a && addressesMsg2.includes(b), true) ); -} \ No newline at end of file +} diff --git a/back/db/utils/addressQueries.js b/back/db/utils/addressQueries.ts similarity index 55% rename from back/db/utils/addressQueries.js rename to back/db/utils/addressQueries.ts index 3787764..fde6c9b 100644 --- a/back/db/utils/addressQueries.js +++ b/back/db/utils/addressQueries.ts @@ -1,4 +1,4 @@ -const queryAddress = (type) => ` +const queryAddress = (type: string): string => ` LEFT JOIN ( SELECT address_field.address_id, address_field.message_id FROM address_field @@ -9,12 +9,6 @@ const queryAddress = (type) => ` ) `; -const queryFromId = queryAddress("from"); -const queryToId = queryAddress("to"); -const queryCcId = queryAddress("cc"); - -module.exports = { - queryFromId, - queryToId, - queryCcId -} \ No newline at end of file +export const queryFromId = queryAddress("from"); +export const queryToId = queryAddress("to"); +export const queryCcId = queryAddress("cc"); diff --git a/back/interfaces/mail/attrs.interface.ts b/back/interfaces/mail/attrs.interface.ts index d69c1b0..ad0f54e 100644 --- a/back/interfaces/mail/attrs.interface.ts +++ b/back/interfaces/mail/attrs.interface.ts @@ -1,5 +1,46 @@ export interface User { - name: string, - mailbox: string, - host: string -} \ No newline at end of file + name: string; + mailbox: string; + host: string; +} + +export interface Envelope { + date?: string | null; + subject?: string | null; + from?: User[] | null; + sender?: User[] | null; + replyTo?: User[] | null; + to?: User[] | null; + cc?: User[] | null; + bcc?: User[] | null; + inReplyTo?: string | null; + messageId: string; +} + +export interface Attrs { + /** A 32-bit ID that uniquely identifies this message within its mailbox. */ + uid: number; + /** A list of flags currently set on this message. */ + flags: string[]; + /** The internal server date for the message. */ + date: string; + /** The message's body structure (only set if requested with fetch()). */ + struct?: any[] | undefined; + envelope?: Envelope; + /** The RFC822 message size (only set if requested with fetch()). */ + size?: number | undefined; +} + +export interface AttrsWithEnvelope { + /** A 32-bit ID that uniquely identifies this message within its mailbox. */ + uid: number; + /** A list of flags currently set on this message. */ + flags: string[]; + /** The internal server date for the message. */ + date: string; + /** The message's body structure (only set if requested with fetch()). */ + struct?: any[] | undefined; + envelope: Envelope; + /** The RFC822 message size (only set if requested with fetch()). */ + size?: number | undefined; +} diff --git a/back/mails/imap/Box.ts b/back/mails/imap/Box.ts index 816da60..6f97d79 100644 --- a/back/mails/imap/Box.ts +++ b/back/mails/imap/Box.ts @@ -1,5 +1,6 @@ -import { ImapMessageAttributes } from "imap"; +import Imap, { ImapMessageAttributes, MailBoxes } from "imap"; import { getMailbox, updateMailbox } from "../../db/imap/imap"; +import { Attrs } from "../../interfaces/mail/attrs.interface"; import logger from "../../system/Logger"; import RegisterMessageInApp from "../saveMessage"; import { saveMessage } from "../storeMessage"; @@ -8,7 +9,7 @@ export default class Box { imap: Imap; boxName: string; id: number; - box: Object; + box: MailBoxes; constructor(_imap, _boxId, _boxName) { this.imap = _imap; diff --git a/back/mails/saveMessage.ts b/back/mails/saveMessage.ts index d608d25..75214ce 100644 --- a/back/mails/saveMessage.ts +++ b/back/mails/saveMessage.ts @@ -7,17 +7,19 @@ import { registerThread, registerMember, getAllMembers, + getRoomInfo, } from "../db/saveMessageApp"; import { findRoomByOwner, getAddresseId, getUserIdOfMailbox } from "../db/mail"; import { nbMembers } from "./utils/envelopeUtils"; import logger from "../system/Logger"; import { ImapMessageAttributes } from "imap"; +import { Attrs, Envelope, User } from "../interfaces/mail/attrs.interface"; /** * take object address and join mailbox and host to return mailbox@host */ -function createAddress(elt) { +function createAddress(elt: User): string { return `${elt.mailbox}@${elt.host}`; } @@ -31,47 +33,58 @@ export const roomType = { export default class RegisterMessageInApp { messageId: number; - attrs: ImapMessageAttributes; - envelope?: ImapMessageAttributes.envelope; + attrs: Attrs; + envelope: Envelope; messageID?: string; boxId: number; isSeen: boolean; ownerId: number; userId: number; - - constructor(_messageId, _attrs, _boxId) { + inReplyTo: string; + + constructor(_messageId: number, _attrs: Attrs, _boxId: number) { this.messageId = _messageId; this.attrs = _attrs; + if (!this.attrs.envelope) throw new Error("Envelope must exist in attributes"); this.envelope = this.attrs.envelope; this.messageID = this.envelope?.messageId; this.boxId = _boxId; this.isSeen = this.attrs.flags.includes("\\Seen") ? true : false; - this.ownerId; - this.userId; + this.ownerId = -1; + this.userId = -1; + this.inReplyTo = ""; } async init() { - this.ownerId = await getAddresseId(createAddress(this.envelope.from[0])); // todo use sender or from ? + if (this.envelope.from) { + this.ownerId = await getAddresseId(createAddress(this.envelope.from[0])); // todo use sender or from ? + } else { + throw new Error("Envelope must have a 'from' field"); + } } isDm = () => nbMembers(this.envelope) == 2; async isFromUs() { - if (!this.userId) this.userId = (await getUserIdOfMailbox(this.boxId))[0]?.user_id; + if (this.userId == -1) { + await getUserIdOfMailbox(this.boxId).then((res) => { + this.userId = res[0]?.user_id; + }); + } return this.ownerId == this.userId; } - async registerMembers(roomId) { + async registerMembers(roomId: number) { getAllMembers(this.messageId).then((res) => { - res[0].id.split(",").foreach(async (memberId) => { + res[0].id.split(",").foreach(async (memberId: number) => { await registerMember(roomId, memberId); }); }); } - async initiateRoom(owner, type) { + async initiateRoom(owner: number, roomType: number) { try { - const roomId = await createRoom(this.envelope.subject, owner, this.messageId, type); + const roomId = await createRoom(this.envelope.subject, owner, this.messageId, roomType); await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date); this.registerMembers(roomId); return roomId; @@ -80,7 +93,7 @@ export default class RegisterMessageInApp { } } - async createOrRegisterOnExistence(owner, roomType) { + async createOrRegisterOnExistence(owner: number, roomType: number) { await findRoomByOwner(owner).then(async (res) => { if (res.length == 0) { // first message with this sender @@ -93,42 +106,41 @@ export default class RegisterMessageInApp { } async initiateThread() { - await createRoom(this.envelope.subject, owner, this.messageId, roomType.THREAD).then(async (roomId) => { - // find parent room infos - await getRoomInfo(this.envelope.inReplyTo).then(async (room) => { - // todo room not lenght, reply to transfer ? - let root_id = room[0].root_id; - if (!root_id) root_id = room[0].room_id; - await registerThread(roomId, room[0].room_id, root_id); - }); - // impl register previous message ? - await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date); - await this.registerMembers(roomId); - }); + await createRoom(this.envelope.subject, this.ownerId, this.messageId, roomType.THREAD).then( + async (roomId: number) => { + // find parent room infos + await getRoomInfo(this.inReplyTo).then(async (room) => { + // todo room not lenght, reply to transfer ? + let root_id = room[0].root_id; + if (!root_id) root_id = room[0].room_id; + await registerThread(roomId, room[0].room_id, root_id); + }); + // impl register previous message ? + await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date); + await this.registerMembers(roomId); + }, + ); } - async createOrRegisterOnMembers(roomId) { - const hasSameMembers = await hasSameMembersAsParent(this.messageID, this.envelope.inReplyTo); + async createOrRegisterOnMembers(roomId: number) { + const hasSameMembers = await hasSameMembersAsParent(this.messageId, this.inReplyTo); if (hasSameMembers) { await registerMessageInRoom(this.messageId, roomId, this.isSeen, this.envelope.date); } else { await this.initiateThread(); - await createThread(this.envelope.subject, this.ownerId, this.messageId, roomId, this.isDm()).then( - async (threadId) => { - await registerMessageInThread(this.messageId, threadId, this.isSeen); - }, - ); } } async save() { await this.init(); if (this.envelope.inReplyTo) { + this.inReplyTo = this.envelope.inReplyTo; this.saveReply(); } else { if (await this.isFromUs()) { if (this.isDm()) { // create or add new message to DM + if (!this.envelope.to) throw new Error("Who send a DM and put the recipient in cc ?"); const userTo = await getAddresseId(createAddress(this.envelope.to[0])); await this.createOrRegisterOnExistence(userTo, roomType.DM); } else { @@ -143,15 +155,14 @@ export default class RegisterMessageInApp { } async saveReply() { - const messageID = envelope.messageId; - await findRoomsFromMessage(messageId).then(async (rooms) => { + await findRoomsFromMessage(this.inReplyTo).then(async (rooms) => { if (rooms.length == 0) { // no rooms, so is a transfer // todo test if members of transferred message are included } else if (rooms.length === 1) { // only one room so message is only in a room and not in a thread // as a thread is associated to a room - await isRoomGroup(rooms[0].room_id).then(async (isGroup) => { + await isRoomGroup(rooms[0].room_id).then(async (isGroup: boolean) => { if (isGroup) { this.createOrRegisterOnMembers(rooms[0].room_id); } else { diff --git a/back/mails/storeMessage.ts b/back/mails/storeMessage.ts index 1a38f98..4135c5d 100644 --- a/back/mails/storeMessage.ts +++ b/back/mails/storeMessage.ts @@ -1,5 +1,5 @@ import { getAddresseId } from "../db/mail"; -import mailParser from "mailparser"; +import {simpleParser} from "mailparser"; import moment from "moment"; import { registerMessage, @@ -41,7 +41,7 @@ export function saveMessage(attrs, mailboxId, imap) { // saveSource(messageId, buffer); // parse data - mailParser(buffer, async (err, parsed) => { + simpleParser(buffer, async (err, parsed) => { saveFromParsedData(parsed, messageId) .then(() => { resolve(messageId); @@ -68,7 +68,7 @@ export function saveMessage(attrs, mailboxId, imap) { } async function saveFromParsedData(parsed, messageId) { - const promises = []; + const promises: Promise[] = []; Object.keys(parsed).forEach((key) => { if (["from", "to", "cc", "bcc", "replyTo"].includes(key)) { promises.push( diff --git a/back/mails/utils/envelopeUtils.ts b/back/mails/utils/envelopeUtils.ts index 2e637de..d9e540c 100644 --- a/back/mails/utils/envelopeUtils.ts +++ b/back/mails/utils/envelopeUtils.ts @@ -1,13 +1,14 @@ -export function nbMembers(envelope) { +import { Envelope, User } from "../../interfaces/mail/attrs.interface"; + +export function nbMembers(envelope: Envelope) { return getMembers(envelope).length; } -export function getMembers(envelope) { - const members: { mailbox: string; host: string }[] = []; - const fields = ["from", "to", "sender", "replyTo", "cc", "bcc"]; +export function getMembers(envelope: Envelope) { + const members: User[] = []; + const fields = ["from", "to", "sender", "replyTo", "cc", "bcc"] as const; fields.forEach((field) => { - if (!envelope[field]) return; - envelope[field].forEach((member) => { + envelope[field]?.forEach((member: User) => { if (members.find((m) => m.mailbox === member.mailbox && m.host === member.host)) return; members.push(member); }); diff --git a/back/package-lock.json b/back/package-lock.json index cb74424..086e82f 100644 --- a/back/package-lock.json +++ b/back/package-lock.json @@ -8,6 +8,7 @@ "ajv": "^8.12.0", "ajv-formats": "^2.1.1", "cors": "^2.8.5", + "dotenv": "^16.0.3", "express": "^4.18.2", "imap": "^0.8.19", "imap-simple": "^5.1.0", @@ -17,16 +18,18 @@ "vue-router": "^4.1.6" }, "devDependencies": { + "@babel/preset-typescript": "^7.21.4", "@types/express": "^4.17.17", "@types/imap": "^0.8.35", + "@types/jest": "^29.5.0", "@types/mailparser": "^3.0.2", "@types/moment": "^2.13.0", "@types/node": "^18.15.11", "concurrently": "^8.0.1", "jest": "^29.5.0", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1", - "ts-sql-plugin": "^0.9.0", - "typescript": "^5.0.3" + "typescript": "^4.9.5" } }, "node_modules/@ampproject/remapping": { @@ -145,6 +148,19 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", @@ -175,6 +191,29 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.21.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -212,6 +251,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", @@ -245,6 +297,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", @@ -255,6 +320,24 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", @@ -268,6 +351,19 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", @@ -423,7 +519,6 @@ "version": "7.21.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/parser/-/parser-7.21.2.tgz", "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "dev": true, "license": "MIT", "bin": { "parser": "bin/babel-parser.js" @@ -498,13 +593,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" @@ -623,6 +718,63 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.21.3", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.21.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", + "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-typescript": "^7.21.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.20.7", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/template/-/template-7.20.7.tgz", @@ -1282,6 +1434,17 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jest": { + "version": "29.5.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "node_modules/@types/mailparser": { "version": "3.0.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/mailparser/-/mailparser-3.0.2.tgz", @@ -1357,9 +1520,9 @@ "license": "MIT" }, "node_modules/@types/yargs": { - "version": "17.0.22", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "version": "17.0.24", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "license": "MIT", "dependencies": { @@ -1373,21 +1536,133 @@ "dev": true, "license": "MIT" }, + "node_modules/@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, "node_modules/@vue/devtools-api": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, - "node_modules/@xialvjun/js-utils": { - "version": "0.3.7", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@xialvjun/js-utils/-/js-utils-0.3.7.tgz", - "integrity": "sha512-IUkqFT5x8m0PJOlv08Vm802EsrZDtEoZVKYk8q4NDfeUMhCU7TRhHKrETygEFenCefVPyVq11SKGYO4oDPCuUA==", - "dev": true, + "node_modules/@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", "license": "MIT", - "peerDependencies": { - "tslib": "^2.0.0" + "peer": true, + "dependencies": { + "@vue/shared": "3.2.47" } }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + }, + "peerDependencies": { + "vue": "3.2.47" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "license": "MIT", + "peer": true + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/accepts/-/accepts-1.3.8.tgz", @@ -1740,6 +2015,19 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/bser/-/bser-2.1.1.tgz", @@ -1919,16 +2207,6 @@ "dev": true, "license": "MIT" }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/concat-map/-/concat-map-0.0.1.tgz", @@ -2083,6 +2361,13 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "license": "MIT", + "peer": true + }, "node_modules/date-fns": { "version": "2.29.3", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/date-fns/-/date-fns-2.29.3.tgz", @@ -2230,6 +2515,15 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ee-first/-/ee-first-1.1.1.tgz", @@ -2341,6 +2635,13 @@ "node": ">=4" } }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT", + "peer": true + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/etag/-/etag-1.8.1.tgz", @@ -2695,9 +2996,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true, "license": "ISC" }, @@ -3841,6 +4142,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3851,12 +4159,15 @@ "yallist": "^3.0.2" } }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true, - "license": "MIT" + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } }, "node_modules/mailparser": { "version": "3.6.3", @@ -4100,6 +4411,25 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/natural-compare/-/natural-compare-1.4.0.tgz", @@ -4375,8 +4705,7 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4414,6 +4743,31 @@ "node": ">=8" } }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/pretty-format": { "version": "29.5.0", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/pretty-format/-/pretty-format-29.5.0.tgz", @@ -4638,9 +4992,9 @@ } }, "node_modules/resolve.exports": { - "version": "2.0.1", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true, "license": "MIT", "engines": { @@ -4828,7 +5182,16 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "license": "BSD-3-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -4844,6 +5207,14 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT", + "peer": true + }, "node_modules/spawn-command": { "version": "0.0.2-1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -5067,6 +5438,86 @@ "tree-kill": "cli.js" } }, + "node_modules/ts-jest": { + "version": "29.0.5", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ts-node/-/ts-node-10.9.1.tgz", @@ -5111,27 +5562,6 @@ } } }, - "node_modules/ts-sql-plugin": { - "version": "0.9.0", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ts-sql-plugin/-/ts-sql-plugin-0.9.0.tgz", - "integrity": "sha512-ndYjBY2xBcGxN0pAOmR5H/UAfUgfTK8w8ow+EwqEzUbmxWMQV1kSKXbXp1pJyIR7FHXzhnAxXLVuByWVcfaNcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xialvjun/js-utils": "^0.3.7", - "commander": "^5.0.0", - "lunr": "^2.3.8", - "shell-quote": "^1.7.2", - "tslib": "^2.0.0", - "typescript-template-language-service-decorator": "^2.2.0" - }, - "bin": { - "ts-sql-plugin": "cli.js" - }, - "peerDependencies": { - "typescript": "^4.0.2" - } - }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/tslib/-/tslib-2.5.0.tgz", @@ -5176,9 +5606,9 @@ } }, "node_modules/typescript": { - "version": "5.0.3", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", + "version": "4.9.5", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "license": "Apache-2.0", "bin": { @@ -5186,16 +5616,9 @@ "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=4.2.0" } }, - "node_modules/typescript-template-language-service-decorator": { - "version": "2.3.1", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/typescript-template-language-service-decorator/-/typescript-template-language-service-decorator-2.3.1.tgz", - "integrity": "sha512-+Q5+cvBtPO4VKNyyI6O+XnIne+/hq/WfNhBaF4hJP8nB8TbikTg+2h9uBMsqduwX1+kVfwG9SBSwMTtvi2Ep7w==", - "dev": true, - "license": "MIT" - }, "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", @@ -5317,6 +5740,20 @@ "node": ">= 0.8" } }, + "node_modules/vue": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, "node_modules/vue-router": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", @@ -5554,6 +5991,15 @@ } } }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, "@babel/helper-compilation-targets": { "version": "7.20.7", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", @@ -5575,6 +6021,22 @@ } } }, + "@babel/helper-create-class-features-plugin": { + "version": "7.21.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", + "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, "@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -5600,6 +6062,15 @@ "@babel/types": "^7.18.6" } }, + "@babel/helper-member-expression-to-functions": { + "version": "7.21.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", + "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.21.0" + } + }, "@babel/helper-module-imports": { "version": "7.18.6", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", @@ -5625,12 +6096,35 @@ "@babel/types": "^7.21.2" } }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + } + }, "@babel/helper-plugin-utils": { "version": "7.20.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "dev": true }, + "@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, "@babel/helper-simple-access": { "version": "7.20.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", @@ -5640,6 +6134,15 @@ "@babel/types": "^7.20.2" } }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "dev": true, + "requires": { + "@babel/types": "^7.20.0" + } + }, "@babel/helper-split-export-declaration": { "version": "7.18.6", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", @@ -5750,8 +6253,7 @@ "@babel/parser": { "version": "7.21.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/parser/-/parser-7.21.2.tgz", - "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==", - "dev": true + "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -5799,12 +6301,12 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.18.6", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", - "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "version": "7.21.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", + "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -5879,6 +6381,42 @@ "@babel/helper-plugin-utils": "^7.19.0" } }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.21.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", + "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-simple-access": "^7.20.2" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.21.3", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", + "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/preset-typescript": { + "version": "7.21.4", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", + "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-validator-option": "^7.21.0", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-typescript": "^7.21.3" + } + }, "@babel/template": { "version": "7.20.7", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@babel/template/-/template-7.20.7.tgz", @@ -6405,6 +6943,16 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jest": { + "version": "29.5.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/jest/-/jest-29.5.0.tgz", + "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "dev": true, + "requires": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, "@types/mailparser": { "version": "3.0.2", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/mailparser/-/mailparser-3.0.2.tgz", @@ -6470,9 +7018,9 @@ "dev": true }, "@types/yargs": { - "version": "17.0.22", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/yargs/-/yargs-17.0.22.tgz", - "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==", + "version": "17.0.24", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -6484,16 +7032,119 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@vue/compiler-core": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-core/-/compiler-core-3.2.47.tgz", + "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==", + "peer": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz", + "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==", + "peer": true, + "requires": { + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz", + "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==", + "peer": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-ssr": "3.2.47", + "@vue/reactivity-transform": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz", + "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==", + "peer": true, + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/shared": "3.2.47" + } + }, "@vue/devtools-api": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" }, - "@xialvjun/js-utils": { - "version": "0.3.7", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@xialvjun/js-utils/-/js-utils-0.3.7.tgz", - "integrity": "sha512-IUkqFT5x8m0PJOlv08Vm802EsrZDtEoZVKYk8q4NDfeUMhCU7TRhHKrETygEFenCefVPyVq11SKGYO4oDPCuUA==", - "dev": true + "@vue/reactivity": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/reactivity/-/reactivity-3.2.47.tgz", + "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==", + "peer": true, + "requires": { + "@vue/shared": "3.2.47" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz", + "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==", + "peer": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.47", + "@vue/shared": "3.2.47", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/runtime-core/-/runtime-core-3.2.47.tgz", + "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==", + "peer": true, + "requires": { + "@vue/reactivity": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/runtime-dom": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz", + "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==", + "peer": true, + "requires": { + "@vue/runtime-core": "3.2.47", + "@vue/shared": "3.2.47", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/server-renderer/-/server-renderer-3.2.47.tgz", + "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==", + "peer": true, + "requires": { + "@vue/compiler-ssr": "3.2.47", + "@vue/shared": "3.2.47" + } + }, + "@vue/shared": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/@vue/shared/-/shared-3.2.47.tgz", + "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", + "peer": true }, "accepts": { "version": "1.3.8", @@ -6735,6 +7386,15 @@ "update-browserslist-db": "^1.0.10" } }, + "bs-logger": { + "version": "0.2.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "requires": { + "fast-json-stable-stringify": "2.x" + } + }, "bser": { "version": "2.1.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/bser/-/bser-2.1.1.tgz", @@ -6848,12 +7508,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "commander": { - "version": "5.1.0", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/concat-map/-/concat-map-0.0.1.tgz", @@ -6955,6 +7609,12 @@ "which": "^2.0.1" } }, + "csstype": { + "version": "2.6.21", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==", + "peer": true + }, "date-fns": { "version": "2.29.3", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/date-fns/-/date-fns-2.29.3.tgz", @@ -7042,6 +7702,11 @@ "domhandler": "^5.0.1" } }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ee-first/-/ee-first-1.1.1.tgz", @@ -7112,6 +7777,12 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "peer": true + }, "etag": { "version": "1.8.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/etag/-/etag-1.8.1.tgz", @@ -7362,9 +8033,9 @@ "dev": true }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "has": { @@ -7846,7 +8517,8 @@ "version": "1.2.3", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "29.4.3", @@ -8188,6 +8860,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lru-cache/-/lru-cache-5.1.1.tgz", @@ -8197,11 +8875,14 @@ "yallist": "^3.0.2" } }, - "lunr": { - "version": "2.3.9", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "magic-string": { + "version": "0.25.9", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "peer": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } }, "mailparser": { "version": "3.6.3", @@ -8386,6 +9067,12 @@ } } }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "peer": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/natural-compare/-/natural-compare-1.4.0.tgz", @@ -8572,8 +9259,7 @@ "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", @@ -8596,6 +9282,17 @@ "find-up": "^4.0.0" } }, + "postcss": { + "version": "8.4.21", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "peer": true, + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, "pretty-format": { "version": "29.5.0", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/pretty-format/-/pretty-format-29.5.0.tgz", @@ -8745,9 +9442,9 @@ "dev": true }, "resolve.exports": { - "version": "2.0.1", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/resolve.exports/-/resolve.exports-2.0.1.tgz", - "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==", + "version": "2.0.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, "rxjs": { @@ -8892,8 +9589,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "peer": true }, "source-map-support": { "version": "0.5.13", @@ -8905,6 +9607,12 @@ "source-map": "^0.6.0" } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "peer": true + }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -9052,6 +9760,48 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "ts-jest": { + "version": "29.0.5", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ts-jest/-/ts-jest-29.0.5.tgz", + "integrity": "sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "7.x", + "yargs-parser": "^21.0.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "ts-node": { "version": "10.9.1", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ts-node/-/ts-node-10.9.1.tgz", @@ -9073,20 +9823,6 @@ "yn": "3.1.1" } }, - "ts-sql-plugin": { - "version": "0.9.0", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/ts-sql-plugin/-/ts-sql-plugin-0.9.0.tgz", - "integrity": "sha512-ndYjBY2xBcGxN0pAOmR5H/UAfUgfTK8w8ow+EwqEzUbmxWMQV1kSKXbXp1pJyIR7FHXzhnAxXLVuByWVcfaNcg==", - "dev": true, - "requires": { - "@xialvjun/js-utils": "^0.3.7", - "commander": "^5.0.0", - "lunr": "^2.3.8", - "shell-quote": "^1.7.2", - "tslib": "^2.0.0", - "typescript-template-language-service-decorator": "^2.2.0" - } - }, "tslib": { "version": "2.5.0", "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/tslib/-/tslib-2.5.0.tgz", @@ -9115,15 +9851,9 @@ } }, "typescript": { - "version": "5.0.3", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/typescript/-/typescript-5.0.3.tgz", - "integrity": "sha512-xv8mOEDnigb/tN9PSMTwSEqAnUvkoXMQlicOb0IUVDBSQCgBSaAAROUZYy2IcUy5qU6XajK5jjjO7TMWqBTKZA==", - "dev": true - }, - "typescript-template-language-service-decorator": { - "version": "2.3.1", - "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/typescript-template-language-service-decorator/-/typescript-template-language-service-decorator-2.3.1.tgz", - "integrity": "sha512-+Q5+cvBtPO4VKNyyI6O+XnIne+/hq/WfNhBaF4hJP8nB8TbikTg+2h9uBMsqduwX1+kVfwG9SBSwMTtvi2Ep7w==", + "version": "4.9.5", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "uc.micro": { @@ -9212,6 +9942,19 @@ "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, + "vue": { + "version": "3.2.47", + "resolved": "https://repo.plus4u.net/operatorGate/repository/public-javascript/vue/-/vue-3.2.47.tgz", + "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==", + "peer": true, + "requires": { + "@vue/compiler-dom": "3.2.47", + "@vue/compiler-sfc": "3.2.47", + "@vue/runtime-dom": "3.2.47", + "@vue/server-renderer": "3.2.47", + "@vue/shared": "3.2.47" + } + }, "vue-router": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", diff --git a/back/package.json b/back/package.json index 69faa27..377ebb3 100644 --- a/back/package.json +++ b/back/package.json @@ -9,6 +9,7 @@ "ajv": "^8.12.0", "ajv-formats": "^2.1.1", "cors": "^2.8.5", + "dotenv": "^16.0.3", "express": "^4.18.2", "imap": "^0.8.19", "imap-simple": "^5.1.0", @@ -18,18 +19,22 @@ "vue-router": "^4.1.6" }, "devDependencies": { + "@babel/preset-typescript": "^7.21.4", "@types/express": "^4.17.17", "@types/imap": "^0.8.35", + "@types/jest": "^29.5.0", "@types/mailparser": "^3.0.2", "@types/moment": "^2.13.0", "@types/node": "^18.15.11", "concurrently": "^8.0.1", "jest": "^29.5.0", + "ts-jest": "^29.0.5", "ts-node": "^10.9.1", - "ts-sql-plugin": "^0.9.0", - "typescript": "^5.0.3" + "typescript": "^4.9.5" }, "jest": { + "preset": "ts-jest", + "testEnvironment": "node", "testMatch": [ "/test//**/*-test.[jt]s?(x)" ] diff --git a/back/test/mail/saveMessage-test.js b/back/test/mail/saveMessage-test.js deleted file mode 100644 index 77bbd17..0000000 --- a/back/test/mail/saveMessage-test.js +++ /dev/null @@ -1,90 +0,0 @@ -const { getAddresseId, getUserIdOfMailbox } from "; -const { generateAttrs, generateUsers } = require("../test-utils/test-attrsUtils"); -const { registerMessageInApp, roomType } from "; - -jest.mock("../../db/mail"); - -// todo mock db -// new message from us -// to multiple people -> room -// if response has same member => group -// if response is dm => channel -// to one person => dm - -// new message from other -// to only me -> room -// if no reply to multiple message => channel -// else => dm -// to multiple people -> room -// // make it better -// if multiple members reply -> group -// if only me reply -> channel - -describe("saveMessage", () => { - describe("new first message", () => { - - const users = generateUsers(5); - const ownUser = users[0]; - const messageId = 1; - const boxId = 1; - getUserIdOfMailbox.mockReturnValue([{ user_id: ownUser.id }]); - getAddresseId.mockImplementation((email) => { - const match = users.find((user) => user.user.mailbox + "@" + user.user.host == email); - return match.id; - }); - - describe("from us", () => { - it("new first message from us to one recipient should create a DM", async () => { - const attrs = generateAttrs({ from: [ownUser.user], to: [users[1].user] }); - - const register = new registerMessageInApp(messageId, attrs, boxId); - - const createOrRegisterOnExistence = jest - .spyOn(register, "createOrRegisterOnExistence") - .mockImplementation(() => undefined); - - await register.save(); - - expect(createOrRegisterOnExistence).toHaveBeenCalledWith(users[1].id, roomType.DM); - }); - it("new first message from us to multiple recipients should create a room", async () => { - const attrs = generateAttrs({ from: [ownUser.user], to: [users[1].user, users[2].user] }); - - const register = new registerMessageInApp(messageId, attrs, boxId); - - const initiateRoom = jest - .spyOn(register, "initiateRoom") - .mockImplementation(() => undefined); - - await register.save(); - - expect(initiateRoom).toHaveBeenCalledWith(ownUser.id, roomType.ROOM); - }); - it("response to new first message to multiple recipients with same members should change room type to GROUP", () => { - - }); - it("response to new first message to multiple recipients with different members should change room type to CHANNEL", () => { - - }); - }); - describe("from other", () => { - it("new first message from other to me only should create a room", async () => { - const attrs = generateAttrs({ from: [users[1].user], to: [ownUser.user] }); - - const register = new registerMessageInApp(messageId, attrs, boxId); - - const createOrRegisterOnExistence = jest - .spyOn(register, "createOrRegisterOnExistence") - .mockImplementation(() => undefined); - - await register.save(); - - expect(createOrRegisterOnExistence).toHaveBeenCalledWith(users[1].id, roomType.ROOM); - }); - }); - }); - describe("replies", () => { - it("", () => {}); - }); - describe("", () => {}); -}); diff --git a/back/test/mail/saveMessage-test.ts b/back/test/mail/saveMessage-test.ts new file mode 100644 index 0000000..29de876 --- /dev/null +++ b/back/test/mail/saveMessage-test.ts @@ -0,0 +1,112 @@ +import { generateAttrs, generateUsers } from "../test-utils/test-attrsUtils"; +import registerMessageInApp, { roomType } from "../../mails/saveMessage"; +import { jest, describe, it, expect } from "@jest/globals"; + +import { getAddresseId, getUserIdOfMailbox } from "../../db/mail"; +// todo esbuild +// todo mock db + +// new message from us +// to multiple people -> room +// if response has same member => group +// if response is dm => channel +// to one person => dm + +// new message from other +// to only me -> room +// if no reply to multiple message => channel +// else => dm +// to multiple people -> room +// // make it better +// if multiple members reply -> group +// if only me reply -> channel + +const users = generateUsers(5); +const ownUser = users[0]; +const messageId = 1; +const boxId = 1; + +jest.mock("../../db/mail", () => ({ + getAddresseId: jest.fn().mockImplementation((email) => { + const match = users.find((user) => user.user.mailbox + "@" + user.user.host == email); + return new Promise((resolve, reject) => resolve(match?.id)); + }), + getUserIdOfMailbox: jest.fn().mockImplementation((boxId) => { + return new Promise((resolve, reject) => resolve([{ user_id: ownUser.id }])); + }), +})); + +describe("saveMessage", () => { + describe("functions", () => { + it("isFromUs", async () => { + const attrs = generateAttrs({ from: [ownUser.user], to: [users[1].user] }); + const register = new registerMessageInApp(messageId, attrs, boxId); + await register.init(); + const res = await register.isFromUs(); + + expect(res).toBe(true); + + const attrs2 = generateAttrs({ from: [users[2].user], to: [users[1].user] }); + const register2 = new registerMessageInApp(messageId, attrs2, boxId); + await register2.init(); + const res2 = await register2.isFromUs(); + + expect(res2).toBe(false); + }); + }); + describe("implementation", () => { + describe("new first message from us", () => { + it("new first message from us to one recipient should create a DM", async () => { + const attrs = generateAttrs({ from: [ownUser.user], to: [users[1].user] }); + + const register = new registerMessageInApp(messageId, attrs, boxId); + + const createOrRegisterOnExistence = jest + .spyOn(register, "createOrRegisterOnExistence") + .mockImplementation( + (owner: number, roomType: number) => new Promise((resolve, reject) => resolve()), + ); + + await register.save(); + + expect(createOrRegisterOnExistence).toHaveBeenCalledWith(users[1].id, roomType.DM); + }); + it("new first message from us to multiple recipients should create a ROOM", async () => { + const attrs = generateAttrs({ from: [ownUser.user], to: [users[1].user, users[2].user] }); + + const register = new registerMessageInApp(messageId, attrs, boxId); + + const initiateRoom = jest + .spyOn(register, "initiateRoom") + .mockImplementation((owner: number, roomType: number) => Promise.resolve(1)); + + await register.save(); + + expect(initiateRoom).toHaveBeenCalledWith(ownUser.id, roomType.ROOM); + }); + // it("response to new first message to multiple recipients with same members should change room type to GROUP", () => {}); + // it("response to new first message to multiple recipients with different members should change room type to CHANNEL", () => {}); + }); + describe("new first message from other", () => { + it("new first message from other to me only should create a room", async () => { + const attrs = generateAttrs({ from: [users[1].user], to: [ownUser.user] }); + + const register = new registerMessageInApp(messageId, attrs, boxId); + + const createOrRegisterOnExistence = jest + .spyOn(register, "createOrRegisterOnExistence") + .mockImplementation((owner: number, roomType: number) => { + return new Promise((resolve, reject) => resolve()); + }); + + await register.save(); + + expect(createOrRegisterOnExistence).toHaveBeenCalledWith(users[1].id, roomType.ROOM); + }); + }); + // describe("replies", () => { + // it("", () => {}); + // }); + // describe("", () => {}); + }); +}); diff --git a/back/test/mail/utils/envelopeUtils-test.js b/back/test/mail/utils/envelopeUtils-test.ts similarity index 63% rename from back/test/mail/utils/envelopeUtils-test.js rename to back/test/mail/utils/envelopeUtils-test.ts index 3c63db4..90ce955 100644 --- a/back/test/mail/utils/envelopeUtils-test.js +++ b/back/test/mail/utils/envelopeUtils-test.ts @@ -1,44 +1,34 @@ -const { nbMembers } from "; -const { generateUsers } = require("../../test-utils/test-attrsUtils"); +import { nbMembers } from "../../../mails/utils/envelopeUtils"; +import { generateAttrs, generateUsers } from "../../test-utils/test-attrsUtils"; +import { describe, it, expect } from '@jest/globals'; describe("envelopeUtils", () => { const names = generateUsers(6); describe("nbMembers", () => { it("sender and from shouldn't be counted twice if there are the same", () => { - const envelope = { + const envelope = generateAttrs({ from: [names[0].user], sender: [names[0].user], - replyTo: null, - to: null, - cc: null, - bcc: null, - inReplyTo: null, - }; + }).envelope; expect(nbMembers(envelope)).toBe(1); }); it("sender and from shoud be counted twice if there are the same", () => { - const envelope = { + const envelope = generateAttrs({ from: [names[0].user], sender: [names[1].user], - replyTo: null, - to: null, - cc: null, - bcc: null, - inReplyTo: null, - }; + }).envelope; expect(nbMembers(envelope)).toBe(2); }); it("should count every members", () => { // todo should merge identic members - const envelope = { + const envelope = generateAttrs({ from: [names[0].user], sender: [names[1].user], replyTo: [names[2].user], to: [names[3].user], cc: [names[4].user], bcc: [names[5].user], - inReplyTo: null, - }; + }).envelope; expect(nbMembers(envelope)).toBe(6); }); }); diff --git a/back/test/test-utils/names.js b/back/test/test-utils/names.ts similarity index 98% rename from back/test/test-utils/names.js rename to back/test/test-utils/names.ts index 4110d0a..eb66e6d 100644 --- a/back/test/test-utils/names.js +++ b/back/test/test-utils/names.ts @@ -201,6 +201,4 @@ const names = [ "Lori", ]; -module.exports = { - names, -}; +export default names; \ No newline at end of file diff --git a/back/test/test-utils/test-attrsUtils.js b/back/test/test-utils/test-attrsUtils.js deleted file mode 100644 index 43616fb..0000000 --- a/back/test/test-utils/test-attrsUtils.js +++ /dev/null @@ -1,61 +0,0 @@ -const { names } from "; - -function generateAttrs(options) { - const attrs = { - "size": 42, - "envelope": { - date: "2023-03-21T15:25:42.000Z", - subject: options.subject ?? "subject" + randomString(10), - from: options.from ?? null, - sender: options.sender ?? null, - replyTo: options.replyTo ?? null, - to: options.to ?? null, - cc: options.cc ?? null, - bcc: options.bcc ?? null, - inReplyTo: options.inReplyTo ?? null, - messageId: options.messageId ?? randomString(10), - }, - "date": options.date ?? new Date(), - "flags": options.flags ?? [], - "uid": options.uid ?? randomInt(3), - "modseq": options.modseq ?? randomInt(7), - "x-gm-labels": ["\\Inbox"], - "x-gm-msgid": "1760991478422670209", - "x-gm-thrid": "1760991478422670209", - }; - return attrs; -} - -function generateUsers(nb) { - const users = []; - for (let i = 0; i < nb; i++) { - users.push({ - user: { - name: "", - mailbox: names[i], - host: "provider.com", - }, - id: i, - }); - } - return users; -} - -function randomString(length) { - let result = ""; - const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - const charactersLength = characters.length; - for (let i = 0; i < length; i++) { - result += characters.charAt(Math.floor(Math.random() * charactersLength)); - } - return result; -} - -function randomInt(length) { - return (Math.random() * Math.pow(10, length)).toFixed(); -} - -module.exports = { - generateAttrs, - generateUsers, -}; diff --git a/back/test/test-utils/test-attrsUtils.ts b/back/test/test-utils/test-attrsUtils.ts new file mode 100644 index 0000000..514aa90 --- /dev/null +++ b/back/test/test-utils/test-attrsUtils.ts @@ -0,0 +1,73 @@ +import { AttrsWithEnvelope, User } from "../../interfaces/mail/attrs.interface"; +import names from "./names"; + +interface Options { + subject?: string; + from?: User[]; + sender?: User[]; + replyTo?: User[]; + to?: User[]; + cc?: User[]; + bcc?: User[]; + inReplyTo?: string; + messageId?: string; + date?: string; + flags?: string[]; + uid?: number; + modseq?: number; +} + +export function generateAttrs(options: Options): AttrsWithEnvelope { + const attrs = { + "size": 42, + "envelope": { + date: "2023-03-21T15:25:42.000Z", + subject: options.subject ?? "subject" + randomString(10), + from: options.from ?? undefined, + sender: options.sender ?? undefined, + replyTo: options.replyTo ?? undefined, + to: options.to ?? undefined, + cc: options.cc ?? undefined, + bcc: options.bcc ?? undefined, + inReplyTo: options.inReplyTo ?? undefined, + messageId: options.messageId ?? randomString(10), + }, + "date": options.date ?? new Date().toDateString(), + "flags": options.flags ?? [], + "uid": options.uid ?? randomInt(3), + "modseq": options.modseq ?? randomInt(7), + "x-gm-labels": ["\\Inbox"], + "x-gm-msgid": "1760991478422670209", + "x-gm-thrid": "1760991478422670209", + }; + return attrs; +} + +export function generateUsers(nb: number) { + const users: {user: User, id: number}[] = []; + for (let i = 0; i < nb; i++) { + users.push({ + user: { + name: "", + mailbox: names[i], + host: "provider.com", + }, + id: i, + }); + } + return users; +} + +function randomString(length: number): string { + let result = ""; + const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + const charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * charactersLength)); + } + return result; +} + +function randomInt(length: number): number { + return parseInt((Math.random() * Math.pow(10, length)).toFixed()); +} \ No newline at end of file diff --git a/back/tsconfig.json b/back/tsconfig.json new file mode 100644 index 0000000..b314d1c --- /dev/null +++ b/back/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "outDir": "./build", + "target": "es6", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "types": ["node", "jest"], + "paths": { + "*": ["node_modules/*", "src/types/*"] + } + }, + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/back/utils/string.js b/back/utils/string.ts similarity index 73% rename from back/utils/string.js rename to back/utils/string.ts index 5683f89..40027d5 100644 --- a/back/utils/string.js +++ b/back/utils/string.ts @@ -1,4 +1,4 @@ -function transformEmojis(str) { +export function transformEmojis(str :string): string { if (!str) return str; // Use a regular expression to match emojis in the string const regex = @@ -6,20 +6,14 @@ function transformEmojis(str) { // Replace each matched emoji with its Unicode code point const transformedStr = str.replace(regex, (match) => { - return "\\u{" + match.codePointAt(0).toString(16).toUpperCase() + "}"; + return "\\u{" + match.codePointAt(0)?.toString(16).toUpperCase() + "}"; }); return transformedStr; } -function decodeEmojis(text) { +export function decodeEmojis(text: string): string { const regex = /\\u{([^}]+)}/g; const decodedText = text.replace(regex, (_, hex) => String.fromCodePoint(parseInt(hex, 16))); return decodedText; -} - - -module.exports = { - transformEmojis, - decodeEmojis } \ No newline at end of file diff --git a/front/babel.config.js b/front/babel.config.js index e69de29..a50f080 100644 --- a/front/babel.config.js +++ b/front/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ['@babel/preset-env', {targets: {node: 'current'}}], + '@babel/preset-typescript', + ], + }; \ No newline at end of file